DSP_DTMF信号的产生于检测_第1页
DSP_DTMF信号的产生于检测_第2页
DSP_DTMF信号的产生于检测_第3页
DSP_DTMF信号的产生于检测_第4页
DSP_DTMF信号的产生于检测_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、DSP课程设计实 验 报 告DTMF信号的产生及检测院(系): 电子信息工程学院 设计人员:李俊青 07214068 尹征 07212081 成绩:工程设计50报告20答辩30总分评语:指导教师签字: 日期:北京交通大学电工电子教学基地2009年1月18日目 录一、设计任务书1二、设计内容5三、设计方案、算法原理说明10四、程序设计、调试与结果分析15 五、设计(安装)与调试的体会25 六、参考文献26DTMF信号的产生及检测一、 设计任务:双音多频DTMF(Dual Tone Multi Frequency)是在按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠

2、加构成。这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。每组分别包括4个频率,分别抽出一个频率进行组合就可以组成16种DTMF编码,分别记作09、*、#、A、B、C、D。如下图1所示。图1DTMF信令的编码要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。设计要求及目标基本部分:(1)使用C语言编写DTMF信号的发生程序,要求循环产生09、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。(2)使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕

3、上显示。发挥部分:利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。二、设计内容本实验用C语言编写程序,用软件CCS5000编程实现,并用两块TMS320C52X的DSP板连接实现DTMF信号的发生和检测。三、设计方案及算法原理说明1、DTMF(双音多频)信号简介双音多频DTMF(Dual Tone MultiFrequency)信令是音频电话的拨号信号。由美国AT&T贝尔实验室开发。这种拨号方法取代了脉冲拨号,DTMF编解码器在编码时将击键或数字信息转换成双音信号(每一个号码由两个音频信号组成,该双音频由按键所在的行和列对应的频率

4、决定)并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。电话中的双音多频信号(DTMF)有两种作用:一是用于双音多频信号的拨号,去控制交换机接通被叫的用户电话机;二是利用双音多频信号控制电话机各种动作,如播放留言、语言信箱等这些功能的实现离不开DTMF信号的正确产生和检测,而本实验所要实现的就是使用TMS320C52X来制作DTMF发生器和检测器。频率1209Hz1336Hz1477Hz1633Hz697Hz123A770Hz456B852Hz789C941Hz*0#D图1 击键相应的DTMF信息2、发送部分原理DTMF编码器基于两个二阶数字正弦波振荡器(如图2),一个用于产生行

5、频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是7001700Hz,我们们在实验中所选取的频率(如图(1)所示)最大频率为1633HZ,为满足抽样不失真的条件,选取8000Hz作为采样频率。AA-1-1DTMF 输出 +列频率行频率Z(-1)Z(-1)Z(-1)Z(-1)图2 DTMF发生算法原理框图由上图数字振荡器对的框图,可以得到该二阶系统函数的差分方程为:y(n)=-a1y(n-1)-a2y(n-2)其中al=-2cos0,a2=1,0=2*f0fS,fS为采样频率,0为归一化数字频率.f0为输出正弦波的频率

6、,A为输出正弦波的幅度。该式初值为y(-1)=0,y(-2)=-Asin(0),其中需要根据不同频率确定其初始化参数a1=-2cos0与y(-2)=-Asin0。下面以770Hz为例,详细说明方程中系数的计算方法:f/fs=770/8000,0 =2*pi*f/fs cos,0 =0.8226,sin0=-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

7、.399320-0.9168016330.284240-0.95874图3 DTMF系数表为分辨出发送数字,数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。每个任务结束后,启动下一个任务前(音频信号任务或静音任务),都必须复位决定其持续时间的定时器变量。在静音任务结束后,DSP从数字缓存中调出下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数a1=-2cos0 与y(-2)=-Asin0。另外,需要注意的是,由于本实验需要用到DSK板上的CODEC模块,因此在编写的程序中还需要写入ADDA转换部分

8、。程序流程图开始 DSK板初始化流水灯亮两次初始化CODEC发送静音信号循环取出0#,并查表得到行频和列频计算256点样点值将样点数转换为Q15的数据格式如果D/A转换器准备好发送数据,则将双音频样点值写到D/A转换器DTMF样点发送完否送完否Y用C语言编写实现该流程。由该图可知,编程时需要完成两个任务,即双音任务和静音任务。双音任务的作用是产生双音频采样值,静音任务的作用是产生静态采样值。经过一段时间后,两个任务需要进行互换。整个程序与接收中断服务同步。当程序结束或暂停时,接收端同时停止工作。3、接收部分原理DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转换到频域,然后得

