Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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){ //funkcja wyznaczająca indeks warstosci widma odpowiadającej pierwszemu istotnemu maksimum
- int znalezione = 0;
- int roznica = 0;
- for(i = 0; 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];
- }
- 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);
- czestotliwosc(maks);
- while (1); // do not exit
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement