与えられた信号にフィルター(例えばバターワースフィルター)を適用するためにPythonに準備された関数はありますか?'scipy.signal'でそのような関数を探していますが、フィルター設計の関数以外に役立つ関数は見つかりませんでした。実際、この関数で信号とフィルターを畳み込みたいと思います。
1 に答える
はい!二つあります:
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
。
ちなみに、ほとんどのアプリケーションではfiltfilt
over ( Matlabではlfilter
単に呼ばれます)を使用することを強くお勧めします。ドキュメントfilter
に記載されているように:
この関数は、線形フィルターを2回適用します。1回は順方向、もう1回は逆方向です。結合されたフィルターは線形位相を持っています。
これが意味するのは、出力の各値は、入力の「過去」と「未来」の両方のポイントの関数であるということです。したがって、入力に遅れをとることはありません。
対照的にlfilter
、入力の「過去」の値のみを使用します。これにより、必然的にタイムラグが発生し、周波数に依存します。もちろん、これが望ましいアプリケーションはいくつかありますが(特にリアルタイムフィルタリング)、ほとんどのユーザーはを使用する方がはるかに優れていfiltfilt
ます。