DTMF信的产生与检测实验报告_第1页
DTMF信的产生与检测实验报告_第2页
DTMF信的产生与检测实验报告_第3页
DTMF信的产生与检测实验报告_第4页
DTMF信的产生与检测实验报告_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DSP课程设计实验报告DTMF信号的产生与检测1设计任务书双音多频DTMF(DualToneMultiFreque指导老师: 申艳老师ncy)信时间:2014年7月18日 号是在 PAC.1-1-按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。每组分别包括4个频率,据CCITT的建议,国际上采用的这些频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。在每组频率中分别抽出一个频率进行组合就可以组成16种DTMF编码,从而代表16种不同的数字或功能键,分别记作0〜9、*、#、A、B、C、D。如下图所示。图1-1双音多频信号编码示意图要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。实验目的掌握DTMF信号的产生和检测的DSP设计可使学生更加透彻的理解和应用奈奎斯特采样定理,与实际应用相结合,提高学生系统地思考问题和解决实际问题的能力。通过对DSP信号处理器及D/A和A/D转换器的编程,可以培养学生C语言编程能力以及使用DSP硬件平台实现数字信号处理算法的能力。技术指标及设计要求基本部分1)使用C语言编写DSP下DTMF信号的产生程序,要求循环产生0〜9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。2)使用C语言编写DSP下DTMF信号的检测程序,检测到的DTMF编码在CCS调试窗口中显示,要求既不能漏检,也不能重复检出。DTMF信号的发送与接收分别使用不同的实验板完成。发挥部分1)使用一个DSP工程同时实现DTMF信号的发送和检测功能。2)改进DTMF信号的规定指标,使每秒内可传送的DTMF编码加倍。3)发送的DTMF信号的幅度在一定范围内可调,此时仍能完成DTMF信号的正常检测。方案完成情况在实现基本要求的基础上,我们又完成了发挥部分的全部要求:能够实现在一个DSP实验箱上同时实现自发自收,基本能实现无差错传输。通过改变处理信号的点数N的数值实现了DTMF信号编码加倍,能够在一秒内传送够多的数据。通过gel添加滑动条的方法实现输入信号幅度可调,并实现判决门限的自适应处理,能随着幅度的变化自动调整门限的值,进而了判决传输信号的正确性。2设计内容DTMF信号的的定义双音多频(DTMF)信号是由两个不同频率的信号叠加而成,设V(t)为DTMF信号、V(t)和HV(t)分别为构成V(t)的两个信号,则它们应满足关系式(1)。LV(t)=V(t)+V(t) (1)HL根据CCITT建议,国际上采用697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz、1633Hz8个频率,并将其分成两个群,即低频群和高频群。从低频群和高频群中任意抽出一个频率进行叠加组合,具有16种组合形式,让其代表数字和功率,如表3-1所列,则有关系式(2)。V(t)=Asin3t+Bsin①t (2)HL其中Asin3t为低频群的值,Bsin3t为高频组的值,A、B分别为低频群和高频群样值HL的量化基线,具体见表2-1。X1209133614771633697123A770456B852789C941*0#D表2-1DTMF频率及其对应的键值DTMF信号生成方法利用math.h采用数学方法产生DTMF信号buffer[k]=sin(2*pi*k*f0/fs)+sin(2*pi*k*f1/fs) (式2-1)f0为行频频率,f1为列频频率,fs为8000采样频率,k为对信号的采样。利用两个二阶数字正弦波振荡器产生DTMF信号(本课程设计实际采用方法)DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是700〜1700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件。由数字振荡器对的框图,可以得到该二阶系统函数的差分方程:二二(式2-2)其中a1=-2cos30,a2=1,30=2nf0/fs,fs为采样频率,f0为输出正弦波的频率,A为输出正弦波的幅度。该式初值为y(-1)=0,y(-2)=-Asin30。CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms内其他时间为静音,以便区别连续的两个按键信号。编程的流程如图1所示,由CCITT的规定,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数a1=-2cos30与y(-2)=-Asin30。该流程图可采用C语言实现,双音信号的产生则由54x汇编代码实现。整个程序作为C54x的多通道缓冲串口(McBsp)的发射串口中断服务子程序,由外部送入的16000Hz串口时钟触发中断,可实时处理并通过D/A转换器输出DTMF信令信号。图2-1DTMF编码流程DTMF信号的检测方法DTMF信号的检测方法可以有多种。主要分为从信号时间域处理和从信号频率域处理两大类。前一种方法包括:过零点位置检测法、信号峰值位置检测法、过零点位置及信号幅值检测法。其特点是实现简单,可以通过MT8880等芯片加上外围电路实现,易于集成化。缺点是易受干扰,对信噪比要求高。现在广泛应用于一般的脉冲拨号电话机。通过神经网络等辅助判别方法可以大大提高信号的识别率。后一种方法包括:频率判断、能量判断两类。频率判断主要通过滤波器提取DTMF相应的频率信号进行比较判断,滤波器可以用窄带、低通、高通滤波器,应用方式可以有并联、级联、混合联接等方式。能量判断是直接对DTMF信号相应的能量进行计算,找出高、低频率群中最强的信号,进行判断,包括有DFT法(DiscreteFourierTransform)、FFT(FastFourierTransform)、Goertzel法等。本次实验我们采用的是能量判断法,并采用了Goertzel算法。3设计方案、算法原理说明Goertzel算法原理Goertzel算法信号解码是将两个音频信号提取出来,并通过他们的频率,确定所接受的DTMF数字。原来使用模拟技术音频信号频率进行检测,一般通过模拟电路进行过零点检测,通过零点计数完成对输入信号的频率检测。在数字信号检测电路中,一般使用频域计算技术代替时域信号处理。我们可以直接通过付立叶变换,直接得到输入的信号频率。信号各个频率分量的幅值直接计算可以使用DFT。对于N点数据序列{x(n)}的DFT为:X(k)=2x(n:Wnk,k=0,1,...,N-1 (式3-1)Nn=0如果用FFT算法来实现DFT计算,计算将涉及复数乘法和加法,并且计算量为NlogN。2虽然我们可以得到DFT的所有N个值,然而,如果希望计算DFT的M个点,并且M<logN时,2可以看到,直接计算DFT则更加有效。下面我们用到Goertzel法,是一种直接计算DFT有效

