IIRフィルター(特にバターワースフィルター)は因果関係がありますか?

Aug 19 2020

私は信号処理に不慣れです。私は今フィルタリングについて学んでいて、ハイパスフィルター(HPF)、そして後にバンドパスフィルター(BPF)を実装しようとしています。私はでフィルタを実装するPython 3.8NumPyしてSciPy

オフラインの場合(事前に記録された時間をフィルタリングする)、バターワースハイパスフィルターを設計し、signal.filtfilt関数を使用して時間領域で信号に適用しました。ただし、ドキュメントに示されているように、このアプローチはオフラインの場合にのみ有効であり、リアルタイムには適していません。これは、フィルターが信号を順方向にスキャンしてから逆方向にスキャンするためです。signal.freqz関数を使用して、フィルターから周波数応答を復元できます。

ここで、このフィルターがリアルタイムでも機能することを望んでいます(したがって、因果関係がある必要があり、このタイプのフィルターでこれが可能かどうかを尋ねます。私の質問は次のとおりです。

  1. 私が正しく理解していれば、バターワースフィルターはIIR(無限インパルス応答)フィルターです。それは本当ですか?
  2. IIRフィルターは因果関係がありますか?すべてのIIRフィルターが因果関係にあるわけではなく、因果関係がある場合とそうでない場合があります。IIRフィルターが原因である場合は何ですか?
  3. バターワースフィルターは因果関係がありますか?常にではないにしても、その場合、それらは因果関係がありますか?
  4. 3の答えが真の場合、時間領域と周波数領域の両方で、因果的なバターワースフィルターを実装するにはどうすればよいですか?(私は使用することができるSciPyような機能signal.buttersignal.freqz等)

関連リンク:

  • バターワースフィルターの設計を支援する
  • filtfilt: https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.filtfilt.html

ありがとうございました。

回答

7 endolith Aug 19 2020 at 13:49
  1. はい、バターワースはIIRです。インパルスからの崩壊は技術的には永遠に続きます。
  2. はい、すべての[実装可能な] IIRは因果関係があります。
  3. はい、#1と#2のためです。
  4. 使用しないでくださいsignal.filtfilt。を使用しsignal.lfilterます。因果的フィルターをゼロ位相フィルターに変更する反対方向の2回を除いfiltfiltて、と同じことをlfilter行います。

ただし、これらの機能の両方のドキュメントが示唆しているように、ほとんどの実用的な使用では、代わりに実際にはSOSバリアントを使用する必要があります。

2次セクションでは数値の問題が少ないため、ほとんどのフィルタリングタスクでは、関数sosfilt(およびを使用したフィルター設計output='sos')を優先する必要がありlfilterます。

機能を要約すると:

  • lfilter:因果的単一ステージフィルタリング(低次のみ)
  • filtfilt:ゼロフェーズシングルステージフィルタリング(低次のみ)
  • sosfilt:因果的二次セクションフィルタリング
  • sosfiltfilt:ゼロフェーズ2次セクションフィルタリング

本当に使用する唯一の理由lfilterfiltfilt、あなたの係数がすでにある場合であるb, aあなたがなど、教科書から何かを実装している場合、フォーマット

自分でフィルターを設計している場合は、SOSフォームを使用するだけで、数値エラーが減少します。

filtfilt関数はフィルターを2回適用するため、元のフィルターの2倍の次数になることに注意してください。

1 TimWescott Aug 19 2020 at 16:17

IIRフィルターは因果関係がありますか?すべてのIIRフィルターが因果関係にあるわけではなく、因果関係がある場合とそうでない場合があります。IIRフィルターが原因である場合は何ですか?

実際のIIRフィルターはすべて因果関係があります。宇宙が見た目よりもはるかに奇妙でない限り、すべての実際のシステムは因果関係があります。

将来の情報に作用するフィルターを定義できます。つまり、あなたはそれを言うことができます$y_n = 0.9 y_{n+1} + x_n$。それは(読者の懐疑論を克服するための多くの言葉で)インパルス応答が$$h_\kappa = \begin{cases} 0 & \kappa > 0 \\ 0.9^{-\kappa} & \kappa \le 0 \end{cases}$$

ただし、実際にはそのようなフィルターを実際に実装することはできません。