ドキュメンテーション

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

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

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

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

である場合、すなわち である場合、出力は に低減します。シーケンス のすべてのサンプルについて、ゼロ位相の歪みをもつ、 に二重のフィルターをかけたバージョンが可能です。

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

fs = 100;
t = 0:1/fs:1;
x = sin(2*pi*t*3)+.25*sin(2*pi*t*40);

ここで 10 点の平均化 FIR フィルターを作成します。x をフィルター処理しますが、比較のために filterfiltfilt の両方を使用します。

b = ones(1,10)/10;

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

plot(t,x,t,y,t,yy)
legend('Original','Noncausal filtering','Normal filtering')

フィルター処理された結果では、いずれも元の実線に見られる 40Hz の正弦波が除去されています。またこのプロットでは、filterfiltfilt の違いも見ることができます。破線 (filtfilt) は元の 3 Hz の正弦波と同相ですが、点線 (filter) は約 5 サンプル分遅れていることがわかります。また破線の振幅は、関数 filtfilt の振幅二乗効果によって小さくなっています。

filtfilt は、初期条件を注意して選択し、この条件を反映した短い入力シーケンスを入力シーケンスに追加することによって、フィルター開始時の過渡状態を減らします。最良の結果を得るには、フィルターを適用するシーケンスの長さが少なくともフィルター次数の 3 倍以上であることと、両端で次第に 0 になっていることを確認します。

参考

| |