Digital Signal Processing Reference
In-Depth Information
// IIRinverse.C Inverse IIR Filter
#include "dsk6713_AIC23.h" //codec-DSK support file
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate
#include "bp2000.cof" //BP @ 2 kHz coefficient file
short dly[stages][2] = {0}; //delay samples per stage
short out_type = 1; //type of output for slider
short a0, a1, a2, b1, b2; //coefficients
interrupt void c_int11()
//ISR
{
short i, input, input1;
int un1, yn1, un2, input2, yn2;
input1 = input_sample(); //input to 1st stage
input = input1; //original input
for(i = 0; i < stages; i++)
//repeat for each stage
{
a1 = ((a[i][1]*dly[i][0])>>15); //a1*u(n-1)
a2 = ((a[i][2]*dly[i][1])>>15); //a2*u(n-2)
b1 = ((b[i][0]*dly[i][0])>>15); //b1*u(n-1)
b2 = ((b[i][1]*dly[i][1])>>15); //b2*u(n-2)
un1 = input1 - b1 - b2;
a0=((a[i][0]*un1)>>15);
yn1 = a0 + a1 + a2; //stage output
input1 = yn1; //intermediate out->in next stage
dly[i][1] = dly[i][0]; //update delays u(n-2) = u(n-1)
dly[i][0] = un1; //update delays u(n-1) = u(n)
}
input2 = yn1; //out forward=in reverse filter
for(i = stages; i > 0; i--) //for inverse IIR filter
{
a1 = ((a[i][1]*dly[i][0])>>15); //a1u(n-1)
a2 = ((a[i][2]*dly[i][1])>>15); //a2u(n-2)
b1 = ((b[i][0]*dly[i][0])>>15); //b1u(n-1)
b2 = ((b[i][1]*dly[i][1])>>15); //b2u(n-2)
un2 = input2 - a1 - a2;
yn2 = (un2 + b1 + b2);
input2 = (yn2<<15)/a[i][0];
//intermediate out->in next stage
}
if(out_type == 1) //if slider in position 1
output_sample(input); //original input signal
if(out_type == 2) output_sample((short)yn1);//forward filter
if(out_type == 3) output_sample((short)(yn2>>9));//inverse filter
return;
//return from ISR
}
void main()
{
comm_intr(); //init DSK, codec, McBSP
while(1);
//infinite loop
}
FIGURE 5.23. Program to implement an inverse IIR filter ( IIRinverse.c ).
Search WWH ::




Custom Search