我想使用自相关来计算基频,我找到了以下代码:
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);