6

Python でマルチコンポーネント オーディオ信号の瞬時周波数を見つけるプロジェクトに取り組んでいます。現在、バターワース バンドパス フィルターを組み合わせて使用​​しscipy.signal.lfilterて、目的の周波数領域を抽出しています。次に、( からの) 解析信号を使用しscipy.signal.hilbertて瞬時位相を取得します。これをアンラップして周波数を得ることができます。

信号処理の比較的初心者として、2 つの主な質問があります。

  1. 多くのアプリケーションでは、scipy.signal.filtfiltoverを使用することが望ましいと読みましたscipy.signal.lfilter。確かにfiltfilt、データに適用すると、非常に滑らかに見える瞬時周波数信号が得られます。「真の」瞬時周波数にできるだけ近い出力を得たいということを念頭に置いて、2つの主な違いを知りたいと思います。

  2. 瞬時周波数データは非定常です。つまり、場合によっては、必要なデータをすべて取得するために、より広いバンドパス フィルターを使用する必要があります。これにより、追加のノイズが発生し、信号が不安定になることがあります。このような問題に対処する方法はありますか? たとえば、より適切に設計されたフィルターを使用するなどです。

編集

フレブールへの回答として、以下は私が見ているデータの画像です。filtまず、との比較filtfilt: <code>filt</code> と <code>filtfilt</code> の比較 上記の両方の信号に同じバターワース フィルターを適用し (フィルター機能は異なります)、次に瞬時周波数を抽出します (時間の関数としてプロットされているものです)。filtfiltデータをシフトして平滑化するようです。これらの信号の 1 つは、「真の」信号のより適切な近似ですか?

このグラフは、特定の信号のサブセットのみを示していることに注意してください。

2 つ目は、バターワース フィルターのサイズを大きくした場合の効果です。 フィルターを広げる これは、図 1 と同じデータのサブセットに対するものです。凡例は、フィルターの下限と上限をそれぞれ示しています (赤いトレースは、filt図 1 のデータのバージョンです)。 .

ここでは、より大きな通過帯域を使用する理由が明確でない場合がありますが、場合によっては、データが 600 ~ 800 Hz の間のさまざまなポイントに配置されることがあります。ここで、より幅広いフィルター設計が必要になります。フィルターが広くなるにつれて、追加のノイズがトレースに入ることがわかります。フィルター設計を最適化/改善する方法があるかどうか知りたいです。

4

2 に答える 2

1

あなたの最初の問題については、私は知的に話すことはできませんが、scipy は一般的に十分に文書化されているので、それらのもののいくつかを読み始めます。

2 番目の問題に対しては、より適切に設計されたフィルターが確かに役立ちます。データは「非定常」だとおっしゃっていますが、それがどこにあるのか知っていますか? または、どのような周波数を占める可能性がありますか? たとえば、信号がアプリオリにわかっている 3 つの周波数のうちの 1 つを中心としている場合、3 つの異なるフィルターを使用して、信号を 3 つすべてに通すことができます (もちろん、必要な出力が得られるのは 1 つだけです)。

信号についてそのような知識がない場合は、最初に広い BPF を実行してから、ピーク検出を行い、必要なデータがどこにあるかがわかったら、より厳密な BPF を適用します。

于 2013-06-25T16:31:59.450 に答える