1

私は音声トレーニング アプリを作成しており、FFT を使用して信号を時間領域から周波数領域に変換しました。FFT を適用する前に、ブラックマン-ハリス ウィンドウを使用して信号をウィンドウ処理しました。次に、高調波積スペクトルを使用して基本周波数を抽出しました。最低周波数は F2 (87.307 Hz) で、最高周波数は C6 (1046.502 Hz) です。FFT 長は 8192 で、サンプリング周波数は 44100 Hz です。

オクターブ エラーを修正するために、ここで言及されているルールを適用しました。

     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.307 Hz ~ 190 Hz では、オクターブの高いエラーが発生します。G5 (783.991) 上に、1 オクターブ下を示すことがあります。

結果の一部を次に示します。結果 | エラー

    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

これを修正するのを手伝ってください。これは、ユーザーへのシステムの最終的なフィードバックにひどく影響するためです。

4

1 に答える 1