音频 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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)