9、出对应的数字信息由于DSP芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片进行处理频率检测时,检测出DTMF信号的基波及二次谐波,DTMF信号只在基波上有较高能量,而话音信号则在基波上叠加有较强的二次谐波,检测二次谐波的作用是用来区分DTMF信号与语言和音乐信号,其中信号基波与二次谐波在N=205时系数如图5。1st Harmonics(N=205) fs=8ksps2nd Harmonics(N=205) fs =8kspskfrequency(k/N)fs/Hzcoefficientcos(2pi k/N)kfrequency(k/N)fs/Hzcoefficientcos(

10、2pi k/N)187020.851623513930.45886207800.817933915520.34445228580.781154317110.22470249360.741424718710.101413112100.58157612428-0.329743413260.50442672667-0.500003814830.39505742945-0.676064216390.27972823264-0.83740 图5 N=205时,基波与二次谐波对应系数整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。(1)Goertzel

11、算法计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只用关心其8个行频列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。Goertzel算法实质是一个两极点的IIR滤波器,离散傅立叶变换值,快速有效的提取输入信号的频谱信息,如图6。yk(n)vk(-1)= vk(-2)=0x(n)x(N)=0-12cos(2k/N)-e(-j*2k/N)ZZ+vk(n)图6 Goertzel算法原理框图如图可知,DFT计算可以等价为:Vk(

12、n)=x(n)+2cos(2k/N)Vk(n-1)-Vk(n-2), 0nN 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(2k/N)Vk(N)Vk(N-1) 用上式的计算取代式(3)即可完全避免复数运算。(2)DTMF信号的有效性检测得到了DTMF信号的基波及二次谐波的频谱平方幅度信息后,需要通

13、过一系列检测才能确定信号的有效性:a、DTMF信号的强度是否足够大,行列频率分量平方幅度和是否高于规定的门限值。b、如果DTMF信号存在,比较行列频率的最大频率分量差值,因为电话线具有低通特性,列频比行频衰减得要厉害,因此要设置一门限值。c、分别在行列频率组比较频谱分量,最强的谱线至少要比其他音频信号高一个门限值。d、二次谐波分量是否小于某个值。e、判断DTMF信号是否包含稳定的数字信息,只有数字信息被连续检测到两次,才认为数字信息是稳定的。f、最后要检测数字信息之后是否有停顿状态,只有这样才将当前的数字作为有效数字。在每一个接收中断到来时,表明采到一个新样点。样点值代入式,迭代计算8个行频列

14、频的中间变量v (n)(k为8个行频列频分别对应的数字频率),直到采到N=125个样点(在8kHz采样频率下,约为15ms)。此时再按式计算8个行频列频的幅度平方|X(k)|2 。接下来将|X(k)|2与门限作比较,并作二次谐波检测,判决出有效的音频信号。将音频信号映射为数字信号后,再与上一个检测到的数字信号比较,最终判决出有效的数字信号,如图7。 与发生部分原理相似,我们们也需要在检测程序中加入AD/DA转换部分。NNYYYNNY采样开始采到新样点?对8个行/列频分别计算Vk (n)= x(n)+2cos(2k/N)Vk(n-1)-Vk(n-2)采到N个样点?对8个行/列频分别计算|x(k)

15、|2=|yk(N)|2=Vk2(n)+ Vk2(n-1)-2cos(2k/N)Vk(N)Vk(N-1)中间变量清零N样点标志=0幅度峰值大于门限?无二次谐波?成功检测到数据返回并检测静音有静音则进入下一次检测图7 DTMF检测流程图四、程序设计、调试与结果分析一程序设计1.发送程序#include <stdio.h>#include <math.h>#include <type.h> /数据类型头文件 #include <board.h> /DSK板头文件#include <codec.h> /AD50C头文件 #include &l

16、t;mcbsp54.h> /多通道缓冲串口头文件/子函数声明void delay(int period);void send(int num);/全局变量定义HANDLE hHandset;/McBSP句柄s16 out_buffer256;float buffer256;/定义一个个的变量和缓冲数组 s16 n=0;int c=0,t=0,m=0,p=-1;char s;s16 tele_number16='0','1','2','3','4','5','6','7&

17、#39;,'8','9','A','B','C','D','*','#'/dtmf按键缓冲区float pi=3.1415926;void main() int cnt=2; if(brd_init(100) return;/DSK初始化失败则返回 SWWSR=0X7249; /流水灯 while (cnt-)brd_led_toggle(BRD_LED0);/brd_delay_msec(500)delay(500);brd_led_toggle(BRD_LED1)

