/* /////////////////////////////////////////////////////////////////////////////////// / FIR_Demo.asm 21161 EZ-KIT LITE SIMDFIR filtr cyfrowy / / / / Program otrzymuje dane z przetwornika A/D AD1836 poprzez port szeregowy (SPORT1)/ / filtruje próbki używając Filtru o Skończonej Odpowiedzi Impulsowej, a następnie / / kieruje dane do SPORT1 ISR, który wysyła je spowrotem do przetwornika / / C/A AD1836. / / / / Współczynniki filtru FIR znajują się w plikach "high1.dat" and "low1.dat" / / / / 24 bitowe próbki pochodzące z przetwornika A/C są konwertowane na / / reprezentację zmienno przecinkową. Dane są również przeskalowywane w zakresie / / +/- 1.0 / / przy pomocy konwersji "integer to float" / / / / Filtrowanie cyfrowe odbywa się w SPORT1 transmit interrupt service / / routine. / / / /////////////////////////////////////////////////////////////////////////////////// */ /* ADSP-21161 Definicje rejestrów procesora 21161*/ #include "def21161.h" #define DOUBLE_FILTER_TAPS 130 #define FILTER_TAPS 65 .section /dm dm_data; .VAR filter_counter = 0; .ALIGN 2; .VAR dline [DOUBLE_FILTER_TAPS]; /* Linia opżniająca próbki z wejścia */ /*---------------------------------------------------------------------------*/ .section /pm pm_data; #define RZAD_FILTRU 67 /* declare and initialize the interleaved lowpass & highpass filter coefficients*/ /* */ .ALIGN 2; .var wspolczynniki1[RZAD_FILTRU]="filter_BP_1_67.dat"; .ALIGN 2; .var wspolczynniki2[RZAD_FILTRU]="filter_BP_2_67.dat"; .ALIGN 2; .var wspolczynniki3[RZAD_FILTRU]="filter_BP_3_67.dat"; .ALIGN 2; .var wej_linia[RZAD_FILTRU]; .section /pm pm_code; .GLOBAL init_fir_filter; .GLOBAL fir; .EXTERN RX_left_flag; .EXTERN Left_Channel_In1; .EXTERN Right_Channel_In1; .EXTERN Left_Channel_Out0; .EXTERN Right_Channel_Out0; .EXTERN Left_Channel_Out1; .EXTERN Right_Channel_Out1; init_fir_filter: bit set mode1 CBUFEN ; nop ; // Inicjalizacja rejestrów cyklicznych - jeden wskazuje na pobrane próbki, drugi na współczynniki filtru b0=dline; l0=@dline; m0=1; // Tutaj można zmienić rodzaj filtru, wskazując inną tablicę współczynników b8=wspolczynniki1; l8=@wspolczynniki1; m8=1; clear: dm(i3,2)=f12; bit clr mode1 PEYEN ; rts; init_fir_filter.end: /* //////////////////////////////////////////////////////////////////////////////// * * podprogram filtracji FIR * * //////////////////////////////////////////////////////////////////////////////// */ fir: r2 = -31; r0 = DM(Left_Channel_In1); // pobranie próbek z DAC AD1881 r1 = DM(Right_Channel_In1); MRF=0, dm(i0,m0)=r0, r1=pm(i8,m8); // procedura filtracji FIR lcntr=RZAD_FILTRU-1, do LFIR until lce; LFIR: MRF=MRF+r0*r1 (ssf), r0=dm(i0,m0),r1=pm(i8,m8); MRF=MRF+r0*r1 (ssfr); // MRF= sat MRF; // polecenie odpowiedzialne za kontrole nasycenia modify(i0,m0); r0=MR1F; DM(Left_Channel_Out0) = r0; // wyslanie wyniku na DAC AD1881 DM(Right_Channel_Out0) = r1; rts; fir.end: