Java 频率与fft.complexForward

Java 频率与fft.complexForward,java,fft,nan,complex-numbers,pitch,Java,Fft,Nan,Complex Numbers,Pitch,我想用自相关计算基频,我发现了以下代码: public double calculateFFT(double[] signal) { final int mNumberOfFFTPoints =1024; double[] magnitude = new double[mNumberOfFFTPoints/2]; DoubleFFT_1D fft = new DoubleFFT_1D(mNumberOfFFTPoints); doub

我想用自相关计算基频,我发现了以下代码:

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;

 }
public双精度计算器efft(双[]信号)
{
最终整数mNumberOfFFTPoints=1024;
double[]震级=新的double[mNumberOfFFTPoints/2];
DoubleFFT_1D fft=新的DoubleFFT_1D(mNumberOfFFTPoints);
double[]fftData=新的双精度[mNumberOfFFTPoints*2];
双最大指数=-1;
双倍最大值=1;
最终浮子取样器=44100;
双频;

for(int i=0;iFFT的输出是复数。复数正向方法计算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);
}

我不熟悉complexForward方法,但我相信它需要1024点的FFT,你需要给出长度为1024的信号,然而,由于这个循环在第一次执行该方法后一个接一个地接受FFT;你给函数一个长度为2048点的信号,输出变为NaN(因为该方法超过1024个点)。如果没有循环,就不应该有任何NaN值。我更改了代码,但如果输入值不是NaN,我会继续获取NaN值。您好。您找到这个问题的答案了吗?
fft.complexForward(fftData);