/* 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 polymorphic functions #include
float iir( float sample, \ float a_coeffs[], float b_coeffs[], \ float pm state[], int taps); */ #include "lib_glob.h" #include "trn_glob.h" .SEGMENT/CODE Code_Space_Name; .FILE RTL_FILENAME; .GLOBAL _iirDDP; /* a_coeff, b_coeff, pm state */ ___iirDDP: pm_lnt=pm_0; iir_core: R1=PASS R12, put(R10); readparam5(R12); /* read taps */ R12=PASS R12, put(R11); /*Test for taps ==0 */ IF EQ JUMP (PC, restore_state) (DB); R0=R0-R0, readparam4(R2); R1=MODE1; BIT SET MODE1 65536; /*Set 40-BIT mode */ dm_dm_pm_iir: R2=R2+1, dma_i=R2; /*R13+1-->base, dma_i-->delay*/ dm_bse=R2; /*Base of delay line is state+1*/ dm_lnt=R12; /*Length of array is TAPS*/ R0=DM(dm_0, dma_i); /*Ready delay ptr */ R0=PASS R0, pm_ptr=R8; /*Point to delay */ IF EQ R0=R2; /*Initial access set delay to zero*/ R0=PASS R12, dm_ptr=R0; /*Point to location in delay line*/ R2=R2-R2, R12=R4; /*Store input in sum */ R8=R8-R8, dm_ptr=R2; 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, R2=dm_ptr; F1=F8+F12, pm_ptr=R1; /*Point to b_coeffs*/ R8=R8-R8, R12=R2; 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*F1, 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: FETCH_RETURN dm_lnt=0; /*Clear for return*/ MODE1=R11; /*Restore old mode*/ get(R11,4); RETURN (DB); RESTORE_STACK RESTORE_FRAME .ENDSEG;