Digital Signal Processing Reference
In-Depth Information
Example 4.4: FIR Implementation with a Pseudorandom Noise Sequence
as Input to a Filter ( FIRPRN )
The program FIRPRN.c (Figure 4.17) implements an FIR filter using an internally
generated pseudorandom noise sequence as input to the filter. This input is the
pseudorandom noise sequence generated in Example 2.16. The coefficient file
BP55.cof uses a float data format and is shown in Figure 4.18. It represents a
// FIRPRN.c FIR with internally generated input noise sequence
#include "DSK6713_AIC23.h" //codec-dsk support file
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; //set sampling rate
#include "bp55.cof" //BP @ Fs/4 coeff file in float
#include "noise_gen.h" //header file for noise sequence
short dly[N], fb; //delay samples,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 generated sequence
}
interrupt void c_int11()
//ISR
{
int i, yn = 0; //initialize filter's output
dly[0] = prn(); //input noise sequence
for (i = 0; i< N; i++)
yn +=(h[i]*dly[i]); //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
return;
//return from interrupt
}
void main()
{
short i;
sreg.regval = 0xFFFF; //shift register to nominal values
fb = 1; //initial feedback value
for (i = 0; i<N; i++)
dly[i] = 0; //init buffer
comm_intr(); //init DSK, codec, McBSP
while(1); //infinite loop
}
FIGURE 4.17. FIR program with a pseudorandom noise sequence as input ( FIRPRN.c ).
Search WWH ::




Custom Search