/*---------------------------------------------------------------------- File: Lms_c.c Description: Perform adaptive filtering on codec input. Input: Right and left channels connected to the same source Output: Left channel = original signal Right channel = filtered signal -----------------------------------------------------------------------*/ #include #include #include #include #include #include #include #include #include #include #define SAMPLING_RATE 20000 extern int inicodec (int sampling_rate); short h[8]={0,0,0,0,0,0,0,0}; short X[8]={0,0,0,0,0,0,0,0}; int Y=0; int E=0; #pragma CODE_SECTION (LMS_isr, ".iprog") interrupt void LMS_isr (void) { int N=8; int i, temp; short BETA_E,D; int beta = 0x00000174; temp = MCBSP0_DRR; X[0] = (short) temp; D = X[0]; Y=0; for(i=0;i>16); BETA_E =(short)((_mpy(beta,E)) >>15); for(i=N-1;i>=0;i--) { h[i] = h[i] +((_mpy(BETA_E,X[i])) >> 15); X[i]=X[i-1]; } MCBSP0_DXR = (temp &0xffff0000) |( ( (short)(Y>>16) )& 0x0000ffff); return; } void Init_Interrupts () { intr_reset(); // Reset the interrupt system, // disable all interrupts. INTR_CLR_FLAG (CPU_INT15); // Clear previous interrupt request INTR_ENABLE (CPU_INT15); // Enable cpu interrupt line 15 intr_map(CPU_INT15,ISN_RINT0); // Link receive interrupt of serial // port 0 to interrupt line 15. intr_hook (LMS_isr,CPU_INT15); // Assign the interrupt service routine } void main(void) { evm_init(); // Initialise EVM board. inicodec (SAMPLING_RATE); // Initialise codec, adjust sampling rate. Init_Interrupts (); // Initialise interrupts and hook isr. INTR_GLOBAL_ENABLE(); // Enable global interrupt. for (;;); // Main loop, does nothing. }