张泽霖08211049通信0808DTMF信号的产生及检测概述.docx
- 文档编号:24550489
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:30
- 大小:479.60KB
张泽霖08211049通信0808DTMF信号的产生及检测概述.docx
《张泽霖08211049通信0808DTMF信号的产生及检测概述.docx》由会员分享,可在线阅读,更多相关《张泽霖08211049通信0808DTMF信号的产生及检测概述.docx(30页珍藏版)》请在冰豆网上搜索。
张泽霖08211049通信0808DTMF信号的产生及检测概述
DSP课程设计
实验报告
DTMF信号的产生及检测
学院:
电子信息工程学院
设计人员:
张泽霖学号:
08211049
目录
一、设计任务书………………………………………………………….…2
二、设计内容…………………………………………………………….…3
三、设计方案、算法原理说明……………………………………………3
四、程序设计、调试与结果分析…………………………………………7
五、设计(安装)与调试的体会……………………………………….15
六、参考文献……………………………………………………………..24
一、设计任务书
简介
双音多频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信号的检测程序,通过Goertzel算法在输入信号中提取频谱信息,通过对检测结果作有效性检查来识别各DTMF信号所对应的数字按键信息并在屏幕上显示。
发挥部分:
利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指
标,使每秒内传送的DTMF编码越多越好。
要求完成的任务:
(1)编写C语言程序,并在CCS集成开发环境下调试通过。
(2)实现设计所要求的各项功能。
(3)按要求撰写设计报告。
要求达到的目的:
(1)熟悉CCS的编程环境和基本试验调试流程和方法;
(2)熟悉并掌握使用C语言编写较为复杂的程序并用CCS实现;
(3)了解并掌握DTMF信号的产生和检测远离核试验流程;
(4)熟练使用软件CCS5000对程序的完整调试过程。
二、设计内容
(1)使用C语言编写DTMF信号的产生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
(2)使用C语言编写DTMF信号的检测程序,再由接收端接收到发送端所发送的相应信号,通过Goertzel算法在输入信号中提取频谱信息,通过对检测结果作有效性检查来识别各DTMF信号所对应的数字按键信息,实现双机通信。
三、设计方案、算法原理说明
DTMF信号的产生
DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。
向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。
典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足Nyquist条件(Nyquist定理:
为了正确判定信号频率,信号在一个周期内至少被采样两次。
)
正弦波是任何波形构成的基本单元,产生正弦波的方法一般有:
采样回放法、查表法、泰勒级数展开法、数字正弦振荡器法。
我们用的是sin函数产生离散的正弦值,因为这种方法我们比较熟悉而且通过查阅资料这种方法的也能达到误差要求,生成DTMF的公式为:
buffer[t]=sin(t*2*pi*f1/fs)+sin(t*2*pi*f2/fs),其中t为采样序数,由0开始递增;f1,f2为生成DTMF信号的两个正弦波的频率;fs为采样频率;buffer[t]为序数t时的得出的采样值。
将这些数据转换为Q15格式然后通过codec发送出去。
CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。
代表数字的音频信号必须持续至少45ms,但不超过55ms。
100ms内其他时间为静音,以便区别连续的两个按键信号。
我们使用8000Hz的采样频率(电话信号的典型抽样频率为
=8kHZ),即1秒采样8000个点,则100ms采样800个点,我们设置800个点的缓存,其中用400个存产生的DTMF信号值,即音频信号必须持续50ms,另外400个存0值,即静音信号。
DTMF信号的接收
DTMF检测是对进入解码端的信号进行检测,并把双音频信号转换成对应的数字信息。
它是一个比DTMF产生更加复杂过程。
由于数据流是连续的,为了保证DTMF检测的实时性,因此要求检测过程必须是实时连续的。
在输入信号中检测DTMF信号,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。
整个检测过程分两步:
首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。
DTMF解码时在输入信号中搜索出有效的行频和列频。
计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。
通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只需关心其8个行频/列频及其二次谐波信息即可,二次谐波的信息用于将DTMF信号与声音信号区别开。
此时Goertzel算法能更加快速的在输入信号中提取频谱信息。
Goertzel算法实质是一个两极点的IIR滤波器。
Goertzel算法简介
DTMF检测器的核心是Goertzel算法。
该算法利用二极点的IIR滤波器计算离散傅立叶变换值,能够快速高效地提取输入信号的频谱信息。
由于IIR滤波器是一个递归结构,它利用只有一个实系数的差分方程进行操作,并不像DFT或FFT算法那样需要计算数据块,而是每输入一个样值就执行一次算法。
完成时域到频域的变换可以用离散傅立叶变换(DFT)或快速傅立叶变(FFT).FFT计算出所有点频率,而DFT可以只计算感兴趣的频率点.如果要计算的频率点数少于log2N(N为输入信号点数),采用DFT的计算速度比FFT更快。
直接计算DFT,需要很多复系数,即使只计算一点的DFT也需要N个复系数.采用数字信号处理中的Goertzel算法,则可明显地提高速度。
图3.2Goertzel算法原理框图
利用二阶复共轭极点可以得到只有一个实系数的差分方程:
(1)
在实际的DTMF检测中,只需DFT的幅度(本算法为平方幅度)信息就足够了,因此在Goertzel滤波器中,当N点(相当于DFT数据块的长度)样值输入滤波器后,滤波器输出伪DFT值vk(n),由vk(n)即可确定频谱的平方幅度。
(2)
其中k=f*N/fs,当N取值为205时,k的取值经计算如下表所示:
信号频率(Hz)
取整值k
信号频率(Hz)
取整值k
697
18
1209
31
770
20
1336
34
852
22
1477
38
941
24
1633
42
表3.1
有效性检测
一旦得到行/列频率的频谱平方幅度信息,就可以通过一系列的判决来确定音频及数字结果的有效性。
首先,检测可能DTMF信号的强度是否足够大。
行频率分量和列频率分量的平方幅度和应高于某一确定门限THR_SIG。
注意与DTMF频率相符的正弦波的能量集中在频域内一段很窄的范围当中,所以门限取值应占动态范围的大部分。
第二,如果DTMF信号存在,由于构成DTMF信号的行频都低于列频,因此从小到大依次判断各个频率点的频谱幅度,得到的第一个达到门限要求的的频率点即为行频,第二个即为列频,综合行频和列频即可得出检测到的按键信息。
四、程序设计、调试与结果分析
分别将DTMF信号的产生与接收建立工程,用两个DSK板可以实现双机通信。
DTMF信号的发送程序:
程序流程包含两个任务,即音频任务和静默任务。
在一段时间间隔后两个任务需要进行互换。
音频任务的作用是产生双音频采样值,静默任务的作用是产生静默采样值。
每个任务被分配一定的持续时间。
Ø发送程序代码:
#include
#include
#include"type.h"
#include"board.h"
#include"codec.h"
#include"mcbsp54.h"
voiddelay(intperiod);
voidgenerate(intnum);
HANDLEhHandset;
s16send_buffer[400];/*定义缓冲区,其中S16为自定义类型名*/
floatbuffer[400];
floatpi=3.1415926;
s16num=0;
intcount=0;
intm;
charsend_num[12];
floatdtmf_freq[16][2]={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//#对应的行频和列频
};
voidmain()
{
intcnt=2;/*控制亮灯次数*/
if(brd_init(100))
{
return;
}
/*LED灯闪两次程序正常运行*/
while(cnt--)
{
brd_led_toggle(BRD_LED0);
delay(1000);/*灯延时*/
brd_led_toggle(BRD_LED1);
delay(1000);/*灯延时*/
brd_led_toggle(BRD_LED2);
delay(1000);/*灯延时*/
}
hHandset=codec_open(HANDSET_CODEC);/*获取设置DAC的句柄*/
codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*设置DAC的工作参数15-bit*/
codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/
codec_ain_gain(hHandset,CODEC_AIN_6dB);/*模拟输出增益6dBgainonanaloginputtoADC*/
codec_aout_gain(hHandset,CODEC_AOUT_MINUS_12dB);/*转换速率-12dBgainonanalogoutputfromDAC*/
codec_sample_rate(hHandset,SR_8000);/*8KHzsamplingrate*/
printf("输入12位号码:
\r\n");
gets(send_num);/*弹出输入框*/
generate(num);
}
voidgenerate(intnum)
{
f32x,y;
intk=0;
inti=0;
intj=0;
switch(send_num[0])/*对num_1[0]进行数值化转换*/
{
case'1':
num=1;break;
case'2':
num=2;break;
case'3':
num=3;break;
case'4':
num=4;break;
case'5':
num=5;break;
case'6':
num=6;break;
case'7':
num=7;break;
case'8':
num=8;break;
case'9':
num=9;break;
case'A':
num=10;break;
case'B':
num=11;break;
case'C':
num=12;break;
case'0':
num=0;break;
case'D':
num=13;break;
case'*':
num=14;break;
case'#':
num=15;break;
}
x=dtmf_freq[num][0]/8000;
y=dtmf_freq[num][1]/8000;
for(k=0;k<=399;k++)
{
buffer[k]=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k))*16384;
/*将样点数据转换为整数数据*/
send_buffer[k]=buffer[k];/*强制类型转换*/
}
//发送
while
(1)
{
//Waitforsamplefromhandset
while(!
MCBSP_XRDY(HANDSET_CODEC)){};
*(volatileu16*)DXR1_ADDR(HANDSET_CODEC)=buffer[i];
i++;
if(i==400)/*一次发送400个点*/
{
i=0;
count++;
if(count==30)/*控制发送30次*/
{
count=0;
j++;
if(j==12)
return;
switch(send_num[j])
{
case'1':
num=1;break;
case'2':
num=2;break;
case'3':
num=3;break;
case'4':
num=4;break;
case'5':
num=5;break;
case'6':
num=6;break;
case'7':
num=7;break;
case'8':
num=8;break;
case'9':
num=9;break;
case'A':
num=10;break;
case'B':
num=11;break;
case'C':
num=12;break;
case'0':
num=0;break;
case'D':
num=13;break;
case'*':
num=14;break;
case'#':
num=15;break;
}
x=dtmf_freq[num][0]/8000;
y=dtmf_freq[num][1]/8000;
for(k=0;k<=399;k++)
{
buffer[k]=(0.65*sin(2*pi*y*k)+0.8*sin(2*pi*x*k))*16384;/*将样点数据转换为整数数据*/
send_buffer[k]=buffer[k];
}
}
}
}
}
voiddelay(intperiod)
{
inti,j;
for(i=0;i { for(j=0;j } } DTMF信号的接收程序: #include #include #include"type.h" #include"board.h" #include"codec.h" #include"mcbsp54.h" HANDLEhHandset; floatin_buffer[256]; floatpi=3.1415926; s16data; intk=0; voiddelay(intperiod); voiddetect(); voidmain() { intcnt=2;/*控制亮灯次数*/ if(brd_init(100)) {return;} //blinktheledsacoupletimes 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); } /*OpenHandsetCodec*/ hHandset=codec_open(HANDSET_CODEC);/*Acquirehandletocodec*/ /*Setcodecparameters*/ codec_dac_mode(hHandset,CODEC_DAC_15BIT);/*DACin15-bitmode*/ codec_adc_mode(hHandset,CODEC_ADC_15BIT);/*ADCin15-bitmode*/ codec_ain_gain(hHandset,CODEC_AIN_6dB);/*6dBgainonanaloginputtoADC*/ codec_aout_gain(hHandset,CODEC_AOUT_MINUS_6dB); /*-6dBgainonanalogoutputfromDAC*/ codec_sample_rate(hHandset,SR_8000);/*8KHzsamplingrate*/ while (1) { while(! MCBSP_RRDY(HANDSET_CODEC)){}; data=*(volatileu16*)DRR1_ADDR(HANDSET_CODEC); in_buffer[k++]=data/16384.0; if(k==256) { k=0; detect(); } } } voiddetect() {inti,j,x,y; intm=0; floatw[8]; floata[8][3]; floatamp[8]; w[0]=2*cos(2*pi*18/205); w[1]=2*cos(2*pi*20/205); w[2]=2*cos(2*pi*22/205); w[3]=2*cos(2*pi*24/205); w[4]=2*cos(2*pi*31/205); w[5]=2*cos(2*pi*34/205); w[6]=2*cos(2*pi*38/205); w[7]=2*cos(2*pi*42/205); for(i=0;i<8;i++) { a[i][0]=0; a[i][1]=0; for(j=1;j<=205;j++) { a[i][2]=w[i]*a[i][1]-a[i][0]+in_buffer[j-1]; a[i][0]=a[i][1]; a[i][1]=a[i][2]; } /*计算频谱的幅度平方值*/ amp[i]=a[i][1]*a[i][1]+a[i][0]*a[i][0]-w[i]*a[i][1]*a[i][0];} for(i=0;i<8;i++) { if(amp[i]>3000)/*门限设为3000*/ { m++; if(m==1)/*第一个达到门限要求的的频率点为行频给x*/ { x=i; } elseif(m==2) { y=i;/*第二个达到门限要求的的频率点为列频给y*/ } } } if(m==2) { if(x==0&&y==4) {printf("TheDTMFsignalis1\n");} elseif(x==0&&y==5) {printf("TheDTMFsignalis2\n");} elseif(x==0&&y==6) {printf("TheDTMFsignalis3\n");} elseif(x==1&&y==4) {printf("TheDTMFsignalis4\n");} elseif(x==1&&y==5) {printf("TheDTMFsignalis5\n");} elseif(x==1&&y==6) {printf("TheDTMFsignalis6\n");} elseif(x==2&&y==4) {printf("TheDTMFsignalis7\n");} elseif(x==2&&y==5) {printf("TheDTMFsignalis8\n");} elseif(x==2&&y==6) {printf("TheDTMFsignalis9\n");} elseif(x==3&&y==5) {printf("TheDTMFsignalis0\n");} elseif(x==0&&y==7) {printf("TheDTMFsignalisA\n");} elseif(x==1&&y==7) {printf("TheDTMFsignalisB\n");} elseif(x==2&&y==7) {printf("TheDTMFsignalisC\n");} elseif(x==3&&y==7) {printf("TheDTMFsignalisD\n");} elseif(x==3&&y==4) {printf("The
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 张泽霖 08211049 通信 0808 DTMF 信号 产生 检测 概述