FFTから得られたパワースペクトルのピークの周波数を抽出するピッチ検出プログラムを作成しようとしています(fftpack
)。クインの最初の推定量を使用してビン番号間を補間して、スペクトルからピーク周波数を抽出しています。このスキームは、特定の条件下でうまく機能するようです。たとえば、ウィンドウサイズが1024、サンプルレートが16000の長方形のウィンドウ関数を使用すると、私のアルゴリズムは純粋なA440トーンの周波数を正しく識別します440.06として、880.1の2番目の部分周波数。ただし、他の条件下では、結果が不正確になります。サンプルレート(例:8000)またはウィンドウサイズ(例:2048)を変更しても、最初の部分音は440として正しく識別されますが、2番目の部分音は約892のどこかにあります。このような非調和音の場合、問題はさらに悪化します。ギターまたはピアノによって生成されます。
私の一般的な質問は次のとおりです。サンプルレート、ウィンドウサイズ、およびウィンドウ関数は、FFTピークの周波数推定にどのように影響しますか?私の想定では、スペクトルの分解能を上げるだけでピーク周波数推定の精度が上がると思いましたが、これは明らかに私の経験ではありません(ゼロパディングも役に立たない)。また、スペクトル漏れはピーク位置を変更する必要がないため、ウィンドウ関数の選択はあまり効果がないと想定しています(ただし、今考えてみると、スペクトル漏れは、隣接するビンの大きさがピークは他のピークからの漏れによって人為的に増加します...)。
何かご意見は?