C# 如何修正谐波积频谱中的倍频程误差?

C# 如何修正谐波积频谱中的倍频程误差?,c#,fft,pitch-tracking,C#,Fft,Pitch Tracking,我正在创建一个语音训练应用程序,我使用FFT将信号从时域转换到频域。在应用FFT之前,我已经使用blackman-harris窗口对信号加窗。然后用谐波积谱提取基频。最低频率为F2(87.307 Hz),最高频率为C6(1046.502 Hz)。FFT长度为8192,采样频率为44100 Hz 为了修正倍频程错误,我应用了 请帮我解决这个问题,因为这会严重影响系统对用户的最终反馈。当我在MP3录音中检测到合成音信号的音调和倍频程时,我使用了一种稍微不同的方法。为了识别构成“基音”的谐波,我选择使

我正在创建一个语音训练应用程序,我使用FFT将信号从时域转换到频域。在应用FFT之前,我已经使用blackman-harris窗口对信号加窗。然后用谐波积谱提取基频。最低频率为F2(87.307 Hz),最高频率为C6(1046.502 Hz)。FFT长度为8192,采样频率为44100 Hz

为了修正倍频程错误,我应用了


请帮我解决这个问题,因为这会严重影响系统对用户的最终反馈。

当我在MP3录音中检测到合成音信号的音调和倍频程时,我使用了一种稍微不同的方法。为了识别构成“基音”的谐波,我选择使用对数间隔的改进DFT,而不是FFT

我还决定使用两阶段算法来检测基音,在第二阶段确定倍频程(以及隐含的基频)。算法的工作原理如下:

a) 首先检测主音符的音阶——“音阶音阶”有12个可能的音高值:{E,F,F#,G,G#,a,a#,B,C,C#,D,D#}。确定音符的音阶和时间宽度后

b) 然后,通过检查4个可能的八度候选音符的所有谐波来计算该音符的八度(基音)

倍频程检测可能非常棘手,尤其是在基波和/或其他谐波缺失的复调信号上。但我的算法可以工作,即使缺少一些谐波。您可能希望编译并逐步浏览GitHub上PitchScope Player的Windows代码,以了解我如何确定倍频程

你想把函数放在FundCydidCalc::CalcxBestBooOctEvyCydiDebug()在文件FundCydialCalCur.CPP中,以查看C++中的八度音检测算法。p>

下图演示了倍频程检测算法,我开发了该算法,用于在确定该音符的标度和谐波后选择正确的倍频程候选音符(即正确的基音)


我正在研究单声道音高。。我试试看
     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;
          }
      }
    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