【发布时间】:2014-07-15 02:15:30
【问题描述】:
我想在 Android 应用程序中找到人声的基频。我正在用this FFT class 和这个Complex class 计算这个。
我计算 FFT 的代码是这样的:
public double calculateFFT(byte[] signal)
{
final int mNumberOfFFTPoints =1024;
double mMaxFFTSample;
double temp;
Complex[] y;
Complex[] complexSignal = new Complex[mNumberOfFFTPoints];
double[] absSignal = new double[mNumberOfFFTPoints/2];
for(int i = 0; i < mNumberOfFFTPoints; i++){
temp = (double)((signal[2*i] & 0xFF) | (signal[2*i+1] << 8)) / 32768.0F;
complexSignal[i] = new Complex(temp,0.0);
}
y = FFT.fft(complexSignal);
mMaxFFTSample = 0.0;
int mPeakPos = 0;
for(int i = 0; i < (mNumberOfFFTPoints/2); i++)
{
absSignal[i] = Math.sqrt(Math.pow(y[i].re(), 2) + Math.pow(y[i].im(), 2));
if(absSignal[i] > mMaxFFTSample)
{
mMaxFFTSample = absSignal[i];
mPeakPos = i;
}
}
return ((1.0 * sampleRate) / (1.0 * mNumberOfFFTPoints)) * mPeakPos;
}
我的价值观与 How do I obtain the frequencies of each value in an FFT?
是否可以从这些值中找到基频?有人可以帮我吗?
提前致谢。
【问题讨论】:
-
您可能想尝试在 Signal Processing StackExchange 上发布此内容
-
如果您想检测语音 pitch,请阅读cepstral analysis - 您仍然需要 FFT,但还需要更多操作来提取音调。
标签: java android fft frequency pitch