//Adaptnoise_pcm.c Adaptive FIR for noise cancellation using PCM3003 #define beta 1E-12 //rate of convergence #define N 30 //# of weights (coefficients) #define LEFT 1 //left channel #define RIGHT 0 //right channel float w[N]; //weights for adapt filter float delay[N]; //input buffer to adapt filter float Fs = 8000.0; //sampling rate short output; //overall output short out_type = 1; //output type for slider volatile union{unsigned int uint; short channel[2];}CODECData; interrupt void c_int11() //ISR { short i; float yn=0, E=0, dplusn=0, desired=0, noise=0; CODECData.uint = input_sample(); //input 32-bit from both channels desired = (float) CODECData.channel[LEFT]; //input left channel noise = (float) CODECData.channel[RIGHT]; //input right channel dplusn = desired + noise; //desired+noise delay[0] = noise; //noise as input to adapt FIR for (i = 0; i < N; i++) //to calculate out of adapt FIR yn += (w[i] * delay[i]); //output of adaptive filter E = (desired + noise) - 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 } if (out_type == 1) //if slider in position 1 output = ((short)E); //error signal as overall output else if (out_type == 2) output=((short)dplusn); //desired+noise output_left_sample(output); //overall output result return; } 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 }