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