Частота с fft.complexForward

1

Я хочу рассчитать основную частоту с автокорреляцией, и я нашел этот код:

public double calculateFFT(double[] signal)

     {
      final int mNumberOfFFTPoints =1024;

      double[] magnitude = new double[mNumberOfFFTPoints/2];
      DoubleFFT_1D fft = new DoubleFFT_1D(mNumberOfFFTPoints);
      double[] fftData = new double[mNumberOfFFTPoints*2];
      double max_index=-1;
      double max_magnitude=-1;


      final float sampleRate=44100;
      double frequency;

      for (int i=0;i<mNumberOfFFTPoints;i++){

       fftData[2 * i] = signal[i]; 
       fftData[2 * i + 1] = 0;

       fft.complexForward(fftData);
      }

      for(int i = 0; i < mNumberOfFFTPoints/2; i++){

       magnitude[i]=Math.sqrt((fftData[2*i] * fftData[2*i]) + (fftData[2*i + 1] * fftData[2*i + 1]));

       if (max_magnitude<magnitude[i]){
        max_magnitude=magnitude[i];
        max_index=i;
       }
      }


      return frequency=sampleRate*(double)max_index/(double)mNumberOfFFTPoints;

 }

Я проанализировал, что fftData до "fft.complexForward(fftData)"; содержит некоторые значения, но после этой операции ("fft.complexForward(fftData)") содержит NaN. Зачем? Может кто-то мне помочь, пожалуйста? благодаря

  • 0
    Привет. Вы уже нашли ответ на этот вопрос?
Теги:
nan
fft
complex-numbers
pitch

1 ответ

0
Лучший ответ

Выходы БПФ являются комплексными числами. Метод complex forward вычисляет FFT fftData и помещает его обратно в fftData. Четные индексы являются реальными частями БПФ, в то время как нечетные индексы являются мнимыми частями. Поскольку этот код вычисляет величины в конце, нет необходимости в цикле for. Поэтому вместо того,

for (int i=0;i<mNumberOfFFTPoints;i++){
fftData[2 * i] = signal[i]; 
fftData[2 * i + 1] = 0;
fft.complexForward(fftData);
}

Просто пиши:

fft.complexForward(fftData);
  • 0
    спасибо, но почему после этой операции есть значения NaN?
  • 0
    Я не знаком с методом complexForward, но я полагаю, что он использует FFT с 1024 точками, и вам нужен сигнал выдачи длины 1024, поскольку этот цикл принимает fft один за другим после первого запуска метода; вы даете функции сигнал длиной 2048 точек, и вывод становится NaN (потому что метод превышает 1024 пункта). Без цикла не должно быть никаких значений NaN.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню