//FIRPRN.c FIR with internally generated input noise sequence 

#include "bp55.cof"		     //BP @ Fs/4 coeff file in float
#include "noise_gen.h"		     //header file for noise sequence
int dly[N];                        //delay samples  
short fb;				     //feedback variable
shift_reg sreg;

short prn(void)			     //pseudorandom noise generation 
{
 short prnseq;                     //for pseudorandom sequence
 
 if(sreg.bt.b0)                    //sequence {1,-1}
	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
{
	int i;
 	int 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(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
}