メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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])

Figure contains an axes object. The axes object with title Electrocardiogram', xlabel Time (s) contains 2 objects of type line. These objects represent Original Signal, Filtered Signal.

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

grpdelay(d,N,Fs)

Figure contains an axes object. The axes object with title Group Delay, xlabel Frequency (Hz), ylabel Group delay (samples) contains an object of type line.

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

xfiltfilt = filtfilt(d,xn);

plot(tn,xn,tn,xfilter)
hold on
plot(tn,xfiltfilt,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])

Figure contains an axes object. The axes object with title Electrocardiogram, xlabel Time (s) contains 3 objects of type line. These objects represent Original Signal, Filtered Signal, Zero-phase filtered with filtfilt.

参考

| | |

トピック