【问题标题】:FFT frequency bucket amplitude varies even with constant tone applied即使应用恒定音调,FFT 频率桶幅度也会变化
【发布时间】:2018-10-07 12:48:57
【问题描述】:

我正在尝试使用 FFT 来解码莫尔斯电码,但我发现当我检查我感兴趣的结果频率箱/桶时,即使呈现恒定音调,绝对值也会有很大的变化。这使我无法使用阈值附近的上升和下降来解码音频莫尔斯。 我什至尝试过似乎到处都在复制的简单示例,但它也有所不同...... 我无法弄清楚我做错了什么,而且我的数学还不够聪明,无法理解与 FFT 相关的所有公式。 我现在肯定有可能,但我不知道如何......有人可以帮忙吗?

【问题讨论】:

  • 你在 FFT 之前使用的是窗口函数吗?
  • 可能不是,因为我不认识这个词。基本上,我声明了一个 RealDoubleFFT,读取麦克风输入(8000hz),将其以 512 个块送入缓冲区(在 /32,768.0 之后),然后在缓冲区上调用 .ft。然后在与我输入麦克风的音调相关的频率桶中检查结果(在返回缓冲区中)
  • OK - 如果没有窗口函数,您将在频谱中获得各种人工制品,特别是关于任意频率的峰值幅度。参见例如this question.
  • 顺便说一句,基于 FFT 的方法对于摩尔斯电码解码来说可能是多余的,您可能需要在连续 FFT 之间使用大量重叠来获得足够的起始/偏移分辨率。
  • 感谢您的帮助。我确实有一个可以工作的莫尔斯解码器来分析传入的音频,但我希望能够从“瀑布”显示中选择所需的信号(通过 fft 频谱)。我有一个很好的频率分辨率,但选定的 bin 的大小是我的问题。我想知道在哪里可以找到如何应用窗口化的示例?

标签: android fft


【解决方案1】:

确保您使用的是 FFT 结果的幅度,而不仅仅是复数结果的实部或虚部。

一般而言,当将较长的恒定幅度正弦波馈送到一系列较短的 FFT(加窗 STFT)时,只有当正弦波的周期在 FFT 长度中是整数周期时,幅度结果才会是恒定的。例如

f_tone modulo (f_sampling_rate / FFT_length) == 0

如果您只对一个选定音调频率的幅度感兴趣,则 Goertzel 算法将用作比完整 FFT 更有效的滤波器。而且,根据您选择的 FFT 库所需的设置和长度限制,改变 Goertzel 的长度以匹配您的目标音调频率的要求以及所需的时间/频率分辨率权衡可能会更容易。

【讨论】:

  • 这听起来很有趣,所以也许我可以使用宽 fft 频谱图让用户选择近似频率,然后切换到 Goertzel 算法。我会对 Goertzel 做一些研究,因为我对此一无所知。谢谢。
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 2015-08-06
  • 1970-01-01
相关资源
最近更新 更多