如何对值进行反规范化以进行谐波乘积谱



我正在尝试执行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数组(上获得更高的振幅值,由于我对这些值应用了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赫兹之间,比我在低音中需要的还要多。如果整个阵列的分割小于24000,我应该减少数字48,这是允许的,因为下采样的阵列是24000/3和24000/2,所以这个值可以减少到3,并且它应该工作得很好。

最新更新