//Adaptnoise.c Adaptive FIR filter for noise cancellation #include "refnoise.h" //cosine 312 Hz #include "dplusn.h" //sin(1500) + sin(312) #define beta 1E-9 //rate of convergence #define N 30 //# of weights (coefficients) #define NS 128 //# of output sample points float w[N]; //buffer weights of adapt filter float delay[N]; //input buffer to adapt filter short output; //overall output short out_type = 1; //output type for slider interrupt void c_int11() //ISR { short i; static short buffercount=0; //init count of # out samples float yn, E; //output filter/"error" signal delay[0] = refnoise[buffercount]; //cos(312Hz) input to adapt FIR yn = 0; //init output of adapt filter for (i = 0; i < N; i++) //to calculate out of adapt FIR yn += (w[i] * delay[i]); //output of adaptive filter E = dplusn[buffercount] - yn; //"error" signal=(d+n)-yn for (i = N-1; i >= 0; i--) //to update weights and delays { w[i] = w[i] + beta*E*delay[i]; //update weights delay[i] = delay[i-1]; //update delay samples } buffercount++; //increment buffer count if (buffercount >= NS) //if buffercount=# out samples buffercount = 0; //reinit count if (out_type == 1) //if slider in position 1 output = ((short)E*10); //"error" signal overall output else if (out_type == 2) output=dplusn[buffercount]*10; //desired(1500)+noise(312) output_sample(output); //overall output result return; //return from ISR } void main() { short T=0; for (T = 0; T < 30; T++) { w[T] = 0; //init buffer for weights delay[T] = 0; //init buffer for delay samples } comm_intr(); //init DSK, codec, McBSP while(1); //infinite loop }