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

Posted

技术标签:

【中文标题】DSP方法检测在当前声音中可能不是最主要的特定频率【英文标题】:DSP method to detect specific frequency which may not be the most dominant in the current sound 【发布时间】:2014-01-29 15:05:28 【问题描述】:

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

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

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

我听说 Goertzel 算法可能更适合我正在尝试做的事情,即实时检测单个频率或一组频率,即使在具有比那些试图被发现的。

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

【问题讨论】:

通信理论的一个基本定理意味着,如果有足够的噪声,您可能需要降低数据速率并使用纠错码以获得可靠的数据。 FFT 主要是关于非主频,通常是所有 N 个 FFT 结果箱中的 N-2 个。 【参考方案1】:

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

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

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

[1] 出于实际目的,这个陈述最不准确的地方在于频率被组合在“bins”中。分析的分辨率有限,取决于多种因素。

【讨论】:

此外,您可能需要考虑时域滤波器,但这取决于您计划如何检测频率:您是否需要非常低的延迟,潜在噪声频率与频率有多接近您正在尝试检测等。FFT 是您尝试执行的标准方法。 谢谢比约恩的解释。我已经实现了 FFT,我想要检测的频率是 18000Hz 以上的高频。我得到了幅度和主要频率,但噪声频率(例如人类语音或其他背景噪声)有时会导致对较高频率的检测受阻,因为此时较低频率更为占主导地位。关于如何为 FFT 应用滤波器以阻止低于 18000Hz 的所有频率的任何想法? 就延迟而言,我需要能够在几秒钟内检测到多达 10 到 15 个不同的频率。 听起来真正的问题是您没有真正分离信号和噪声。您可能想为信号添加一些纠错或只是一些简单的调制。我建议在 DSP.stackexchange.com 上询问,并提供有关您的信号、噪声、您用作 transievers 等的更多详细信息。 您认为创建一个过滤掉 18000hz 以下频率的高通滤波器会有所帮助吗?【参考方案2】:

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

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

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

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

这些方法可以多种方式组合和复用。在***上阅读它们。此外,一旦您的基础信号被传输,您可以在上面添加纠错和检测。

我不是这方面的专家,但在我看来,我不确定你是否能够安静地使用 PM,而且正如你所发现的那样,AM 对噪音太敏感了,虽然它可能适用于正确的冗余。 FM 可能是您最好的选择。

【讨论】:

以上是关于DSP方法检测在当前声音中可能不是最主要的特定频率的主要内容,如果未能解决你的问题,请参考以下文章

dsp.Audiorecorder的Matlab傅里叶变换实时

检测特定频率和持续时间的哔声

音频编程、声音处理和 DSP

你能告诉我如何从声音中检测事件,无论其波或频谱的一部分是不是超过特定数量的阈值? [复制]

声音 FFT 频率

如何产生特定的声音频率?