(Para una buena introducción al filtro de Wiener, leer el siguiente documento: wiener.pdf )
Abre MATLAB.
Generaremos un filtro de orden 15.
P=15;
La señal deseada (señal de referencia) es una sinusoide de frecuencia 0.45 y 200 muestras.
N=200;
k=1:N;
w0=0.45;
d=sin(w0*k)'; %Senal deseada
La señal a tratar es la señal deseada con un ruido blanco de distribución normal, varianza 1.
eps=1;
n=eps*randn(N,1);
x=d+n;
plot(x,'r');
%hold on;
%plot(d)
%hold off;
pause;
Sabemos de teoría que las ecuaciones de Wiener-Hopf modelan el sistema:
Calculamos la matriz R y el vector p y le decimos a Matlab que resuelva w de
la ecuación. El operador "\" resuelve la ecuación de mínimos
cuadrados. Es mucho más conveniente que calcular
, ya que nadie nos asegura que
la matriz de autocorrelación tenga inversa.
r=xcorr(x);
R=toeplitz(r(N:N+P-1));
ptemp=xcorr(x,d);
p=ptemp(N:N+P-1);
w=R\p
w =
0.1208
0.1070
0.0905
0.0416
-0.0104
-0.0574
-0.0774
-0.0922
-0.0831
-0.0703
-0.0269
0.0172
0.0613
0.0723
0.0783
Estos son los coeficientes que mejor filtran el ruido de la señal . Obviamente, la respuesta que te dará es diferente, ya que no estamos utilizando la matriz de autocorrelación real, sino una estimación en base a las muestras de que disponemos, que cambian cada vez que creamos la señal x al tener una componente aleatoria.
Vamos a ver cómo queda la señal después de filtrarla con nuestro filtro recién calculado, y lo compararemos con la señal deseada.
xrec=filter(w,1,x);
%plot(x,'r');
%hold on;
plot(xrec);
hold on;
plot(d,'g');
hold off;
No está mal, comparándolo con la señal original. Para entender el
tipo de filtrado que realiza el filtro de Wiener, vamos a ver la respuesta
frecuencial del filtro frente al espectro de la señal que hemos recibido:
X=abs(fft(x,1024));
W=abs(fft(w,1024));
plot(X./max(X));
hold on;
plot(W./max(W),'r');
hold off;
Si vemos el espectro de la señal después de filtrarla, y la comparamos con la señal deseada, vemos que realmente el filtro ha hecho un buen trabajo.
D=abs(fft(d,1024));
Xrec=abs(fft(xrec,1024));
plot(D,'g');
hold on;
plot(Xrec);
hold off;
Prueba variaciones de los parámetros de la señal y del filtro y describe cómo cambian los efectos del filtrado: prueba diferentes órdenes (P=6, 50 y 200), diferentes números de muestras (N=25 y 1000), diferentes frecuencias (w0=0.2 y 1.0) y diferentes varianzas (eps=0.25 y 5).
Comprueba el efecto de añadir un offset de 0.5 al ruido.
eps=1;
n=eps*randn(N,1)+0.5;