martaczaska

ZPS_4

Jun 14th, 2020
1,090
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.90 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.  
  17.  
  18. // Wzmocnienie wejścia w dB: 0 dla wejścia liniowego, 30 dla mikrofonowego
  19. #define WZMOCNIENIE_WEJSCIA_dB 30
  20.  
  21. // Wybór sygnału do przetwarzania
  22. // 0: próbki z wejścia mikrofonowego
  23. // 1: biały szum
  24. // 2: sygnał piłokształtny
  25. // 3: sinus (stała częstotliwość)
  26. // 4: sygnał z testsignal.h
  27. #define SIGNAL 0
  28.  
  29. /*MÓJ SHIT*/
  30. int k, i, j;
  31. #define NUM_SAMPLES 5000                                                                //ilosc probek
  32. #define N 57
  33. #define M 512
  34. short wynik[NUM_SAMPLES];
  35.  
  36. short bufor[N + 2];
  37. Int16 probka = 0;
  38. short obliczona = 0;
  39. long y = 0;
  40.  
  41. const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41,                 //wspolczynniki filtru obliczone w programie Matlab
  42. -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
  43. 1482, 1594, 1687, 1755, 1797, 1811, 1797, 1755, 1687, 1594, 1482, 1353,
  44. 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
  45. , -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)
  46. /*MÓJ SHIT*/
  47.  
  48.  
  49.  
  50. // Głowna procedura programu
  51.  
  52. void main(void) {
  53.  
  54.     // Inicjalizacja układu DSP
  55.     USBSTK5515_init();          // BSL - układ uruchomieniowy
  56.     pll_frequency_setup(100);   // ustawienie częstotliwości zegara DSP (PLL) na 100 MHz
  57.     aic3204_hardware_init();    // kodek dźwięku AIC3204
  58.     aic3204_init();             // jw.
  59.     USBSTK5515_ULED_init();     // diody LED
  60.     SAR_init_pushbuttons();     // przyciski
  61.     oled_init();                // wyświelacz OLED 2x19 znaków
  62.  
  63.     // ustawienie częstotliwości próbkowania i wzmocnienia wejścia
  64.     set_sampling_frequency_and_gain(48000L, WZMOCNIENIE_WEJSCIA_dB);
  65.  
  66.     // wypisanie komunikatu na wyświetlaczu
  67.     // 2 linijki po 19 znaków, tylko wielkie angielskie litery
  68.     oled_display_message("PROJEKT ZPS        ", "                   ");
  69.  
  70.     // 'krok' oznacza tryb pracy wybrany przyciskami
  71.     unsigned int krok = 0;
  72.     unsigned int poprzedni_krok = 9999;
  73.  
  74.     // zmienne do przechowywania wartości próbek
  75.     Int16 lewy_wejscie;
  76.     Int16 prawy_wejscie;
  77.     Int16 lewy_wyjscie;
  78.     Int16 prawy_wyjscie;
  79.     Int16 mono_wejscie;
  80.  
  81.     // Przetwarzanie próbek sygnału w pętli
  82.     while (1) {
  83.  
  84.         // odczyt próbek audio, zamiana na mono
  85.         aic3204_codec_read(&lewy_wejscie, &prawy_wejscie);
  86.         mono_wejscie = (lewy_wejscie >> 1) + (prawy_wejscie >> 1);
  87.  
  88.         // sprawdzamy czy wciśnięto przycisk
  89.         // argument: maksymalna liczba obsługiwanych trybów
  90.         krok = pushbuttons_read(4);
  91.         if (krok == 0) // oba wciśnięte - wyjście
  92.             break;
  93.         else if (krok != poprzedni_krok) {
  94.             // nastąpiła zmiana trybu - wciśnięto przycisk
  95.             USBSTK5515_ULED_setall(0x0F); // zgaszenie wszystkich diód
  96.             if (krok == 1) {
  97.                 // wypisanie informacji na wyświetlaczu
  98.                 oled_display_message("PROJEKT ZPS        ", "ORYGINALNY         ");
  99.                 // zapalenie diody nr 1
  100.                 USBSTK5515_ULED_on(0);
  101.             } else if (krok == 2) {
  102.                 oled_display_message("PROJEKT ZPS        ", "FILTR              ");
  103.                 USBSTK5515_ULED_on(1);
  104.             } else if (krok == 3) {
  105.                 oled_display_message("PROJEKT ZPS        ", "FILTR BLOK         ");
  106.                 USBSTK5515_ULED_on(2);
  107.             } else if (krok == 4) {
  108.                 oled_display_message("PROJEKT ZPS        ", "KROK 4             ");
  109.                 USBSTK5515_ULED_on(3);
  110.             }
  111.             // zapisujemy nowo ustawiony tryb
  112.             poprzedni_krok = krok;
  113.         }
  114.  
  115.  
  116.         // zadadnicze przetwarzanie w zależności od wybranego kroku
  117.  
  118.         if (krok == 1) {
  119.             // tryb podstawowy - kopiowanie sygnału
  120.             lewy_wyjscie = mono_wejscie;
  121.             prawy_wyjscie = mono_wejscie;
  122.  
  123.         } else if (krok == 2) {
  124.  
  125.             for(k = 0; k < NUM_SAMPLES; k++){                                                   //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
  126.                     //probka = mono_wejscie;
  127.                     fir((DATA*)&mono_wejscie, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N);            //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
  128.                     lewy_wyjscie =  obliczona;
  129.                     prawy_wyjscie = obliczona;
  130.                 }
  131.  
  132.  
  133.         } else if (krok == 3) {
  134.  
  135.             /*for(j = 0; j < M; j++){                                                   //pętla iterująca próbki z sygnalu wejsciowego
  136.                 for(i = 0; i < N; i++){                                                         //pętla realizująca obliczenia dla jednej próbki
  137.                         if(i > j || i == j){break;}                                                 //zatrzymanie pętli jesli i => j
  138.                         y = _smaci(y, mono_wejscie, filtr_fir[i]);                              //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  139.                     }
  140.                     wynik[j] = (short)(_sround(y) >> 15);                                       //zaokrąglenie i przejcie z formatu Q30 na Q15
  141.                 }*/
  142.  
  143.             for(i = 0; i < N; i++){                                                                 //pętla iterująca próbki z sygnalu wejsciowego
  144.                 y = _smaci(y, mono_wejscie, filtr_fir[i]);                                          //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
  145.                 lewy_wyjscie =  (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  146.                 prawy_wyjscie = (short)(_sround(y) >> 15);                                          //zaokrąglenie i przejcie z formatu Q30 na Q15
  147.             }
  148.  
  149.  
  150.             //lewy_wyjscie =  wynik;
  151.             ///prawy_wyjscie = wynik;
  152.  
  153.         } else if (krok == 4) {
  154.             lewy_wyjscie = mono_wejscie;
  155.             prawy_wyjscie = mono_wejscie;
  156.  
  157.  
  158.         }
  159.  
  160.         // zapisanie wartości na wyjście audio
  161.         aic3204_codec_write(lewy_wyjscie, prawy_wyjscie);
  162.  
  163.     }
  164.  
  165.     // wciśnięcie obu przycisków jednocześnie kończy działanie pętli
  166.     aic3204_disable();
  167.     oled_display_message("KONIEC PRACY       ", "                   ");
  168.     while(1); // nie wychodź z programu
  169. }
Advertisement
Add Comment
Please, Sign In to add comment