我的应用。正在以RPM显示输入声音的峰值频率。我有双数组包含时域中的样本。
audioRecord.read(buffer, 0, 1024);
然后我对它做了FFT。
transformer.ft(toTransform);
使用此课程Here
然后我得到了复数值的最大值,这是FFT的结果
//块大小= 1024
double magnitude[] = new double[blockSize / 2];
for (int i = 0; i < magnitude.length; i++) {
double R = toTransform[2 * i] * toTransform[2 * i];
double I = toTransform[2 * i + 1] * toTransform[2 * i * 1];
magnitude[i] = Math.sqrt(I + R);
}
int maxIndex = 0;
double max = magnitude[0];
for(int i = 1; i < magnitude.length; i++) {
if (magnitude[i] > max) {
max = magnitude[i];
maxIndex = i;
}
}
现在我得到了最大幅度的索引...... 1 - 如何获得峰值频率的详细信息? 2 - 是否有任何名为ComputeFrequency()或getFrequency()的就绪函数? 在此先感谢:)
答案 0 :(得分:0)
对应于给定FFT bin索引的频率由下式给出:
f = i * Fs / N;
其中:
Fs = sample rate (Hz)
N = FFT size
i = bin index
因此,对于峰值索引maxIndex
和FFT大小blockSize
,峰值的频率将为:
f = maxIndex * Fs / blockSize;
有关详细信息,请参阅this answer。