メインコンテンツ

非因果的ゼロ位相フィルターの実装

FIR フィルターの場合、データに適用した際 (filterまたはconvを使用)、出力を単純に一定のサンプル数分だけ遅延させる線形位相フィルターを設計できます。ただし、IIR フィルターの場合、通常位相の歪みはきわめて非線形です。filtfilt関数では、現在の点の前後にある点における信号の情報を使用し、基本的に「将来を予測する」ことによって位相の歪みを除去します。

filtfilt がこの処理をどのように実行するかを理解するには、実数シーケンス x(n) の Z 変換が X(z) であれば、逆時間シーケンス x(-n) の Z 変換が X(z-1) であることを思い出してください。以下の処理を考えます。

|z|=1 である場合、すなわち z=ejω である場合、出力は X(ejω)|H(ejω)|2 に低減します。シーケンス x(n) のすべてのサンプルについて、ゼロ位相の歪みを持つ、x に二重のフィルターをかけたバージョンが利用できます。

サンプル レート 100 Hz、持続時間 1 秒の信号を定義します。この信号は、3 Hz と 40 Hz の 2 つの正弦波成分で構成されます。

Fs = 100;
t = 0:1/Fs:1;
x = sin(2*pi*t*3) + 0.25*sin(2*pi*t*40);

6 次バタワース ローパス フィルターを作成して高周波数の正弦波成分を除外します。x をフィルター処理しますが、比較のために filterfiltfilt の両方を使用します。

[b,a] = butter(6,20/(Fs/2));

y = filtfilt(b,a,x);
yy = filter(b,a,x);

plot(t,x,t,y,t,yy)
legend(["Input" "filtfilt output" "filter output"])
xlabel("Time (s)")

Figure contains an axes object. The axes object with xlabel Time (s) contains 3 objects of type line. These objects represent Input, filtfilt output, filter output.

フィルター処理された結果では、いずれも元の信号に見られる 40 Hz の正弦波が除去されています。プロットは、filterfiltfilt の違いも示します。filtfilt ラインは、元の 3 Hz の正弦波をもつ位相にあり、filter ラインは遅延しています。filter ラインは早い時点で過渡状態を示します。filtfilt は、初期条件を注意して選択し、この条件を反映した短い入力シーケンスを入力シーケンスに追加することによって、フィルター開始時の過渡状態を減らします。

最良の結果を得るには、フィルターを適用するシーケンスの長さが少なくともフィルター次数の 3 倍以上であることと、両端で次第に 0 になっていることを確認します。

参考

| |