/* 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();
}
