Advertisement
martaczaska

plum

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