ゼロ位相フィルター:前方後方フィルタリングの初期条件の決定


7

フォワードバックワードフィルタリングで過渡を最小化するためのGustafsonのアルゴリズムに精通している人はいますか[1]?私はそれを実装しようとしていますが、私の最初の推測は、Matlabのfiltfilt.mをチェックすることでした。Matlab関数では、起動過渡を最小化する初期条件ziを見つけるために線形方程式系も解かれますが、参照とコードの関係は私には明らかではありません。最小化に関するコードの行は次のとおりです(nfiltは係数ベクトルの長さです):

zi = ( eye(nfilt-1) - [-a(2:nfilt), [eye(nfilt-2); zeros(1,nfilt-2)]] ) \...
 ( b(2:nfilt) - b(1)*a(2:nfilt) );

それらの行がGustafsonの記事で説明されているアルゴリズムとどのように関連しているかについて、誰かが正しい方向に私を指摘できますか?

[1] Gustafsson、F。「フォワードバックワードフィルタリングでの初期状態の決定」信号処理に関するIEEE®トランザクション。巻。44、1996年4月、988〜992ページ。


IIRフィルターの初期状態は、順方向フィルタリングパスの開始時にゼロであり、逆方向フィルタリングパスの開始時にゼロでなければなりません。両方のパスで、フィルターされる信号ファイル(またはバッファー)は、IIRの見かけの長さ(出力がゼロに近くなるまで減衰し、残りの減衰をカットオフするのにかかる時間)だけ長くなります。 。
ロバート・ブリストウジョンソン2017

この論文では、著者は、フォワードフィルターとバックワードフィルターの状態空間表現が異なると主張しています。理由を説明できますか?
Maxtron、2018年

まあ、私は使用を理解しているfiltfilt()ので、理由がわかりません。私はGustafsonの論文を読んでいません(IEEEではないため、無料で入手することはできません。コピーを持っている人は誰でも、その.pdfをメールで送信してください)。の概念を使用するfiltfilt場合、サンプルのファイル全体に対して行うことができます(私にとっては、.wavのようなオーディオファイルまたはサウンドファイルです)最初に、最後にゼロが埋め込まれたサウンドを前方にフィルタリングします。フォワードフィルターのインパルス応答が期待されます。これによりファイルが長くなりますが、出力は実質的にゼロになります。次に、結果のファイルをフィルターで逆方向に実行します。
ロバートブリストウジョンソン

PowellとChauによる論文に基づいてfiltfilt、入力をサンプルのブロックに分割し、各ブロックをゼロパディングし、ブロックを後方にフィルタリングしながら、「テール」を前方に反転させたままにする別の用途があります。オーバーラップ加算。Powell-Chauはこれを実行しませんでしたが、これはTruncated IIRフィルターの優れたアプリケーションであると考えているため、減衰ブロックの出力がいつ終了するわかります。
ロバートブリストウジョンソン

1
@ robertbristow-johnson:このGustafsson論文のコピーに遭遇しました。
djvg 2018年

回答:


5

興味がある人のために、私は偶然偶然、matlabのfiltfilt.mで実装された方法を説明する論文を見つけました。論文へのリンクが添付されています。少なくとも私の理解では、matlabのfiltfilt.mはGustafsonアルゴリズムを実装していません。

サドフスキー、P。Bartusek、K:デジタルフィルターの過渡応答の最適化、Radioengineering Vol。9、2、2000


参照してくださいscipy ドキュメントのためlfilter_ziのデフォルトである、scipy.signal.filtfiltあなたが見ることができるように、初期条件を決定するためのソースを。この場合、「奇数」のパディングがデフォルトで使用されますが、オプションとしてGustafssonのメソッドを使用できます(_filtfilt_gustソースの定義を確認してください)。
djvg 2018年

0

zi = (...)\(...)OPの質問の行は、フィルターの初期状態を決定します。まったく同じアプローチがPythonでも使用されていると思いますscipyscipy docsによると:

次数mの線形フィルターには、状態空間表現(A、B、C、D)があり、フィルターの出力yは次のように表すことができます。

z(n + 1)= A z(n)+ B x(n)

y(n)= C z(n)+ D x(n)

ここで、z(n)は長さmのベクトル、Aは形状(m、m)、Bは形状(m、1)、Cは形状(1、m)、Dは形状(1、1)を持ちます(xと仮定) (n)はスカラーです)。lfilter_ziは次を解決します:

zi = A * zi + B

つまり、すべて1の入力に対する応答が定数である初期条件を見つけます。

(私の強調)

filtfiltは、初期状態を計算し、ziそれを最初のサンプル値でスケーリングしてから、に渡しfilter、実際にそれを適用することに注意してください(docs)。

ここziでは、状態空間表現を使用して、この初期状態をフィルターに適用する方法の基本的な例を示します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.