我目前正在尝试将一个简单的逆滤波器与维纳滤波器进行比较,以使用 matlab 进行反卷积。我的起始信号是exp(-t^2)
,这将与时间为-.5 到 0.5 的非零矩形进行卷积。我正在引入幅度在 -.5 到 .5 范围内的噪声。
定义我的时域到频域映射:
f = exp(-t^2) => F
s = rect => R
c = f*s => C
r = noise (see above) => R
with noise c becomes: c = f*s + n => C = FxS + N
对于第一种方法,我只是将 FTc
除以 FT,f
然后进行逆 FT。这相当于s = (approx.) ifft((FxS + N)/F)
。
对于第二种方法,我采用维纳滤波器 ,W
并将其相乘C/R
,然后进行逆 FT。这相当于S = (approx.) ifft(CxW/R)
。
维纳滤波器是W = mag_squared(FxS)/(mag_squared(FxS) + mag_squared(N))
。
我用“*”表示卷积,用“x”表示乘法。
我正在尝试在时间间隔 -3 到 3 内比较矩形的两个反卷积。现在,我得到的反卷积矩形图看起来与原始图完全不同。
有人可以指出我做错了什么的正确方向吗?我曾尝试在许多不同的顺序中使用 ifftshift 和不同的缩放比例,但似乎没有任何效果。
谢谢
我的matlab代码如下:
%%using simple inverse filter
dt = 1/1000;
t = linspace(-3,3,1/dt); %time
s = zeros(1,length(t));
s(t>=-0.5 & t<=0.5) = 1; %rect
f = exp(-(t.^2)); %function
r = -.5 + rand(1,length(t)); %noise
S = fft(s);
F = fft(f);
R = fft(r);
C = F.*S + R;
S_temp = C./F;
s_recovered_1 = real(ifft(S_temp)); %correct?...works for signal without R (noise)
figure();
plot(t,s + r);
title('rect plus noise');
figure();
hold on;
plot(t,s,'r');
plot(t,f,'b');
legend('rect input','function');
title('inpute rect and exponential functions');
hold off;
figure();
plot(t,s_recovered_1,'black');
legend('recovered rect');
title('recovered rect using naive filter');
%% using wiener filter
N = length(s);
I_mag = abs(I).^2;
R_mag = abs(R).^2;
W = I_mag./(I_mag + R_mag);
S_temp = (C.*W)./F;
s_recovered_2 = abs(ifft(S_temp));
figure();
freq = -fs/2:fs/N:fs/2 - fs/N;
hold on;
plot(freq,10*log10(I_mag),'r');
plot(freq,10*log10(R_mag),'b');
grid on
legend('I_mag','R_mag');
title('Periodogram Using FFT')
xlabel('Frequency (Hz)')
ylabel('Power/Frequency (dB/Hz)')
figure();
plot(t,s_recovered_2);
legend('recovered rect');
title('recovered rect using wiener filter');