Я хочу рассчитать основную частоту с автокорреляцией, и я нашел этот код:
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. Зачем? Может кто-то мне помочь, пожалуйста? благодаря
Выходы БПФ являются комплексными числами. Метод 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);