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
源代码:
解决方案
推荐阅读
- forms - Symfony - 使用表单甚至监听器设置数据
- node.js - Node.js 无法将 x-zip-compressed 转换为 application/zip
- c# - 循环依赖:IVisitor 和 Datas
- python - 在以下问题中,我实现了 Jacobi 迭代方法
- java - SOAP Web服务如何更改请求的命名空间
- sql - SQL 存储过程 WHERE..IN 子句多个 VALUE 数据
- java - 为什么我的 JSON 映射器无法识别我的对象?
- c++ - 使用自定义类时,多线程泛型矩阵添加非常慢
- graphql - 允许自定义属性的类型的 graphQL 模式
- scala.js - 扩展 js.native 类会产生 TypeError:没有“new”就不能调用类构造函数