このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
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])
参考
designfilt
| filter
| filtfilt
| grpdelay