的方法。我们应用Goertzel算法对DTMF信号的检测,并且对其进行改进。Goertzel算法,从根本上说,是计算DFT的一种线性滤波算法,它可以通过调整滤波器的中心频率和带宽,直接计算出DFT的系数。Goertzel算法利用相位因子8k}的周期性。我们可以同时将DFT运算表示为线性滤波得到:(式3-2)(式得到:(式3-2)(式3-3)运算,由于W-kN=1,我们可以用该因子对公式(4)(DFT表达式)两边相乘,NW-kNX&)=X&)=NE1x(n)Wnk*W-kN=NE1X(m)W-k(N-m)N NN Nn=0 m=0我们注意到,上式就是卷积形式。可以定义序列Y(n)为:KY(n)=^x(m:W-k(n-m)

kNm=0显然,Yk(n)就是长度为N的有限长输入序列Y(n)与具有如下单位脉冲响应的滤波器K的卷积:h(n)=W-knu(n) (式3-4)kN2冗可以看到,当n=N时,该滤波器的输出就是DFT在频点3=竺k值kN即X(k)=Y(n) (式3-5)Kn=N我们可以通过比较式⑹和式(7)来验证上式。对于单位脉冲响应为hk(n)的滤波器来说,其系统函数为:H(z)= (式3-6)k 1-W-kz-iN2万这个滤波器只有一个位于单位圆上的极点,其频率为3=竺k。因此,可以使用输入KN数据块通过N个并行的单极点滤波器或者谐振器组来计算全部的DFT,其中每个滤波器有一个位于DFT响应频率的极点。因此,对于式(7)的卷积计算,我们可以使用差分方程形式来表示用式(9)给出的滤波器,通过迭代的方法计算Y(n),从而得出DFT的计算结果:Ky(n)=W-ky(n-1)+x(n)y(-1)二0 (式3-7)k Nk k计算涉及复数加法和复数乘法,计算量大。由于我们只需要计算幅值信息,而不关心相位信息。我们在单位圆上另外引入一个极点,与原有的极点形成一对共扼极点。将两个滤波器组成一对复数共轭极点的谐振器。原有的单极点滤波器计算方式变成形如式(10)的方式。其系统函数为:(式3-8)H(z)= 1-WNZ;(式3-8)z 1-2cos(2兀kN)z-i+z-2上式中:Wk=ejMk/N,为差分方程的系数。由于引入了复数共扼极点,避免了(式N中复杂的复数加法和复数乘法。显然,对式(10)无法进行直接计算。为了便于计算实现,我们引入中间变量Q<n),将k式(9)表示为差分方程形式:Q(n)=2*cos 义Q(n-1)-Q(n-2)+x(n) (式3-9)k IN)kk式中,初始条件为:Q(—1)=Q(—2)=0,n=0,1,...,NkkX(k)=Y(N)=Q(N)-WkxQ(N-1) (式3-10)k k Nk2口k其中,Wk=enNGoertzel算法改进与实现Goertzel算法是计算离散傅立叶变换的方法,需要计算的频率点数不超过21092N时Goertzel算法将比FFT(FastFourierTransform)更为有效。Goertzel算法相当于一个二阶IIR滤波器,(10)式是它的转移函数我们可以根据(10)式画出改进Goertzel算法的模拟框图,如图3-1所示x(nx(n)y(n)k-1图3-1Goertzel算法的模拟框图图2中可看到,整个计算过程分为两部分:前向通路式(11)和反馈通路式(12)。显然,对于式(11)的递推关系计算需要重复N=1,?,N重复N+1次,但是式(12)中的反向计算只需要在n=N时计算一淡。每次计算只需要计算一次实数乘法和两次实数加法。所以,对实数序列x(n),由于对称性,用这种算法求出X(k)和X(N-k)的值需要N+1次实数乘法运算。

我们现在可应用Goertzel算法完成实现DTMF解码器了。由于有8种可能的音频信号需要检测。所以需要至少8个由式(9)给出的滤波器,将每个滤波器调谐到这8个频率值上。在完成信号判决时,我们并不需要相位信息,只需要幅值信息|X(k)|。因此,对式(12)两边进行平方,计算幅度的平方值|X(k)|2。我们将递推方程式(9,11,12)进一步简化,得到滤波器计算的前向部分的简化表达方式,即滤波表达式的分子项部分:由于我们只需要幅值信息,不需要相位信息,因此,对前向部分进行改进,输出幅度平方值。|X(k)2=y(N)y*(N)=Q2(N)+Q2(N—1)2cos至Q(N)Q(N—1)(式3-1)11kk k k Nkk改进Goertzel算法原理小结在式(12)中可以使用A,B分别代替递归项,令A=Q(N-1),B=Q(N-2)将离散付kk里叶变换DFT的改进计算过程总结写为:|y(N)2=A2+B2—ABcoef (式3-2)1kl k其中coef=其中coef=2cos—k,|y(N)2二|X(k)2

1kli1可以看到,由于上面两式中:忽略相位信息,使用实数运算,无复数运算。等式右边全部是实数运算,大大提高了运算速度,降低计算量。实际实现中误差分析舍入误差问题我们再次回到公式3-1进行分析:X(k)2=y(N)y*(N)=Q2(N-1)-2cos过Q(N)Q(N—1)(式3-1)kk K NKK简单地说,在实际的)SP实现中将使用(4)式和(6)式来得到DTMF信号的频谱信息,(4)式实际就是一个递归线性滤波器的表达式,它在n=0・・・N之间进行循环。每个样点对公式(6)进行了一次计算。在这个算法中,DTMF频率(fi)变换成了离散傅立叶系数(k),它们之间存在如下关系:fk二=£,这里,N是滤波器的长度,f是采样频率。在给定的采样频率下,我们可以fN ss通过调整N和K值,得到相应的DTMF频率(f)上的能量幅值。i但是,由于k和N是整数,有可能不能取到合适的DTMF频率(fi)。实际上,计算时如果采用FFT变换,计算字长N将被限定为2得n次方,每次计算可以同时得到N/2个频率点的幅度值。而对于DFT或Goertzel算法来说,对于N长度的算法,其可以分辨的最高频率为采样频率的一半。其输出序列为{X(0)、X(1)……,X(N)}对应的信号计算频率为fi,i=0,1,…,N。所以,我们可以知道,可计算的信号频率存在一定的限制。式(4-12)给出了Goertzel算法的频率分辨率。对于不是正好在输出序列计算点上的信号频率,其计算结果分布在相近的频率值上,将会出现泄漏,这不是我们所期望的。计算字长N的问题提出N和k的选择不同,计算的误差会有很大不同。缩小N值,将显着减少计算量,所以N值的选取,是完成实时计算的核心。在相关文献中,N值的选取也有很大的不同。有使用16个106字长计算完成信号监测及语音检测的,也有使用105字长或205字长完成Goertzel算法完成检测的,由此我们提出这样一个问题,在文所利用的Goertzel算法中,进行DTMF信号检测的最佳字长是多少?由采样频率公式可知,在采样率一定的情况下,N值的取值同时决定Goertzel算法计算时对应的频率,即Goertzel滤波器的中心频率。通过改变N值,计算出我们感兴趣的对应一组k值,即完成DTMF频率检测。但是,由式(14)可知k取整数,计算中心频率的位置与实际的DTMF频率必然会产生一定的舍入误差。我们将Goertzel算法中的中心频率与实际的DTMF频率的差值定义为D。可以计算出D的最大值为ffDmax=二,当k的误差Ak=0.5时,对应的频率百分比为:,f,为所需计算的2N 2NfdtmfdtmfDTMF频率。这实际上是DTMF频率位于“所计算的信号窗口的边缘”。当N值取较大值时,同时采取较高的采样频率可以取得较准确的检测结果,但是也加大了计算量。由于N的取值,影响了计算时的Goertzel滤波器的中心频率的位置。实际应用中,首先需要确定N,同时对应不同的DTMF频率,取相应的k值,通过Goertzel算法,得到相应的X(k)。可以看到,N的取值是Goertzel算法设计DTMF信号检测器的关键,它直接决定了检测器的性能及对ITU建议的满足性。以下讨论在满足ITU要求的情况下,寻找的N值的过程,同时,我们在这里讨论的是误差的百分比,因此,可以通过计算点数的误差百分比来估计频率的百分比。Goertzel算法中N的选择要求N的选择应考虑如下的因素:频率偏移度不但要求主瓣宽度存在一定的范围之内,同时也和计算窗口中心频率有关。Goertzel算法种计算长度N的取值也影响到计算窗口中心频率的取值。例如,如果N=125,fs=8000Hz,对于770Hz信号的完成检测,频域分辨率为8000/125=64Hz,ITU规定的对于频率误差大于3.5%的信号拒识,即对于770Hz信号为中心,宽度为743.05到769.95。39.0Hz的频率分辨率将矗立的信号为780.488Hz为中心,其他范围的频率则不满足规定要求。舍入误差的寻优f根据k=N义t,在Goertzel算法进行递归计算时k要取整数,因而存在舍入误差。舍fs入误差是随机和离散的,不同的N值和不同的鼻舍入误差是不同的,因此造成的频率的偏移也是不同的。由于k的舍入误差反映的是频率的偏移,因此必须兼顾每个频率,选择女舍入误差小得N值。表3-1列出了当N=125时,不同的频率k值的舍入误差,表3-2列出了当N=205时,不同的频率k值的舍入误差.信号频率(Hz)k计算值k相对偏差(%)

