如何计算出fft输出中的频率?



我正在开发一个计步器应用程序,我正在对加速度计数据运行实时fft,我在Arduino 101上使用arduinoFFT(kosme)库。

假设我的采样频率是100Hz。我对身体的上下运动感兴趣,它与 1-4Hz 左右的步行或跑步频率相匹配。许多库,包括我正在使用的库似乎都具有计算量级函数。这有效地给了我一半的箱数使用的振幅数(如果我输入 64 个样本,它将给我 32 个振幅)。

所以我的问题是这些振幅对应于什么频率? 在库提供的示例代码中,频率计算如下:

for (int i=0; i<(noofbins>>1); i++) {
freq[i]=((i*samplingfreq)/(noofbins>>1));
}

我真的不明白为什么会这样,如果我对此完全愚蠢,请原谅我。此外,这确实给了我从0到100Hz的频率(我使用的采样频率)。有没有办法在不降低采样频率以"匹配"它的情况下完善有关感兴趣频率的 fft(这在这里是一个糟糕的主意)?

这些振幅对应于什么频率?

我不确定你从哪里得到这个例子,以及为什么它会除以noofbins>>1.每个箱的频率的正确公式由下式给出:

for (int i=0; i<(noofbins>>1); i++) {
freq[i]=((i*samplingfreq)/noofbins);
}

这将为您提供从 0 到奈奎斯特频率的频率(采样频率的一半)。在您的特定情况下,这将是从 0 到 50Hz(以 100/64 = 1.5625Hz 的增量)。

有没有办法在不降低采样频率的情况下完善有关感兴趣频率的fft[...]

捕获更多数据,即增加用作FFT输入的样本数量,将使FFT的频率分辨率更高。例如,使用 128 个样本(略高于 1 秒的数据)而不是 64 个样本,将使频率增量从 1.5625Hz 降低到 0.78125Hz。进一步将样本数量增加到256(约2.5秒)会将频率增量减少到~0.39Hz。

最新更新