//FIRPRNbuf.c FIR filter with input noise sequence & output in buffer 

#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)                   //sequence {1,-1}
	prnseq = -8000; 	          //scaled negative noise level
 else
	prnseq = 8000;	          //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;
}

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(yn);	    //output filter

	yn_buffer[buffercount] = yn;    	    //filter's output into buffer
	buffercount++; 		                //increment buffer count
	if(buffercount==bufferlength)   	    //if buffer count = size
	   buffercount = 0;          	    //reinitialize 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
}