420 likes | 645 Views
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.
E N D
Filtros adaptativosImplementación en DSP Laboratorio DSP y FPGA ITBA 2010
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 Sistema desconocido + - Filtro adaptativo
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 OUT R IN L + Filtro adaptativo - RUIDO BLANCO OUT L DSP56002
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 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) w2(n) x(n-2) x(n-3) w3(n) x0: y0: x1: a: r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n) x0: y0: x1: a: r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n) x0: mu y0: x1: a: r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n) x0: mu y0: x1: a: e(n).mu r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: mu y0: x1: a: e(n).mu r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n) y0: x1: a: w0(n) r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n) y0: x1: a: w0(n) r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n) y0: x1: a: w0(n)+mu.x(n).e(n) r0 r4 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: x1: a: w0(n)+mu.x(n).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: w1(n) x1: a: w0(n)+mu.x(n).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: w1(n) x1: a: w0(n)+mu.x(n).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: w1(n) x1: a: w0(n)+mu.x(n).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: w1(n) x1: a: w1(n) r4 r0 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-1) y0: w1(n) x1: a: w1(n) r4 r0 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-2) y0: w2(n) x1: a: w1(n)+mu.x(n-1).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-2) y0: w2(n) x1: a: w2(n) r4 r0 r5
Algoritmo LMS X Y 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) w2(n) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-3) y0: w3(n) x1: a: w2(n)+mu.x(n-2).e(n) r0 r4 r5
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n-3) y0: w3(n) x1: a: w3(n) r4 r0 r5
Algoritmo LMS X Y 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) w2(n+1) x(n-2) x(n-3) w3(n) e(n).mu x0: x(n) y0: w0(n+1) x1: a: w3(n)+mu.x(n-3).e(n) r4 r0 r5
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n+1) e(n).mu x0: x(n) y0: w0(n+1) x1: a: w0(n+1) r4 r0 r5
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n+1) e(n).mu x0: x(n) y0: w0(n+1) x1: a: w0(n+1) r0 r4 r5 Quedaron actualizados todos los coeficientes w
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n+1) e(n).mu x0: x(n-1) y0: w0(n+1) x1: a: w0(n+1) r0 r4 r5 NOTA: n0 = -2
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n+1) e(n).mu x0: x(n-1) y0: w1(n+1) x1: a: w0(n+1) r4 r0 r5
Algoritmo LMS X Y 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,ax:(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) w2(n+1) x(n-2) x(n-3) w3(n+1) e(n).mu x0: x(n-1) y0: w1(n+1) x1: a: w0(n+1) r4 r0 r5 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
S + N ? S N’ 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).
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.