【学习笔记】DTMF相关的学习-三种方式

来源:互联网 发布:写作软件排行 编辑:程序博客网 时间:2024/05/18 19:40

使用电话时有很多语音功能。




先转载一篇文章了解DTMF.

http://sirrain.blog.51cto.com/2645762/481055

1、DTMF(双音多频)定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D)。

2、SIP中检测DTMF数据的方法:SIPINFO、RFC2833、INBAND

      1)SIPINFO

     为带外检测方式,通过SIP信令通道传输DTMF数据。没有统一的实现标准,目前以Cisco SIPINFO为标准,通过SIPINFO包中的signal字段识别DTMF按键。注意当DTMF为“*”时不同的标准实现对应的signal=*或signal=10。SIPINFO的好处就是不影响RTP数据包的传输,但可能会造成不同步。

      2)RFC2833

      为带内检测方式,通过RTP传输,由特殊的rtpPayloadType即TeleponeEvent来标示RFC2833数据包。同一个DTMF按键通常会对应多个RTP包,这些RTP数据包的时间戳均相同,此可以作为识别同一个按键的判断依据,最后一包RTP数据包的end标志置1表示DTMF数据结束。另外,很多SIP UA 包括IAD都提供TeleponeEvent的设置功能如3CX Phone,Billion-IAD,ZTE-IAD等默认的TeleponeEvent都为101,但可以人为修改,这时要求在进行RFC2833 DTMF检测之前需事先获取SDP协商的TeleponeEvent参数。

      3)INBAND

      为带内检测方式,而且与普通的RTP语音包混在一起传送。在进行INBAND DTMF检测时唯一的办法就是提取RTP数据包进行频谱分析,经过频谱分析得到高频和低频的频率,然后查表得到对应的按键,进行频谱分析的算法一般为Goertzel,这种算法的实现也很简单,网上有很多可以下到,但建议采用定点算法,浮点算法效率很低。

     在选择压缩比很高码率很低的codec,比如G.723.1和G.729A等,建议不要使用INBAND模式,因为INBAND DTMF数据在进行复杂编解码后会产生失真,造成DTMF检测发生偏差或失败。

另外,还特别需要注意的一点就是很多SIP UA中INBAND都是伴随着RFC2833和SIPINFO同时发生的,这时需要区别对待,最好选择RFC2833和SIPINFO

 

本文出自 “赛驰天下” 博客


接下来就使用voip电话测试一下:

RFC2833:
A、B建立通话,A在通话过程中按0-9、*、#按键。
使用Wireshark捕获通话按键过程的数据报文,在过滤器中输入rtpevent过滤出DTMF。
从Wireshark中过滤的DTMF可以看到输入的数字(数字一般是重复的),且数据报文中的数字与话机手动按键的数字正确对应,且Playload=101。



SIP-INFO

从数据包Message Body字段中可以看到输入的数字(如,Signal:1),且数据报文中的数字与话机手动按键的数字正确对应。

Session Initiation Protocol-->Message Body


IN-AUDIO
在音频视图中可以看见各个按键。频率相似。


ps:不太明白别人是如何看一下频率就知道如何计算该DTMF。不是有了频率图还是要用傅立叶变换去计算得到频谱才行吗?

阅读全文
0 0