0

我正在尝试执行 HPS 算法,结果不正确。(48000Hz,16 位)我已经将记录频率应用于缓冲区,然后是几个分割,然后是汉宁窗,最后是 FFT。

我在每个 FFT 中都获得了一个峰值,它与我使用的频率或它的一个倍频程相对应。但是当我做 HPS 时,基频的结果是 0,因为我求和(乘)的数组的数量太小了,超过了我在原始 FFT 中的峰值。这是 HPS 的代码:

                 int i_max_h = 0;
                 double m_max_h = miniBuffer[0];
                 //m_max is the value of the peak in the original time domain array
                 m_max_h = m_max;

                 //array for the sum
                 double sum [] = new double[miniBuffer.length];
                 int fund_freq = 0;

                 //It could be divide by 3, but I'm not going over 500Hz, so it should works
                 for(int k = 0; k < 24000/48 ; k++)
                 {
                     //HPS down sampling and multiply 
                     sum[k] = miniBuffer[k] * miniBuffer[2*k] * miniBuffer[3*k];
                     // find fundamental frequency (maximum value in plot)
                     if( sum[k] > m_max_h && k > 0 )
                     {
                         m_max_h = sum[k];
                         i_max_h = k;
                     }
                  }
                  //This should get the fundamental freq. from sum
                  fund_freq = (i_max_h * Fs / 24000);
                  System.out.print("Fundamental Freq.: ");
                  System.out.println(fund_freq);
                  System.out.println("");

原始 HPS 代码在这里

我不知道为什么总和的值很小,什么时候应该大于前一个,以及总和的峰值。我已经应用了RealFordward FFT,也许 -1 到 1 的范围存在问题,这使得当我乘以它时我的总和会减少。

知道如何解决它,做 HPS 吗?我怎么能做逆归一化?

4

1 回答 1

0

问题是我试图在 sum 数组(HPS 数组)上获得更高的幅度值,并且我的值集是标准化的,因为我将 FFT 算法应用于它们。这是我创建的解决方案,将 sum 数组的各个值乘以 10,然后再进行乘法运算。

数字 10 是我选择的一个系数,但在某些高频情况下它可能是错误的,这个系数可能是另一个更高的数字。

'''

    for(int k = 0; k < 24000/48 ; k++)
             {

                 sum[k] = ((miniBuffer[k]*10) * (miniBuffer[2*k]*10) * (miniBuffer[3*k]*10));
                 // find fundamental frequency (maximum value in plot)
                 if( sum[k] > m_max_h && k > 0 )
                 {
                     m_max_h = sum[k];
                     i_max_h = k;
                 }
              }

'''

频率范围是 24000/48 = 500,所以它在 0 到 499 Hz 之间,比我在贝司中需要的要多。如果整个数组的拆分小于24000,我应该减少数字48,这是可以接受的,因为下采样的数组是24000/3和24000/2,所以这个值可以减少到3,它应该可以工作出色地。

于 2020-04-01T15:22:41.597 回答