POLITECHNIKA POZNAŃSKA KATEDRA STEROWANIA I INŻYNIERII SYSTEMÓW Pracownia Układów Elektronicznych i Przetwarzania Sygnałów PROGRAMOWALNE UKŁADY CYFROWE I PROCESORY SYGNAŁOWE Instrukcja do ćwiczeń laboratoryjnych Projektowanie i implementacja filtru FIR 1. Cel ćwiczenia Celem ćwiczenia jest zaprojektowanie filtru przy pomocy pakietu MATLAB, a następnie jego zaimplementowanie na module DM6437 EVM. Podczas ćwiczenia zostanie dokonana filtracja sygnałów DTMF. AIC 33 Codec LINE IN LINE OUT Rys. 1. Rozmieszczenie gniazd wykorzystywanych w ćwiczeniu Wymagania: - system operacyjny: Windows 7 - środowisko programistyczne: Code Composer Studio v4. 2. Sprawozdanie W sprawozdaniu należy zamieścić odpowiedzi na pytania. 3. Przebieg ćwiczenia 3.1. Wstęp str. 1
Połącz wyjście HeadPhone Out komputera z wejściem Line In modułu oraz wyjście Line Out modułu ze słuchawkami/głośnikami. Połączeń dokonaj przewodami z końcówkami typu Mini Jack. Połącz moduł z komputerem oraz podłącz do niego zasilanie. Uruchom środowisko Code Composer Studio v4. Dokonaj ustanowienia komunikacji pomiędzy CCS i modułem. 3.2. Importowanie projektu Z menu File wybierz Import. Z listy CCS wybierz Existing CCS/CCE Eclipse Project i wciśniej Next. W kolejnym oknie zaznacz opcję Select archive file i kliknij przycisk Browse. Wskaż plik aic33_audio_fir.zip. Upewnij się, że na liście do importu zaznaczony jest projekt aic33_audio_fir. Zaimportuj go. Rys. 2. Okno importu projektu Rys. 3. Okno Project view str. 2
3.3. Projektowanie filtru Celem jest zaprojektowanie filtru dolnoprzepustowego FIR o długości 127. Do zaprojektowania filtru zostanie użyta metoda okienkowa. Częstotliwość odcięcia zostanie ustawiona na wartość 1 khz przy założeniu szybkości próbkowania 48 khz. Uruchom środowisko MATLAB. Poleceniem fdatool, uruchom narzędzie projektowania filtrów: Filter Design & Analysis Tool. Wprowadź następujące parametry: w obszarze Response Type wybierz Lowpass, w obszarze Design Method wybierz FIR, a w rozwijanym menu metodę projektowania Window, w obszarze Filter Order wybierz Specify order i wprowadź wartość 127, w obszarze Options w polu Window wybierz typ okna Hamming, w obszarze Frequency Specifications w polu Units wybierz Hz, w polu Fs wpisz 48000, w polu Fc wpisz 1000. Po zakończeniu wprowadzania kliknij przycisk Design Filter. W obszarze Magnitude Response (db) pojawi się charakterystyka częstotliwościowoamplitudowa projektowanego filtru. Odpowiedz na pytania Rys. 4. Okno narzędzia Filter Design & Analysis Tool Naszkicuj schemat zaprojektowanego filtru. Na podstawie charakterystyki częstotliwościowo-amplitudowej określ tłumienie w paśmie zaporowym oraz szerokości pasm: przejściowego, przepustowego i zaporowego. str. 3
3.4. Eksportowanie filtru W oknie Filter Design & Analysis Tool z menu Targets wybierz Code Composer Studio (tm) IDE. Otworzy się okno Export To Code Composer Studio (tm) IDE. W obszerz Variable names In C header file w polu Numerator wpisz h, a w polu Numerator lenght hl ; W obszarze Data Type to use in export zaznacz Export as, a następnie wybierz Signed 16-bit integer Kliknij przycisk Generate. Wybierz lokalizację zapisu w katalogu głównym projektu: C:\Laboratoria\PUCiPS\aic33_audio_fir Po zapisaniu kliknij przycisk Close. Rys. 5. Okno Export to Code Composer Studio (tm) IDE 3.5. Implementacja zaprojektowanego filtru Przejdź do programu Code Composer Studio. Otwórz plik main.c i przy pomocy dyrektywy include dołącz plik "fdacoefs.h". Zapoznaj się z zawartością plików main.c oraz fdacoefs.h. Zmodyfikuj program tak, aby na jednym kanale odtwarzany był oryginalny sygnał wejściowy, a na drugim sygnał filtrowany. Z katalogu C:\Laboratoria\PUCiPS\aic33_audio_fir\DTMF - przykłady odtwórz przy pomocy programu Windows Media Player dowolny plik sygnału DTMF. Uruchom program na module DM6437. Odpowiedz na pytania Opisz funkcję fir_filter(). Co zawiera utworzony plik fdacoefs.h? 3.6. Podłączanie i konfiguracja oscyloskopu Podłącz wyjście modułu Line out do wejść CH1 i CH2 oscyloskopu cyfrowego. Połączenia dokonaj przewodem Mini Jack - RCA z przejściówkami RCA - BNC. Wciśnij przycisk AUTO. str. 4
Wciśnij CH1 i wybierz Coupling AC, BW Limit OFF, Probe 1X, Digital Filter OFF. Ustawienia powtórz dla CH2. Wciśnij MATH i wybierz Operate FFT, Display Full Screen, Scale V RMS. Dwukrotnym naciśnięciem CH1 i CH2 wyłącz wykresy przebiegów czasowych sygnału. Pokrętłami SCALE ustaw wartości dla VERTICAL 1.00mVrms/div, dla HORIZONTAL 500.0kHz/div. Ustaw pozycję wykresu pokrętłami POSITION tak, aby widoczny był początek widma sygnału. Zmieniaj odtwarzane pliki sygnałów DTMF, aby zaobserwować zmiany w widmie sygnału Zmień źródło sygnału wejściowego wciskając MATH, następnie wybierając Source CH1 lub CH2. Rys. 6. Podłączenie oscyloskopu Rys. 7. Charakterystyka amplitudowo-fazowa przykładowego sygnału DTMF (klawisz #) przed filtracją str. 5
Rys. 8. Charakterystyka amplitudowo-fazowa przykładowego sygnału DTMF (klawisz #) po filtracji Rys. 9. Przebieg przykładowego sygnału DTMF (klawisz #); niebieski przed filtracją, czerwony po filtracji Odpowiedz na pytania Na czym polega sygnalizacja DTMF? Opisz wyświetlane na oscyloskopie wykresy FFT. Dokonaj w tabeli zestawienia plików wraz z określeniem odfiltrowanych składowych. Zademonstruj działanie programu z pkt. 3.6. i przekaż jego kod prowadzącemu zajęcia. 3.7. Po zakończeniu ćwiczenia z menu Project wybierz Save, a następnie Close. 3. Załączniki Kod programu main.c: #include "stdio.h" #include "evmdm6437.h" #include "evmdm6437_aic33.h" str. 6
/* ------------------------------------------------------------------------ * * * * main( ) * * * * ------------------------------------------------------------------------ */ Int16 R_in[128]; /* Input samples R_in[0] most recent, R_in[127] oldest */ short fir_filter (short input) Int32 i; Int16 output; Int32 acc=0; Int32 prod; R_in[0] = input; /* Update most recent sample */ acc = 0; /* Zero accumulator */ for (i=0; i<hl; i++) /* 128 taps */ prod = (h[i]*r_in[i]); /* Perform Q.15 multiplication */ acc = acc + prod; /* Update 32-bit accumulator, catering */ /* for temporary overflow. */ output = (Int16) (acc>>15); /* Cast output to 16-bits. */ for (i=hl-1; i>0; i--) /* Shift delay samples */ R_in[i]=R_in[i-1]; return output; void main( void ) Int16 msec, sec; Int16 sample; Int16 sample_data_l_in = 0; Int16 sample_data_r_in = 0; Int16 sample_data_l_out = 0; Int16 sample_data_r_out = 0; AIC33_CodecHandle aic33handle; /* Initialize BSL */ EVMDM6437_init( ); /* Grab AIC33 handle */ aic33handle = EVMDM6437_AIC33_openCodec( AIC33_MCBSP_ID, &aic33config ); /* Play Loop */ for ( sec = 0 ; sec < 100 ; sec++ ) /* * For each second there are 48000 left/right samples */ for ( msec = 0 ; msec < 10000 ; msec++ ) /* * For each millisecond there are 48 left/right samples */ for ( sample = 0 ; sample < 48 ; sample++ ) /* Read then write the left sample */ while (! EVMDM6437_AIC33_read16( aic33handle, &sample_data_l_in ) ); sample_data_l_out = sample_data_l_in; while (! EVMDM6437_AIC33_write16( aic33handle, sample_data_l_out ) ); /* Read then write the right sample */ while (! EVMDM6437_AIC33_read16( aic33handle, &sample_data_r_in ) ); sample_data_r_out = sample_data_r_in; while (! EVMDM6437_AIC33_write16( aic33handle, sample_data_r_out ) ); EVMDM6437_AIC33_closeCodec( aic33handle ); printf( "\n***end***\n" ); str. 7