Advertisement
martaczaska

ZPS_3_finito

May 31st, 2020
984
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.89 KB | None | 0 0
  1. /*
  2. WYKONAŁA: MARTA TRZASKA 171632
  3. TELEKOMUNIKACJA 1, SEMESTR 6
  4. */
  5.  
  6. #include <dsplib.h>
  7. #include <testsignal.h>                                          //tablica z próbkami fragmentu nagrania dźwięku klarnetu
  8. #include <okno_hamminga.h>                                       //tablica ze współczynnikami okna Hamminga (format Q15)
  9. #include <stdio.h>
  10.  
  11. #define NUM_SAMPLES 2048                                        //ilosc probek
  12. #define Nr 1000                                                 //liczba wartoci funkcji autokorelacji
  13.  
  14. int klarnet[NUM_SAMPLES];
  15. int bufor[NUM_SAMPLES];
  16. int autokorelacja[NUM_SAMPLES];
  17.  
  18. int i;
  19. int j = 0;
  20.  
  21. int maks = 0;
  22.  
  23. const long f_s = 48000;
  24.  
  25. void maksimum(int* tablica, int podloga, int number, int wybor){ //funkcja wyznaczająca indeks warstosci widma odpowiadającej pierwszemu istotnemu maksimum
  26.     int znalezione = 0;
  27.     int roznica = 0;
  28.     int w;
  29.  
  30.     if(wybor == 1){                                             //dla
  31.         w = 0;
  32.     }
  33.     else if(wybor == 2){
  34.         w = 1;
  35.     }
  36.  
  37.     for(i = w; i < number; i++){
  38.             if(tablica[i] > podloga){                           //porównanie wartosci próbki z ustaloną podłogą szumową
  39.                 roznica = tablica[i] - tablica[i - 1];          //liczenie pochodnej widma (różnica próbki bieżącej i próbki poprzedniej)
  40.                 if(roznica > 0){                                //gdy próbka bieżąca jest większa od poprzedniej, zostaje przypisana do maksimum
  41.                     maks = i;
  42.                     znalezione = 1;
  43.                 }
  44.                 else{
  45.                     if(znalezione==1 && (roznica < 0)){        //gdy próbka bieżąca jest mniejsza od poprzedniej, a maksimum zostało już raz przypisane:
  46.                         break;                                 //(znalezione = 1), to kończymy poszukiwania
  47.                     }
  48.                     else{continue;}
  49.                 }
  50.             }
  51.             else{continue;}
  52.     }
  53.  
  54.     printf("Indeks maksimum: ");
  55.     printf("%d \n", maks);
  56. }
  57.  
  58. void czestotliwosc(int p){                                    //funkcja wyznaczająca częstotliwosć maksimum widma
  59.     long df = f_s >> 11;                                      //dzielenie przez 2048  (f_s = 48000)
  60.     df = ((df << 15) + (1 << 14));                            //przejcie na format Q15
  61.     int f_maks = (int)((p*df) >> 15);                         //wyznaczenie częstotliwosci dla maksimum (przemnożenie indeksu maksimum i rozdzielczosci częstot.)
  62.  
  63.     printf("Częstotliwosc znalezionego maksimum wynosi: ");
  64.     printf("%d \n", f_maks);
  65. }
  66.  
  67.  
  68. void main(void) {
  69.     int x = okno_hamminga[0];
  70.  
  71.     for (i = 0; i < NUM_SAMPLES; i++){                        //przypisanie probek nagrania dźwięku klarnetu do tablicy klarnet[]
  72.         klarnet[i] = testsignal[i];
  73.         //klarnet[i] = _smpy(okno_hamminga[i], testsignal[i]);//dla zad. 3
  74.     }
  75.  
  76.     rfft((DATA*)klarnet, NUM_SAMPLES, SCALE);                 //funkcja z biblioteki DSPLIB pozwalająca obliczenie widma (FFT) dla sygnału rzeczywistego
  77.  
  78.     for (i = 0; i < NUM_SAMPLES; i++){                        //obliczenie kwadratów próbek widma
  79.         klarnet[i] = _smpy(klarnet[i], klarnet[i]);
  80.     }
  81.  
  82.     for(i = 2; i < NUM_SAMPLES; i = i + 2){                   //sumowanie kwadratów częsci rzeczywistych i urojonych (Re[i]^2 + Im[i+1]^2)
  83.         klarnet[j] = klarnet[i] + klarnet[i + 1];
  84.         j++;
  85.     }
  86.  
  87.     sqrt_16((DATA*)klarnet, (DATA*)klarnet, 512);            //obliczenie widma amplitudowego (modułu widma zespolonego)
  88.  
  89.    maksimum(klarnet, 2800, NUM_SAMPLES, 1);
  90.    czestotliwosc(maks);
  91.  
  92.     for (i = 0; i < NUM_SAMPLES; i++){
  93.             bufor[i] = testsignal[i] >> 4;
  94.         }
  95.  
  96.     acorr((DATA*)bufor, (DATA*)autokorelacja, NUM_SAMPLES, NUM_SAMPLES, bias);
  97.  
  98.     maksimum(autokorelacja, 17, NUM_SAMPLES, 2);
  99.  
  100.  
  101.     while (1); // do not exit
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement