24

与えられた信号にフィルター(例えばバターワースフィルター)を適用するためにPythonに準備された関数はありますか?'scipy.signal'でそのような関数を探していますが、フィルター設計の関数以外に役立つ関数は見つかりませんでした。実際、この関数で信号とフィルターを畳み込みたいと思います。

4

1 に答える 1

43

はい!二つあります:

scipy.signal.filtfilt
scipy.signal.lfilter

convolve畳み込み(および)の方法もありますがfftconvolve、IIRフィルターが含まれるため、これらはアプリケーションにはおそらく適切ではありません。

完全なコードサンプル:

b, a = scipy.signal.butter(N, Wn, 'low')
output_signal = scipy.signal.filtfilt(b, a, input_signal)

引数と使用法の詳細については、ドキュメントを参照してください。1つの落とし穴はWn、ナイキスト周波数の一部(サンプリング周波数の半分)です。したがって、サンプリングレートが1000Hzで、250Hzのカットオフが必要な場合は、を使用する必要がありますWn=0.5

ちなみに、ほとんどのアプリケーションではfiltfiltover ( Matlabではlfilter単に呼ばれます)を使用することを強くお勧めします。ドキュメントfilterに記載されているように:

この関数は、線形フィルターを2回適用します。1回は順方向、もう1回は逆方向です。結合されたフィルターは線形位相を持っています。

これが意味するのは、出力の各値は、入力の「過去」と「未来」の両方のポイントの関数であるということです。したがって、入力に遅れをとることはありません。

対照的にlfilter、入力の「過去」の値のみを使用します。これにより、必然的にタイムラグが発生し、周波数に依存します。もちろん、これが望ましいアプリケーションはいくつかありますが(特にリアルタイムフィルタリング)、ほとんどのユーザーはを使用する方がはるかに優れていfiltfiltます。

于 2012-12-06T09:27:54.427 に答える