Matlab中反褶积的朴素逆滤波器与维纳滤波器的比较

Matlab中反褶积的朴素逆滤波器与维纳滤波器的比较,matlab,signal-processing,fft,convolution,ifft,Matlab,Signal Processing,Fft,Convolution,Ifft,我目前正在尝试使用matlab将一个简单的逆滤波器与维纳滤波器进行反卷积比较。我的起始信号是exp(-t^2),这将与一个非零的rect进行卷积,时间为-0.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 = Fx

我目前正在尝试使用matlab将一个简单的逆滤波器与维纳滤波器进行反卷积比较。我的起始信号是exp(-t^2),这将与一个非零的rect进行卷积,时间为-0.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=(大约)ifft((FxS+N)/f)

对于第二种方法,我采用维纳滤波器,
W
,将其与
C/R
相乘,然后进行反FT。这相当于
S=(大约)ifft(CxW/R)

维纳滤波器是
W=mag_平方(FxS)/(mag_平方(FxS)+mag_平方(N))

我用“*”表示卷积,用“x”表示乘法

我试图比较rect在时间间隔-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');
%%使用简单逆滤波器
dt=1/1000;
t=linspace(-3,3,1/dt);%时间
s=零(1,长度(t));

s(t>=-0.5&t因此,在计算维纳滤波器时,我被错误的分母除了。我现在还使用简单的abs(…)^2方法计算维纳滤波器中每个项的|…^2(功率谱密度)。上面的代码反映了这些变化。
希望这对任何像我这样的noob都有帮助:)

去除噪声并计算简单的逆滤波器可以显示原始的rect(前提是我做了“s_recovered_1=real(ifft(s_temp));我已经修改了上面的代码来反映)。我希望简单逆滤波器的输出会给出较大的值,因为我主要是除以较小的值。这或多或少与我实际得到的输出相匹配。我想我现在的主要问题是计算维纳滤波器。我已经更新了我的代码,以反映我认为它现在是什么,但我非常不确定这一点,它仍然没有产生任何像原来的rect。我还尝试计算维纳滤波器,直接计算我认为是双边功率谱密度的I和R。我已经更新了上面的代码,以反映这一点。我现在有点像sinc了。所以这可能更好,但仍然不接近。我也尝试过两次关于维纳滤波的ifft,我知道这很愚蠢,但它给出了正确振幅的矩形(因为第一个ifft是sinc),但宽度是错误的。。。我已经更新了上面的代码以显示这一行。我也在尝试这样做,但你的代码现在被零除,导致维纳反褶积的所有NaN值。是的,你必须检查NaN值。嗨,我试着运行你的代码,但它说I和R没有定义。I和R的值是多少?@MoneyBall我上次看这个已经有一段时间了,但我相信I=FxS,其中F=fft(F)和s=fft(s)(F是原始信号,s是rect)