martaczaska

ZPS_4_4

Jun 14th, 2020
1,151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.73 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;
  33. int maks = 0, j = 0;
  34. #define NUM_SAMPLES 5000                                                                //ilosc probek
  35. #define N 57
  36. #define M 512
  37. int wynik[NUM_SAMPLES];
  38. int klarnet[NUM_SAMPLES];
  39. int wybrana[NUM_SAMPLES];
  40.  
  41. short bufor[N + 2];
  42. short obliczona = 0;
  43. long y = 0;
  44.  
  45. const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41,                 //wspolczynniki filtru obliczone w programie Matlab
  46. -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
  47. 1482, 1594, 1687, 1755, 1797, 1811, 1797, 1755, 1687, 1594, 1482, 1353,
  48. 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
  49. , -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)
  50. /*MÓJ SHIT*/
  51.  
  52. void maksimum(int* tablica, int podloga, int number, int wybor){ //funkcja wyznaczająca indeks warstosci widma odpowiadającej pierwszemu istotnemu maksimum
  53.     int znalezione = 0;
  54.     int roznica = 0;
  55.  
  56.     for(i = 0; i < number; i++){
  57.             if(tablica[i] > podloga){                           //porównanie wartosci próbki z ustaloną podłogą szumową
  58.                 roznica = tablica[i] - tablica[i - 1];          //liczenie pochodnej widma (różnica próbki bieżącej i próbki poprzedniej)
  59.                 if(roznica > 0){                                //gdy próbka bieżąca jest większa od poprzedniej, zostaje przypisana do maksimum
  60.                     maks = i;
  61.                     znalezione = 1;
  62.                 }
  63.                 else{
  64.                     if(znalezione==1 && (roznica < 0)){        //gdy próbka bieżąca jest mniejsza od poprzedniej, a maksimum zostało już raz przypisane:
  65.                         break;                                 //(znalezione = 1), to kończymy poszukiwania
  66.                     }
  67.                     else{continue;}
  68.                 }
  69.             }
  70.             else{continue;}
  71.     }
  72.     printf("Indeks maksimum: ");
  73.     printf("%d \n", maks);
  74. }
  75.  
  76. void saw(int* tablica, unsigned int dl_tablicy, unsigned int step){                 //funkcja generująca sygnał piłokształtny
  77.     int amplituda = 0;
  78.     int i;
  79.     tablica[0] = 0;
  80.     for(i = 1; i < dl_tablicy; i++){                                                //pętla licząca kolejne wartosci sygnału
  81.         amplituda = amplituda + step;
  82.         tablica[i] = amplituda;
  83.     }
  84. }
  85.  
  86. void sint(int* tablica_sin, unsigned int dl_tablicy, unsigned int step){            //funkcja generująca sygnał sinusoidalny
  87.         signed int amplituda = 0;
  88.         signed int x = 0;
  89.         int i;
  90.         int minus = 0;
  91.         const long a_1 = 12868; //3.14159 w dziesiętnym (pi)
  92.         const long a_2 = 21167; //5.16771  w dziesiętnym (pi^3/3!)
  93.         const long a_3 = 10445; //2.55016 w dziesiętnym (pi^5/5!)
  94.         const long a_4 = 2455; //0.59926 w dziesiętnym (pi^7/7!)
  95.  
  96.         int dwa, trzy, piec, siedem;
  97.         long y = 0;
  98.  
  99.         tablica_sin[0] = 0;
  100.         for(i = 1; i < dl_tablicy; i++){                                            //pętla licząca wartosci próbek
  101.             amplituda = amplituda + step;
  102.  
  103.             if(amplituda < 0){minus = 1;}                                          //dla amplitudy mniejszej od 0 (3 i 4 ćwiartka) zmieniamy znak
  104.             else{minus = 0;}
  105.  
  106.             x = amplituda < 0 ? -amplituda : amplituda;                             //obliczenie wartoci bezwzględnej kąta fazowego
  107.             if(x > 16384){
  108.                 x = 32767 - x;
  109.             }
  110.             dwa = _smpy(x, x);
  111.             trzy = _smpy(dwa, x);
  112.             piec = _smpy(dwa, trzy);
  113.             siedem = _smpy(dwa, piec);
  114.  
  115.             y = a_1*x - a_2*trzy + a_3*piec - a_4*siedem;                          //szereg Taylora do 7 potęgi włącznie ('y' w Q27)
  116.  
  117.             if(minus == 1){
  118.                 tablica_sin[i] = -(int)((y + (1<<11)) >> 12);                      //przejscie do zapisu Q15 i ustawienie przeciwnego znaku
  119.             }                                                                      //dla ujemnej oryginalnej wartosci kąta fazowego (trzecia lub czwarta ćwiartka)
  120.             else{
  121.                 tablica_sin[i] = (int)((y + (1<<11)) >> 12);                       //przejscie do zapisu Q15
  122.             }
  123.         }
  124. }
  125.  
  126. // Głowna procedura programu
  127.  
  128. void main(void) {
  129.  
  130.     // Inicjalizacja układu DSP
  131.     USBSTK5515_init();          // BSL - układ uruchomieniowy
  132.     pll_frequency_setup(100);   // ustawienie częstotliwości zegara DSP (PLL) na 100 MHz
  133.     aic3204_hardware_init();    // kodek dźwięku AIC3204
  134.     aic3204_init();             // jw.
  135.     USBSTK5515_ULED_init();     // diody LED
  136.     SAR_init_pushbuttons();     // przyciski
  137.     oled_init();                // wyświelacz OLED 2x19 znaków
  138.  
  139.     // ustawienie częstotliwości próbkowania i wzmocnienia wejścia
  140.     set_sampling_frequency_and_gain(48000L, WZMOCNIENIE_WEJSCIA_dB);
  141.  
  142.     // wypisanie komunikatu na wyświetlaczu
  143.     // 2 linijki po 19 znaków, tylko wielkie angielskie litery
  144.     oled_display_message("PROJEKT ZPS        ", "                   ");
  145.  
  146.     // 'krok' oznacza tryb pracy wybrany przyciskami
  147.     unsigned int krok = 0;
  148.     unsigned int poprzedni_krok = 9999;
  149.  
  150.     // zmienne do przechowywania wartości próbek
  151.     Int16 lewy_wejscie;
  152.     Int16 prawy_wejscie;
  153.     Int16 lewy_wyjscie;
  154.     Int16 prawy_wyjscie;
  155.     Int16 mono_wejscie;
  156.  
  157.     // Przetwarzanie próbek sygnału w pętli
  158.     while (1) {
  159.  
  160.         // odczyt próbek audio, zamiana na mono
  161.         aic3204_codec_read(&lewy_wejscie, &prawy_wejscie);
  162.  
  163.         #if SIGNAL == 0
  164.             mono_wejscie = (lewy_wejscie >> 1) + (prawy_wejscie >> 1);
  165.         #elif SIGNAL == 1
  166.             rand16init();
  167.             mono_wejscie = rand16((DATA*)wybrana, NUM_SAMPLES);
  168.         #elif SIGNAL == 2
  169.             saw(wybrana, NUM_SAMPLES, krok);
  170.             mono_wejscie = wybrana;
  171.         #elif SIGNAL == 3
  172.             sint(wybrana, NUM_SAMPLES, krok);
  173.             mono_wejscie = wybrana[0];
  174.         #elif SIGNAL == 4
  175.             mono_wejscie = testsignal[0];
  176.         #endif
  177.  
  178.         // sprawdzamy czy wciśnięto przycisk
  179.         // argument: maksymalna liczba obsługiwanych trybów
  180.         krok = pushbuttons_read(4);
  181.         if (krok == 0) // oba wciśnięte - wyjście
  182.             break;
  183.         else if (krok != poprzedni_krok) {
  184.             // nastąpiła zmiana trybu - wciśnięto przycisk
  185.             USBSTK5515_ULED_setall(0x0F); // zgaszenie wszystkich diód
  186.             if (krok == 1) {
  187.                 // wypisanie informacji na wyświetlaczu
  188.                 oled_display_message("PROJEKT ZPS        ", "ORYGINALNY         ");
  189.                 // zapalenie diody nr 1
  190.                 USBSTK5515_ULED_on(0);
  191.             } else if (krok == 2) {
  192.                 oled_display_message("PROJEKT ZPS        ", "FILTR              ");
  193.                 USBSTK5515_ULED_on(1);
  194.             } else if (krok == 3) {
  195.                 oled_display_message("PROJEKT ZPS        ", "FILTR BLOK         ");
  196.                 USBSTK5515_ULED_on(2);
  197.             } else if (krok == 4) {
  198.                 oled_display_message("PROJEKT ZPS        ", "WIDMO              ");
  199.                 USBSTK5515_ULED_on(3);
  200.             }
  201.             // zapisujemy nowo ustawiony tryb
  202.             poprzedni_krok = krok;
  203.         }
  204.  
  205.  
  206.         // zadadnicze przetwarzanie w zależności od wybranego kroku
  207.  
  208.         if (krok == 1) {
  209.             // tryb podstawowy - kopiowanie sygnału
  210.             lewy_wyjscie = mono_wejscie;
  211.             prawy_wyjscie = mono_wejscie;
  212.  
  213.         } else if (krok == 2) {
  214.  
  215.             for(k = 0; k < NUM_SAMPLES; k++){                                                   //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
  216.                     fir((DATA*)&mono_wejscie, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N);            //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
  217.                     lewy_wyjscie =  obliczona;
  218.                     prawy_wyjscie = obliczona;
  219.                 }
  220.  
  221.  
  222.         } else if (krok == 3) {
  223.  
  224.             for(i = 0; i < M; i++){                                                                 //pętla iterująca próbki z sygnalu wejsciowego
  225.                 y = _smaci(y, mono_wejscie, filtr_fir[i]);                                          //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  226.                 lewy_wyjscie =  (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  227.                 prawy_wyjscie = (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  228.             }
  229.  
  230.         } else if (krok == 4) {
  231.  
  232.             lewy_wyjscie = mono_wejscie;
  233.             prawy_wyjscie = mono_wejscie;
  234.  
  235.  
  236.             wynik[j] = mono_wejscie
  237.  
  238.             rfft((DATA*)&wynik, NUM_SAMPLES, SCALE);                 //funkcja z biblioteki DSPLIB pozwalająca obliczenie widma (FFT) dla sygnału rzeczywistego
  239.  
  240.             for (i = 0; i < NUM_SAMPLES; i++){                        //obliczenie kwadratów próbek widma
  241.                 wynik[i] = _smpy(wynik[i], wynik[i]);
  242.             }
  243.  
  244.             for(i = 2; i < NUM_SAMPLES; i = i + 2){                   //sumowanie kwadratów częsci rzeczywistych i urojonych (Re[i]^2 + Im[i+1]^2)
  245.                 wynik[k] = wynik[i] + wynik[i + 1];
  246.                 k++;
  247.             }
  248.  
  249.            sqrt_16((DATA*)wynik, (DATA*)wynik, 512);              //obliczenie widma amplitudowego (modułu widma zespolonego)
  250.            maksimum(wynik, 2000, NUM_SAMPLES, 1);                   //obliczenie indeksu maksimum widma
  251.            j++;
  252.  
  253.         }
  254.  
  255.         // zapisanie wartości na wyjście audio
  256.         aic3204_codec_write(lewy_wyjscie, prawy_wyjscie);
  257.  
  258.     }
  259.  
  260.     // wciśnięcie obu przycisków jednocześnie kończy działanie pętli
  261.     aic3204_disable();
  262.     oled_display_message("KONIEC PRACY       ", "                   ");
  263.     while(1); // nie wychodź z programu
  264. }
Advertisement
Add Comment
Please, Sign In to add comment