双音多频DTMF

双音多频 DTMF(Dual Tone Multi-Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。
 
由于 DTMF在传统通信领域中的广泛使用,所以在VOIP中,DTMF仍是发挥着重要的作用。
 
一个 DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。产生DTMF信号,就是利用两个不同频率的正弦波叠加以后形成的波形,解码时则采用改进的 Goertzel算法,从频域搜索两个正弦波的存在。
 
下表描述了每个 DTMF信号的频率。
动态生成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内其他时间为静音,以便区别连续的两个按键信号。
 

你可能感兴趣的:(算法,电话,算法,语言,优化,终端,c)