0

我正在尝试检测电话音频信号中的音调(确切地说是忙碌和响铃)。我使用 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

4

0 回答 0