DTMF的产生与检测_第1页
DTMF的产生与检测_第2页
DTMF的产生与检测_第3页
DTMF的产生与检测_第4页
DTMF的产生与检测_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

DSP课程设计实 验 报 告DTMF的产生与检测目 录一、设计任务书3二、设计内容3三、设计方案、算法原理说明3四、程序设计、调试与结果分析7 五、设计(安装)与调试的体会24 六、参考文献25一、 设计任务书要求完成的任务:(1)编写C语言程序,并在CCS集成开发环境下调试通过。(2)实现设计所要求的各项功能。(3)按要求撰写设计报告。要求达到的目的: (1) 熟悉CCS的编程环境和基本试验调试流程和方法; (2) 熟悉并掌握使用C语言编写较为复杂的程序并用CCS实现; (3) 了解并掌握DTMF信号的产生和检测远离核试验流程; (4) 熟练使用软件CCS5000对程序的完整调试过程。二、 设计内容基本部分:(1)使用C语言编写DTMF信号的发生程序,要求循环产生09、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。(2)使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕上显示。发挥部分:利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。三、 设计方案、算法原理说明 表一双音多频 DTMF(Dual Tone Multi Frequency),双音多频,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信令有16个编码。利用DTMF信令可选择呼叫相应的对讲机 双音多频信号(DTMF),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。 在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续(早期方法,很老很古董)。 双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。 双音多频的拨号键盘是44的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如1相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。电话机中通常有16个按键,其中有10个数字键09和6个功能键*、#、A、B、C、D。由于按照组合原理,一般应有8种不同的单音频信号。因此可采用的频率也有8种,故称之为多频,又因它采用分别从高低频中任意抽出1种进行组合来进行编码,所以又称之为“8中取2”的编码技术。根据CCITT的建议,国际上采用的多种频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键,具体组合见表1。双音多频DTMF信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。通过软件产生与检测DTMF信令,是一项较有价值的工程应用。DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。DTMF的编解码方案无需过多的计算量,以目前计算机的运算速度,可以很轻松地实现。一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。每一对这样的音频信号唯一表示一个数字或符号。为了产生DTMF信号,可以通过软件产生两个正弦波叠加在一起后发送,解码时软件可以采用改进的Goertzel算法,从频域搜索两个正弦波的存在,从而解调出DTMF信号。1.DTMF的产生DTMF发生器基于两个二阶数字正弦振荡器,一个用于产生行频,一个用于产生列频。DSP只要装载相应的系数和初始条件,就可以只用两个振荡器产生所需的八种音频信号。典型的DTMF信号频率范围是7001700Hz,选取8000Hz作为采样频率,即可满足奈奎斯特定理。我们用的是sin函数产生离散的正弦值,因为这种方法我们比较熟悉而且通过查阅资料这种方法的也能达到误差要求,生成DTMF的公式为:buffert=sin(t*2*pi*f1/fs)+sin(t*2*pi*f2/fs),其中t为采样序数,由0开始递增;f1,f2为生成DTMF信号的两个正弦波的频率;fs为采样频率;buffert为序数t时的得出的采样值。将这些数据转换为Q15格式然后通过codec发送出去。CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms内其他时间为静音,以便区别连续的两个按键信号。我们使用8000Hz的采样频率(电话信号的典型抽样频率为=8kHZ),即1秒采样8000个点,则100ms采样800个点,我们设置800个点的缓存,其中用400个存产生的DTMF信号值,即音频信号必须持续50ms,另外400个存0值,即静音信号。2.DTMF的检测 DTMF信号包含两组音频信号,解码器的任务是通过数学变换把它从时域转换到频域,然后得出对应的数字信息。由于DSP芯片处理的是数字信号,所以必须把输入信号数字化,再用DSP芯片进行处理。频率检测时,整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。DTMF解码时在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只需关心其8个行频/列频及其二次谐波信息即可,二次谐波的信息用于将DTMF信号与声音信号区别开。此时Goertzel算法能更加快速的在输入信号中提取频谱信息。Goertzel算法实质是一个两极点的IIR滤波器。Goertzel算法简介块大小的设置 Goertzel算法中的块大小N与相应的FFT中的点数类似,它控制了频率分辨率的大小。例如,若采样率为8kHz,而N为100个采样,那么频率分辨率就是80Hz。 这就可能使我们为了获取最大的频率分辨率而尽量将N取高。然而N越大,检测到每个音调所需的时间就越多,因为我们必须等所有这N个采样都完成后才能开始处理。例如,采样率为8kHz时,累积800个采样需要100ms。若想缩短检测音调的时间,就必须适当调整N的值。 影响N的选择的另一个因素是采样率和目标频率之间的关系。比较理想情况是目标频率在相应的频率分辨率的中点范围内,也就是说,我们希望目标频率是sample_rate/N比值的整数倍。值得庆幸的是,Goertzel算法中的N与FFT中不同,不必是2的整数次幂。 预计算常数 在采样率和块大小确定之后,只须通过下面5个简单的计算来得出处理时所需要的常数: k = (N*target_freq)/sample_tatew = (2*/N)*kcosine = cos wsine = sin wcoeff = 2 * cosine每一次采样处理中都需要3个变量,我们称其为Q0、Q1和Q2。Q1是前一次采样处理的Q0值,Q2是在两次采样前的Q0值(或Q1在本次采样前的值)。 在每个采样块的开始时,都必须将Q1和Q2初始化为0。每个采样都需要按照下面三个等式进行计算:Q0 = coeff * Q1 - Q2 + sampleQ2 = Q1Q1 = Q0在进行N次预采样计算之后,可以检测到音调是否存在。real = (Q1 - Q2 * cosine)imag = (Q2 * sine)magnitude2 = real2 + imag2 这时只需进行一次简单的幅度门限测试就可以判断出是否有音调存在。之后,将Q2和Q1复位到0,开始下一个块的处理。 Goertzel优化算法 Goertzel优化算法比Goertzel基本算法所需的计算量小,但这是以损失相位信息为代价。 在Goertzel优化算法中每个采样处理完全一样,但处理的结果与Goertzel基本算法不同。在Goertzel基本算法中,通常需要计算信号的实部和虚部,然后将实部和虚部的计算结果转换为相应的幅度平方。而在优化Goertzel算法中则不需计算实部和虚部,直接计算下式: magnitude2 = Q12 + Q22-Q1*Q2*coeffGoertzel算法实质是一个两极点的IIR滤波器,离散傅立叶变换值,快速有效的提取输入信号的频谱信息,如图:图(6) Goertzel算法原理框图如图知,DFT计算可以等价为:Vk(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) 1st Harmonics(N = 205) fs = 8 ksps2nd Harmonics(N=205) fs = 8 kspskfrequency(k/N)fs/Hzcoefficientcos(2pi k/N)kfrequency(k/N)fs/Hzcoefficientcos(2pi k/N)186970.851623513930.45886207700.817933915520.34445228520.781154317110.22470249410.741424718710.101413112090.58157612428-0.329743413360.50442672667-0.500003814770.39505742945-0.676064216330.27972823264-0.83740信号频率(Hz)计算值k取整值k绝对误差相对误差69710.110.1.00430%77012.03125120.031250.25974%85213.3125130.31252.34741%94114.150.2.01912%120918.190.0.57899%133620.875210.1250.59880%147723.230.0.33852%163325.250.2.02082%(N=125)DTMF信号的有效性检测得到了DTMF信号的基波及二次谐波的频谱平方幅度信息后,需要通过一系列检测才能确定信号的有效性:(1)DTMF信号的强度是否足够大,行列频率分量平方幅度和是否高于规定的门限值(2)如果DTMF信号存在,比较行列频率的最大频率分量差值,因为电话线具有低通特性,列频比行频衰减得要厉害,因此要设置一门限值(3)分别在行列频率组比较频谱分量,最强的谱线至少要比其他音频信号高一个门限值四、程序设计与调试结果分析我们的设计由两个DSP板构成进行通信,一个负责产生信号,一个接收信号。(一) 基本要求(1) DTMF的产生#include #include #include #include #include #include void delay(int period);void generate(int num);HANDLE hHandset;float buffer800;s16 num=0;int count=0;float freq162= 941,1336, /0 697,1209, /1 697,1336, /2 697,1477, /3 770,1209, /4 770,1336, /5 770,1477, /6 852,1209, /7 852,1336, /8 852,1477, /9 697,1633, /A 770,1633, /B 852,1633, /C 941,1633, /D 941,1209, /* 941,1477 /# ;float pi=3.;void main()int cnt=2; if(brd_init(100) return; /* blink the leds a couple times 通过观察LED指示灯的闪动频率来验证程序运行*/while ( cnt- )brd_led_toggle(BRD_LED0);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED1);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED2);/brd_delay_msec(1000);delay(1000); /* 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, CODEC_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 */ generate(num); void generate(int num)f32 x,y;int k=0;int i;i=0; while(1) / Wait for sample from handset while (!MCBSP_XRDY(HANDSET_CODEC) ; *(volatile u16*)DXR1_ADDR(HANDSET_CODEC)=bufferi; i+; if(i=800) i=0; num+; if(num=16) num=0; x=freqnum0/8000;y=freqnum1/8000;for(k=0;k400;k+) bufferk=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k)*16384; bufferk+400=0; void delay(int period) int i, j; for(i=0; iperiod; i+) for(j=0; j1; j+); (2)DTMF的检测#include #include #include #include #include #include HANDLE hHandset;float buffer125; float pi=3.; s16 receive125; s16 dacdata; int k=0; int detect_result100=0; int l=0; int flag=0; void delay(int period);void detect();void main() int cnt=2; /* Description:* vk(n) = 2*coef*vk(n-1) - vk(n-2) + x(n)* Coefficients are in w8* x(n) is in buffer256* vk(n-2) is ai0 * vk(n-1) is ai1 .* vk(n) is ai2 */ if(brd_init(100) return;/ blink the leds a couple timeswhile ( cnt- )brd_led_toggle(BRD_LED0);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED1);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED2);/brd_delay_msec(1000);delay(1000);/* 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, CODEC_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_6dB); /* -6dB gain on analog output from DAC */ codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */ while(1) while (!MCBSP_RRDY(HANDSET_CODEC) ; dacdata = *(volatile u16*)DRR1_ADDR(HANDSET_CODEC);receivek=dacdata;bufferk=dacdata/16384.0; k+;if(k=125) k=0; detect(); void detect() int i,j,x,y; float w8,a83,amp8; w0=2*cos(2*pi*11/125);w1=2*cos(2*pi*12/125);w2=2*cos(2*pi*13/125);w3=2*cos(2*pi*15/125);w4=2*cos(2*pi*19/125);w5=2*cos(2*pi*21/125);w6=2*cos(2*pi*23/125);w7=2*cos(2*pi*26/125); for(i=0;i8;i+)ai0=0;ai1=0;for(j=1;j=125;j+)ai2=wi*ai1-ai0+bufferj-1;ai0=ai1;ai1=ai2;/计算频谱的幅度平方值ampi=ai1*ai1+ai0*ai0-wi*ai1*ai0;j=0;for(i=0;i500) /门限设为500 /printf(The amplitude %d is %f.rn,i,ampi);j+;if(j=1)x=i; else if(j=2)y=i;i=-1; if(flag=0) if(j=2)if(x=0 & y=4) i=1; else if(x=0 & y=5) i=2; else if(x=0 & y=6) i=3; else if(x=1 & y=4) i=4; else if(x=1 & y=5) i=5; else if(x=1 & y=6) i=6; else if(x=2 & y=4) i=7; else if(x=2 & y=5) i=8; else if(x=2 & y=6) i=9; else if(x=3 & y=5) i=0; else if(x=0 & y=7) i=A;else if(x=1 & y=7) i=B; else if(x=2 & y=7) i=C; else if(x=3 & y=7) i=D; else if(x=3 & y=4) i=*; else if(x=3 & y=6) i=#; if(i!=-1) detect_resultl=i; l+; if(l=100) for(l=0;l100;l+) printf(The DTMF signal is %c.rn ,detect_resultl); flag+; else if(j=0) flag=0; void delay(int period) int i, j; for(i=0; iperiod; i+) for(j=0; j1; j+); (3)cmd文件源代码如下:/*# $Id: $# Copyright (c) 1999 DNA Enterprises, Inc.# Revision History# -# $Log: $# XFERMAKE.CMD# -# C54x Linker Command File for 5402 DSK Memory Transfer Module#*/*/* Object Files */*/*/* Linker Options */*/*/* C5402 DSK DSP Memory Map */* */*/MEMORY PAGE 0: VECS: origin = 0080h, length = 0080h /* Internal Program RAM */ PRAM: origin = 0100h, length = 8000h /* Internal Program RAM */ PAGE 1: SCRATCH: origin = 0060h, length = 0020h /* Scratch Pad Data RAM */ DMARAM: origin = 0C00h, length = 0300h /* DMA buffer */ DATA: origin = 1100h, length = 0080h /* Internal Data RAM */ STACK: origin = 1180h, length = 0560h /* Stack Memory Space */ INRAM: origin = 1900h, length = 0100h /* Internal Data RAM */ HPRAM0: origin = 1A00h, length = 0002h /* HPI memory accessible by Host and DSP */ HPRAM1: origin = 1A02h, length = 0280h /* HPI memory accessible by Host and DSP */ HPRAM2: origin = 1C82h, length = 0280h /* HPI memory accessible by Host and DSP */ EXRAM: origin = 1F10h, length = 4000h /* External Data RAM */*/* DSP Memory Allocation */*/SECTIONS .cinit PRAM PAGE 0 .text PRAM PAGE 0 .vectors VECS PAGE 0 init_var PRAM PAGE 0 detect PRAM PAGE 0 vrcprg PRAM PAGE 0 matprg PRAM PAGE 0 .stack STACK PAGE 1 .trap SCRATCH PAGE 1 .const EXRAM PAGE 1 .data EXRAM PAGE 1 .bss EXRAM PAGE 1 .cio EXRAM PAGE 1 .switch EXRAM PAGE 1 tables EXRAM PAGE 1 var EXRAM PAGE 1 svctab EXRAM PAGE 1 /* SS_V LSP table */ vctab EXRAM PAGE 1 /* V LSP table */ uvctab EXRAM PAGE 1 /* UV LSP table */ cuvtab EXRAM PAGE 1 /* Stochastic codebook */ cdbktab EXRAM PAGE 1 /* various codebook tables*/ logtab EXRAM PAGE 1 /* table for log2 */ powtab EXRAM PAGE 1 /* table for pow2 */ hamtab EXRAM PAGE 1 /* table for hamming */ lgwtab EXRAM PAGE 1 /* table for lag window */ acostab EXRAM PAGE 1 /* table for arccos */ sqrtab EXRAM PAGE 1 /* table for square root */ acbtab EXRAM PAGE 1 /* table for thresholds in acb */ pm03tab EXRAM PAGE 1 /* table for x(-0.3) computation */ costab EXRAM PAGE 1 /* table for cosine */ V23 INRAM PAGE 1 FSK INRAM PAGE 1 hpibuff0 HPRAM0 PAGE 1 hpibuff1 HPRAM1 PAGE 1 hpibuff2 HPRAM2 PAGE 1 dma_buff DMARAM PAGE 1(4)调试过程及结果分析调试过程双击桌面上的Setup CCS 2 (C5000)图标,运行CCS 设置程序。单击Import Configuration 对话框中的Clear,删除原先定义的设置。从Available Configurations列表中,选择C5402 DSK via XDS510 Emulator,单击Import,单击close,加载seedusd2文件。创建工程加载.c和.cmd文件添加库文件添加include文件编译链接结果分析发送端时域:发送端频域:接收端时域:接收端频域:通过下面的图像我们可以清楚地看出接收到的信号频域峰值低频部分在687Hz左右,高频部分在1333Hz左右,根据表格此时截取的图像应当是“2”。发挥部分:我们在基本部分实现的是CCITT的标准,在发挥部分我们改变了部分参数,改变了静音部分的时间以及整个信号的时长,可以使单位时间输出音频数增加。具体程序如下:#include #include #include #include #include #include void delay(int period);void generate(int num);HANDLE hHandset;float buffer800;s16 num=0;int count=0;float freq162= 941,1336, /0 697,1209, /1 697,1336, /2 697,1477, /3 770,1209, /4 770,1336, /5 770,1477, /6 852,1209, /7 852,1336, /8 852,1477, /9 697,1633, /A 770,1633, /B 852,1633, /C 941,1633, /D 941,1209, /* 941,1477 /# ;float pi=3.;void main()int cnt=2; if(brd_init(100) return; /* blink the leds a couple times 通过观察LED指示灯的闪动频率来验证程序运行*/while ( cnt- )brd_led_toggle(BRD_LED0);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED1);/brd_delay_msec(1000); delay(1000);brd_led_toggle(BRD_LED2);/brd_delay_msec(1000);delay(1000); /* 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, CODEC_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 */ generate(num); void generate(int num)f32 x,y;int k=0;int i;i=0; while(1) / Wait for

温馨提示

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

评论

0/150

提交评论