我试图获得只有一个音高的信号的基频。我使用 FFT 编码了自相关函数,并且已经得到了自相关结果。不幸的是,我不知道如何从自相关结果中获得基频。有人能帮我吗?我使用自相关获取基频的 JAVA 代码如下:
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<autocorrelation_values.length;i++)
{
if(max<autocorrelation_values[i])
{
max=autocorrelation_values[i];
max_i=i;
}
}
return max/2;
}
返回最大自相关值除以 2 作为基频是否正确?当我这样做时,我总是得到错误的答案。