私は最近、ピッチ検出に FFT を使用しており、ノートは正しい (例: C、D# など) にもかかわらず、間違ったオクターブにある多くのノートがあることに気付きました (例: E2 は E3 に分類され、C3 はC4 に分類され、常に 1 オクターブ上)。
これはなぜですか?私のアルゴリズムは、FFTビンを計算した後、最大の強度を持つビンを取得し、それがどの周波数であるかを計算します。
これについて何か助けはありますか?ありがとう!
2つの考え:-
入力とアルゴリズムが常に期待値から正確に 1 オクターブ離れている場合、そのように調整されていることを認めて、常に 1 オクターブ減算することはできませんか?
ギターの弦を弾くと、常に正確に 1 オクターブ高い倍音 (2 倍音) が得られます。これは非常に大きく、自然音 (1 倍音) とほぼ同じ大きさです。次に 1 オクターブ 7 半音上 (第 3 倍音) になりますが、オクターブ倍音は非常に目立ちます。
私にはハーモニクスのように聞こえます。グレッグの鋭い質問は正しい方向に進んでいるようです。
そうであれば、(現在行っているように) 統計モードを見つけるのではなく、すべてのバケットの統計的中央値を見つけて、最も近いものを見つけることができます。
出力に変動が見られる場合は、一時的な平滑化 (経時的な平均) を行うこともできます。
ギターのチューナーがこれらのことをいくつか行っていることは知っていますが、それでも断続的に間違っています。それは厄介なビジネスです:)
ライブ サンプリングについて言えば、サンプル ソースによっては、予期しない結果をもたらす可能性のある考慮すべき多くの異常があります。
これらはデータに表示されますが、聞くことができない可能性があります。また、複数のトーンやコードを一致させようとすると、作業はさらに複雑になります。
ピッチをどのオクターブに配置するかを決定する際には、周波数の 3 倍に存在するオーディオ量の一部を各バケットに追加してみてください (たとえば、1320Hz バケットの振幅の一部を 440Hz バケットに追加します)。ほとんどの楽器では、A440 は 880Hz、1320Hz、1760Hz、2200Hz、2640Hz などに重要なコンポーネントを持つ可能性があります。案件)。したがって、コードが音符が A440 か A880 かを判断しようとしている場合、3 番目の高調波バケット (またはその他の奇数倍音) を調べると、有用な手がかりが得られる可能性があります。
オクターブ検出は、特に基音ハーモニクスやその他のハーモニクスが欠落しているポリフォニック信号では非常に扱いにくい場合があります。「高調波」だけでなく「ピッチ」を正しく検出していると仮定すると (以下のウィキペディアのリンクを参照)、私が開発したオクターブ検出アルゴリズムを使用できます。
PitchScope Player のピッチ検出を行うために、次のように機能する 2 ステージ アルゴリズムを決定しました。 G, G#, A, A#, B, C, C#, D, D# }. そして音符の ScalePitch と Time-Width が決定された後、b) その音符のオクターブ (基音) は、4 つの可能なオクターブ候補音符のすべてのハーモニクスを調べることによって計算されます。
私のピッチ検出アプリケーション PitchScope Player の完全な C++ ソース コードと実行可能ファイルは GitHub にあります (以下のリンク)。
ファイル FundCandidCalcer.cpp 内の関数 FundCandidCalcer::Calc_Best_Octave_Candidate() に注目して、そのアルゴリズムを C++ で確認することをお勧めします。下の図は、オクターブの計算方法も大まかに示しています。
https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection
https://github.com/CreativeDetectors/PitchScope_Player
下の図は、その音の ScalePitch が決定されたら、正しい Octave-Candidate 音 (つまり、正しい Fundamental) を選択するために私が開発したオクターブ検出アルゴリズムを示しています。