我想使用自相关来计算基频,我找到了以下代码:

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;

 }


我在“ fft.complexForward(fftData);”之前分析了fftData。包含一些值,但此操作之后(“ fft.complexForward(fftData)”)包含NaN。
为什么?
有谁可以帮助我吗?
谢谢

最佳答案

FFT的输出是复数。复合方法正向计算fftData的FFT,然后将其放回fftData中。偶数索引是FFT的实数部分,而奇数索引是虚数部分。由于此代码最终是在计算幅度,因此不需要for循环。所以代替

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


写吧 :

fft.complexForward(fftData);

07-27 16:59