我正在尝试执行 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 吗?我怎么能做逆归一化?