/********************************************** Adaptive Filter Program Coded for the ADSP21020 by Eric Wigforss, Kevin Johns, John Siedlecki Digital Signal Processing Design Lab 28 February 1995 ***********************************************/ #include <21020.h> #include #include volatile int in_port1 segment (hip_reg0); volatile int in_port2 segment (hip_reg1); volatile int out_port1 segment (hip_reg2); volatile int out_port2 segment (hip_reg3); volatile int control_0 segment (hip_reg4); void process_input(int); void timer_isr (int interrupt_number); void irq2_interrupt(int sig_number); float converge = 0.00005; int old_u = 0; int w = 1000; void main(void) { timer_set(6250000, 6250000); interrupt(SIG_IRQ3, process_input); interrupt(SIG_TMZ0, timer_isr); interrupt(SIG_IRQ2, irq2_interrupt); timer_on(); set_flag(SET_FLAG1, CLR_FLAG); /* turn off led 1 */ set_flag(SET_FLAG2, CLR_FLAG); for(;;) /* infinite loop */ { poll_flag_in(READ_FLAG0, FLAG_IN_LO_TO_HI); /* wait for switch press */ set_flag(SET_FLAG1, SET_FLAG); /* turn on led 1 */ converge = converge + 0.0005; poll_flag_in(READ_FLAG0, FLAG_IN_HI_TO_LO); /* wait for release */ set_flag(SET_FLAG1, CLR_FLAG); /* turn off led 1 */ } } void timer_isr(int interrupt_number) { set_flag(SET_FLAG1, TGL_FLAG); } void process_input(int sig_number) { int d; int u; int e; int y; d = in_port1; /* left input - summed - 100 Hz + 60 Hz*/ u = in_port2; /* right input - carrier - 60 Hz*/ y = old_u / 1000 * w; e = d - y; w = w + (( (float) e / 130000.0) * ( (float) old_u / 130000.0) * converge); if (u > 5000) set_flag(SET_FLAG2, SET_FLAG); else set_flag(SET_FLAG2, CLR_FLAG); /* w = 1; */ out_port1 = e; /* left - filter */ out_port2 = d; /* right - carrier */ old_u = u; } void irq2_interrupt(int sig_number) { control_0 = 0x2400; }