LOGODTMF信号的生成余恒xiaoyustudio@sina.cnDTMF信号DTMF高低次群频率(HZ)1209136614771633697770852941DTMF信号生成DTMF生成方法:1.静态方法:播放录制好的信号及静音。2.动态生成方式:硬件与软件方法。3.专用硬件方法:使用专门的DTMF芯片产生和接收,比如HT9170,MT8880等。DTMF信号生成DTMF信号硬件电路原理:DTMF信号生成软件生成DTMF软件生成原理:sample=sin(n*2*PI*f/fs)sample:序数为n时的采样值;n:采样序数,由0开始递增f:正弦波频率Fs:采样频率。DTMF信号生成DTMF产生公式:sample(n)=A0+ALsin(n*2PI*fL/fs)+AHsin(n*2PI*fH/fs)A0:直流分量;AL:低频正弦波振幅;AH:高频正弦波振幅;fL:低频群频率;fH:低频群频率;fs:采样频率;DTMF信号生成采样频率fs:由于DTMF频率为697-1633Hz。fs取8K即可。采样精度8bit时:sample(n)=128+63*sin(n*2PI*fL/8000)+63*sin(n*2PI*fH/8000)采样精度16bit时:sample(n)=32768+16383*sin(n*2PI*fL/8000)+16383*sin(n*2PI*fH/8000)DTMF信号生成A0,AL,AH的推导(16bit):不考虑Q.24的规定情况下,可令AL=AH=A正弦信号Asin(n*2PI*f/fs)的峰峰值为2A,最小值为0为保证信号幅度总为正,因为需加上直流分量A0。因此A0=2Asample(n)=2A+Asin(n*2PI*fL/fs)+Asin(n*2PI*fH/fs)DTMF信号生成0≤sample(n)≤4An位转换电路最大表示值为2n-1samplemax(n)=4A=2n-1A=(2n-1)/4,取整为2n-2-116bitD/A时,A=16383DTMF信号生成DSP软件生成DTMF1.产生两个数字正弦波,将输出合成;2.产生两个数字方波,再使用滤波器滤除二次以上谐波,将输出合成;3.查表输出。DTMF信号生成数字正弦波震荡器原理数字震荡器的实质是使用IIR滤波器,通过把其极点放在单位圆上产生震荡。sample=sin(n*2*PI*f/fs)令x=n*2*PI*f/fs;2*PI*f/fsDTMF信号生成则序列:Z变换为:120()()jnjnnjnXzeeZDTMF信号生成11120()()jnjnjneZeZ12jjjTzzzeze221222cos(jjjzzezzezzDTMF信号生成上式在|Z|>1时成立;2sin(2cos()1zzzT2CzzAzB2cos(;1;sin(ABCDTMF信号生成根据Z变换的基本原理及性质,序列X(n)及其Z变换X(z)存在一一对应的关系。对于给定X(z),可通过反Z变换得到X(n)产生一个正弦波等价于利用上述公式设计一个二阶的IIR滤波器,使其传递函数就是正弦序列X(n)的Z变换。系统传递函数:1212()1CzCzHzzAzBAzBzDTMF信号生成滤波器的极点为的根cos(sin(j22cos(4cos(220zAzB21,242AABPDTMF信号生成由上式得出的结论:P1,2是一对复根,其幅值为1,相角为幅值为1的极点在单位圆上,对应着一个数字振荡器。振荡频率由系数A,B,C决定。设计数字振荡器主要就是设计A,B,C这几个参数。DTMF信号生成单位冲击响应下的差分方程:传递函数假设初始条件为0,则式①的Z反变换为112()1CzHzAzBz()(1)(2)(1)ynAynBynCxn①②DTMF信号生成10()()00nXnnn令输入X(n)为单位冲激函数:n=1时,代入②式(1)(1)xnn(1)(0)1xnDTMF信号生成(0)(1)(2)00yAyBy•当n=0时,•当n=1时,•当n=2时,•当n=3时,…………•当n>2以后:(1)(0)(1)yAyByCC(2)(1)(0)0(1)yAyByAy(3)(2)(1)yAyBy()(1)(2)ynAynByn③DTMF信号生成由以上推导得出的结论:n>2以后,y(n)可由y(n-1)及y(n-2)计算Y(n)为一递归差分方程递归计算过程均为乘加表达式,非常适合DSP高效实现。对于余弦序列,当n>2后,差分方程与正弦序列是一样的。cos(DTMF信号生成DSP生成DTMF信号原理示意:DTMF信号生成以697Hz为例说明生成过程:2*PI*f/fs=2*cos(2*PI*697/8000)=2*0.8538B=-1=2*sin(2*PI*697/8000)=2*0.52042cos()ATsin(CDTMF信号生成归一化及定标处理为防溢出,将所有系数除2为便于定点DSP处理,将所有系数扩大215=27361.28=0X6AE1=-16384=0XC000=17052.35=0X429C1522A1522C1522B正弦信号生成程序SIN:STM#3,BK;循环缓冲区长度为3,针对AR2STM#1,AR0;在AR0中放一个常数1STM#H,AR2;AR2指向y(N-1)处STM#L,AR3;AR3指向A/2处STM#400-1,AR7;循环计算400个样点LOOP1:MPY*AR2,*AR3,A;因为系数是A/2,所以要做两次运算MAC*AR2+0%,*AR3+,A;A*Y(N-2)MAC*AR2,*AR3,A;因为系数是B/2,所以要做两次运算MAC*AR2+0%,*AR3+,A;B*Y(N-1)STM#L,AR3STHA,*AR2;更新Y(N)的值STHA,*AR5+;保存y(n)BANZLOOP1,*AR7-;AR7不等于0,跳转至LOOP1RETDTMF信号生成程序start:SSBXFRCT;设置小数方式位,以消去多余符号STM#H,AR1;AR1指向HRPT#1MVPD#KEY4_L,*AR1+;AR1指向KEY4_LSTM#L,AR1;AR1指向LRPT#1MVPD#(KEY4_L+2),*AR1+;AR1指向KEY4_L+2STM#X,AR5;AR5指向X,用于存储400个正弦波样点CALLSIN;调用SIN,产生固定行频的正弦波STM#H,AR1;AR1指向HRPT#1MVPD#KEY3_H,*AR1+;AR1指向KEY4_HSTM#L,AR1;AR1指向LRPT#1MVPD#(KEY3_H+2),*AR1+;AR1指向KEY4_H+2STM#Y,AR5;AR5指向Y,用于存储400个正弦波样点CALLSIN;调用SIN,产生固定列频的正弦波STM#DTMF,AR4;AR4指向DTMFSTM#X,AR2;AR2指向XSTM#Y,AR3;AR3指向YSTM#400-1,AR6;循环400次LOOP:ADD*AR2+,*AR3+,B;将行频和列频的400个样点相加,得到DTMF信号,STHB,*AR4+;将得到的DTMF信号存在起始地址为0x4000BANZLOOP,*AR6-;AR6不等于0,跳转至LOOPend:BendLOGO