メインコンテンツ

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

信号をフィルター処理すると遅延が生じます。つまり入力に対し、出力信号では時間のシフトが行われます。この例では、この影響を抑える方法を説明します。

有限インパルス応答フィルターでは、しばしばすべての周波数成分が同じ量だけ遅延します。このため、信号を時間シフトすれば、遅延を簡単に修正できます。

1 秒間に 500 Hz でサンプルされた心電図の読み取りを例に取ります。ランダム ノイズを追加します。再現性が必要な場合は、乱数発生器をリセットします。

Fs = 500;
N = 500;
rng default

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

75 Hz より高い周波数を阻止するフィルターを使用して、ノイズの一部を除去します。designfilt を使用して次数 70 のフィルターを設計します。

nfilt = 70;
Fst = 75;

d = designfilt('lowpassfir','FilterOrder',nfilt, ...
               'CutoffFrequency',Fst,'SampleRate',Fs);

信号をフィルター処理し、プロットします。結果は元の信号より滑らかですが、遅れます。

xf = filter(d,xn);

plot(tn,xn)
hold on, plot(tn,xf,'-r','linewidth',1.5), hold off
title 'Electrocardiogram'
xlabel 'Time (s)', legend('Original Signal','Filtered Signal')

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 を使用して、フィルターによって発生する遅延がフィルター次数の半分に等しいことを確認します。

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.

delay = mean(grpdelay(d))
delay = 
35

フィルター処理された信号をシフトして、データを整列させます。最初の delay サンプルを削除します。元の信号および時間ベクトルの最後の delay サンプルを削除します。

tt = tn(1:end-delay);
sn = xn(1:end-delay);

sf = xf;
sf(1:delay) = [];

信号をプロットし、それらが整列していることを確認します。

plot(tt,sn)
hold on, plot(tt,sf,'-r','linewidth',1.5), hold off
title 'Electrocardiogram'
xlabel('Time (s)'), legend('Original Signal','Filtered Shifted Signal')

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 Shifted Signal.

参考

| | |

トピック