DTMF信号产生发生器设计1、设计内容:DTMF信号产生发生器设计2、操作过程:在单片机系统或ARM系统上使用D/A变换器和软件算法合成DTMF信号,采样平频率8000Hz,即每125us输出一个采样点;3、基本要求:软件合成DTMF信号,产生16个电话拨号音。4、基本原理与参考测试代码4.1DTMF信号产生的基本原理在全世界范围内,双音多频DTMF(DualToneMultiFrequency)信令都使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信号。近年来,DTMF也应用在交互式控制中,如语言菜单、语言邮件、来电显示、电话银行和ATM终端等。根据CCITT建议,DTMF信号由8个频率(分高频群和低频群两组)两两组合而成,共有16中组合,代表16个按键。低频群的4个频率依次为697Hz、770Hz、852Hz、941Hz;高频群的4个频率依次为1209Hz、1336Hz、1477Hz、1336Hz。频率组合与按键对应表低频组高频组1209hz1336hz1477hz1633hz697hz123A770hz456B852hz789C941hz*0#D在通信领域应用中,DTMF主要用于电话机拨号信号和CID(CallerIdentification,来电显示)信号的传送。在应用于电话机的拨号信号中,按照国家电信标准,其信号持续时间和间隔时间都不小于40ms,而频率偏差不大于±1.5%。DTMF信号可由专用DTMF发生器硬件产生,也可由软件合成。当然,产生DTMF的方法还有很多,用软件产生可以用PWM的方式(要求MCU具有较高的执行速度),用硬件产生可以用信号发生器等;但相对于用D/A或者普通I/O口来说,其复杂程度和成本都分比较高。因此,用D/A或者普通I/O产生DMTF信号有更广泛的应用。4.2DTMF信号可由专用DTMF发生器产生传统的DTMF发生器芯片有Hotel公司的HT9200A/B、Mitel公司的MT8880等。部分MCU也内置了DTMF发生器,其DTMF信号产生原理可简述如下:将振荡器产生的高频振荡信号分别送至两个计数器,当计数器达到预设的值时,产生一次反转信号输出,形成低频方波。其中计数器寄存器可用软件设置且有自动装载功能。通过这两个计数器可设置输出的两路方波频率。软件编写控制程序时,只须将对应频率的计数值写入控制寄存器便可自动产生所需的频率信号。从以上两路输出的方波再进行信号正弦化处理和幅度控制,然后将两路信号同时送至信号混合器输出。这样,如果其中一路输出的方波频率接近DTMF低频群中的一个频率,而另一路接近DTMF高频群中的一个频率,从混合器输出的信号便是所需的DTMF信号了。4.3用D/A产生DTMF信号DTMF软件产生器是基于两个用软件模拟的二阶数字正弦波振荡器,一个用于产生低频,一个用于产生高频。典型的DTMF信号频率范围是697Hz~1633Hz。选取8000Hz作为采样频率,即可满足Nyquist条件。系统中信号合成的函数方程为:Y(n)=A0+A1·sin(2·Pi·f1·n/fs)+A2·sin(2·Pi·f2·n/fs)(1)=A0+A1·sin(x1)+A2·sin(x2)X1=2·Pi·f1·n/fs;X2=2·Pi·f2·n/fs;sin(x1)=SinTab[int(x1/da)&0xff]式中:A0为直流分量;f1、f2分别为DTMF中的低频和高频;fs为采样频率,在此定为8000Hz;A1、A2分别为f1、f2的振幅;n为采样点数。4.4sin函数的计算采样频率并不是DTMF的8个频率中各频率的整数倍,若采用查表法得到各采样点处理的D/A输出值,由于查表意味着输出值周期性的出现,则要求采样频率是输出频率的多个周期的整数倍。又由于输出数据表中需要包括多个周期,而且要逼近上述的整数倍,因此输出频率必须是采样频率整数倍的倍数。由此产生以下几个问题:①多个周期的数据表较大(平均一个频率20字左右);②数据表中各数值的计算烦杂;③产生的信号频率存在频偏。若采用计算sin函数的方法,以上问题都将迎刃而解。只是,如何计算sin函数呢?在传统的电子计算机系统中,处理浮点数比处理整数要复杂且占用CPU较多的时间;而在单片机系统中,一般对程序运行的时间都有要求。因此,本文采用了定点小数近似表示浮点数的方法,再利用线性插值法计算各点处的正弦函数值。定点小数的表示方法:将需要表示的小数空间乘上一个系数映射到整数所能所示的空间。若D/A的精度为8位,DAC输出寄存器为8位数据;sin函数的值域为[-1,+1],取整数域[-128,127]映射sin函数值中的[-1,1],即可满足DTMF输出精度要求。因此有:DAC输出数据值为=(int)(127*sin(x)).计算sin函数时,将0~2π映射为整数域的[0,255],因此,可通过整数域的查表计算得到[0,2π]的正弦值。DAC输出数据值为=sin_tab[i]=(int)(127*sin(x));其中i=(int)(x*256/2π)%256);因为x=2·π·f0·n/fs,所以i=(256*f0*n/fs)&0xff;其中n为采样计数(0~8000)周期性地重复;为避免每采样点浮点除法运算,预先定义8个不同频率相位常量IntDaltaPhase[8]={256*f1/8000,256*f2/8000,….,256*f8/8000};i=(DaltaPhase[fm]*n)&0xff;sin(x1)=SinTab[int(x1/Daltapase)&0xff]4.5DTMF信号的软件合成由于在DTMF的传输过程中,高频在线路中的传输损耗比低频高,为了保证信号到达交换机时高、低频信号电平基本相当,在DTMF信号产生器中,标准规定频率组合中高频分量电平应比低频分量电平高2±1dB。在DTMF硬件产生器中,这一处理是在高、低频信号混合器之间的低频通道中加适当的衰减电路完成的;而在用D/A产生DTMF信号的过程中,高、低频信号的混合也是由软件完成的。因此,必须在高、低频信号的产生过程中就考虑使低频信号的振幅略低于高频信号,这样才能从输出的信号中获得所需的电平差。由2.1中所描述的sin函数计算得的函数值,实际DAC输出若为0~1024,对应输出电压范围为0~5V,直流分量为2.5V;则有A0=512,取A2/A1=12/10,高频分量电平比低频分量电平高1.6dB,取A2为12,A1为10,即可得到高、低频的电平差为1.6dB的信号。有效相位:i=(256*f0*n/fs)%256;有效相位:j=(256*f1*n/fs)%256;DAC=A0+(A1*sin_tab[i]+A2*sin_tab[j])3;最大值=512+(12*128+10*128)/8=864没有溢出;最小值=512+(-12*128-10*128)/8=160也没有溢出;由上述公式求得的DAC值,直接输出到D/A寄存器。4.6软件流程图main()D/A,定时器初始化主循环入口Call按键处理函数按键有效?YN采样点计数n=0计算有效相位i,j的数值查表并计算当前DAC数值输出DAC值n++等待采样间隔时间到?清除定时标志重置定时初值采样计数n8000?return根据按键值设置f0,f1数值CallDTMF(f0,f1)DTMF(f0,f1)4.7参考设计单片机接口及数据输出子程序outDA:;输出数据在A中Setbp3.2Movp1,AClrp3.2NopSetbp3.2RetARM2138D/A接口及参考程序C语言操作D/A程序:#defineDACR*(unsignedlongint*)0xE006C000#defineOUT_DAC(a)DACR=(a6)2138定时器说明参见LPC213X_CN.pdf的112页定时器初始化程序Voidinit_timer0(void){T0TC=0;T0PR=0;T0MCR=0x03;T0MR0=Fpclk/8300;//125usT0TCR=0x01;//start}voidwait_timer0(void){while((T0IR&0x01)==0);T0IR=0x01;//ClearIRT0MR0=Fpclk/8300;//resettimer0}5.0VVoP3.2P1.0~P1.7VrefD0-7D/AWrCE输出三角波的主程序测试代码Main(){Inti=0;While(1){OUT_DAC(i);i++;delay(10);if(i1023)i=0;}}}