Digital Signal Processing Reference
In-Depth Information
// FIRPRNbuf.c FIR filter with input noise sequence & output in buffer
#include "DSK6713_AIC23.h" //codec-DSK support file
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ;//set sampling rate
#include "bp41.cof" //BP @ 1 kHz coefficient file
#include "noise_gen.h" //header file for noise sequence
int yn = 0; //initialize filter's output
short dly[N]; //delay samples
short buffercount = 0; //init buffer count
const short bufferlength = 1024; //buffer size
short yn_buffer[1024]; //output buffer
short fb;
//feedback variable
shift_reg sreg;
short prn(void)
//pseudorandom noise generation
{
short prnseq; //for pseudorandom sequence
if(sreg.bt.b0) prnseq =-16000; //scaled negative noise level
else prnseq = 16000; //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; //shift register 1 bit to left
sreg.bt.b0 = fb; //close feedback path
return prnseq; //return sequence
}
interrupt void c_int11()
//ISR
{
short i;
dly[0] = prn(); //input noise sequence
yn = 0; //initialize filter's output
for (i = 0; i< N; i++)
yn +=(h[i]*dly[i]) >>15; //y(n)+=h(i)*x(n-i)
for (i = N-1; i > 0; i--) //start @ bottom of buffer
dly[i] = dly[i-1]; //data move to update delays
output_sample((short)yn); //output filter
yn_buffer[buffercount] = yn; //filter's output into buffer
buffercount++; //increment buffer count
if(buffercount==bufferlength) buffercount=0; //reinit buffer count
return;
//return from interrupt
}
void main()
{
sreg.regval = 0xFFFF; //shift register to nominal values
fb = 1; //initial feedback value
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
FIGURE 4.20. FIR program using an internally generated input pseudorandom noise
sequence and output stored in memory ( FIRPRNbuf.c ).
Search WWH ::




Custom Search