【发布时间】:2014-01-30 18:36:21
【问题描述】:
所以我正在开发一个吉他调音器应用程序,并且我正在努力使用 FFT 来找到基本频率。这是我“尝试”从 PCM 声音阵列数据 [] 中查找频率的代码,大小为 4160(bufferSize),采样率为 8000 Hz
DoubleFFT_1D fft1d = new DoubleFFT_1D(bufferSize);
double[] fftBuffer = new double[bufferSize*2];
double[] magnitude = new double[bufferSize/2];
// copy real input data to complex FFT buffer
for(int i = 0; i < bufferSize-1; ++i){
fftBuffer[2*i] = data[i];
fftBuffer[2*i+1] = 0;
}
//perform FFT on fft[] buffer
fft1d.realForward(fftBuffer);
// calculate power spectrum (magnitude) values from fft[]
for(int i = 0; i < (bufferSize/2)-1; ++i) {
double real = (2 * fftBuffer[i]);
double imaginary = (2 * fftBuffer[i] + 1);
magnitude[i] = Math.sqrt( real*real + imaginary*imaginary );
}
// find largest peak in power spectrum
for(int i = 0; i < (bufferSize/2)-1; ++i) {
if(magnitude[i] > maxVal){
maxVal = (int) magnitude[i];
binNo = i;
}
}
// convert index of largest peak to frequency
freq = 8000 * binNo/bufferSize;
其中大部分内容是基于在本网站上找到的类似问题的示例和答案,因此我对这一切的理解充其量只是粗略。
在使用音高发生器测试我的程序时,返回的频率值似乎变化很大。
我想知道我的代码中是否有任何明显的缺陷,或者我对过程的理解,以及任何指向正确方向的指针
【问题讨论】: