ウィンドウサイズ、サンプルレートはFFTピッチ推定にどのように影響しますか?


8

FFTから得られたパワースペクトルのピークの周波数を抽出するピッチ検出プログラムを作成しようとしています(fftpack)。クインの最初の推定量を使用してビン番号間を補間して、スペクトルからピーク周波数を抽出しています。このスキームは、特定の条件下でうまく機能するようです。たとえば、ウィンドウサイズが1024、サンプルレートが16000の長方形のウィンドウ関数を使用すると、私のアルゴリズムは純粋なA440トーンの周波数を正しく識別します440.06として、880.1の2番目の部分周波数。ただし、他の条件下では、結果が不正確になります。サンプルレート(例:8000)またはウィンドウサイズ(例:2048)を変更しても、最初の部分音は440として正しく識別されますが、2番目の部分音は約892のどこかにあります。このような非調和音の場合、問題はさらに悪化します。ギターまたはピアノによって生成されます。

私の一般的な質問は次のとおりです。サンプルレート、ウィンドウサイズ、およびウィンドウ関数は、FFTピークの周波数推定にどのように影響しますか?私の想定では、スペクトルの分解能を上げるだけでピーク周波数推定の精度が上がると思いましたが、これは明らかに私の経験ではありません(ゼロパディングも役に立たない)。また、スペクトル漏れはピーク位置を変更する必要がないため、ウィンドウ関数の選択はあまり効果がないと想定しています(ただし、今考えてみると、スペクトル漏れは、隣接するビンの大きさがピークは他のピークからの漏れによって人為的に増加します...)。

何かご意見は?

回答:


8
  1. ガウスウィンドウを使用-ガウスのフーリエ変換はガウスです
  2. スペクトルを対数スケールしてピークを強調し、ガウスピークを放物線ピークに変換
  3. 放物線補間を使用して真のピークを見つけます。

§D.1で述べたように、ガウスウィンドウ変換の大きさは、正確にdBスケールの放物線であることに注意してください。その結果、2次スペクトルピーク補間はガウスウィンドウの下で正確です。もちろん、実際にはガウスウィンドウの無限に長い尾部を何らかの方法で削除する必要がありますが、図3.30に示すように、これによって放物線からのずれが大きくなることはありません。

https://ccrma.stanford.edu/~jos/sasp/Quadratic_Interpolation_Spectral_Peaks.html

ここに画像の説明を入力してください

私はこの方法で1000 Hz波形の1000.000004 Hzを推定しますhttps ://gist.github.com/255291#file_parabolic.py

問題が発生した場合は、スペクトルをプロットし、目を使ってそれが機能しない理由を確認してください。


2
ありがとうございました!これは完全に理にかなっています。ガウスの対数は放物線であるため、ガウスウィンドウの対数スペクトルのピークの放物線補間はほぼ正確です。これを実装した後、さまざまなサンプルレートとウィンドウサイズにわたって一貫したFFTピーク周波数推定を取得しています。フザー!
willpett

@ will.pett:では、問題はFFTよりも「Quinn's First Estimator」が原因だったのでしょうか?
エンドリス

二次補間も特定のウィンドウ関数とサンプルレートで私に悪い結果を与えたので、私は補間法が完全に責任があるとは思いません。上記のパラメーターの組み合わせが重要だったと思います。適切なウィンドウ関数を使用しておらず、スペクトルを対数変換していませんでした。もっとも重要なのはログ変換でした。おそらく私が知らなかった標準的なプロトコルでしょう。
willpett

@endolith、ありがとう、取得しました(質問が続く場合があります)
denis

3

まず、ピーク周波数推定とピッチ推定は2つの異なるものです。ピッチは心理音響現象です。一部の楽器で生成された低音のように、基本周波数が完全に欠けていたり、他のほとんどのピークと比較して比較的弱い場合でも、人々はピッチを聞くことができます。

