Estoy tratando de obtener la frecuencia fundamental de una señal que solo tiene un solo tono. Codifiqué la función de autocorrelación usando FFT y ya obtuve el resultado de autocorrelación. Desafortunadamente, no sé cómo obtener la frecuencia fundamental del resultado de autocorrelación. ¿Alguien me puede ayudar? Mi código está abajo:
public double getPitch(double[] buffer, int firstSample, int lastSample, double sampleRate)
{
int lengthOfFFTWindow=lastSample-firstSample;
double[] input_buffer=new double[lengthOfFFTWindow];
DoubleFFT_1D fft = new DoubleFFT_1D(lengthOfFFTWindow);
double[] autocorrelation_values=new double[lengthOfFFTWindow];
double[] fftData = new double[lengthOfFFTWindow * 2];
double max=-1;
double max_i=-1;
//FFT on each sample in each window
for (int i = 0; i < lengthOfFFTWindow; i++) {
// copying audio data to the fft data buffer, imaginary part is 0
fftData[2 * i] = buffer[i+firstSample];
fftData[2 * i + 1] = 0;
}
fft.complexForward(fftData);
for (int i = 0,j=0; i < fftData.length; i += 2,j++) {
// complex numbers -> vectors, so we compute the length of the vector, which is sqrt(realpart^2+imaginarypart^2)
autocorrelation_values[j] = Math.sqrt((fftData[i] * fftData[i]) + (fftData[i + 1] * fftData[i + 1]));
}
fft.complexInverse(fftData, false);
for(int i=0;i<fftData.length;i++)
{
if(max<fftData[i])
{
max=fftData[i];
max_i=i;
}
}
return (max_i * 44100 )/ lengthOfFFTWindow;
}
¿Es correcto devolver el valor máximo de autocorrelación dividido por 2 como la frecuencia fundamental? Sigo recibiendo respuestas incorrectas cuando hago eso.
EDITAR: Un ejemplo del archivo de prueba de un solo paso: enlace