Как денормализовать значения, чтобы сделать Harmoni c Product Spectrum - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь выполнить алгоритм 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, из-за которой моя сумма уменьшается при умножении.

Любая идея, как это исправить, делать ГЭС? Как я могу сделать обратное нормализовать?

1 Ответ

0 голосов
/ 01 апреля 2020

Проблема заключалась в том, что я пытался получить более высокое значение амплитуды в массиве суммы (массив HPS), и мой набор значений нормализовался, так как я применяю к ним алгоритм FFT. Это решение, которое я создал, умножая отдельные значения массива суммы на 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, и оно должно работать хорошо.

...