私はピアノのチューニングプログラムに取り組んでおり、その一部にはリアルタイムのピッチ検出が必要です。これは私がこれまでに行ったスキームで、ある程度は機能しますが、おそらくいくつかの改良を使用できます。
モノラル、44.1kHz、16ビットPCMオーディオを2 ^ 14サンプルのチャンクでキャプチャしています。最後の4つのサンプルを長さ2 ^ 16のバッファーに結合し、ハンウィンドウをバッファーに適用して、FFTを実行します。次に、FFTの結果を2つの解像度でバケット化します。最初に、200バケットにバケット化してから、この粒度でHPSピッチ検出アルゴリズムを実行します。ここで正確な周波数を取得する必要はありません。近づきたいだけです。次に、12000バケットにバケット化すると、10Hzから10kHzまで1セントの解像度になります。200ビンHPSアルゴリズムからおおよその周波数がわかったら、12000ビンケースのその範囲でピークを検索して、より正確な周波数を取得します。
これは、キーボードの中央にあるノートでは問題なく動作するようです。低音で発生するのは、通常、実際の音の2番目または3番目の部分である約1.5秒の音の誤認と、その後の正しい音の誤認です。
何が起こっているのかを確認するために作成したすべてのスペクトルプロットでは、予想されるピークよりも広い幅があります。この幅は、200ビンから12000ビンのケースで視覚的にある程度一貫しています。200ビンの場合、ピークが狭くなると予想していました。
ですから、信号処理は私にとっては初めてなので、私が質問することは考えられない問題があるかもしれませんが、特定の質問に関しては、サンプルサイズはこのタスクに十分ですか?ハーンはウィンドウの正しい選択ですか?FFTの前にデータを平滑化する必要がありますか?ビンの数に対してHPSはどの程度敏感ですか?多くのビンを使用した場合、非調和性により、部分音がHPSアルゴリズムの2、3、4などで除算する単純なアプローチと基本波をオーバーラップしない可能性があると考えていました。