//FIRinverse.c Implementation of inverse FIR Filter

#include "bp41.cof"         //coefficient file BP @ Fs/8
int yn;		 	    //filter's output
short dly[N];               //delay samples
int out_type = 1;	          //output type for slider 

interrupt void c_int11()    //ISR
{
 short i; 
 
 dly[0] = input_sample();   //newest input sample data    
 yn = 0;                    //initialize filter's output

 for (i = 0; i<N; i++)
    yn += (h[i]*dly[i]);    //y(n)+=h(i)*x(n-i)
 if(out_type==1)		    //if slider in position 1
    output_sample(dly[0]);  //original input
 if(out_type==2)       		    
    output_sample(yn>>15);  //output of FIR filter
 if(out_type==3)		    //calculate inverse FIR
   {
    for (i = N-1; i>1; i--)
       yn -= (h[i]*dly[i]); //calculate inverse FIR filter
    yn = yn/h[0];           //scale output of inverse filter
    output_sample(yn>>8);   //send output of inverse filter
   }
 for (i = N-1; i>0; i--)    //from bottom of buffer
    dly[i] = dly[i-1];      //update delay samples
 return;			    //return from ISR
}

void main()
{
 comm_intr();               //init DSK, codec, McBSP
 while(1);                  //infinite loop
}