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