Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Projekt z Zastosowania Procesorów Sygnałowych 2020
- * Projekt dla DSP TMS320C5535
- */
- // Dołączenie wszelkich potrzebnych plików nagłówkowych
- #include "usbstk5515.h"
- #include "usbstk5515_led.h"
- #include "aic3204.h"
- #include "PLL.h"
- #include "bargraph.h"
- #include "oled.h"
- #include "pushbuttons.h"
- #include "Dsplib.h"
- #include "testsignal.h"
- #include "stdio.h"
- // Wzmocnienie wejścia w dB: 0 dla wejścia liniowego, 30 dla mikrofonowego
- #define WZMOCNIENIE_WEJSCIA_dB 30
- // Wybór sygnału do przetwarzania
- // 0: próbki z wejścia mikrofonowego
- // 1: biały szum
- // 2: sygnał piłokształtny
- // 3: sinus (stała częstotliwość)
- // 4: sygnał z testsignal.h
- #define SIGNAL 0
- /*MÓJ SHIT*/
- int k, i;
- int maks = 0, j = 0;
- #define NUM_SAMPLES 5000 //ilosc probek
- #define N 57
- #define M 512
- int wynik[NUM_SAMPLES];
- int klarnet[NUM_SAMPLES];
- int wybrana[NUM_SAMPLES];
- short bufor[N + 2];
- short obliczona = 0;
- long y = 0;
- const short filtr_fir[] = {-30, -32, -36, -41, -46, -51, -53, -50, -41, //wspolczynniki filtru obliczone w programie Matlab
- -23, 6, 49, 106, 178, 267,372, 492, 624, 766, 914, 1064, 1212, 1353,
- 1482, 1594, 1687, 1755, 1797, 1811, 1797, 1755, 1687, 1594, 1482, 1353,
- 1212, 1064, 914, 766, 624, 492, 372, 267, 178, 106,49, 6, -23, -41
- , -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)
- /*MÓJ SHIT*/
- void maksimum(int* tablica, int podloga, int number, int wybor){ //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 saw(int* tablica, unsigned int dl_tablicy, unsigned int step){ //funkcja generująca sygnał piłokształtny
- int amplituda = 0;
- int i;
- tablica[0] = 0;
- for(i = 1; i < dl_tablicy; i++){ //pętla licząca kolejne wartosci sygnału
- amplituda = amplituda + step;
- tablica[i] = amplituda;
- }
- }
- void sint(int* tablica_sin, unsigned int dl_tablicy, unsigned int step){ //funkcja generująca sygnał sinusoidalny
- signed int amplituda = 0;
- signed int x = 0;
- int i;
- int minus = 0;
- const long a_1 = 12868; //3.14159 w dziesiętnym (pi)
- const long a_2 = 21167; //5.16771 w dziesiętnym (pi^3/3!)
- const long a_3 = 10445; //2.55016 w dziesiętnym (pi^5/5!)
- const long a_4 = 2455; //0.59926 w dziesiętnym (pi^7/7!)
- int dwa, trzy, piec, siedem;
- long y = 0;
- tablica_sin[0] = 0;
- for(i = 1; i < dl_tablicy; i++){ //pętla licząca wartosci próbek
- amplituda = amplituda + step;
- if(amplituda < 0){minus = 1;} //dla amplitudy mniejszej od 0 (3 i 4 ćwiartka) zmieniamy znak
- else{minus = 0;}
- x = amplituda < 0 ? -amplituda : amplituda; //obliczenie wartoci bezwzględnej kąta fazowego
- if(x > 16384){
- x = 32767 - x;
- }
- dwa = _smpy(x, x);
- trzy = _smpy(dwa, x);
- piec = _smpy(dwa, trzy);
- siedem = _smpy(dwa, piec);
- y = a_1*x - a_2*trzy + a_3*piec - a_4*siedem; //szereg Taylora do 7 potęgi włącznie ('y' w Q27)
- if(minus == 1){
- tablica_sin[i] = -(int)((y + (1<<11)) >> 12); //przejscie do zapisu Q15 i ustawienie przeciwnego znaku
- } //dla ujemnej oryginalnej wartosci kąta fazowego (trzecia lub czwarta ćwiartka)
- else{
- tablica_sin[i] = (int)((y + (1<<11)) >> 12); //przejscie do zapisu Q15
- }
- }
- }
- // Głowna procedura programu
- void main(void) {
- // Inicjalizacja układu DSP
- USBSTK5515_init(); // BSL - układ uruchomieniowy
- pll_frequency_setup(100); // ustawienie częstotliwości zegara DSP (PLL) na 100 MHz
- aic3204_hardware_init(); // kodek dźwięku AIC3204
- aic3204_init(); // jw.
- USBSTK5515_ULED_init(); // diody LED
- SAR_init_pushbuttons(); // przyciski
- oled_init(); // wyświelacz OLED 2x19 znaków
- // ustawienie częstotliwości próbkowania i wzmocnienia wejścia
- set_sampling_frequency_and_gain(48000L, WZMOCNIENIE_WEJSCIA_dB);
- // wypisanie komunikatu na wyświetlaczu
- // 2 linijki po 19 znaków, tylko wielkie angielskie litery
- oled_display_message("PROJEKT ZPS ", " ");
- // 'krok' oznacza tryb pracy wybrany przyciskami
- unsigned int krok = 0;
- unsigned int poprzedni_krok = 9999;
- // zmienne do przechowywania wartości próbek
- Int16 lewy_wejscie;
- Int16 prawy_wejscie;
- Int16 lewy_wyjscie;
- Int16 prawy_wyjscie;
- Int16 mono_wejscie;
- // Przetwarzanie próbek sygnału w pętli
- while (1) {
- // odczyt próbek audio, zamiana na mono
- aic3204_codec_read(&lewy_wejscie, &prawy_wejscie);
- #if SIGNAL == 0
- mono_wejscie = (lewy_wejscie >> 1) + (prawy_wejscie >> 1);
- #elif SIGNAL == 1
- rand16init();
- mono_wejscie = rand16((DATA*)wybrana, NUM_SAMPLES);
- #elif SIGNAL == 2
- saw(wybrana, NUM_SAMPLES, krok);
- mono_wejscie = wybrana;
- #elif SIGNAL == 3
- sint(wybrana, NUM_SAMPLES, krok);
- mono_wejscie = wybrana[0];
- #elif SIGNAL == 4
- mono_wejscie = testsignal[0];
- #endif
- // sprawdzamy czy wciśnięto przycisk
- // argument: maksymalna liczba obsługiwanych trybów
- krok = pushbuttons_read(4);
- if (krok == 0) // oba wciśnięte - wyjście
- break;
- else if (krok != poprzedni_krok) {
- // nastąpiła zmiana trybu - wciśnięto przycisk
- USBSTK5515_ULED_setall(0x0F); // zgaszenie wszystkich diód
- if (krok == 1) {
- // wypisanie informacji na wyświetlaczu
- oled_display_message("PROJEKT ZPS ", "ORYGINALNY ");
- // zapalenie diody nr 1
- USBSTK5515_ULED_on(0);
- } else if (krok == 2) {
- oled_display_message("PROJEKT ZPS ", "FILTR ");
- USBSTK5515_ULED_on(1);
- } else if (krok == 3) {
- oled_display_message("PROJEKT ZPS ", "FILTR BLOK ");
- USBSTK5515_ULED_on(2);
- } else if (krok == 4) {
- oled_display_message("PROJEKT ZPS ", "WIDMO ");
- USBSTK5515_ULED_on(3);
- }
- // zapisujemy nowo ustawiony tryb
- poprzedni_krok = krok;
- }
- // zadadnicze przetwarzanie w zależności od wybranego kroku
- if (krok == 1) {
- // tryb podstawowy - kopiowanie sygnału
- lewy_wyjscie = mono_wejscie;
- prawy_wyjscie = mono_wejscie;
- } else if (krok == 2) {
- for(k = 0; k < NUM_SAMPLES; k++){ //pętla filtrująca sygnał z tablicy wejściowej metodą próbka po próbce
- fir((DATA*)&mono_wejscie, (DATA*)filtr_fir, (DATA*)&obliczona, bufor, 1, N); //wywołanie funkcji fir z biblioteki DSPLIB (liczenie pojedynczych próbek)
- lewy_wyjscie = obliczona;
- prawy_wyjscie = obliczona;
- }
- } else if (krok == 3) {
- for(i = 0; i < M; i++){ //pętla iterująca próbki z sygnalu wejsciowego
- y = _smaci(y, mono_wejscie, filtr_fir[i]); //mnożenie dwóch liczb Q15 sprawia, że y jest w formacie Q30
- lewy_wyjscie = (short)(_sround(y) >> 15); //zaokrąglenie i przejcie z formatu Q30 na Q15
- prawy_wyjscie = (short)(_sround(y) >> 15); //zaokrąglenie i przejcie z formatu Q30 na Q15
- }
- } else if (krok == 4) {
- lewy_wyjscie = mono_wejscie;
- prawy_wyjscie = mono_wejscie;
- wynik[j] = mono_wejscie
- rfft((DATA*)&wynik, 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
- wynik[i] = _smpy(wynik[i], wynik[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)
- wynik[k] = wynik[i] + wynik[i + 1];
- k++;
- }
- sqrt_16((DATA*)wynik, (DATA*)wynik, 512); //obliczenie widma amplitudowego (modułu widma zespolonego)
- maksimum(wynik, 2000, NUM_SAMPLES, 1); //obliczenie indeksu maksimum widma
- j++;
- }
- // zapisanie wartości na wyjście audio
- aic3204_codec_write(lewy_wyjscie, prawy_wyjscie);
- }
- // wciśnięcie obu przycisków jednocześnie kończy działanie pętli
- aic3204_disable();
- oled_display_message("KONIEC PRACY ", " ");
- while(1); // nie wychodź z programu
- }
Advertisement
Add Comment
Please, Sign In to add comment