在Matlab中比较朴素逆滤波器与Wiener滤波器进行反卷积

时间:2014-10-11 09:25:41

标签: matlab signal-processing fft convolution ifft

我目前正在尝试使用matlab将简单的逆滤波器与用于解卷积的维纳滤波器进行比较。我的起始信号为exp(-t^2),这将与一个非零的矩阵卷积,时间为-.5到.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

对于第一种方法,我只是采用c的FT并将其除以f的FT,然后进行逆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之间比较rect的两个解卷积。 现在,我得到的解卷积矩形图形与原始图形完全不同 有人能指出我正确的方向,我做错了吗?我尝试过使用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');

1 个答案:

答案 0 :(得分:3)

事实证明,在计算维纳滤波器时,我正在用错误的分母划分。我现在还使用直接的abs(...)^ 2方式计算维纳滤波器中每个项的| ... | ^ 2(功率谱密度)。上面的代码反映了这些变化。 希望这对像我这样的任何新手都有帮助:)。