Я пытаюсь выполнить алгоритм HPS, и результаты не верны. (48000 Гц, 16 бит) Я применил к буферу с записанной частотой несколько разделений, затем окно Ханнинга и, наконец, БПФ.
Я получил пик в каждом БПФ, который соответствует частоте Я использую или октаву этого. Но когда я делаю HPS, результаты основной частоты равны 0, потому что числа массива, в котором я делаю сумму (умножение), слишком малы, больше, чем мой пик в исходном БПФ. Это код 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, из-за которой моя сумма уменьшается при умножении.
Любая идея, как это исправить, делать ГЭС? Как я могу сделать обратное нормализовать?