Filtros adaptativos Implementación en DSP Laboratorio DSP y FPGA ITBA 2010
Algoritmo LMS
Algoritmo LMS Salida del filtro: Error en la estimación: Adaptación de los coeficientes: Valores anteriores de la entrada: Coeficientes del filtro:
Posibles aplicaciones System identification / modelado adaptativo Cancelación de ruido Ecualización adaptativa Control de eco Beamforming …
Ejemplo: system identification Filtro adaptativo Sistema desconocido - +
Simulación en MATLAB Inventamos un sistema desconocido Hacemos pasar ruido blanco por el sistema desconocido Adaptamos el filtro muestra a muestra Graficamos el error en el tiempo Ver simulación
Ejemplo con DSP56002 Sistema desconocido + Filtro adaptativo - OUT L OUT R IN L RUIDO BLANCO + -
Algoritmo LMS move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 Adaptación de los coeficientes:
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: x0: y0: a:
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n) x0: y0: a:
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n) x0: mu y0: a:
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n) x0: mu y0: a: e(n).mu
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: mu y0: a: e(n).mu
Algoritmo LMS X Y r0 r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n) y0: a: w0(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r0 r4 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n) y0: a: w0(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r0 r4 x(n-1) w1(n) x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n) y0: a: w0(n)+mu.x(n).e(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r4 x(n-1) w1(n) r0 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: a: w0(n)+mu.x(n).e(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) r0 r4 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: w1(n) a: w0(n)+mu.x(n).e(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n) r0 r4 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: w1(n) a: w0(n)+mu.x(n).e(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r5 x(n-1) w1(n) r0 r4 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: w1(n) a: w0(n)+mu.x(n).e(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r5 x(n-1) w1(n) r0 r4 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: w1(n) a: w1(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r5 x(n-1) w1(n) r0 r4 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-1) y0: w1(n) a: w1(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r5 x(n-1) w1(n) x(n-2) w2(n) r0 r4 x(n-3) w3(n) x1: e(n).mu x0: x(n-2) y0: w2(n) a: w1(n)+mu.x(n-1).e(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n+1) r5 x(n-2) w2(n) r0 r4 x(n-3) w3(n) x1: e(n).mu x0: x(n-2) y0: w2(n) a: w2(n)
Algoritmo LMS X Y r0 r4 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n+1) r5 x(n-2) w2(n) x(n-3) w3(n) x1: e(n).mu x0: x(n-3) y0: w3(n) a: w2(n)+mu.x(n-2).e(n)
Algoritmo LMS X Y r0 r4 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n+1) x(n-2) w2(n+1) r5 x(n-3) w3(n) x1: e(n).mu x0: x(n-3) y0: w3(n) a: w3(n)
Algoritmo LMS X Y move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r0 r4 x(n-1) w1(n+1) x(n-2) w2(n+1) r5 x(n-3) w3(n) x1: e(n).mu x0: x(n) y0: w0(n+1) a: w3(n)+mu.x(n-3).e(n)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r0 r4 x(n-1) w1(n+1) x(n-2) w2(n+1) x(n-3) w3(n+1) x1: e(n).mu x0: x(n) y0: w0(n+1) a: w0(n+1)
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r0 r4 x(n-1) w1(n+1) x(n-2) w2(n+1) x(n-3) w3(n+1) x1: e(n).mu x0: x(n) y0: w0(n+1) a: w0(n+1) Quedaron actualizados todos los coeficientes w
Algoritmo LMS X Y r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) w0(n+1) r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 r4 x(n-1) w1(n+1) x(n-2) w2(n+1) r0 x(n-3) w3(n+1) x1: e(n).mu x0: x(n-1) y0: w0(n+1) a: w0(n+1) NOTA: n0 = -2
Algoritmo LMS X Y r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) r4 w0(n+1) r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n+1) x(n-2) w2(n+1) r0 x(n-3) w3(n+1) x1: e(n).mu x0: x(n-1) y0: w1(n+1) a: w0(n+1)
Algoritmo LMS X Y r4 r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a x(n) r4 w0(n+1) r5 move X:ErrorN,x1 move #mu,x0 mpy x0,x1,a move a,x1 move x:(r0)+,x0 y:(r4)+,a do #ntaps,_coefupdate macr x0,x1,a x:(r0)+,x0 y:(r4)+,y0 tfr y0,a a,y:(r5)+ _coefupdate move x:(r0)+n0,x0 y:(r4)-,y0 x(n-1) w1(n+1) x(n-2) w2(n+1) r0 x(n-3) w3(n+1) x1: e(n).mu x0: x(n-1) y0: w1(n+1) a: w0(n+1) La próxima muestra x(n+1) pisa a x(n-3)
Salida del filtro Salida del filtro: move X:EntradaN,x0 clr a x0,x:(r0)+ y:(r4)+,y0 rep #ntaps-1 mac x0,y0,a x:(r0)+,x0 y:(r4)+,y0 macr x0,y0,a Este es el algoritmo del FIR
Código assembler Código canal derecho y canal izquierdo Generación de ruido blanco Problema con saturación por nivel del ruido Problema con delay / Línea de retardo
Pruebas Simulación Pruebas con loop cerrado (cable) Ver señal de error en el osciloscopio Modificar mu y verificar convergencia Pruebas con parlante y micrófono
Trabajo práctico Parte A) Algoritmo NLMS En LMS convergencia y estabilidad dependen de mu Efecto de la potencia de x(n) Normalización con la potencia de la señal
Trabajo práctico ? Parte B) Cancelación adaptativa de ruido Se desea eliminar la interferencia (N) presente en una señal (S + N). Se cuenta con una señal de referencia (N´) que está correlacionada (en forma desconocida) con el ruido que contamina la señal de interés (S). S + N N’ S ?
Algoritmo LMS - origen Según el método de steepest-descent Usamos los estimadores instantáneos:
Referencias Farhang, Boroujeny. Adaptive filters – Theory and applications. Haykin. Adaptive filter theory. Widrow, Stearns. Adaptive signal processing.