67910.891111.077012.031120.385213.313132.394114.703152.0120918.891190.6133620.875210.6147723.078230.3163325.516252.0表3-1N=125时不同的频率值k的舍入误差85221.833220.894124.113240.5120930.981310.1133634.235340.7147737.848380.4163341.846420.4表3-2N=205时不同的频率值k的舍入误差由于k的舍入误差反映的是频率的偏移,因此必须选择女舍入误差小的N值。同时还要兼顾每个频率,每个频率卜舍入误差都比较小,或者尽可能的都取“舍”或者都取“入”,这样就会使偏移比较小或者都向同一个方向偏移。复杂度比较直接计算离散傅里叶变换,对于每一个k值,需要4N次实数乘法及4N-2次的实数加法,N点的傅里叶变换需要4N2次实数乘法及N(4N-2)次实数加法,因此,采用直接法计算的计算复杂度为O(N2)。对于Goertzel算法来说。其输入的乂(口)2工是复数,每计算一个新输出Y值需要做四次实数加法和四次实数乘法。由于我们只需要幅值信息,对于相位信息可以忽略,通过变换得到幅值信息。因此,共需要N+l次实数乘法,计算复杂度为O(Nm)。对于单个解码器来说,对于每次成功完成DTMF信号解码的时间估计十分重要。通过对解码器的处理时间估计,我们可以得到其处理性能,通过对处理性能评价,就可以预计单个解码器工作时可以承载的最大信道个数。在这里,定义DTMF解码器成功完成两个DTMF信号解码之间所耗费的时间可以这样估算:每处理一个采样样本的时间间隔允许的最大值为:1T二—二125rs (式3-3)sfs前向计算所需的时间为:N*Ts可以看到,计算时间主要决定于计算字长N。对于每一个需要检测的频率,都必须进行(N+4)次实数乘法和(N十2)次加法。检测8个DTMF频率需要的总共的计算量为:(8N+32)次乘法与(16N十16)次实数加法。算法流程图图4-1程序算法流程图源程序注释初始化程序//*****************************初始化**********************************//InitializeCSLlibrary-ThisisREQUIRED!!!CSL_init();//Themainfrequencyofsystemis240MHz//该频率是为了设置IIC模块的需要设置的,为了使用I2C_setup函数PLL_setFreq(1,0xC,0,1,3,3,0);//EMIF初始化Emif_Config();//OpenMcBSPport1andgetaMcBSPtypehandlehMcbsp=MCBSP_open(MCBSP_PORT1,MCBSP_OPEN_RESET);//ConfigMcBSPport1byusepreviouslydefinedstructureMcbsp_Config(hMcbsp);〃12c初始化I2C_cofig();//CODEC寄存器初始化inti_AIc();二极管闪烁程序//*******************程序正常执行:二极管闪烁两次***********************while(cnt--){asm("BCLRXF");//;ClearXFdelay(3000);asm("BSETXF");//;SetXFdelay(3000);}DTMF信号产生,发送与接收〃**********************DTMF信号产生,发送,接收*************************for(i=0;i<16;i++){f0=freq[i][0]; //顺序获取各符号低频数据row_freq[i][0]=cos(2*pi*f0/fs);row_freq[i][1]=sin(2*pi*f0/fs);}for(i=0;i<16;i++)f0=freq[i][1]; //顺序获取各符号高频数据column_freq[i][0]=cos(2*pi*f0/fs);column_freq[i][1]=sin(2*pi*f0/fs);}for(k=0;k<16;) //基于两个二阶数字正弦振荡器,产生DTMF信号{ax1=row_freq[k][0];x_n_2=-row_freq[k][1];ay1=column_freq[k][0];y_n_2=-column_freq[k][1];x_n_1=0;y_n_1=0;for(j=0;j<200;j++)//传输信号采样值,设产生信号的持续时间为50ms,所以j为200。x_n=2*ax1*x_n_1-x_n_2;y_n=2*ay1*y_n_1-y_n_2;z_n=x_n+y_n;x_n_2=x_n_1;x_n_1=x_n;y_n_2=y_n_1;y_n_1=y_n;dtmf[j]=z_n*gain; //gain(可变)改变产生信号的幅度,使之在一定范围内可调,while(!MCBSP_xrdy(hMcbsp)){};//左声道信号发送MCBSP_write16(hMcbsp,dtmf[j]); //采样值的装入,前二百个点为双音信号采样值while(!MCBSP_xrdy(hMcbsp)){};//右声道信号发送MCBSP_write16(hMcbsp,dtmf[j]); //采样值的装入,前二百个点为双音信号采样值while(!MCBSP_rrdy(hMcbsp)){};//左声道信号接收dtmfr[j]=MCBSP_read16(hMcbsp);}}}}}}while(!MCBSP_rrdy(hMcbsp)){};//右声道信号接收dtmfr[j]=MCBSP_read16(hMcbsp);}for(j=0;j<200;j++) //传输静音信号,设产生信号的持续时间为50ms,所以j为200。{dtmf[j+200]=0; //后二百个点为0(即静音信号)。while(!MCBSP_xrdy(hMcbsp)){}; //左声道信号发送MCBSP_write16(hMcbsp,0);while(!MCBSP_xrdy(hMcbsp)){}; //右声道信号发送MCBSP_write16(hMcbsp,0);while(!MCBSP_rrdy(hMcbsp)){}; //左声道信号接收dtmfr[j+200]=MCBSP_read16(hMcbsp);while(!MCBSP_rrdy(hMcbsp)){}; //右声道信号接收dtmfr[j+200]=MCBSP_read16(hMcbsp);detect();//接收信号判决检测与显detect();示k++;if(k==16) /控/制16个符号循环发送k=0;}延时子程序//********************************延时子程序******************************voiddelay(intperiod){inti,j;for(i=0;i<period;i++){for(j=0;j<period>>1;j++);5.55.5接收信号判决检测与显示子程序5.55.5接收信号判决检测与显示子程序//采用Goertzel//采用Goertzel算法检测DTMT信//i表示有8个频率点。//***********************接收信号判决检测与显示子程序*********************voiddetect()w[0]=2*cos(2*pi*K[0]/N);号w[1]=2*cos(2*pi*K[1]/N);w[2]=2*cos(2*pi*K[2]/N);w[3]=2*cos(2*pi*K[3]/N);w[4]=2*cos(2*pi*K[4]/N);w[5]=2*cos(2*pi*K[5]/N);w[6]=2*cos(2*pi*K[6]/N);w[7]=2*cos(2*pi*K[7]/N);for(i=0;i<8;i++)bb[i][0]=0;bb[i][1]=0;for(j=0;j<N;j++){bb[i][2]=w[i]*bb[i][1]-bb[i][0]+dtmfr[j+50]/8192.0;//DFT在8个频率点的值bb[i][0]=bb[i][1]; //迭代算法bb[i][1]=bb[i][2];}result[i]=bb[i][1]*bb[i][1]+bb[i][0]*bb[i][0]-w[i]*bb[i][1]*bb[i][0]; //每一段的8个频率点的幅度平方值}j=0;for(i=0;i<8;i++){if(result[i]>thresh) 〃对result中的值进行检测,与域值比较,当超过域值时,判断此频率点上信号存在j++;printf("dtmf[%d]:%f\r\n",i,result[i]);if(j==1)有的低频信息{X=i;}elseif(j==2)有的高频信息{Y=i;}}}threshold();适应更新域值//j=1时i的值赋给x,代表检测符号含〃j=2时i的值赋给y,代表检测符号含//根据当前8个频率点的幅度平方值自}}}}ch='e';if(j==2){if(X==0&&Y==4)为1209Hz{ch='1';}elseif(X==0&&Y==5)为1336Hz{ch='2';}elseif(X==0&&Y==6){ch='3';〃若x=0,y=4,则表示低频为697Hz,高频//这两个频率所对应的数为"1"〃若x=0,y=5,则表示低频为697Hz,高频//这两个频率所对应的数为"2"//以下都依次类推elseif(X==2&&Y==elseif(X==2&&Y==#){ch='D';}}if(ch!='e') //满足以上一种情况,则输出检测的信号{printf("TheDTMFsignalis\"%c\".\r\n",ch);}else //以上情况都不满足,则输出错误信息提示{printf("Thenumberinputtediniswrong!\n");}}5.6自适应域值更新子程序//******************************自适应域值更新子程序**********************voidthreshold(){for(c=0;c<8;c++) //传递当前8个频率点的幅度平方值,便于自适应域值更新处理{linshi[c]=result[c];}for(b=0;b<2;b++) //寻找八个频点中第二大频点的幅度平方值{for(a=b;a<8;a++){if(linshi[b]<=linshi[a]){temp=linshi[b];linshi[b]=linshi[a];linshi[a]=temp;}}thresh=thresh*0.3+0.7*(linshi[1]*0.5);//自适应更新域值(原域值30%+0.7倍第二大频点的幅度平方值70%)}6程序设计、调试与结果分析调试过程CCS的启动双击桌面上的SetupCC3.3运行CCS设置程序。单击ImportConfiguration对话框中的Clear,删除原先定义的设置。从AvailableConfigurations列表中,选择C5502SEEDXDS510PLUSEmulator,单击Import,单击saveandquit。图6-1硬件环境设置工程建立、加载与程序运行(1)创建名为DTMF-SEND&RECEIVE的工程通过project的new来建立一个名为DTMF-SEND&RECEIVE的新工程,过程如下图所示:图6-2新建工程(2)向工程中添加文件从file中的new—source建立c程序和cmd文件,编写完成后保存,然后从project—addfilestoproject添加c程序和cmd文件,库文件,头文件可以通过扫描相关性(ScanAllDependencies)自动加入到工程中。头文件路径可以通过project中buildoptions的compiler中的processes进行设置,最终编译环境如下图所示:图6-3添加源文件图6-4添加cmd文件图6-5添加库文件图6-6添加头文件(使用浏览文件相关性选项)图6-7设置头文件路径图6-8设置数据大小端模式(大端模式)图6-9添加宏定义(3)编译与运行程序选择Project/RebuildAll或单击(RebuildAll)菜单条按钮,CCS重新进行编辑、汇编、连接工程里的所有文件。选择File/LoadProgram.选中DTMF-SEND&RECEIVE,双击,即可加载.out文件。CCS将程序装载到目标DSP上,打开显示程序反汇编指令的Disassembly窗口。选择Debug/GoMain,从主程序开始执行。最后单击Debug—Run(或按F5键)运行程序。图6-10下载gel文件

图6-11程序编译成功图6-12将程序下载到实验箱图6-13程序运行图6-13打开gel文件滚动条6.2实验结果及图像本次实验中,我们通过一台电脑循环产生0——9、A、B、C、D、*、#,在另一台电脑上会循环显示检测到的DTMF信号,即循环显示0——9、A、B、C、D、*、#。下面我们从时域和频域两个角度观察一下检测信号的波形:使用CCS中Graph显示发送端的时域图形参数设置及显示结果如下所示:图6-14发送缓存区图形参数设置(时域及频域)图6-15发送缓存区时域图形显示图6-16发送缓存区波形频谱显示检测端的时域图形参数设置及显示结果如下所示:图4-17检测缓存区图形参数设置(时域及频域)图6-18发送缓存区时域图形显示图6-19发送缓存区波形频谱显示2使用虚拟仪器显示图6-20发送端信号时域波形图6-21发送端信号频谱遇到的问题及解决方法【问题一】新建工程时头文件路径不匹配,文件编译出错。解决方法:在菜单栏中选中Project-Bu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论