0

我的应用程序。正在以 RPM 显示输入声音的峰值频率。我有一个双精度数组包含时域中的样本。

audioRecord.read(buffer, 0, 1024);

然后我对它做了 FFT。

transformer.ft(toTransform);

在这里使用这个类

然后我得到了复数值的最大值,这是 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() 的现成函数?提前致谢 :)

4

1 回答 1

0

对应于给定 FFT bin 索引的频率由下式给出:

f = i * Fs / N;

在哪里:

Fs = sample rate (Hz)
N = FFT size
i = bin index

因此,对于您的峰值指数maxIndex和 FFT 大小blockSize,峰值的频率将是:

f = maxIndex * Fs / blockSize;

有关更多详细信息,请参阅此答案

于 2013-04-17T12:48:31.717 回答