Post on 22-Jan-2016
Filtros adaptativosImplementación en DSP
Laboratorio DSP y FPGAITBA 2010
Algoritmo LMS
Algoritmo LMS
( ) ( ) ( )y n n n Tw x
( ) ( ) ( )e n d n y n
( 1) ( ) ( ) ( )n n n e n w w x
Salida del filtro:
Error en la estimación:
Adaptación de los coeficientes:
( ) ( ), ( 1), ( 2),..., ( 1)n x n x n x n x n N x
0 1 2 1( ) ( ), ( ), ( ),..., ( )Nn w n w n w n w nw
Valores anteriores de la entrada:
Coeficientes del filtro:
( ) ( ) ( )iy n w n x n i N -1
i=0
Posibles aplicaciones
• System identification / modelado adaptativo
• Cancelación de ruido
• Ecualización adaptativa
• Control de eco
• Beamforming
• …
Ejemplo: system identification
( )y n
( )e n( )x n ( )d n
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
Filtro adaptativo ( )e n
Sistema desconocido
( )x n
( )d n
DSP56002OUT L
OUT R IN L
RUIDO BLANCO
( )y n +
-
Algoritmo LMS
( 1) ( ) ( ) ( )n n n e n w w xAdaptación de los coeficientes: 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
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n) w0(n)
x(n-1)
x(n-2)
x(n-3)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n)
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n) mu
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n) mu
e(n).mu
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n)
x(n-1)
x(n-2)
x(n-3)
mu
e(n).mu
e(n).mu
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4 r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu x(n)
w0(n)
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r0 r4
r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu x(n)
w0(n)
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu x(n)
w0(n)+mu.x(n).e(n)
r0 r4
w0(n)
w1(n)
w2(n)
w3(n)
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
a:
x1: x0: y0:
X Y
r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n)+mu.x(n).e(n)
r0
r4
w0(n)
w1(n)
w2(n)
w3(n)
x(n-1)
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
a:
x1: x0: y0:
X Y
r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n)+mu.x(n).e(n)
r4
w0(n)
w1(n)
w2(n)
w3(n)
x(n-1)
r0
w1(n)
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
a:
x1: x0: y0:
X Y
r5x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n)+mu.x(n).e(n)
w0(n+1)
w1(n)
w2(n)
w3(n)
x(n-1)
r0
w1(n)
r4
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
a:
x1: x0: y0:
X Y
r5
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n)+mu.x(n).e(n)
w0(n+1)
w1(n)
w2(n)
w3(n)
x(n-1)
r0
w1(n)
r4
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w1(n)
w0(n+1)
w1(n)
w2(n)
w3(n)
x(n-1)
r0
w1(n)
r4
r5
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w1(n)
w0(n+1)
w1(n)
w2(n)
w3(n)
x(n-1)
r0
w1(n)
r4
r5
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w1(n)+mu.x(n-1).e(n)
w0(n+1)
w1(n)
w2(n)
w3(n)
x(n-2) w2(n)
r5
r0 r4
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w2(n)
w0(n+1)
w1(n+1)
w2(n)
w3(n)
x(n-2)
r0
w2(n)
r4
r5
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w2(n)+mu.x(n-2).e(n)
w0(n+1)
w1(n+1)
w2(n)
w3(n)
x(n-3) w3(n)
r5
r0 r4
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w3(n)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n)
x(n-3)
r0
w3(n)
r4
r5
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w1(n+1)
w2(n+1)
w3(n)
x(n) w0(n+1)
r5
r0 r4
w3(n)+mu.x(n-3).e(n)
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n+1)
x(n)
r0
w0(n+1)
r4
r5
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n+1)
x(n)
r0
w0(n+1)
r4
r5
Quedaron actualizados todos los coeficientes w
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n+1)
x(n-1) w0(n+1)
r4
r5
r0
NOTA: n0 = -2
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n+1)
x(n-1) w1(n+1)
r5r4
r0
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
a:
x1: x0: y0:
X Y
x(n)
x(n-1)
x(n-2)
x(n-3)
e(n).mu
w0(n+1)
w0(n+1)
w1(n+1)
w2(n+1)
w3(n+1)
x(n-1) w1(n+1)
r5
r0
r4
La próxima muestra x(n+1) pisa a x(n-3)
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
( ) ( ) ( )y n n nw xSalida del filtro:
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
2( 1) ( ) ( ) ( )
( )x
n n n e nn
w w x
2 2 2( ) ( 1) (1 )x xn n x
Trabajo práctico
• Parte B) Cancelación adaptativa de ruidoSe 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
( 1) ( ) 2 ( )[ ( ) ( ) ( )]n n n d n n n Tw w x x w
Según el método de steepest-descent
( 1) ( ) ( ( ))
( ( )) 2 2 ( )
n n J n
J n n
dx x
w w w
w p R w
Usamos los estimadores instantáneos:
( ) ( )
( ) ( )
d n n
n n
dx
Tx
p x
R x x
( 1) ( ) ´ ( ) ( )n n n e n w w x
Referencias
• Farhang, Boroujeny. Adaptive filters – Theory and applications.• Haykin. Adaptive filter theory.• Widrow, Stearns. Adaptive signal processing.