/* Simple, unoptimized IIR filter (feedback only) */ /* for TMS320C54X series DSPs */ /* Copyright September 2005 by Matt Kleffner */ /* under the Creative Commons Attribution License */ #include "lab4b.h" #include "intrinsics.h" /* IIR values and buffers (declared in c_fft_given_iirc.asm) */ #define IIR_order 4 extern int scale; extern int coef[IIR_order]; extern int state[IIR_order]; /* Arrays declared in main routine */ extern int autocorr_in[N]; extern int autocorr_out[N]; /* Pointer to state buffer location */ extern int iirptr; void iirfilt() { int i, j; _set_fract_bit(); /* Filter PN input */ for (i = 0; i < N; ++i) { int sum = 0; /* Calculate and sum all feedback terms except the "oldest" one */ for (j = 0; j < (IIR_order-1); ++j) { sum += _i_mul_fract_fb1_ii(coef[j],state[iirptr]); /* Avoid usage of "modulo" routine */ iirptr++; if (iirptr == IIR_order) iirptr = 0; } /* Calculate and sum oldest feedback term without incrementing iirptr */ sum += _i_mul_fract_fb1_ii(coef[IIR_order-1],state[iirptr]); /* Calculate direct input contribution */ sum += _i_mul_fract_fb1_ii(scale,autocorr_in[i]); autocorr_in[i] = sum; state[iirptr] = autocorr_in[i]; } _reset_fract_bit(); }