/**************************************************************************************** ***************************************************************************************** Technická univerzita v Kosiciach Fakulta elektrotechniky a informatiky Katedra elektroniky a multimedialnych telekomunikacii Tema diplomovej prace: Implementacia zakladnych algoritmov cislicoveho spracovania signalov pomocou procesorov Analog Devices ADSP218x a ADSP219x Veduci diplomovej prace: doc. Ing. Milos Drutarovsky, CSc. ***************************************************************************************** Nazov suboru: iir_main.asm Datum modifikacie: 29-04-2003 Autor: Peter Popadic Verzia: 1.00 pre ADSP2191, VisualDSP++ verzie 3 Opis: Demonstruje cinnost IIR filtra implementovaneho v procesore ADSP-2191. Priklad vyuziva kaskadne zapojenie bikvadov. Vstupne vzorky su nacitavane zo suboru x.dat vo formate 16.0 do vstupneho buffra rx_buf a filtrovane udaje sa zapisuju do vystupneho buffra tx_buf a do IO pameti, odkial sa zapisu do suboru. Subor na zaciatk obsahuje deklaracie buffrov a premennych. Buffre _Scale_List a _Coef musia byt definovane ako cirkulacne buffre. V hlavnej casti _main sa postupne sa nastavia potrebne registre (I, L, M, B). Nasleduje slucka 'iir', v ktorej sa nacita vzorka a nasledne sa vola funkcia bikvad, ktora realizuje filtraciu vzoriek. ****************************************************************************************/ #include "iir_constant.h" /*** datova pamat - DM data ***/ .section/dm data1; .var _rx_buf[Dlzka_Bloku]="x.dat"; // deklaracia vstupneho buffra, hodnoty sa // nacitaju zo suboru x.dat (format 16.0) .var _tx_buf[Dlzka_Bloku]; // deklaracia vystupneho buffra .var _Scale_List[Pocet_Sekcii] = "scal.dat"; // skalovacie faktory pre bikvady .var _Delay_Line[2*Pocet_Sekcii+2]; // deklaracia oneskorovacej linky .global _Delay_Line; /*** programova pamat - PM data ***/ .section/pm data3; .var _Coef[N]="coef.dat"; // koeficienty filtra su nacitane zo suboru // coef.dat v tvare B2, B1, B0, A2, A1,... /*** programova pamat - PM program ***/ .section/pm program; .global _main; .extern _bikvad; _main: /*** nastavenie smernikov ***/ I2=_rx_buf; // nastavenie smernika na vstupny buffer I3=_tx_buf; // nastavenie smernika na vystupny buffer I0=_Delay_Line; // nastavenie smernika na oneskorovaciu linku ax0=0; L0=ax0; I1=_Scale_List; // nastavenie smernika na skalovacie koeficienty, L1=length(_Scale_List); // nastavene ako cirkulacny buffe ar=_Scale_List; reg(B1) = ar; I5=_Coef; // nastavenie smernika na koeficienty, L5=length(_Coef); // nastavene ako cirkulacny buffe ar=_Coef; reg(b5) = ar; M0=1; M3=-3; M2=1; M5=1; CNTR=Dlzka_Bloku; // inicializacia pocitadla dlzky bloku DO iir UNTIL CE; SR1=DM(I2,M2); // nacitanie vstupnej vzorky I0=_Delay_Line; // smernik na oneskorovaciu linku CNTR=Pocet_Sekcii; // inicializacia pocitadla bikvadov Call _bikvad; // volanie funkcie na filtraciu io(0x000f)=SR1; // zapisanie vysledku do IO pameti iir: DM(I3,M2)=SR1; // zapis vysledku receive: // nekonecna slucka Jump receive; |