martaczaska

ZSP_4_3

Jun 14th, 2020
1,071
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.42 KB | None | 0 0
  1. /*
  2.  * Projekt z Zastosowania Procesorów Sygnałowych 2020
  3.  * Projekt dla DSP TMS320C5535
  4.  */
  5.  
  6.  
  7. // Dołączenie wszelkich potrzebnych plików nagłówkowych
  8. #include "usbstk5515.h"
  9. #include "usbstk5515_led.h"
  10. #include "aic3204.h"
  11. #include "PLL.h"
  12. #include "bargraph.h"
  13. #include "oled.h"
  14. #include "pushbuttons.h"
  15. #include "Dsplib.h"
  16. #include "testsignal.h"
  17. #include "stdio.h"
  18.  
  19.  
  20. // Wzmocnienie wejścia w dB: 0 dla wejścia liniowego, 30 dla mikrofonowego
  21. #define WZMOCNIENIE_WEJSCIA_dB 30
  22.  
  23. // Wybór sygnału do przetwarzania
  24. // 0: próbki z wejścia mikrofonowego
  25. // 1: biały szum
  26. // 2: sygnał piłokształtny
  27. // 3: sinus (stała częstotliwość)
  28. // 4: sygnał z testsignal.h
  29. #define SIGNAL 0
  30.  
  31. /*MÓJ SHIT*/
  32. int k, i, j;
  33. int maks = 0;
  34. #define NUM_SAMPLES 5000                                                                //ilosc probek
  35. #define N 57
  36. #define M 512
  37. short wynik[NUM_SAMPLES];
  38. int klarnet[NUM_SAMPLES];
  39.  
  40. short bufor[N + 2];
  41. short obliczona = 0;
  42. long y = 0;
  43.  
  44. const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41,                 //wspolczynniki filtru obliczone w programie Matlab
  45. -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
  46. 1482, 1594, 1687, 1755, 1797, 1811, 1797, 1755, 1687, 1594, 1482, 1353,
  47. 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
  48. , -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)
  49. /*MÓJ SHIT*/
  50.  
  51. void maksimum(int* tablica, int podloga, int number, int wybor){ //funkcja wyznaczająca indeks warstosci widma odpowiadającej pierwszemu istotnemu maksimum
  52.     int znalezione = 0;
  53.     int roznica = 0;
  54.  
  55.     for(i = 0; i < number; i++){
  56.             if(tablica[i] > podloga){                           //porównanie wartosci próbki z ustaloną podłogą szumową
  57.                 roznica = tablica[i] - tablica[i - 1];          //liczenie pochodnej widma (różnica próbki bieżącej i próbki poprzedniej)
  58.                 if(roznica > 0){                                //gdy próbka bieżąca jest większa od poprzedniej, zostaje przypisana do maksimum
  59.                     maks = i;
  60.                     znalezione = 1;
  61.                 }
  62.                 else{
  63.                     if(znalezione==1 && (roznica < 0)){        //gdy próbka bieżąca jest mniejsza od poprzedniej, a maksimum zostało już raz przypisane:
  64.                         break;                                 //(znalezione = 1), to kończymy poszukiwania
  65.                     }
  66.                     else{continue;}
  67.                 }
  68.             }
  69.             else{continue;}
  70.     }
  71.     printf("Indeks maksimum: ");
  72.     printf("%d \n", maks);
  73. }
  74.  
  75. // Głowna procedura programu
  76.  
  77. void main(void) {
  78.  
  79.     // Inicjalizacja układu DSP
  80.     USBSTK5515_init();          // BSL - układ uruchomieniowy
  81.     pll_frequency_setup(100);   // ustawienie częstotliwości zegara DSP (PLL) na 100 MHz
  82.     aic3204_hardware_init();    // kodek dźwięku AIC3204
  83.     aic3204_init();             // jw.
  84.     USBSTK5515_ULED_init();     // diody LED
  85.     SAR_init_pushbuttons();     // przyciski
  86.     oled_init();                // wyświelacz OLED 2x19 znaków
  87.  
  88.     // ustawienie częstotliwości próbkowania i wzmocnienia wejścia
  89.     set_sampling_frequency_and_gain(48000L, WZMOCNIENIE_WEJSCIA_dB);
  90.  
  91.     // wypisanie komunikatu na wyświetlaczu
  92.     // 2 linijki po 19 znaków, tylko wielkie angielskie litery
  93.     oled_display_message("PROJEKT ZPS        ", "                   ");
  94.  
  95.     // 'krok' oznacza tryb pracy wybrany przyciskami
  96.     unsigned int krok = 0;
  97.     unsigned int poprzedni_krok = 9999;
  98.  
  99.     // zmienne do przechowywania wartości próbek
  100.     Int16 lewy_wejscie;
  101.     Int16 prawy_wejscie;
  102.     Int16 lewy_wyjscie;
  103.     Int16 prawy_wyjscie;
  104.     Int16 mono_wejscie;
  105.  
  106.     // Przetwarzanie próbek sygnału w pętli
  107.     while (1) {
  108.  
  109.         // odczyt próbek audio, zamiana na mono
  110.         aic3204_codec_read(&lewy_wejscie, &prawy_wejscie);
  111.         mono_wejscie = (lewy_wejscie >> 1) + (prawy_wejscie >> 1);
  112.  
  113.         // sprawdzamy czy wciśnięto przycisk
  114.         // argument: maksymalna liczba obsługiwanych trybów
  115.         krok = pushbuttons_read(4);
  116.         if (krok == 0) // oba wciśnięte - wyjście
  117.             break;
  118.         else if (krok != poprzedni_krok) {
  119.             // nastąpiła zmiana trybu - wciśnięto przycisk
  120.             USBSTK5515_ULED_setall(0x0F); // zgaszenie wszystkich diód
  121.             if (krok == 1) {
  122.                 // wypisanie informacji na wyświetlaczu
  123.                 oled_display_message("PROJEKT ZPS        ", "ORYGINALNY         ");
  124.                 // zapalenie diody nr 1
  125.                 USBSTK5515_ULED_on(0);
  126.             } else if (krok == 2) {
  127.                 oled_display_message("PROJEKT ZPS        ", "FILTR              ");
  128.                 USBSTK5515_ULED_on(1);
  129.             } else if (krok == 3) {
  130.                 oled_display_message("PROJEKT ZPS        ", "FILTR BLOK         ");
  131.                 USBSTK5515_ULED_on(2);
  132.             } else if (krok == 4) {
  133.                 oled_display_message("PROJEKT ZPS        ", "WIDMO              ");
  134.                 USBSTK5515_ULED_on(3);
  135.             }
  136.             // zapisujemy nowo ustawiony tryb
  137.             poprzedni_krok = krok;
  138.         }
  139.  
  140.  
  141.         // zadadnicze przetwarzanie w zależności od wybranego kroku
  142.  
  143.         if (krok == 1) {
  144.             // tryb podstawowy - kopiowanie sygnału
  145.             lewy_wyjscie = mono_wejscie;
  146.             prawy_wyjscie = mono_wejscie;
  147.  
  148.         } else if (krok == 2) {
  149.  
  150.             for(k = 0; k < NUM_SAMPLES; k++){                                                   //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
  151.                     fir((DATA*)&mono_wejscie, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N);            //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
  152.                     lewy_wyjscie =  obliczona;
  153.                     prawy_wyjscie = obliczona;
  154.                 }
  155.  
  156.  
  157.         } else if (krok == 3) {
  158.  
  159.             for(i = 0; i < M; i++){                                                                 //pętla iterująca próbki z sygnalu wejsciowego
  160.                 y = _smaci(y, mono_wejscie, filtr_fir[i]);                                          //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  161.                 lewy_wyjscie =  (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  162.                 prawy_wyjscie = (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  163.             }
  164.  
  165.         } else if (krok == 4) {
  166.  
  167.             lewy_wyjscie = mono_wejscie;
  168.             prawy_wyjscie = mono_wejscie;
  169.  
  170.             for (i = 0; i < NUM_SAMPLES; i++){                        //przypisanie probek nagrania dźwięku klarnetu do tablicy klarnet[]
  171.                 klarnet[i] = testsignal[i];
  172.             }
  173.  
  174.             rfft((DATA*)klarnet, NUM_SAMPLES, SCALE);                 //funkcja z biblioteki DSPLIB pozwalająca obliczenie widma (FFT) dla sygnału rzeczywistego
  175.  
  176.             for (i = 0; i < NUM_SAMPLES; i++){                        //obliczenie kwadratów próbek widma
  177.                 klarnet[i] = _smpy(klarnet[i], klarnet[i]);
  178.             }
  179.  
  180.             for(i = 2; i < NUM_SAMPLES; i = i + 2){                   //sumowanie kwadratów częsci rzeczywistych i urojonych (Re[i]^2 + Im[i+1]^2)
  181.                 klarnet[j] = klarnet[i] + klarnet[i + 1];
  182.                 j++;
  183.             }
  184.  
  185.            sqrt_16((DATA*)klarnet, (DATA*)klarnet, 512);              //obliczenie widma amplitudowego (modułu widma zespolonego)
  186.            maksimum(klarnet, 2000, NUM_SAMPLES, 1);                   //obliczenie indeksu maksimum widma
  187.  
  188.         }
  189.  
  190.         // zapisanie wartości na wyjście audio
  191.         aic3204_codec_write(lewy_wyjscie, prawy_wyjscie);
  192.  
  193.     }
  194.  
  195.     // wciśnięcie obu przycisków jednocześnie kończy działanie pętli
  196.     aic3204_disable();
  197.     oled_display_message("KONIEC PRACY       ", "                   ");
  198.     while(1); // nie wychodź z programu
  199. }
Advertisement
Add Comment
Please, Sign In to add comment