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

时间:2014-01-29 15:05:28

标签: math audio signal-processing fft core-audio

我正在尝试确定我正在尝试完成的最佳DSP方法,具体如下:

实时地,从一组不同的预定义频率(在1000Hz范围内不超过40个不同频率)检测频率的存在。即使存在更具优势的其他频率(在此集合或范围之外),我也需要能够做到这一点。

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

我听说Goertzel算法可能对我正在尝试做的更好,即实时检测单个频率或一组频率,即使在频率比主频更高的声音中也是如此。那些试图被发现的人。

非常感谢任何指导,如果我在这些假设上错了,请纠正我。谢谢!

2 个答案:

答案 0 :(得分:0)

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

根据我的理解,对于您的应用,FFT是正确的算法。

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

[1]出于实际目的,这句话最不准确的是频率在“箱子”中组合在一起。分析的分辨率有限,取决于各种因素。

答案 1 :(得分:0)

我正在离开我的另一个答案,因为我认为它就是它自己的答案。

根据您的评论和私人电子邮件,您面临的问题很可能就是:声音,如语音,主要在一个频率范围内,具有可扩展到更高频率范围的谐波。低质量的麦克风和电子设备加剧了这个问题,但它不是由它们引起的,即使使用完美的设备也不会消失。一旦您的信号在同一频段中混乱,您就无法以简单可靠的方式将 on off 区分开来,因为 on < / strong>可能是由噪音引起的。您可以尝试根据其他频段中的噪声进行一些自适应阈值处理,并且您可能会到达某个地方,但是没有办法建立一个强大的系统。

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

  • 振幅调制,这听起来就像你现在所做的那样。
  • 频率调制,在环境噪声方面往往更加稳健。 (比较FM和AM收音机)
  • 相位调制,这是更微妙和棘手的。

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

我不是这方面的专家,但是我不确定你是否能够默默地使用PM,而AM对噪音过于敏感,因为你&#39;已经发现,虽然它可能适用于正确的冗余。 FM可能是你最好的选择。