メインコンテンツ

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

信号をフィルター処理すると遅延が生じます。つまり入力に対し、出力信号では時間のシフトが行われます。

シフトが一定の場合は、信号を時間シフトすることで遅延を補正できます。

フィルターでは、一部の周波数成分が不均一に遅延することがあります。この現象は位相歪みと呼ばれています。この影響は、関数 filtfilt を使用してゼロ位相フィルター処理を実行することで補正できます。

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

Fs = 500;
N = 500;

rng default

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

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

Nfir = 70;
Fst = 75;

firf = designfilt('lowpassfir','FilterOrder',Nfir, ...
    'CutoffFrequency',Fst,'SampleRate',Fs);

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

xf = filter(firf,xn);

plot(tn,xn,tn,xf)
title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','FIR Filtered')
grid

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

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

grpdelay(firf,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(firf))
delay = 
35

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

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

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

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

plot(tt,sn,tt,sf)
title 'Electrocardiogram'
xlabel('Time (s)')
legend('Original Signal','Filtered Shifted Signal')
grid

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.

7 次 IIR フィルターを使用して計算を繰り返します。

Niir = 7;

iir = designfilt('lowpassiir','FilterOrder',Niir, ...
    'HalfPowerFrequency',Fst,'SampleRate',Fs);

信号をフィルター処理します。フィルター処理された信号は元の信号よりノイズが少ないですが、元の信号に対して時間が遅延します。また、フィルターの非線形位相により歪みが生じます。

xfilter = filter(iir,xn);

plot(tn,xn,tn,xfilter)

title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','Filtered')
axis([0.25 0.55 -1 1.5])
grid

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

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

grpdelay(iir,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(iir,xn);

plot(tn,xn)
hold on
plot(tn,xfilter)
plot(tn,xfiltfilt)

title 'Electrocardiogram'
xlabel 'Time (s)'
legend('Original','''filter''','''filtfilt''')
axis([0.25 0.55 -1 1.5])
grid

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