使用FFT计算声音输入的频率

时间:2013-04-17 12:32:25

标签: android signal-processing fft

我的应用。正在以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()的就绪函数? 在此先感谢:)

1 个答案:

答案 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