web-dev-qa-db-ja.com

pythonで信号にフィルターを適用する方法

pythonに準備された関数があり、特定の信号にフィルタ(たとえば、バターワースフィルタ)を適用しますか? 'scipy.signal'でそのような関数を探しましたが、何も見つかりませんでしたフィルターの設計よりも便利な機能実際には、この機能でフィルターと信号を畳み込みます。

17
Navid Khairdast

はい!二つあります:

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(Matlabでは単にlfilterと呼ばれています)よりもfilterを使用することを強くお勧めします。 documentation のように:

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

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

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

35
cxrodgers