Python でマルチコンポーネント オーディオ信号の瞬時周波数を見つけるプロジェクトに取り組んでいます。現在、バターワース バンドパス フィルターを組み合わせて使用しscipy.signal.lfilter
て、目的の周波数領域を抽出しています。次に、( からの) 解析信号を使用しscipy.signal.hilbert
て瞬時位相を取得します。これをアンラップして周波数を得ることができます。
信号処理の比較的初心者として、2 つの主な質問があります。
多くのアプリケーションでは、
scipy.signal.filtfilt
overを使用することが望ましいと読みましたscipy.signal.lfilter
。確かにfiltfilt
、データに適用すると、非常に滑らかに見える瞬時周波数信号が得られます。「真の」瞬時周波数にできるだけ近い出力を得たいということを念頭に置いて、2つの主な違いを知りたいと思います。瞬時周波数データは非定常です。つまり、場合によっては、必要なデータをすべて取得するために、より広いバンドパス フィルターを使用する必要があります。これにより、追加のノイズが発生し、信号が不安定になることがあります。このような問題に対処する方法はありますか? たとえば、より適切に設計されたフィルターを使用するなどです。
編集
フレブールへの回答として、以下は私が見ているデータの画像です。filt
まず、との比較filtfilt
:
上記の両方の信号に同じバターワース フィルターを適用し (フィルター機能は異なります)、次に瞬時周波数を抽出します (時間の関数としてプロットされているものです)。
filtfilt
データをシフトして平滑化するようです。これらの信号の 1 つは、「真の」信号のより適切な近似ですか?
このグラフは、特定の信号のサブセットのみを示していることに注意してください。
2 つ目は、バターワース フィルターのサイズを大きくした場合の効果です。
これは、図 1 と同じデータのサブセットに対するものです。凡例は、フィルターの下限と上限をそれぞれ示しています (赤いトレースは、
filt
図 1 のデータのバージョンです)。 .
ここでは、より大きな通過帯域を使用する理由が明確でない場合がありますが、場合によっては、データが 600 ~ 800 Hz の間のさまざまなポイントに配置されることがあります。ここで、より幅広いフィルター設計が必要になります。フィルターが広くなるにつれて、追加のノイズがトレースに入ることがわかります。フィルター設計を最適化/改善する方法があるかどうか知りたいです。