1基于MATLAB的DTMF技术计算机模拟徐阿勇李方洲罗蔚华(温州师范学院物理与电子信息学院浙江温州325027)摘要:主要阐述了DTMF编码的原理以及通过MATLAB产生DTMF信号的方法,并对Goertzel算法和快速傅里叶变换FFT算法提取的频谱进行了分析比较,设计了两种算法的MATLAB程序。利用Goertzel算法对输入的DTMF信号提取频谱信息,从而对输入信号进行检测、解码。关键词:DTMFGoertzel算法MatlabTheSimulateDesignofDTMFBasedonMATLABXuayong,LIfangzhou,Luoweihua(Departmentofphysicsandelectroninformationscience,wenzhounormalcollege,wenzhou325027,china)Abstract:ThisarticleismainlyabouttheprincipleofDTMFandtheproducesignalofDTMFunderMATLABenvironment.ThenanalyzeandcomparetheFrequencyinformationdistilledbyarithmeticofGoertzelandFFT,ThedesignofGoertzelarithmeticbasedonMATLABisgiven,weeducethatusingarithmeticofGoertzeltodistilltheFrequencyinformation.Finally,wegetcodeofDTMFbasedontheFrequencyinformation.Keywords:;DTMF;Goertzelalgorithm;Matlab1、引言DTMF(DoubleToneMultiFrequency,双音多频)信号是音频电话拨号信号,由美国AT&T贝尔实验室开发。作为实现电话号码快速可靠传输的一种技术,它具有很强的抗干扰能力和较高的传输速度,因此,可广泛用于电话通信系统中。但绝大部分是用作电话的音频拨号。另外,它也可以在数据通信系统中广泛地用来实现各种数据流和语音等信息的远程传输。这种拨号方法取代了脉冲拨号,在DTMF通信系统中共有8个频率,分为4个高频音和4个低频音.用1个高频音和1个低频音的组合来表示一个信号.这样,共能提供16种组合,分别代表16种信号.图一为电话按键与信号频率的对应关系。图一DTMF编码124758*A3AB609C#D679HZ770HZ852HZ941HZ1290HZ1366HZ1477HZ1633HZ行频率列频率2各种DTMF信号的应用都离不开DTMF信号的检测,这是DTMF信号应用的关键。对它的检测,主要通过数字信号处理的算法以及硬件实现。本文主要通过MATLAB的软件编程来实现DTMF信号的仿真检测,从频域分析了快速傅立叶变换(FFT)和GOERTZEL两种方法,并对GOERTZEL算法进行了详细的推导,提出采用Goertzel算法来实现DTMF信号的检测。2、Matlab简介Matlab(MatrixLaboratory,矩阵实验室)是由美国MathWorks公司于1982年推出的一个完整的并可扩展的高性能的数值计算和可视化软件,是一种进行科学和工程计算的交互式程序语言。MATLAB还具有功能丰富和完备的数学函数库及工具箱,大量繁杂的数学运算和分析可通过调用MATLAB函数直接求解,大大提高了编程效率,其程序编译和执行速度远远超过了BASIC、FORTRAN和C等语言。Matlab采用开发式的环境,你可以读到它的原码、了解它的算法,并能改变当前的函数或增添你自己编写的函数。在欧美的大学和研究机构中,Matlab是一种非常流行的计算机语言,许多重要的学术刊物上发表的论文均是用Matlab来分析计算和绘制各种图形。它还是一种有力的教学工具,它在大学的线性代数、自动控制理论、数理统计、数字信号处理、动态系统仿真等课程的教学中,已成为标准的教学工具[1,2]。3、信号的产生及算法实现DTMF编码,是将电话拨号盘上的数字0~9,字母A~D,及*/E、#/F,共16个字符,用音频范围的8个频率表示出来。具体来说,将8个频率分为高频群和低频群两组,分别作为列频和行频。每一个键的频率模式由来自于列频和行频的两个频率叠加而成。DTMF信号所规定的指标是:传送/接收率为每秒10个数字,或每个数字100ms。每个数字传送过程中,信号必须存在至少45ms,且不得多于55ms,100ms里的其余时间是静音。1)、DTMF信号的产生DTMF信号的产生比较简单,可直接利用两行频、列频的正弦函数的叠加实现,MATLAB程序及DTMF信号(电话拨号“7”为例)波形如下:图二电话拨号“7”的DTMF编码信号波形2)、DTMF信号的检测检测中采用了频域的方法,N点数据的DFT公式为:它的好处是可以得到DFT的所有N点的值。也就是通过DFT可以计算出信号中所包含的频率成分。具体实现时,由于它的计算量非常大,因而主要使用它的快速算法——快速傅立叶变换(FFT)[3,4]。对上述产生的DTMF信号,经过200点FFT运算得到DTMF信号的频谱X(K)(如图三所1,...,1,0)()]([)(10NkWnxnxDFTkXNnknN3示)。根据结果中两条谱线的位置K值可知其频率分别为820HZ和1290HZ,即对应了电话号码盘的数字“7”。从图中可以看出,FFT运算中出现了两个问题:1、由于数据的截断,带来了频谱泄漏误差;2、通过FFT运算,计算出了200点的频谱,而DTMF信号只需8个频率点,计算效率大大降低。为解决这个问题,文中采用了GOERTZEL算法[5]。图三“7”的DTMF编码FFT频谱GOERTZEL算法本身也是对DFT的快速运算,但可以有选择地计算个别点处的DFT,而对不需要的点不进行计算。GOERTZEL算法原理如下:GOERTZEL算法实质是一个两极点的IIR滤波器,其算法原理框图如图四所示:图四GOERTZEL算法原理框图由图可知:)1()()()(0)2()1()2cos(2)()(2NveNvNykXNnnvnvNknxnvkkNjkkkkk具体推导如下:)()()(10)(DFTWnxkXNnNnkNX(n)Vk(n)kNwYk(n)4令n=m10)()()(NmNmkNWmxkX=()knNXnW(n=N)所以对序列X(n)的DFT等价于X(n)与系统传递函数()knNhnW的第N个卷积值.对()knNhnW进行Z变换可得:11()1knHzWZ=)1(2cos211121ZWZkNZkN因此,H(z)可看作是级联型网络:2112cos211)(ZkNZzH12()(1)kNHzWZ因此)()2()1(2cos2)(nXnVnkVNnV其中V(-1)=V(-2)=0.()()(1)kNynVnWVn.因而,系统输出的功率谱为:)1()()2cos(2)1()()(222nvnvkNnvnvny其中n=N5图五“7”的DTMF编码GOERTZEL功率谱根据以上算法,使用MATLAB语言具体实现,程序如下:k=f/fn;vk(1)=0;vk(2)=0;fori1=1:8w=2*cos(2*pi*k(i1)/N);fori2=3:202vk(i2)=w.*vk(i2-1)-vk(i2-2)+x(i2);end;Xk(i1)=vk(202).^2+vk(201).^2-w*vk(202)*vk(201);end;程序运行结果如图五所示。从图中可以看出,利用GOERTZEL算法,只需计算出八个点的功率谱就可以进行拨号的判断,减少了运算量,提高了计算效率,使判断可以实时进行。4、结束语基于以上的算法,可以在PC机中通过MATLAB语言实现DTMF的编解码。试验结果表明基于MATLAB的DTMF编解码具有速度快、精度高、稳定性好以及便于灵活应用等特点。而利用MATLAB语言,可以较好地、快速地进行算法的仿真,对系统的快速开发起到了推动作用。当然,DTMF信号还要进行有效性检测:(1)、DTMF信号的强度是否足够大,行列频率分量平方幅度和是否高于规定的门限值。(2)、如果DTMF信号存在,比较行列频率的最大频率分量差值,因为电话线具有低通特性,列频比行频衰减得厉害,因此需要设置一个门限。(3)、分别在行列频率组比较频谱分量,最强的谱线至少要比其他高频信号高一个门限值。(4)、二次谐波分量是否小于某个值。(5)、判断DTMF信号是否包含稳定的数字信息,只有数字信息被连续检测到两次,才认为数字信息是稳定的。(6)、最后要检测数字信息之后是否有停顿状态,只有这样才将当前的数字作为有效数字。参考文献:[1]陈怀琛.MATLAB及其在理工课程中的应用指南.西安电子科技大学出版社,2000[2]王立宁.MATLAB与通信仿真.北京:人民邮电出版社,2000[3]胡广书.数字信号处理-理论算法与实现.北京:清华大学出版社,1993[4]丁玉美.数字信号处理.西安电子科技大学出版社,1999[5]MockP,AddDTMFGenerationandDecodingtoDSP2uPDesigns,DSPApplicationswiththeTMS320Family[J].TexasInstruments,1989,1:332551