martaczaska

all_pila+whitenoise

May 16th, 2020
1,310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.45 KB | None | 0 0
  1. /*
  2. WYKONAŁA: MARTA TRZASKA 171632
  3. TELEKOMUNIKACJA 1, SEMESTR 6
  4. */
  5.  
  6. #include <dsplib.h>
  7. //częstotliwosc graniczna filtru dolnoprzepustowego: fc=1320
  8. //długoć filtru N = 57
  9.  
  10. #define NUM_SAMPLES 5000                                                //ilosc probek
  11. #define N 57
  12. #define krok 137                                                        //wartosc kroku w formacie Q15
  13.  
  14. const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41, //wspolczynniki filtru obliczone w programie Matlab
  15. -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
  16. 1482, 1594, 1687, 1755, 1797, 1811, 1797,1755, 1687, 1594, 1482, 1353,
  17. 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
  18. , -50, -53, -51, -46, -41, -36, -32, -30};                              //suma współczynników = 32441; 32441/2^15 = 0,990021 (przemnożenie przez 0.99 przed zaokrągleniem)
  19.  
  20. short white_noise[NUM_SAMPLES];
  21. short pila[NUM_SAMPLES];
  22. short wynik[NUM_SAMPLES];
  23.  
  24. void saw(short* tablica, unsigned int dl_tablicy, unsigned int step){     //funkcja generująca sygnał piłokształtny
  25.     int amplituda = 0;
  26.     int i;
  27.     tablica[0] = 0;
  28.     for(i = 1; i < dl_tablicy; i++){                                    //pętla licząca kolejne wartosci sygnału
  29.         amplituda = amplituda + step;
  30.         tablica[i] = amplituda;
  31.     }
  32. }
  33.  
  34. void blockfir(short* input, const short* filter, short* output, int numSamples, int numFilter){  //funkcja wykonującą filtrację bloku próbek sygnalu
  35.     int j;
  36.     int i;
  37.  
  38.     for(j = 0; j < numSamples; j++){                                    //pętla iterująca próbki z sygnalu wejsciowego
  39.         long y = 0;
  40.  
  41.         for(i = 0; i < N; i++){                                         //pętla realizująca obliczenia dla jednej próbki
  42.             y = _smaci(y, input[j-i], filter[i]);                       //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  43.         }
  44.  
  45.         output[j] = (short)(_sround(y) >> 15);                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  46.     }
  47. }
  48.  
  49. void main(void) {
  50.     //rand16init();                                                      //inicjalizacja generatora
  51.     //rand16((DATA*)white_noise, NUM_SAMPLES);                           //funkcja do generowania szumu bialego
  52.  
  53.     saw(pila, NUM_SAMPLES, krok);
  54.     //blockfir(white_noise, filtr_fir, wynik, NUM_SAMPLES, N);           //wywolanie funkcji blockfir
  55.     blockfir(pila, filtr_fir, wynik, NUM_SAMPLES, N);           //wywolanie funkcji blockfir
  56.  
  57.     while (1); // do not exit
  58. }
Advertisement
Add Comment
Please, Sign In to add comment