Digital Signal Processing Reference
In-Depth Information
#include "DSK6713_AIC23.h" //codec-DSK support file
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate
#include "bp2000.cof" //BP @ 2kHz fixed IIR coeff
#include "noise_gen.h" //support file noise sequence
#define beta 1E-11 //rate of convergence
#define WLENGTH 200 //# of coeff for adaptive FIR
float w[WLENGTH+1]; //buffer coeff for adaptive FIR
int dly_adapt[WLENGTH+1]; //buffer samples of adaptive FIR
int dly_fix[stages][2] = {0}; //delay samples of fixed IIR
int a[stages][3], b[stages][2]; //coefficients of fixed IIR
short out_type = 1; //slider adaptive FIR/fixed IIR
int fb;
//feedback variable for noise
shift_reg sreg;
//shift register for noise
int prand(void)
//pseudo-random sequence {-1,1}
{
int prnseq;
if(sreg.bt.b0) prnseq = -4000; //scaled negative noise level
else prnseq = 4000; //scaled positive noise level
fb =(sreg.bt.b0)^(sreg.bt.b1); //XOR bits 0,1
fb^=(sreg.bt.b11)^(sreg.bt.b13); //with bits 11,13 ->fb
sreg.regval<<=1;
sreg.bt.b0=fb;
//close feedback path
return prnseq;
//return noise sequence
}
interrupt void c_int11() //ISR
{
int i, un, input, yn;
int iir_out=0; //init output of fixed IIR
int adaptfir_out=0; //init output of adaptive FIR
float E; //error signal
dly_fix[0][0] = prand(); //input noise to fixed IIR
dly_adapt[0] = dly_fix[0][0]; //same input to adaptive FIR
input = prand(); //noise as input to fixed IIR
for (i = 0; i < stages; i++) //repeat for each stage
{
un=input-((b[i][0]*dly_fix[i][0])>>15)-((b[i][1]*dly_fix[i][1])>>15);
yn = ((a[i][0]*un)>>15)+((a[i][1]*dly_fix[i][0])>>15)
+ ((a[i][2]*dly_fix[i][1])>>15);
dly_fix[i][1] = dly_fix[i][0]; //update delays of fixed IIR
dly_fix[i][0] = un; //update delays of fixed IIR
input = yn;
//in next stage=out previous
}
iir_out = yn; //output of fixed IIR
for (i = 0; i < WLENGTH; i++)
adaptfir_out +=(w[i]*dly_adapt[i]); //output of adaptive FIR
E = iir_out - adaptfir_out; //error as difference of outputs
for (i = WLENGTH; i > 0; i--)
{
w[i] = w[i]+(beta*E*dly_adapt[i]); //update weights of adaptive FIR
dly_adapt[i] = dly_adapt[i-1]; //update samples of adaptive FIR
}
if (out_type == 1) //slider position->adaptive FIR
output_sample((short)adaptfir_out); //output of adaptive FIR
else if (out_type == 2) //slider position->fixed IIR
output_sample((short)iir_out); //output of fixed IIR
FIGURE 7.22. Program to implement an adaptive FIR filter that models (identifies) a fixed
IIR filter ( adaptIDIIR.c ).
Search WWH ::




Custom Search