Advertisement
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>
- #include <testsignal.h> //tablica z próbkami fragmentu nagrania dźwięku klarnetu
- #include <okno_hamminga.h> //tablica ze współczynnikami okna Hamminga (format Q15)
- #include <stdio.h>
- #define NUM_SAMPLES 2048 //ilosc probek
- #define Nr 1000 //liczba wartoci funkcji autokorelacji
- int klarnet[NUM_SAMPLES];
- int bufor[NUM_SAMPLES];
- int autokorelacja[NUM_SAMPLES];
- int i;
- int j = 0;
- int maks = 0;
- const long f_s = 48000;
- void maksimum(int* tablica, int podloga, int number, int wybor){ //funkcja wyznaczająca indeks warstosci widma odpowiadającej pierwszemu istotnemu maksimum
- int znalezione = 0;
- int roznica = 0;
- int w;
- if(wybor == 1){ //dla
- w = 0;
- }
- else if(wybor == 2){
- w = 1;
- }
- for(i = w; i < number; i++){
- if(tablica[i] > podloga){ //porównanie wartosci próbki z ustaloną podłogą szumową
- roznica = tablica[i] - tablica[i - 1]; //liczenie pochodnej widma (różnica próbki bieżącej i próbki poprzedniej)
- if(roznica > 0){ //gdy próbka bieżąca jest większa od poprzedniej, zostaje przypisana do maksimum
- maks = i;
- znalezione = 1;
- }
- else{
- if(znalezione==1 && (roznica < 0)){ //gdy próbka bieżąca jest mniejsza od poprzedniej, a maksimum zostało już raz przypisane:
- break; //(znalezione = 1), to kończymy poszukiwania
- }
- else{continue;}
- }
- }
- else{continue;}
- }
- printf("Indeks maksimum: ");
- printf("%d \n", maks);
- }
- void czestotliwosc(int p){ //funkcja wyznaczająca częstotliwosć maksimum widma
- long df = f_s >> 11; //dzielenie przez 2048 (f_s = 48000)
- df = ((df << 15) + (1 << 14)); //przejcie na format Q15
- int f_maks = (int)((p*df) >> 15); //wyznaczenie częstotliwosci dla maksimum (przemnożenie indeksu maksimum i rozdzielczosci częstot.)
- printf("Częstotliwosc znalezionego maksimum wynosi: ");
- printf("%d \n", f_maks);
- }
- void main(void) {
- int x = okno_hamminga[0];
- for (i = 0; i < NUM_SAMPLES; i++){ //przypisanie probek nagrania dźwięku klarnetu do tablicy klarnet[]
- klarnet[i] = testsignal[i];
- //klarnet[i] = _smpy(okno_hamminga[i], testsignal[i]);//dla zad. 3
- }
- rfft((DATA*)klarnet, NUM_SAMPLES, SCALE); //funkcja z biblioteki DSPLIB pozwalająca obliczenie widma (FFT) dla sygnału rzeczywistego
- for (i = 0; i < NUM_SAMPLES; i++){ //obliczenie kwadratów próbek widma
- klarnet[i] = _smpy(klarnet[i], klarnet[i]);
- }
- for(i = 2; i < NUM_SAMPLES; i = i + 2){ //sumowanie kwadratów częsci rzeczywistych i urojonych (Re[i]^2 + Im[i+1]^2)
- klarnet[j] = klarnet[i] + klarnet[i + 1];
- j++;
- }
- sqrt_16((DATA*)klarnet, (DATA*)klarnet, 512); //obliczenie widma amplitudowego (modułu widma zespolonego)
- maksimum(klarnet, 2800, NUM_SAMPLES, 1);
- czestotliwosc(maks);
- for (i = 0; i < NUM_SAMPLES; i++){
- bufor[i] = testsignal[i] >> 4;
- }
- acorr((DATA*)bufor, (DATA*)autokorelacja, NUM_SAMPLES, NUM_SAMPLES, bias);
- maksimum(autokorelacja, 17, NUM_SAMPLES, 2);
- while (1); // do not exit
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement