簡體   English   中英

fft.complexForward的頻率

[英]Frequency with fft.complexForward

我想用自相關來計算基頻,我找到了以下代碼:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM