martaczaska

full kodzix

May 16th, 2020
1,620
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.22 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. short bufor[N + 2];
  25. short probka = 0;
  26. short obliczona = 0;
  27. int k;
  28.  
  29.  
  30. void saw(short* tablica, unsigned int dl_tablicy, unsigned int step){     //funkcja generująca sygnał piłokształtny
  31.     int amplituda = 0;
  32.     int i;
  33.     tablica[0] = 0;
  34.     for(i = 1; i < dl_tablicy; i++){                                    //pętla licząca kolejne wartosci sygnału
  35.         amplituda = amplituda + step;
  36.         tablica[i] = amplituda;
  37.     }
  38. }
  39.  
  40. void blockfir(short* input, const short* filter, short* output, int numSamples, int numFilter){  //funkcja wykonującą filtrację bloku próbek sygnalu
  41.     int j;
  42.     int i;
  43.  
  44.     for(j = 0; j < numSamples; j++){                                    //pętla iterująca próbki z sygnalu wejsciowego
  45.         long y = 0;
  46.  
  47.         for(i = 0; i < N; i++){                                         //pętla realizująca obliczenia dla jednej próbki
  48.             if(i > j || i == j){break;}
  49.             y = _smaci(y, input[j-i], filter[i]);                       //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  50.         }
  51.  
  52.         output[j] = (short)(_sround(y) >> 15);                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  53.     }
  54. }
  55.  
  56. void main(void) {
  57.     //rand16init();                                                      //inicjalizacja generatora
  58.     //rand16((DATA*)white_noise, NUM_SAMPLES);                           //funkcja do generowania szumu bialego
  59.     saw(pila, NUM_SAMPLES, krok);
  60.  
  61.  
  62.     //blockfir(white_noise, filtr_fir, wynik, NUM_SAMPLES, N);           //wywolanie funkcji blockfir
  63.     //blockfir(pila, filtr_fir, wynik, NUM_SAMPLES, N);           //wywolanie funkcji blockfir
  64.    
  65.    
  66.    
  67.    
  68.    
  69.  
  70.     fir((DATA*)white_noise, (DATA*)filtr_fir, (DATA*)wynik, bufor, NUM_SAMPLES, N);   //wywołanie funkcji fir z biblioteki DSPLIB
  71.    
  72.    
  73.    
  74.    
  75.    
  76.     //fir((DATA*)pila, (DATA*)filtr_fir, (DATA*)wynik, bufor, NUM_SAMPLES, N);          //wywołanie funkcji fir z biblioteki DSPLIB
  77.  
  78.  
  79.     for(k = 0; k < NUM_SAMPLES; k++){                                         //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
  80.         //probka = white_noise[k];
  81.         probka = pila[k];
  82.         fir((DATA*)&probka, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N); //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
  83.         wynik[k] = obliczona;
  84.     }
  85.  
  86.  
  87.  
  88.     while (1); // do not exit
  89. }
Advertisement
Add Comment
Please, Sign In to add comment