18、;/brd_delay_msec(500)delay(500);brd_led_toggle(BRD_LED2);/brd_delay_msec(500)delay(500);/初始化codec /* Open Handset Codec */ hHandset = codec_open(HANDSET_CODEC); /Acquire handle to codec /* Set codec parameters */ codec_dac_mode(hHandset,CODEC_DAC_15BIT); /DAC in 15-bit mode codec_adc_mode(hHandset,C

19、ODEC_ADC_15BIT); /ADC in 15-bit mode codec_ain_gain(hHandset,CODEC_AIN_6dB); /6dB gain on analog input to ADC codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB); /-12dB gain on analog output from DAC codec_sample_rate(hHandset,SR_8000); /8KHz sampling rate send(n); fflush(stdin);/清空输入缓冲区,确保不影响后面的数据读取vo

20、id send(int n)int k=0;int i;int pp;float f1,f2,ff; ff=2*pi/8000; i=k; while(1) while (!MCBSP_XRDY(HANDSET_CODEC) ;/等待接收handset处的采样数据 *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=bufferi;/从handset处发送采样数据 i+; if(i=256) i=0; c+; if(c=15) pp=400; while(pp-) while (!MCBSP_XRDY(HANDSET_CODEC) ;/等待接收handset处的采

21、样数据 *(volatile u16*)DXR1_ADDR( HANDSET_CODEC)=0;/从handset处发送采样数据 fflush(stdin);/清空输入缓冲区,确保不影响后面的数据读取 c=0; p+; s=tele_numberm; m+; if(m=16) m=0; switch (s) case '0' : f1=ff*941; f2=ff*1336; break; case '1' : f1=ff*697; f2=ff*1209; break; case '2' : f1=ff*697; f2=ff*1336; break

22、; case '3' : f1=ff*697; f2=ff*1477; break; case '4' : f1=ff*770; f2=ff*1209; break; case '5' : f1=ff*770; f2=ff*1336; break; case '6' : f1=ff*770; f2=ff*1477; break; case '7' : f1=ff*852; f2=ff*1209; break; case '8' : f1=ff*852; f2=ff*1336; break; case

23、 '9' : f1=ff*852; f2=ff*1477; break; case 'A' : f1=ff*697; f2=ff*1633; break; case 'B' : f1=ff*770; f2=ff*1633; break; case 'C' : f1=ff*852; f2=ff*1633; break; case 'D' : f1=ff*941; f2=ff*1633; break; case '*' : f1=ff*941; f2=ff*1209; break; case '

24、#' : f1=ff*941; f2=ff*1477; break; for(k=0;k<256;k+) bufferk=(0.65*sin(f1*k)+0.8*sin(f2*k)*16384;/定点处理,将数扩大16384=214且规定为Q15格式 out_bufferk=bufferk; /强制类型转换 void delay(int period) int i, j; for(i=0; i<period; i+) for(j=0; j<period>>1; j+); 2.检测程序#include <stdio.h>#include <

25、math.h>#include <type.h>#include <board.h>#include <codec.h>#include <mcbsp54.h>HANDLE hHandset; float buffer205;/定义一个个的变量和缓冲数组 float pi=3.1415926; s16 test205; s16 dacdata; int k=0,l=0; int dtmf_flag=0; int result32=0;void delay(s16 period);/延时声明void detect();u16 m=0,n=0,

26、c1=0;void main() s16 cnt=2; if(brd_init(100) return; SWWSR=0X7249; while ( cnt- )brd_led_toggle(BRD_LED0);/首先让流水灯亮两遍以示程序运行/* brd_delay_msec(500); */delay(500);brd_led_toggle(BRD_LED1);/* brd_delay_msec(500); */delay(500);brd_led_toggle(BRD_LED2);/* brd_delay_msec(500); */delay(500); /* 公式vk(n) = 2*c

27、oef*vk(n-1) - vk(n-2) + x(n) 基波系数 为 w8 x(n) 为 in buffer256 vk(n-2) 为 ai0 vk(n-1) 为 ai1 . vk(n) 为 ai2 */ hHandset = codec_open(HANDSET_CODEC); /* Acquire handle to codec */ codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */ codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit

28、mode */ codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 6dB gain on analog input to ADC */ codec_aout_gain(hHandset, CODEC_AOUT_MINUS_6dB); /* -6dB gain on analog output from DAC */ codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */ while(1) while (!MCBSP_RRDY(HANDSET_CODEC) ; /等待数据接受,判断是不是有数

29、据来了 dacdata = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);/接数据 bufferk=dacdata/16384.0;/把接收到的数据赋值给缓冲数组 k+; if(k=205)/取205点 k=0; detect();/检测收到的是什么数据,进入检测子程序 void detect() /检测子程序 int i,j,x,y,c;char s;/定义变量 float w8,a83,amp8;/定义数组 w0=2*cos(2*pi*18/205);/分别把求方值的系数赋值给数组w1=2*cos(2*pi*20/205);w2=2*cos(2*pi*2

30、2/205);w3=2*cos(2*pi*24/205);w4=2*cos(2*pi*31/205);w5=2*cos(2*pi*34/205);w6=2*cos(2*pi*38/205);w7=2*cos(2*pi*42/205); for(i=0;i<8;i+)/利用格策尔算法的八重循环,因为一共有八个基波系数ai0=0;ai1=0;for(j=1;j<=205;j+)/格策尔算法的一次谐波的样点数ai2=wi*ai1-ai0+bufferj-1;/公式vk(n) = 2*coef*vk(n-1) - vk(n-2) + x(n)ai0=ai1;ai1=ai2;ampi=ai1

31、*ai1+ai0*ai0-wi*ai1*ai0;/计算收到的其平方值给数组 j=0; m=x; n=y; c1=10*m+n;for(i=0;i<8;i+) /此处循环只是为了记录下面的检测到的第一个频率是第几个频率(一共八个) if(ampi>1500)/门限定义为1500,看信号的能量强弱,大于门限才算是能接收j+;if(j=1)/判断门限后的基波(相当于第一个频率)否?有信号就一定会有第一个频率x=i;else if(j=2)/判断二次谐波的存在与否(相当于第二个频率)的到来y=i; c=x*10+y;s='/' if(dtmf_flag=0)if(j=2)/

32、如果是二次谐波存在就通过判断接收的是什么信号,若不存在就返回。 if(c!=c1) m=x;n=y; c1=10*m+n; switch(c1)/;判断收到的赋值c,通过x,y便能知道行频多少和列频多少,确定按键值 case 4:s='1'break; /八个频率都是从小到大为0到7,0到3为x,4到7为y case 5:s='2'break; case 6:s='3'break; case 14:s='4'break; case 15:s='5'break; case 16:s='6'break;

33、 case 24:s='7'break; case 25:s='8'break; case 26:s='9'break; case 35:s='0'break; case 7:s='A'break; case 17:s='B'break; case 27:s='C'break; case 37:s='D'break; case 34:s='*'break; case 36:s='#'break; if(s!='/') r

34、esultl=s;l+; /printf("收到的数字为 %c.rn ",s);if(l=32) for(l=0;l<32;l+) printf("The number received is %c.rn ",resultl); l=0; dtmf_flag+; / dtmf_flag=0;else if (j=0)dtmf_flag=0; void delay(s16 period)/延时子程序 int i, j; for(i=0; i<period; i+) for(j=0; j<period>>1; j+); 二程序调

35、试,结果分析 1、编写、编译程序。(1)编写程序在实验中主要需要编写的程序就是用C语言实现所需的公式,其他的如ADDA部分,CMD部分可以参考老师在课件中给的程序。(2)建立工程建立工程步骤如下:a、 创建一个新的工程:ProjectNew;b、 建立.c、.asm、.cmd程序:FileNewSource File;c、 添加库文件:ProjectBuild Options;C程序运行支持库: rts.lib,在C:tic5400cgtoolslib目录下,将.h文件的路径填入所示方框第一行。如图8:图8 DSK板库文件: drv5402.lib和dsk5402.lib,在C:tic5400

36、dsk5402lib 目录下。选择Preprocessor这一项,在出现的界面中将头文件的路径添加在图9所示界面的第一行。如图9:图9d、 建立链接命令文件.pjt:FileNewSource File;e、 添加有关文件到工程:ProjectAdd Files to Project;f、 编译链接产生.out文件:ProjectRebuild All或点击;g、 加载.out文件:FileLoad Program;h、 运行程序:DebugRun或点击。2、程序运行结果显示 (1)编译成功后,选择File菜单中的Load Program选项,将程序加载到DSK板中,为软件仿真结果的观测做准备

37、。(2)图形显示参数设置:选择View中的Graph的第一项,在如图所示的对话框中修改相关参数以观察输出信号的时域(Single Time)和频域(FFT Magnitude)波形图。 图10 图形显示参数设置(3)运行结果显示:发送部分:时域(Single Time)波形图:频域(FFT Magnitude)波形图:接收部分:频域(FFT Magnitude)波形图(收到1时):说明:可以看见在发送端的频谱是很清晰的两个尖峰,而接收端有很多杂质信号,但是两个峰值信号还是基本可以检测到的。五、设计(安装)与调试的体会在开始做DTMF的试验时,我们去图书馆借了几本关于DSP的书,有很多关于DTMF信号产生与检测的研究,通过阅读这些书以及查阅了几篇论文后,我们对DTMF信号有了大概的了解,所谓DTMF信号产生与检测的过程,实际是由模拟信号的产生,抽样产生数字信号并D/A变换成模拟信号传输,在接收端将模拟信号抽样成数字信号,并检测出所对应的模拟频率的过程,在开始,我们对整个信号处理的过程很迷茫,通过阅

温馨提示

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

评论

0/150

提交评论