【问题标题】:How to figure out the frequencies in an fft output?如何计算fft输出中的频率?
【发布时间】:2017-08-11 00:45:48
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: arduino signal-processing fft


【解决方案1】:

这些幅度对应的频率是多少?

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

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。

【讨论】:

  • 是的,这很有意义。然后我需要做的就是输入更多数据,尽管我仍然有 10Hz 到 50Hz 未使用。将采样频率降低到 10Hz 并等待足够的数据到达以填充例如:128 个 bin 是否明智?难道我不能把 100Hz 的样本分成 10 组 10Hz 的样本吗?
  • 如果您的信号不包含任何高于 5Hz 的能量,您确实可以将采样频率降低到 10Hz。但是等待相同的持续时间(例如 1 秒)将导致相同的频率分辨率(尽管您可以节省处理时间)。至于将 100Hz 的样本以 10Hz 的频率切割成 10 束,只要您的信号不包含高于 5Hz 的能量,您就可以这样做,但这会给您带来什么?
猜你喜欢
  • 2021-03-09
  • 1970-01-01
  • 2014-12-18
  • 2011-05-12
  • 1970-01-01
  • 2013-04-10
  • 2020-05-22
  • 2017-06-06
  • 2019-11-28
相关资源
最近更新 更多