4

私は現在、単純な逆フィルターを、matlab を使用してデコンボリューション用のウィーナー フィルターと比較しようとしています。私の開始信号はexp(-t^2)、これは、-.5 から .5 の時間で非ゼロの rect で畳み込まれることです。-.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

最初のアプローチでは、単純に の FT を の FT でc割りf、逆 FT を実行します。これは に相当しs = (approx.) ifft((FxS + N)/F)ます。

2 番目のアプローチでは、ウィーナー フィルター を使用しW、それを乗算してからC/R逆 FT を実行します。これは になりS = (approx.) ifft(CxW/R)ます。

ウインナーフィルターはW = mag_squared(FxS)/(mag_squared(FxS) + mag_squared(N)).

'*' は畳み込みを意味し、'x' は乗算を意味します。

-3 から 3 の時間間隔で rect の 2 つのデコンボリューションを比較しようとしています。現在、デコンボリューションされた 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');
4

1 に答える 1

3

そのため、ウィーナー フィルターを計算するときに間違った分母で割っていたことがわかりました。また、単純な abs(...)^2 の方法を使用して、ウィーナー フィルターの各項の |...|^2 (パワー スペクトル密度) も計算します。上記のコードは、これらの変更を反映しています。これが私のような初心者に役立つことを願っています:)

于 2014-10-13T02:59:58.607 に答える