Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- WYKONAŁA: MARTA TRZASKA 171632
- TELEKOMUNIKACJA 1, SEMESTR 6
- */
- #include <dsplib.h>
- //częstotliwosc graniczna filtru dolnoprzepustowego: fc=1320
- //długoć filtru N = 57
- #define NUM_SAMPLES 5000 //ilosc probek
- #define N 57
- #define krok 137 //wartosc kroku w formacie Q15
- const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41, //wspolczynniki filtru obliczone w programie Matlab
- -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
- 1482, 1594, 1687, 1755, 1797, 1811, 1797, 1755, 1687, 1594, 1482, 1353,
- 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
- , -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)
- short white_noise[NUM_SAMPLES];
- short pila[NUM_SAMPLES];
- short wynik[NUM_SAMPLES];
- short bufor[N + 2];
- short probka = 0;
- short obliczona = 0;
- int k;
- void saw(short* tablica, unsigned int dl_tablicy, unsigned int step){ //funkcja generująca sygnał piłokształtny
- int amplituda = 0;
- int i;
- tablica[0] = 0;
- for(i = 1; i < dl_tablicy; i++){ //pętla licząca kolejne wartosci sygnału
- amplituda = amplituda + step;
- tablica[i] = amplituda;
- }
- }
- void blockfir(short* input, const short* filter, short* output, int numSamples, int numFilter){ //funkcja wykonującą filtrację bloku próbek sygnalu
- int j;
- int i;
- for(j = 0; j < numSamples; j++){ //pętla iterująca próbki z sygnalu wejsciowego
- long y = 0;
- for(i = 0; i < N; i++){ //pętla realizująca obliczenia dla jednej próbki
- if(i > j || i == j){break;}
- y = _smaci(y, input[j-i], filter[i]); //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
- }
- output[j] = (short)(_sround(y) >> 15); //zaokrąglenie i przejcie z formatu Q30 na Q15
- }
- }
- void main(void) {
- //rand16init(); //inicjalizacja generatora
- //rand16((DATA*)white_noise, NUM_SAMPLES); //funkcja do generowania szumu bialego
- saw(pila, NUM_SAMPLES, krok);
- //blockfir(white_noise, filtr_fir, wynik, NUM_SAMPLES, N); //wywolanie funkcji blockfir
- //blockfir(pila, filtr_fir, wynik, NUM_SAMPLES, N); //wywolanie funkcji blockfir
- fir((DATA*)white_noise, (DATA*)filtr_fir, (DATA*)wynik, bufor, NUM_SAMPLES, N); //wywołanie funkcji fir z biblioteki DSPLIB
- //fir((DATA*)pila, (DATA*)filtr_fir, (DATA*)wynik, bufor, NUM_SAMPLES, N); //wywołanie funkcji fir z biblioteki DSPLIB
- for(k = 0; k < NUM_SAMPLES; k++){ //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
- //probka = white_noise[k];
- probka = pila[k];
- fir((DATA*)&probka, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N); //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
- wynik[k] = obliczona;
- }
- while (1); // do not exit
- }
Advertisement
Add Comment
Please, Sign In to add comment