DTMF的传输

 
双音多频DTMF(Dual Tone Multi-Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。
 
由于DTMF在传统通信领域中的广泛使用,所以在VOIP中,DTMF仍是发挥着重要的作用。
 
一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。产生DTMF信号,就是利用两个不同频率的正弦波叠加以后形成的波形,解码时则采用改进的Goertzel算法,从频域搜索两个正弦波的存在。
 
下表描述了每个DTMF信号的频率。
               1209 Hz 1336 Hz 1477 Hz 1633 Hz
                          ABC     DEF
   697 Hz          1       2       3       A
                  GHI     JKL     MNO
   770 Hz          4       5       6       B
                  PRS     TUV     WXY
   852 Hz          7       8       9       C
                          oper
   941 Hz          *       0       #       D
DTMF在VOIP中的解决方案
由于在IP网中的通信传输是采用包交换(packet switch)而不是传统领域中的线路交换(circuit switch)以及IP网的不稳定的特性,DTMF在VOIP中应用的解决方案和传统有所不同,并且暂时还未统一,有多种解决方案。
下面简单介绍现有的各种方案。
SIP信令的INFO方法携带DTMF信号。
该方法是用SIP信令的INFO方法来明文定义来代表DTMF信号。该种方法还在研究讨论当中,有专家认为其并不适用,主要缺陷是因为SIP控制信令和媒体传输(RTP)是分开传输,很容易造成DTMF信号和媒体包不同步。
简单举个例子,在 Voice Mail应用中,用户根据提示音输入一个DTMF信号,随后开始留言。Server是在接受到该DTMF信号后开始保存用户的留言。然而由于DTMF信号是通过SIP信令来传输的,而媒体流是通过RTP来传输的,有可能用户留言的RTP包先到,而该DTMF信号的INFO消息延迟,导致Server不保存用户的语音留言直至接受到INFO消息。
RTP媒体传输中携带DTMF信号。
该方法是将DTMF信号和媒体流一样,用RTP包来传输,因而没有DTMF信号和媒体流不同步的问题,使用H323信令的VOIP就是采用该种方法,相对来说比较成熟。
而其中又分In band和Out of band(RFC2833)两种。
l          In Band DTMF
In Band DTMF是指直接将DTMF的音频数字信号不经任何处理直接打成RTP包在IP网中传输。其中可能和用户的语音媒体流混合(mix)在一起传输。程序要获知哪个包有DTMF信号,是什么DTMF信号,必须实时检查每个RTP包里面的媒体流数据,分析它的频域。
l          Out of Band DTMF(RFC 2833)
Out of Band DTMF是DTMF信号用专门的RTP包进行标识,在RTP包的头域中就可得知该包是DTMF包,并且知道是什么DTMF信号。RFC2833专门对此有定义。
 
动态生成DTMF音频信号
当程序需要产生一个DTMF音频数字信号时,当然可以读取已经录制好的文件。
 
在这里介绍如何利用算法程序动态产生单个DTMF音频数字信号。
前面介绍过DTMF信号的原理是两个不同频率的正弦波叠加。
简单的生成正弦波的公式: sample=sin(n*2*PI*f/samplerate)
n:采样序数,由0开始递增
f:正弦波的频率
samplerate:采样频率
sample:序数n时的得出的采样值
 
如果要生成一个采样频率是8000hz,采样位是8bit的DTMF信号,则公式:
sample(n) = 128 + 63*sin(n*2*pi*f1/8000) + 63*sin(n*2*pi*f2/8000)
f1和f2分别是该DTMF信号的两个正弦波频率
其中128 = 256/2
63 = 128 /2 – 1
同样地,如果要生成16bit的DTMF信号,则公式:
sample(n) = 32768 + 16383*sin(n*2*pi*f1/8000) + 16383*sin(n*2*pi*f2/8000)
 
计算DTMF信号是一个耗费资源的过程,你可以通过不同途径去优化你的代码,最简单的是预先计算好2*pi*f1和2*pi*f2的值,减少CPU的计算时间。
 
关于DTMF信号的时间间隔,CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms内其他时间为静音,以便区别连续的两个按键信号。
 
根据RTP包中的音频信号检测DTMF信号
在输入信号中检测DTMF信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。
整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。

Goertzel 算法DTMF解码即是在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。此时Goertzel算法能更加快速的在输入信号中提取频谱信息。 
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在SIP中,DTMF(Dual Tone Multi-Frequency)信号的协商是通过SDP(Session Description Protocol)进行的。SDP是一种描述会话参数的协议,它用于在SIP通信中交换音频、视频和其他媒体信息。 协商DTMF的过程如下: 1. 起始方(通常是发起呼叫的一方)在SIP INVITE请求中的SDP部分中指定了自己支持的媒体传输方式(如音频编解码器、媒体传输协议等)以及DTMF传输方式的支持情况。 2. 接收方在SIP 200 OK响应中的SDP部分回复自己支持的媒体传输方式和DTMF传输方式。 3. 如果起始方和接收方都支持"inband"模式(将DTMF信号嵌入到音频信号中),则可以选择在SDP中指定"inband"作为DTMF传输方式。 4. 如果起始方和接收方都支持"out-of-band"模式(通过独立的信令通道或其他方式传输DTMF信息),则可以选择在SDP中指定"out-of-band"作为DTMF传输方式。 5. 如果起始方和接收方都支持"via signaling"模式(通过SIP信令通道传输DTMF信息),则可以选择在SDP中指定"via signaling"作为DTMF传输方式。 6. 最终,根据双方协商的结果,会话的DTMF传输方式被确定下来,并在后续的SIP消息中使用该方式进行DTMF信号的传输。 需要注意的是,DTMF的协商过程是根据双方设备和服务器的能力和配置进行的。不同设备和服务器可能支持不同的DTMF传输方式,因此在协商过程中需要确保双方都支持相同的方式。 希望这个回答对您有帮助!如果您还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值