DSP课程设计实验报告DTMF信号的产生及检测院(系):电子信息工程学院设计人员:李俊青07214068尹征07212081成绩:工程设计50报告20答辩30总分评语:指导教师签字:日期:北京交通大学电工电子教学基地2009年1月18日目录一、设计任务书……………………………………………………………1二、设计内容………………………………………………………………5三、设计方案、算法原理说明……………………………………………10四、程序设计、调试与结果分析…………………………………………15五、设计(安装)与调试的体会…………………………………………25六、参考文献………………………………………………………………26DTMF信号的产生及检测一、设计任务:双音多频DTMF(DualToneMultiFrequency)是在按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。每组分别包括4个频率,分别抽出一个频率进行组合就可以组成16种DTMF编码,分别记作0~9、*、#、A、B、C、D。如下图1所示。图1DTMF信令的编码要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。设计要求及目标基本部分:(1)使用C语言编写DTMF信号的发生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。(2)使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕上显示。发挥部分:利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。二、设计内容本实验用C语言编写程序,用软件CCS5000编程实现,并用两块TMS320C52X的DSP板连接实现DTMF信号的发生和检测。三、设计方案及算法原理说明1、DTMF(双音多频)信号简介双音多频DTMF(DualToneMulti—Frequency)信令是音频电话的拨号信号。由美国AT&T贝尔实验室开发。这种拨号方法取代了脉冲拨号,DTMF编解码器在编码时将击键或数字信息转换成双音信号(每一个号码由两个音频信号组成,该双音频由按键所在的行和列对应的频率决定)并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。电话中的双音多频信号(DTMF)有两种作用:一是用于双音多频信号的拨号,去控制交换机接通被叫的用户电话机;二是利用双音多频信号控制电话机各种动作,如播放留言、语言信箱等.这些功能的实现离不开DTMF信号的正确产生和检测,而本实验所要实现的就是使用TMS320C52X来制作DTMF发生器和检测器。频率1209Hz1336Hz1477Hz1633Hz697Hz123A770Hz456B852Hz789C941Hz*0#D图1击键相应的DTMF信息2、发送部分原理DTMF编码器基于两个二阶数字正弦波振荡器(如图2),一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是700~1700Hz,我们们在实验中所选取的频率(如图(1)所示)最大频率为1633HZ,为满足抽样不失真的条件,选取8000Hz作为采样频率。图2DTMF发生算法原理框图由上图数字振荡器对的框图,可以得到该二阶系统函数的差分方程为:y(n)=-a1y(n-1)-a2y(n-2)其中al=-2cosω0,a2=1,ω0=2*f0/fS,fS为采样频率,ω0为归一化数字频率.f0为输出正弦波的频率,A为输出正弦波的幅度。该式初值为y(-1)=0,y(-2)=-Asin(ω0),其中需要根据不同频率确定其初始化参AA-1-1DTMF输出++++++列频率行频率ΣΣΣZ^(-1)Z^(-1)Z^(-1)Z^(-1)数a1=-2cosω0与y(-2)=-Asinω0。下面以770Hz为例,详细说明方程中系数的计算方法:f/fs=770/8000,ω0=2*pi*f/fscos,ω0=0.8226,sinω0=-0.5686。f/HZa1Y(-1)Y(-2)/A6970.853820-0.520477700.822630-0.568578520.784330-0.620339410.739110-0.6735812090.582060-0.8131413360.498200-0.8670614470.399320-0.9168016330.284240-0.95874图3DTMF系数表为分辨出发送数字,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数a1=-2cosω0与y(-2)=-Asinω0。另外,需要注意的是,由于本实验需要用到DSK板上的CODEC模块,因此在编写的程序中还需要写入ADDA转换部分。McBSPA/DCPUD/Ax(t)y(t)CodecDSP程序流程图用C语言编写实现该流程。由该图可知,编程时需要完成两个任务,即双音任务和静音任务。双音任务的作用是产生双音频采样值,静音任务的作用是产生静态采样值。经过一段时间后,两个任务需要进行互换。整个程序与接收中断服务同步。当程序结束或暂停时,接收端同时停止工作。3、接收部分原理DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转换到频域,然后得出对应的数字信息.由于DSP芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片进行处理.频率检测时,检测出DTMF信号的基波及二次谐波,DTMF信号只在基波上有较高能量,而话音信号则在基波上叠加有较强的二次谐波,检开始DSK板初始化流水灯亮两次初始化CODEC发送静音信号循环取出0~#,并查表得到行频和列频计算256点样点值将样点数转换为Q15的数据格式如果D/A转换器准备好发送数据,则将双音频样点值写到D/A转换器DTMF样点发送完否送完否Y测二次谐波的作用是用来区分DTMF信号与语言和音乐信号,其中信号基波与二次谐波在N=205时系数如图5。1stHarmonics(N=205)fs=8ksps2ndHarmonics(N=205)fs=8kspskfrequency(k/N)fs/Hzcoefficientcos(2pik/N)kfrequency(k/N)fs/Hzcoefficientcos(2pik/N)187020.851623513930.45886207800.817933915520.34445228580.781154317110.22470249360.741424718710.101413112100.58157612428-0.329743413260.50442672667-0.500003814830.39505742945-0.676064216390.27972823264-0.83740图5N=205时,基波与二次谐波对应系数整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。(1)Goertzel算法计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。Goertzel算法实质是一个两极点的IIR滤波器,离散傅立叶变换值,快速有效的提取输入信号的频谱信息,如图6。图6Goertzel算法原理框图yk(n)vk(-1)=vk(-2)=0x(n)x(N)=0-12cos(2πk/N)-e^(-j*2πk/N)ZZ+++vk(n)如图可知,DFT计算可以等价为:Vk(n)=x(n)+2cos(2kπ/N)Vk(n-1)-Vk(n-2),0≤n≤N①x(k)=yk(N)=Vk(N)-e-j2kπ/NVk(N-1)②由于在DTMF检测中,输入的信号是实数序列,并不需要检测出8个行频/列频的相位,只需要计算出其幅度平方即可。对于实序列x(n),Goertzel算法所需的内部变量Vk(n)也为实数。因此计算/X(k)/2如下:|x(k)|2=|yk(N)|2=Vk2(n)+Vk2(n-1)-2cos(2πk/N)Vk(N)Vk(N-1)③用上式的计算取代式(3)即可完全避免复数运算。(2)DTMF信号的有效性检测得到了DTMF信号的基波及二次谐波的频谱平方幅度信息后,需要通过一系列检测才能确定信号的有效性:a、DTMF信号的强度是否足够大,行列频率分量平方幅度和是否高于规定的门限值。b、如果DTMF信号存在,比较行列频率的最大频率分量差值,因为电话线具有低通特性,列频比行频衰减得要厉害,因此要设置一门限值。c、分别在行列频率组比较频谱分量,最强的谱线至少要比其他音频信号高一个门限值。d、二次谐波分量是否小于某个值。e、判断DTMF信号是否包含稳定的数字信息,只有数字信息被连续检测到两次,才认为数字信息是稳定的。f、最后要检测数字信息之后是否有停顿状态,只有这样才将当前的数字作为有效数字。在每一个接收中断到来时,表明采到一个新样点。样点值代入式①,迭代计算8个行频/列频的中间变量v(n)(k为8个行频/列频分别对应的数字频率),直到采到N=125个样点(在8kHz采样频率下,约为15ms)。此时再按式③计算8个行频/列频的幅度平方|X(k)|2。接下来将|X(k)|2与门限作比较,并作二次谐波检测,判决出有效的音频信号。将音频信号映射为数字信号后,再与上一个检测到的数字信号比较,最终判决出有效的数字信号,如图7。与发生部分原理相似,我们们也需要在检测程序中加入AD/DA转换部分。图7DTMF检测流程图四、程序设计、调试与结果分析一.程序设计1.发送程序#includestdio.h#includemath.h#includetype.h//数据类型头文件#includeboard.h//DSK板头文件#includecodec.h//AD50C头文件#includemcbsp54.h//多通道缓冲串口头文件//子函数声明voiddelay(intperiod);voidsend(intnum);//全局变量定义NNYYYNNY采样开始采到新样点?对8个行/列频分别计算Vk(n)=x(n)+2cos(2kπ/N)Vk(n-1)-Vk(n-2)采到N个样点?对8个行/列频分别计算|x(k)|2=|yk(N)|2=Vk2(n)+Vk2(n-1)-2cos(2πk/N)Vk(N)Vk(N-1)中间变量清零N样点标志=0幅度峰值大于门限?无二次谐波?成功检测到数据返回并检测静音有静音则进入下一次检测HANDLEhHandset;//McBSP句柄s16out_buffer[256];floatbuffer[256];//定义一个个的变量和缓冲数组s16n=0;intc=0,t=0,m=0,p=-1;chars;s16tele_number[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','*','#'};//dtmf按键缓冲区floatpi=3.1415926;voidmain(){intcnt=2;if(brd_init(100))return;//DSK初始化失败则返回SWWSR=0X7249;//流水灯while(cnt--){brd_