ドキュメンテーション

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

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

grpdelay を使用して、フィルターによって発生する遅延がフィルター次数の半分に等しいことを確認します。

grpdelay(d,N,Fs)

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

参考

| | |

関連するトピック