如何对值进行归一化以进行谐波积谱

问题描述 投票:0回答:1

我正在尝试执行HPS算法,结果不正确。 (48000Hz,16位)我已经将缓冲区的记录频率进行了几次分割,然后是Hanning窗口,最后是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代码为HERE

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

任何想法如何解决,以做HPS吗?我该如何进行逆归一化?

我正在尝试执行HPS算法,结果不正确。 (48000Hz,16bits)我已经将缓冲区的记录频率进行了几次分割,然后是Hanning窗口,最后是FFT ....

fft frequency denormalization time-frequency pitch-detection
1个回答
0
投票

问题是,我试图在求和数组(HPS数组)上获得更高的振幅值,并且由于将FFT算法应用于它们,因此我的一组值被归一化。这是我创建的解决方案,在进行乘法运算之前,将sum数组的各个值乘以10。

© www.soinside.com 2019 - 2024. All rights reserved.