2011-06-27 10 views
1

ピッチ検出に最近FFTを使用していましたが、ノートが正しくても(C、D#など)、間違ったオクターブにあるノートが多数ありますC3はC4として分類され、常に1オクターブ上に分類されます)。ピッチ検出のためのFFT

これはなぜですか?私のアルゴリズムは、FFTビンを計算した後で、ビンを最大強度で取得し、それがどの周波数であるかを計算します。

これに関する助力?ありがとう!

+2

正しいオクターブと間違ったオクターブ間の強度がどのように接近していますか? –

+0

データのソースは何ですか?実際の声や楽器は倍音を生成します。これは、あなたが派生するスペクトルに表示されます。 –

+0

@Greg、時々閉じる、時にはあまりにも遠すぎる...一般的に、間違ったオクターブはちょうど正しい@Adamより少し高いです。私のデータのソースはWAVファイルです(44.1KHz、モノ、16ビットアコースティック・ギターの録音です(私は単音の音楽のみを扱っています) – user488792

答えて

1

音が高調波です。グレッグの指摘された質問は正しい道のりにあるようだ。

これが当てはまる場合は、すべてのバケットの統計的中央値を見つけて(現在行っているように)統計モードを見つけるのではなく、最も近いものを見つけることができます。 Statistical Mode

  • Statistical Median
    • あなたの出力の変動を見ている場合は、一時的なスムージング(時間にわたる平均)を行うことができます。

      私は、ギターのチューナーがこれらのいくつかのことを行い、間違って間違っていることを知っています。それは厄介なビジネスだ:)ライブサンプリングの

      言えば、あなたのサンプルのソースに依存し、それはあなたに予期しない結果を与えることができ、考慮すべき異常がたくさんあります:サウンドで

      • 倍音
      • 聞こえる音が聞こえません

      これはあなたのデータに表示されますが、聞こえない可能性があります。また、複数のトーンやコードにマッチさせようとすると、あなたの仕事はさらに複雑になります。

    +0

    こんにちは!すみませんが、問題の統計的中央値をどのように使うことができるかを明確にすることはできますか?なぜなら、それは何らかの順序でそれを配置した後のちょうど中間点ではないのですか? – user488792

    +0

    @ user488792:の並べ替え。あなたはすべてのバケツの重量を取って、すべてのバケツを合計し、バケツの数で割り、そして最も近いバケツに丸めます。これは、他のバケットのデータ(最大値ではない)が「投げ捨てられない」ため、単にすべてのバケットの最大値を取ることとは対照的です。 –

    2

    2つの思考: -

    1. あなたの入力し、あなたのアルゴリズムは、あなたが、あなたはちょうどあなたがそのように校正し、常にオクターブを引くしていることを私達accpetすることはできません期待から丁度1オクターブ離れて常にある場合?

    2. ギターの弦をとると、常に高調波(第2高調波)が正確に1オクターブ上がって自然な音量(第1高調波)ほど大きくなります。次に、1オクターブ7セミトーン(3次ハーモニック)が得られますが、オクターブハーモニックは本当に目立ちます。でピッチを配置するためにどのオクターブを決めるには

    0

    、3倍の周波数が存在するオーディオの量は、(例えば440Hzのバケットに1320Hzの振幅の割合を追加し、各バケットにいくつかの部分を追加してみてくださいバケツ)。ほとんどの機器では、A480は880Hz、1320Hz、1760Hz、2200Hz、2640Hzなどで重要な成分を持つ可能性があります.A880はおそらく880Hz、1760Hz、2640Hzですが、重要な1320Hz成分はありません(2220Hz問題)。したがって、コードがA440かA880のどちらであるかを判断しようとしている場合は、3次ハーモニックバケット(または他の奇妙な高調波)を見ると役立つかもしれません。

    0

    オクターブ検出は、特に基本高調及び/又は他の高調波が欠落しているポリフォニック信号に、非常に難しいことができます。 「高調波」だけでなく「音程」を正確に検出していると仮定すると(下のWikipediaのリンクを参照)、私が開発したOctave Detectionアルゴリズムを使用することができます。

    PitchScope Playerのピッチ検出を行うために、私は次のような2段階アルゴリズムを決めました:a)最初に音符のScalePitchが検出されました。 - 'ScalePitch'には12通りのピッチ値があります:{E、 F、F#、G、G#、A、A#、B、C、C#、D、D#}。そして、音符のScalePitchとTime-Widthが決定された後、b)その音のOctave(基本音)は、4つの可能なOctave-Candidate音の高調波をすべて調べることによって計算されます。

    私のピッチ検出アプリケーション、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が一旦以下の図は、(すなわち、正しい基礎である)私が正しいオクターブ候補音符を選択するために開発されたオクターブ検出アルゴリズムを示してい決定。

    enter image description here

    関連する問題