/* This C language subroutine computes the Infinite Impulse Response (IIR) filter specified by its floating point input, coefficients, and state. The Run Time Library for the C Language. Gordon A. Sterling (617) 461 - 3076 DSP Development Tools Engineering Created on 6/24/90 Updated on 5/94 by AS Updated on 1/95 by AS - separated polymorphed functions #include
float iir( float sample, \ float pm a_coeffs[], float pm b_coeffs[], \ float state[], int taps); */ #include "lib_glob.h" #include "trn_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _iir; /* a_coeff, b_coeff, state */ _iir: ___iirPPD: iir_core: R1=PASS R12, put(R10); readparam5(R12); R12=PASS R12, put(R11); /*Test for taps ==0 */ IF EQ JUMP (PC, restore_state) (DB); readparam4(R2); R11=MODE1; BIT SET MODE1 65536; /*Set 40-BIT mode */ pm_pm_dm_iir: R10=dma_i; /*Hold extra dm pointer */ R2=R2+1, dma_i=R2; /*R13+1-->base, dma_i-->delay*/ dm_bse=R2; /*Base of delay line=state+1*/ R0=DM(dm_0, dma_i); /*Ready delay ptr */ R0=PASS R0, dm_lnt=R12; /*Len of array=TAPS */ IF EQ R0=R2; /*Init access set delay to 0*/ R0=PASS R12, dm_ptr=R0; /*Pt to location in delay line*/ R2=R2-R2, pm_ptr=R8; /*Store input in sum Pt to delay*/ R8=R8-R8, R12=R4; LCNTR=R0, DO ppdpole_loop UNTIL LCE; ppdpole_loop: F8=F2*F4, F12=F8+F12, F4=DM(dm_ptr,dm_1), F2=PM(pm_ptr,pm_1); F8=F2*F4, F12=F8+F12; R8=R8-R8, pm_ptr=R1; /*Point to b_coeffs */ R1=PASS R5, R5=R12; /*Save R5 in R1 and assign*/ R2=R2-R2, R12=R8; /*Zero these out */ LCNTR=R0, DO ppdzero_loop UNTIL LCE; ppdzero_loop: F8=F2*F4, F12=F8+F12, F4=DM(dm_ptr,dm_1), F2=PM(pm_ptr,pm_1); F8=F2*F4, F12=F8+F12, F2=PM(pm_ptr,pm_1); F8=F2*F5, F12=F8+F12, DM(dm_ptr, dm_1)=F1; F0=F8+F12, R4=dm_ptr; DM(dm_0, dma_i)=R4; dma_i=R10; restore_state: R5=PASS R1, FETCH_RETURN dm_lnt=0; /*Clear for return*/ MODE1=R11; /*Restore old mode*/ get(R11,1); get(R10,2); RETURN (DB); RESTORE_STACK RESTORE_FRAME .ENDSEG;