第2に、FFTでウィンドウを使用しないことは、スペクトルをSinc関数でたたみ込む長方形のウィンドウを使用することと同じです。Sinc関数には、ピークから遠く離れた多くのこぶがあり、FFT長で正確に周期的ではないすべての周波数で表示されます(「スペクトルリーク」とも呼ばれます)。1つの強い周波数からのこのすべてのエネルギー漏れは、他の周波数ピークの位置推定に干渉します。したがって、より適切なウィンドウ関数(ハミングまたはフォンハン)は、ピーク間のこの干渉を減らすのに役立つ可能性があります。

FFTが長くなると、ビンの中心間のデルタ周波数が減少します。これにより、内挿が増加し、定常スペクトルの周波数推定精度が向上します。ただし、FFTが非常に長く、FFTウィンドウ内でスペクトルが変化する場合、変化したすべての周波数は、より長いFFTで一緒にぼかされます。


1

間違いなく適切なウィンドウ関数が必要です-スペクトル漏れの影響は、ピッチ周期とFFTウィンドウの長さがどのように関連しているかによって大きく異なります-FFTウィンドウの最後のサンプルと最初のサンプルの間で大きなトランジェントが発生すると、これは非常に厄介ですスペクトルが不鮮明になるのに対し、運が良くなり、この不連続性が小さい場合、結果のスペクトルはかなりきれいになります。これが、FFTサイズなどのパラメーターを変更したときに不整合が発生する理由です。適切なウィンドウ関数を使用すると、ピッチが変化しても一貫したスペクトルが得られます。


私は今、さまざまなウィンドウ関数(ハミング、ブラックマンハリス、ガウス、ウィードンガウス)を試してみましたが、それらはすべて、サンプルレート/ウィンドウサイズ条件(たとえば、460、488、およびその他)。長方形のウィンドウだけが、440 Hzのピークを正しく識別できました。興味深いことに、このピークは、長方形のウィンドウ内のサンプルレート/ウィンドウサイズの組み合わせが異なっても、ほとんど不変ですが、2番目の部分はまだ可変です。これらの結果をアドバイスとどのように調整しますか?

補足として、FFTと比較するために自己相関アルゴリズムも使用しています。この方法(ウィンドウ関数とは無関係)は、ウィキペディアトーンに対して〜440.4 Hzを提供しますが、FFTメソッドは、ウィンドウ関数なしでほぼ​​正確に440を提供します。自己相関は最初の部分周波数を直接推定するのではなく、心理音響的な「ピッチ」を推定しますが、比較することはまだ興味深いことです。ピアノ音色の実験から、自己相関法が最初の部分周波数をFFT法と比較して一貫して過大評価していることに気づきました。

1
コードなどを見なければ問題が何であるかを推測するのは難しいです。ウィンドウ関数がある場合とない場合のピークが実際にどのように見えるかを確認するためにパワースペクトルをプロットしてみましたか?これにより、ウィンドウ処理/ FFTなどが正しく動作しているかどうかがわかるだけでなく、ピッチ推定アルゴリズムが行った結果が得られる理由についての洞察が得られる場合もあります。
Paul R

窓関数は実際にスミアがほとんどなく、よりきれいに見えるスペクトルを生成するので、それは奇妙です。ただし、ピーク周波数の推定は正しくありません。ウィンドウなしで440 Hzになる設定を使用し、ハミングウィンドウに切り替えると、444.6 Hzになります。Blackman-Harrisウィンドウでは460.9 Hzが得られ、ガウスウィンドウでは446.4 Hzが得られます。ピーク補間法が、私が違反している可能性があるウィンドウ関数について暗黙の仮定を行うことは可能ですか?
willpett

リンクしている記事の補間方法についてはあまり詳しくありません-マグニチュードだけでなくマグニチュードとフェーズの両方の情報を使用しているようですが、ウィンドウ処理がフェーズに大きな影響を与えるとは思いませんでした。
Paul R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.