Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math DSP方法检测特定频率,该频率可能不是当前声音中最主要的频率_Math_Audio_Signal Processing_Fft_Core Audio - Fatal编程技术网

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

Math DSP方法检测特定频率,该频率可能不是当前声音中最主要的频率,math,audio,signal-processing,fft,core-audio,Math,Audio,Signal Processing,Fft,Core Audio,我正在尝试为我要实现的目标确定最佳的DSP方法,如下所示: 实时检测来自一组不同预定义频率的频率(不超过40个不同频率,所有频率均在1000Hz范围内)。我需要能够做到这一点,即使有其他频率(在这组或范围之外)更占主导地位 据我所知,FFT可能不是最好的方法,因为它告诉你在任何给定的时间最主要的频率(幅度)。这似乎不起作用,因为如果我试图检测1650Hz的频率(存在),但500Hz的频率更强,那么它不会告诉我当前的频率是1650Hz 我听说Goertzel算法可能更适合我要做的事情,即实时检测单

我正在尝试为我要实现的目标确定最佳的DSP方法,如下所示:

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

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

我听说Goertzel算法可能更适合我要做的事情,即实时检测单个频率或一组频率,即使是在主频比要检测的频率更多的声音中


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

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

据我所知,对于您的应用程序,FFT是正确的算法

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


[1] 出于实际目的,这种说法最不准确的地方是频率被分组在“箱子”中。分析的分辨率有限,这取决于多种因素。

我保留我的另一个答案,因为我认为它是独立的

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

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

  • 调幅,这就是你现在正在做的事情
  • 频率调制,在面对环境噪声时更为稳健。(比较调频和调幅收音机)
  • 相位调制,这是更微妙和棘手的
这些方法可以以各种方式组合和复用。在维基百科上读到他们。此外,一旦基本信号被传输,您可以在顶部添加纠错和检测


我不是这方面的专家,但我不确定你是否能够安静地使用PM,而且正如你所发现的,am对噪音太敏感,尽管它可能使用正确的冗余。FM可能是你最好的选择。

此外,你可能需要考虑时域滤波器,但是这取决于你打算如何检测你的频率:你真的需要低延迟,潜在的噪声频率与你要检测的频率有多接近?等。FFT是您尝试执行的标准方法。感谢Bjorn的解释。我已经实现了FFT,我想要检测的频率是18000Hz以上的高频。我得到了震级和主频,但是噪声频率(比如人类语音或其他背景噪声)有时会导致检测到更高频率受阻,因为此时较低的频率更占主导地位。你知道我如何为FFT应用一个滤波器来屏蔽18000Hz以下的所有频率吗?就延迟而言,我需要能够在几秒钟内检测到10到15个不同的频率。听起来真正的问题是你的信号和噪声之间没有真正的分离。您可能需要在信号中添加一些纠错或简单的调制。我建议在DSP.stackexchange.com上询问,并提供更多关于您的标志的详细信息