DSP方法来检测可能不是当前声音中最主要的特定频率

问题描述 投票:0回答:2

我正在尝试确定最佳的 DSP 方法来实现我想要完成的任务,如下所示:

实时检测一组不同预定义频率中的频率是否存在(1000Hz 范围内不超过 40 个不同频率)。即使存在其他更占主导地位的频率(在该组或范围之外),我也需要能够做到这一点。

据我所知,FFT 可能不是最好的方法,因为它告诉您在任何给定时间的最主要频率(幅度)。这似乎不起作用,因为如果我试图检测 1650Hz 的频率(存在),但也有一个更强的 500Hz 频率,那么它不会告诉我当前频率是 1650Hz .

我听说 Goertzel 算法可能更适合我正在尝试做的事情,即实时检测单个频率或一组频率,即使在比尝试的声音具有更多主频率的声音中被检测到。

非常感谢任何指导,如果我的这些假设有误,请纠正我。谢谢!

math audio signal-processing fft core-audio
2个回答
0
投票

用模糊且有些不准确的术语来说,FFT 的输出是所有 1 频率的幅度和相位。也就是说,您的陈述“[FFT] 告诉您在任何给定时间的最主要频率(幅度)”是不正确的。 FFT 通常被用作确定最主要频率的第一步,但这并不是它的作用。事实上,如果您对最主要的频率感兴趣,则需要在 FFT 之外采取额外的步骤:获取 FFT 输出的所有频率的幅度,然后找到最大值。对应的频率就是主频率。

据我了解,对于您的应用程序,FFT 是正确的算法。

Goertzel 算法与 FFT 密切相关。如果您只对一小部分频率的幅度和/或相位感兴趣,它允许对 FFT 进行一些优化。它可能是您的应用程序的正确选择,具体取决于相关频率的数量,但仅作为一种优化 - 除了性能之外,它不会解决 FFT 无法解决的任何问题。因为有更多关于 FFT 的文章,所以我建议您从这里开始,仅当 FFT 被证明不够快并且您可以确定 Goertzel 在您的情况下会更快时才使用 Goertzel 算法。

1 出于实际目的,这种说法最不准确的是频率被分组在“箱”中。分析的分辨率有限,取决于多种因素。 “bins”及其解决方案在here有很好的解释。


0
投票

我将保留我的其他答案,因为我认为它是独立的。

根据您的评论和私人电子邮件,您面临的问题很可能是这样的:声音(如语音)主要在一个频率范围内,具有延伸到更高频率范围的谐波。低质量的麦克风和电子设备会加剧这个问题,但它不是由它们引起的,即使有完美的设备也不会消失。一旦您的信号在同一频段内充满噪声,您就无法以简单可靠的方式真正区分 onoff,因为 on 可能是由噪声引起的。您可以尝试根据其他频段的噪声进行一些自适应阈值处理,您可能会有所收获,但这无法构建强大的系统。

解决这个问题的方法有很多,但它们都涉及调制信号以及使用错误检测和纠正。基本上,您正在构建调制解调器和/或收音机。最终,我要说的是:仅靠探测器无法解决问题。您需要在信号中构建一些冗余,并且可能需要考虑其他检测方法。我知道发送复杂信号的三种方法:

  • 幅度调制,听起来就像您现在正在做的那样。
  • 频率调制,在面对环境噪声时往往更加鲁棒。 (比较 FM 和 AM 收音机)
  • 相位调制,更加微妙和棘手。

这些方法可以以各种方式组合和复用。在维基百科上了解它们。此外,一旦传输了基本信号,您就可以在上面添加纠错和检测。

我不是这方面的专家,但从我的角度来看,我不确定你是否能够默默地使用 PM,而 AM 对噪音太敏感,正如你所发现的,尽管它可能采用正确的冗余方式。 FM 可能是您最好的选择。

© www.soinside.com 2019 - 2024. All rights reserved.