Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

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 に二重のフィルターをかけたバージョンが利用できます。

たとえば、100Hz でサンプリングされた、3Hz と 40Hz の 2 つの正弦波で構成される、持続時間 1 秒の信号は以下のようになります。

fs = 100;
t = 0:1/fs:1;
x = sin(2*pi*t*3)+.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('Original','filtfilt','filter')

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

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

参考

| |