ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

IIR フィルターによって生じる遅延の補正

信号をフィルター処理すると遅延が生じます。つまり入力に対し、出力信号では時間のシフトが行われます。

無限インパルス応答フィルターでは、一部の周波数成分が不均一に遅延します。このフィルターは事実上、入力信号を歪めます。関数 filtfilt は、こういったフィルターで生じる遅延を補正することで、フィルターによる歪みを修正します。この "ゼロ位相フィルター処理" は、信号を順方向および逆方向にフィルター処理することで得られます。

1 秒間に 500 Hz でサンプルされた心電図の読み取りを例に取ります。ランダム ノイズを追加します。

Fs = 500;
N = 500;

rng default
xn = ecg(N) + 0.2*randn([1 N]);
tn = (0:N-1)/Fs;

75 Hz より高い周波数を阻止するフィルターを使用して、ノイズの一部を除去します。1 dB の通過帯域リップルと 60 dB の阻止帯域の減衰量をもつ 7 次の IIR フィルターを指定します。

Nf = 7;
Fp = 75;
Ap = 1;
As = 60;

d = designfilt('lowpassiir','FilterOrder',Nf,'PassbandFrequency',Fp, ...
    'PassbandRipple',Ap,'StopbandAttenuation',As,'SampleRate',Fs);

信号をフィルター処理します。フィルター処理された信号は元の信号よりノイズが少ないですが、元の信号に対して時間が遅延します。また、フィルターの非線形位相により歪みが生じます。ピークの近傍を拡大します。

xfilter = filter(d,xn);

plot(tn,xn,tn,xfilter)

title 'Electrocardiogram'
xlabel 'Time (s)', legend('Original Signal','Filtered Signal')
axis([0.25 0.55 -1 1.5])

フィルターによって生じた "群遅延" を見ると、遅延が周波数に依存していることがわかります。

grpdelay(d,N,Fs)

filtfilt を使用して信号をフィルター処理します。遅延と歪みは事実上削除されています。信号の位相情報をそのまま残すことが不可欠な場合は filtfilt を使用します。

xfiltfilt = filtfilt(d,xn);

plot(tn,xn,tn,xfilter)
hold on
plot(tn,xfiltfilt,'r','linewidth',2)
hold off

title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original Signal','Filtered Signal', ...
       'Zero-phase filtered with ''filtfilt''')
axis([0.25 0.55 -1 1.5])

参考

| | |

関連するトピック