问题标签 [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.
android - 使用 Goertzel 算法检测特定频率
我只是一名在数字信号处理方面没有经验的大四学生,我想制作一个 android 应用程序来记录音频并检测大学作业的特定目标频率。我是在 Goertzel 算法的帮助下这样做的。所以这是与我用作参考的完全相同的问题的链接。 使用 Goertzel 算法检测频率 另外,此链接作为 Goertzel 算法的主要参考。 http://www.embedded.com/design/configurable-systems/4024443/The-Goertzel-Algorithm 正如此链接中提到的,Goertzel 算法在目标频率处使幅度达到峰值,然后再次下降,但对我来说,幅度在目标频率处确实变得非常高,但之后并没有下降。缓冲区大小或某个阈值频率有问题吗?我真的不确定。
这是我的代码:- MainActivity
Goertzel.java 类
如果有人可以帮助我并告诉我哪里出错并指出我正确的方向,我将非常感激。
signal-processing - 在软件中实现相位解调器
我目前正在尝试通过声音发送和接收一些 BPSK 调制数据。目前,我使用 goertzel 算法作为带通滤波器进行解调。我没有接受过信号处理方面的正式培训。
给定 44100Hz 的采样率和 100 的桶大小,我的直觉是,以 441hz 的频率倍数生成波应该会导致我获得一个相对恒定的相位。在其他频率,我检测到的相位应该漂移。
但是,我当前的实现显示在一秒钟内(大约 90 度)检测生成的声波时会出现相位漂移。这是可以预料的还是我的 goertzels 实施存在缺陷的迹象?
此外,有没有比使用 goertzels 更好的、可能更明显的方法来检测特定频率的波相位?
algorithm - 在 python 中将 Goertzel 算法扩展到 24 kHz、32 kHz 和 48 kHz
我正在学习实现 Goertzel 的算法来从记录的波形文件中检测 DTMF 音调。我从这里用 python 实现了一个。它支持以 8 kHz 和 16 kHz 采样的音频。我想扩展它以支持以 24 kHz、32 kHz 和 48 kHz 采样的音频文件。
从我从上面的链接得到的代码中,我看到作者设置了以下前置条件参数/常量:
根据这篇文章,在进行实际的 Goertzel 之前,有两个初步计算是:
- 确定采样率。
- 选择块大小,N
因此,作者明确将 16k 采样输入的块大小设置为 210,将 8k 采样输入设置为 92。现在,我想明白:
- 作者是如何得出这个块大小的?
- 24k、32k 和 48k 样本的块大小是多少?
java - 如何使用 Goertzel 算法检测频率
我真的很难弄清楚这一点。本质上,我试图找出通过麦克风播放的频率。据我了解,我需要暴力破解 Goertzel 算法。所以基本上我只是使用 Goertzel 算法尝试每个频率,直到找到正确的频率。但是,我不明白我如何真正知道 Goertzel 算法何时找到了正确的算法。有人可以帮助我。
MainActivity.java
Goertzel.java
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 次过滤器。
你有什么建议?
谢谢
编辑
我想我设法得到了我想要的。实时:
- 我计算了最后 20 个 goertzel 震级的平均值。
- 我更新了这个平均值的最大值
如果 avg > (max/2) 则发现信号
在下面的屏幕截图中,结果为灰色
https://i.stack.imgur.com/L432s.jpg
编辑 2
源代码: