2016-11-11 4 views
0

私は音声トレーニングアプリを作成していますが、FFTを使用して信号を時間領域から周波数領域に変換しました。 FFTを適用する前に、blackman-harrisウィンドウを使用して信号を窓掛けしました。次に、基本周波数を抽出するために高調波積スペクトルを使用しました。最低周波数はF2(87.307 Hz)で、最高周波数はC6(1046.502 Hz)です。 FFT Lengthは8192、サンプリング周波数は44100 Hzです。高調波のスペクトルにおけるオクターブ誤差を修正するには?

オクターブの誤差を修正するために、私はhereというルールを適用しました。

 float[] array = hps.HPS(Data); 
    float hpsmax_mag = float.MinValue; 
    float hpsmax_index = -1; 

    for (int i = 0; i < array.Length; i++) 
      if (array[i] > hpsmax_mag) 
       { 
       hpsmax_mag = array[i]; 
       hpsmax_index = i; 
       } 

    // Fixing octave too high errors  
     int correctMaxBin = 1; 
     int maxsearch = (int) hpsmax_index * 3/4; 
     for (int j = 2; j < maxsearch; j++) 
     { 
     if (array[j] > array[correctMaxBin]) 
     { 
      correctMaxBin = j; 
     } 
     } 

     if (Math.Abs(correctMaxBin * 2 - hpsmax_index) < 4) 
     { 
      if (array[correctMaxBin]/array[(int)hpsmax_index] > 0.2) 
      { 
       hpsmax_index = correctMaxBin; 
      } 
     } 

システムをノコギリ波でテストしたところ、オクターブのエラーがまだ目に見えることがわかりました。 87.307Hzから〜190Hzになると、オクターブの誤差が大きくなります。 G5(783.991)以上になるとオクターブが低くなることがあります。

ここにいくつかの結果があります:入力|結果|これは、ユーザーにシステムの最終的なフィードバックにひどく影響するため、エラー

F2 (87.307) - F4 (349.228) - 2 octaves higher 
    G2 (97.999)- G4 (391.995) - 2 octaves higher 
    A2 (110) - A3 (220) - an octave higher 
    D3 (146.832) - D4 (mostly) (293.665) and D3 - an octave higher 
    A3 (220) - A3 - Correct 
    A4 (440) - A4 - Correct 
    G5 (783.991) - G5 (mostly) and G4 (391.995) - an octave lower 
    A5 (880) - A5 - Correct 
    C6 (1046.502) - C6 - Correct 

は、私はこの問題を解決するのに役立ちます。

答えて

0

のポリフォニックからの音やオクターブを検出したとき、私は少し異なるアプローチを使用しました。 「ピッチ」を構成する高調波を特定するために、FFTではなく対数的に配置された修正DFTを使用することを選択しました。

また、後で第2段階でOctave(および暗黙の基本周波数)を決定するピッチを検出するためにTwo Stage Algorithmを使用することに決めました。

a)まず、支配的な音符のScalePitchが検出されます。 - 'ScalePitch'には、{E、F、F#、G、G#、A、A#、B、Cの12個の可能なピッチ値があります。 、C#、D、D#}である。

b)そのノートのオクターブ(基本)は、4つのオクターブ候補ノートのすべての高調波を調べることによって計算されます。

オクターブ検出は、特に基本波やその他の高調波が欠落しているポリフォニック信号の場合、非常に扱いにくいことがあります。しかし、いくつかの高調波がない場合でも、私のアルゴリズムは動作します。コンパイルして、GitHubのPitchScope PlayerのWindowsコードをステップ実行して、どのようにオクターブを決定するかを確認することができます。

FundCandidCalcer.cppファイル内のFundCandidCalcer :: Calc_Best_Octave_Candidate()関数に焦点を当てて、C++のオクターブ検出アルゴリズムを確認したいとします。

https://github.com/CreativeDetectors/PitchScope_Player

https://en.wikipedia.org/wiki/Transcription_(music)#Pitch_detection

以下の図は、そのノートのScalePitchと高調波と、(つまり、正しい基礎である)私が正しいオクターブ候補音符を選択するために開発されたオクターブ検出アルゴリズムを示してい決定されました。私はモノラルピッチに取り組んでいる

enter image description here

+0

..私はそれを試してみて、表示されます – Giggity

関連する問題