问题标签 [goertzel-algorithm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1001 浏览

android - 使用 Goertzel 算法检测特定频率

我只是一名在数字信号处理方面没有经验的大四学生,我想制作一个 android 应用程序来记录音频并检测大学作业的特定目标频率。我是在 Goertzel 算法的帮助下这样做的。所以这是与我用作参考的完全相同的问题的链接。 使用 Goertzel 算法检测频率 另外,此链接作为 Goertzel 算法的主要参考。 http://www.embedded.com/design/configurable-systems/4024443/The-Goertzel-Algorithm 正如此链接中提到的,Goertzel 算法在目标频率处使幅度达到峰值,然后再次下降,但对我来说,幅度在目标频率处确实变得非常高,但之后并没有下降。缓冲区大小或某个阈值频率有问题吗?我真的不确定。

这是我的代码:- MainActivity

Goertzel.java 类

如果有人可以帮助我并告诉我哪里出错并指出我正确的方向,我将非常感激。

0 投票
2 回答
213 浏览

signal-processing - 在软件中实现相位解调器

我目前正在尝试通过声音发送和接收一些 BPSK 调制数据。目前,我使用 goertzel 算法作为带通滤波器进行解调。我没有接受过信号处理方面的正式培训。

给定 44100Hz 的采样率和 100 的桶大小,我的直觉是,以 441hz 的频率倍数生成波应该会导致我获得一个相对恒定的相位。在其他频率,我检测到的相位应该漂移。

但是,我当前的实现显示在一秒钟内(大约 90 度)检测生成的声波时会出现相位漂移。这是可以预料的还是我的 goertzels 实施存在缺陷的迹象?

此外,有没有比使用 goertzels 更好的、可能更明显的方法来检测特定频率的波相位?

0 投票
1 回答
490 浏览

algorithm - 在 python 中将 Goertzel 算法扩展到 24 kHz、32 kHz 和 48 kHz

我正在学习实现 Goertzel 的算法来从记录的波形文件中检测 DTMF 音调。我从这里用 python 实现了一个。它支持以 8 kHz 和 16 kHz 采样的音频。我想扩展它以支持以 24 kHz、32 kHz 和 48 kHz 采样的音频文件。

从我从上面的链接得到的代码中,我看到作者设置了以下前置条件参数/常量:

根据这篇文章,在进行实际的 Goertzel 之前,有两个初步计算是:

  1. 确定采样率。
  2. 选择块大小,N

因此,作者明确将 16k 采样输入的块大小设置为 210,将 8k 采样输入设置为 92。现在,我想明白:

  1. 作者是如何得出这个块大小的?
  2. 24k、32k 和 48k 样本的块大小是多少?
0 投票
1 回答
470 浏览

java - 如何使用 Goertzel 算法检测频率

我真的很难弄清楚这一点。本质上,我试图找出通过麦克风播放的频率。据我了解,我需要暴力破解 Goertzel 算法。所以基本上我只是使用 Goertzel 算法尝试每个频率,直到找到正确的频率。但是,我不明白我如何真正知道 Goertzel 算法何时找到了正确的算法。有人可以帮助我。

MainActivity.java


Goertzel.java

0 投票
0 回答
110 浏览

c - 音频 PCM 信号中的忙音检测

我正在尝试检测电话音频信号中的音调(确切地说是忙碌和响铃)。我使用 Goertzel 算法来检测信号中的一个频率。我不需要搜索多个频率,这只是我想要或不想要的频率(1/0)(在通话开始之前)

另一方面,我编写了一个模式检测器(例如,开启 300 毫秒,关闭 100 毫秒,开启 300 毫秒,关闭 100 毫秒)。我得到与我的模式相似的百分比,而不是我决定是否找到它。

我使用了来自一个音调数据库网站的样本,但它似乎给出了生成的信号:与您可以从手机获得的真实声音相比,它太干净了。

我的 goertzel 过滤器在现实中给出了这样的结果:当我在一个样本上运行它时,我得到了这样的结果:

https://i.stack.imgur.com/rZdgZ.png

如何转换此结果,以便在检测到频率时获得 1,否则为 0。

到目前为止,我试过这个:

  • clean signal = (goertzel > 20000) :有效,但恐怕这个值会随着不同的信号或不同的硬件而改变。
  • 我计算了 2 goertzel:g1 = goertzel(frq) 和 g2 = goertzel(frq-100) 然后结果 = (g1 > g2):这并不总是有效。很多时候 g1=g2 和 "100" 可能并不总是有效。
  • g1 = goertzel(frqn) g1 = goertzel(frqn/2) 并且结果 = g1 > g2。可以检测频率但不能检测静音
  • 此外,我宁愿避免运行 2 次过滤器。

你有什么建议?

谢谢

编辑

我想我设法得到了我想要的。实时:

  1. 我计算了最后 20 个 goertzel 震级的平均值。
  2. 我更新了这个平均值的最大值

如果 avg > (max/2) 则发现信号

在下面的屏幕截图中,结果为灰色

https://i.stack.imgur.com/L432s.jpg

编辑 2

源代码:

https://github.com/nonprenom/tones_detector