打印
[无线通信]

提取语音通话中的DTMF信号,用什么算法比较省资源?

[复制链接]
2428|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
aozima|  楼主 | 2017-10-9 20:44 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
语音信号中插播一个DTMF信号,人听起来区别很明显,但FFT后发现区别不是很明显。
是否可以针对DTMF的频率做一下过滤?

用什么算法比较好?是否可以不使用浮点运算?

相关帖子

沙发
aozima|  楼主 | 2017-10-10 11:08 | 只看该作者
搜了一圈,常用的方案是使用 goertzel 算法识别音调。
抽空对比一下原理和效果。

使用特权

评论回复
板凳
nethopper| | 2017-10-10 16:05 | 只看该作者
N点DFT计算出来的是能量在N/2+1个连续频带的分布,[频率分辨率] = [采样频率] / [DFT点数],8个DTMF单频的最小间隔为770-697=7 3Hz,按这个可计算所需的DFT点数。由于DTMF信号的能量只分布8个频带附近,而DFT计算了N/2+1个频带,因此DFT有很多计算是白干了,所以费时费资源。

而每次Goertzel计算出来的其实只是DFT的N/2+1个频带中的一个频带处的能量,8个DTMF需要计算8次Goertzel,还是比DFT省力,也比FFT省力,还无需受DFT和FFT的固定的每个频带中心频率的掣肘。因此通常都采用Goertzel法。


FFT本身就是滤波器,只要设计好频率分辨率,减小频谱泄漏的影响,应该是可以直接在噪音环境下分辨DTMF的。

下图为用FFT识别DTMF的例子,示波器的采样频率=48kHz, 频 谱 分 析仪FFT点数=4096,因此频率分辨率为48000/4096=11.718Hz。为了减小频谱泄漏的影响,窗函数选为Kaiser 6,例子中用信号发生器的DTMF面板按下了“8”键,然后示波器采集此信号来分析。可见经过FFT分析识**,频率1 = 1.336kHz, 频率2 = 852 Hz, 非常精准,最后DTMF的识别结果为“8”。



下图则在上面的例子中加入了幅度与DTMF信号幅度相当的白噪声,其他参数完全相同。由频谱图可见两个谱峰仍然傲立与其它噪音电平之上。当然判别DTMF的时候,只需要判断697Hz~1633Hz之间的信号,其他地方就算噪音很高,也不影响最后判别。



用Goertzel法同样需要增加点数来提高频率分辨率,以提高抗噪能力。



使用特权

评论回复
地板
aozima|  楼主 | 2017-10-11 10:08 | 只看该作者
学习了

使用特权

评论回复
5
chunyang| | 2017-10-12 20:43 | 只看该作者
软件识别DTMF有专门的算法,不能用FFT,具体信息在网上搜吧。

使用特权

评论回复
6
nethopper| | 2017-10-16 14:43 | 只看该作者
本帖最后由 nethopper 于 2017-10-16 14:44 编辑

以前遇到过电话行骗的,就是通过种种方式,录到对方按双音频电话按键的声音,然后用音频分析软件(通用软件一般都是普通FFT)来分析出密码、电话号码之类的东东,所以在用带双音频声音的电话键盘要小心。还有企图分析点阵式打印机的声音来预猜中奖号什么的...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

2022

帖子

23

粉丝