查看: 289|回复: 5
收起左侧

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

[复制链接]

53

主题

1807

帖子

5727

积分

高级工程师

 楼主| 发表于 2017-10-9 20:44 | 显示全部楼层 |返回版面||阅读模式
语音信号中插播一个DTMF信号,人听起来区别很明显,但FFT后发现区别不是很明显。
是否可以针对DTMF的频率做一下过滤?

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

53

主题

1807

帖子

5727

积分

高级工程师

 楼主| 发表于 2017-10-10 11:08 | 显示全部楼层 |返回版面
搜了一圈,常用的方案是使用 goertzel 算法识别音调。
抽空对比一下原理和效果。
     

12

主题

1357

帖子

4449

积分

中级工程师

发表于 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法同样需要增加点数来提高频率分辨率,以提高抗噪能力。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册 手机登录

x

53

主题

1807

帖子

5727

积分

高级工程师

 楼主| 发表于 2017-10-11 10:08 | 显示全部楼层 |返回版面
学习了
     

163

主题

3万

帖子

17万

积分

坛主

发表于 2017-10-12 20:43 | 显示全部楼层 |返回版面
软件识别DTMF有专门的算法,不能用FFT,具体信息在网上搜吧。
有技术问题请在论坛里发帖,站内信、QQ、邮件等仅供业务或私人用途使用,不对技术问题单独解答。
欢迎访问春阳频道
     

12

主题

1357

帖子

4449

积分

中级工程师

发表于 2017-10-16 14:43 | 显示全部楼层 |返回版面
本帖最后由 nethopper 于 2017-10-16 14:44 编辑

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

本版积分规则

关闭

热门推荐上一条 /5 下一条

分享 快速回复 返回顶部 返回列表