dsp课程设计1Word下载.docx
《dsp课程设计1Word下载.docx》由会员分享,可在线阅读,更多相关《dsp课程设计1Word下载.docx(16页珍藏版)》请在冰点文库上搜索。
1.概述
DTMF(Dual-ToneMultifrequency)通信技术中的一种信号传输方法,这里的tone代表一个固定频率的声音片断,而dual-tone则是由两个不同的tone产生的复频信号。
数字式电话的12个键分别代表了12种不同的复频组合,借助于对频率组合的侦测,计算机可分辨出所按的是哪一个键,从而达到与电话另一端的使用者互动控制的目的。
通过这种技术可以使计算机将控制命令从复杂的声音讯号中判别出来,从而使我们能够通过电话按键控制计算机的运作。
DTMF信号发生器将按键或数字信号转化成双音信号,DTMF信号检测器检测双音信号中的信息。
下图是一般双音多频电话的双音频率情况:
图1双音频电话键盘
2.DTMF信号的产生
正弦信号算法和频率控制
设有一系统:
其传输函数
没有零点,只有一对处在单位圆上的共扼极点,则单位冲击响应为恒幅度振荡,即产生了正弦信号。
式中:
,
;
经离散变换后得:
A为正弦波幅值,
为采样频率,
为正弦波频率。
图2正弦波振荡器原理图
对于DTMF所要产生的频率和采样频率为:
ROW频率:
697、770、852、941Hz
COLUMN频率:
1209、1336、1477、1633Hz
采样频率:
=8kHz
DTMF信号时序控制
根据AT&
T技术规范:
(1)数字号码最大传输速度为每秒10个,即一个号码占100ms时间片。
(2)在100ms时间片内双音多频信号持续不少于45ms且不多于55ms的时间。
(3)一个数字按键有两个作业:
ToneTask和QuietTask。
工作流程
键中断将启动一个作业(StartTask)
执行QuietTask:
o插入双音信号间的间隔
o置ToneTask的计数大小
oUnpackNewDigit
执行ToneTask:
o按规定时间片输出双音信号
o置QuietTask的计数大
3.DTMF信号的检测
双音频率信息获取算法:
Goertzel算法
Goertzel算法用来从输入信号中提取出所需要信号,运算速度比DFT算法快。
对N点采样计算表达式为:
式中:
DTMF信号的判别方法:
∙信号强度大于THR-SIG
∙双音信号(行、列)功率差:
THR-TWIREV~THR-TWISTD
∙比邻近双音信号强度大THR-ROWREL,THR-COLREL
∙二次谐波强度小于THR-ROW2nd,THR-COL2nd
运算量与存储需求
表1产生DTM信号所需的运算速度和内存
表2检测DTM信号所需的运算速度和内存
四、操作步骤
1.熟悉DTMF的基本原理和规范;
2.阅读实验提供的程序;
3.运行样例程序,观察DTMF信号的产生和检测过程;
4.写实验报告。
5.样例程序实验操作说明
A.实验前准备
1)开关K9拨到左边,即仿真器选择连接左边的CPU:
CPU1;
2)正确完成计算机、DSP仿真器和实验箱的连接后,系统上电;
B.实验
启动CCS2.0,用Project/Open打开“Exp10_cpu1”目录下的“DTMF.pjt”工程文件;
双击工程文件及“Source”可查看各源程序;
并加载“DTMF.out”;
在程序最后“i=0”处,设置断点;
单击“Run”运行程序,至断点处停止;
分别用View/Graph/Time/Frequency打开三个图形观察窗口,以观察产生的行频、列频、双音频信号以及
信号;
设置第一个图形观察窗口,观察起始地址分别为xr和xc,长度为102、32位浮点型的两组数据,分别为行频和列频的产生信号;
设置第二个图形观察窗口,观察起始地址为x,长度102、32位浮点型的一组数据,为双音频产生信号;
设置第三个图形观察窗口,观察起始地址为z,长度为8、32位浮点型的一组数据,为
的值;
打开程序变量观察窗口,观察以下变量的值;
“inkey”为输入键值,整型,范围0~15;
“outkey”为运算后输出键值,字符型,与实验介绍的键盘各键值对应,“outkeycol”为输出键值的行位置,“outkeyrow”为列位置。
范围均为1~4;
单击“Animate”,观察各窗口图形、变量变化;
在程序中,可以修改输入键值数组in的值,该数组长度为16,“RebuildAll”后、“加载”及“运行”,可观察不同的运行结果;
关闭工程文件,关闭各窗口,实验完毕。
五、实验说明
1、程序分两部分,前半部分为DTMF产生,后半部分为DTMF检测。
2、DTMF产生中用数组in设定键值,数组长度为16,范围0~15,可人工改写;
3、数组xr为产生的行频信号,长度为102,32位浮点型;
数组xc为产生的列频信号,长度为102,32位浮点型;
数组x为产生的双音频信号,长度102点,32位浮点型;
4、数组z为DTMF检测中能量模板
,以完成按键的行位置及列位置检测;
6、变量outkeycol及变量outkeyrow分别为按键行位置及列位置的检测结果,均为整
型变量;
变量outkey为最终键值检测结果,键值与本实验中介绍的键盘键值对
应,为字符型变量。
子程序流程图
DTMF信号产生子程序流程图:
DTMF信号检测子程序流程图:
externvoidInitC5402(void);
externvoidOpenMcBSP(void);
externvoidCloseMcBSP(void);
externvoidWRITEAD50(void);
#include"
math.h"
stdio.h"
#definepi3.1415927
#defineLength102
#defineLen8
doublex[Length],xc[Length],xr[Length];
doublevk[Len][Length],vs1[Len],vs2[Len],v[3],s[Len],z[Len];
doublevkn[Len][Length];
doublefr0,fr1,fr2,fr3,fc0,fc1,fc2,fc3,fs,fr,fc;
doublem1,m0,max1,max2;
inti,j;
/***********************************************************************
**MainFunctionProgram
***********************************************************************/
voidmain(void)
{
intinkey,outkeyrow,outkeycol;
charoutkey;
int*out=(int*)0x2b00;
intin[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
intks;
fs=8000;
fr0=697.0;
fc0=1209.0;
fr1=770.0;
fc1=1336.0;
fr2=852.0;
fc2=1477.0;
fr3=941.0;
fc3=1633.0;
s[0]=fr0/fs;
s[4]=fc0/fs;
s[1]=fr1/fs;
s[5]=fc1/fs;
s[2]=fr2/fs;
s[6]=fc2/fs;
s[3]=fr3/fs;
s[7]=fc3/fs;
/*inputthekeynumberfrom0to15*/
InitC5402();
/*initializeC5402DSP*/
//OpenMcBSP();
for(;
;
)
{
for(ks=0;
ks<
16;
ks++)
{
inkey=in[ks];
if(inkey==0){fr=fr3;
fc=fc1;
}
elseif(inkey==1){fr=fr0;
fc=fc0;
elseif(inkey==2){fr=fr0;
elseif(inkey==3){fr=fr0;
fc=fc2;
elseif(inkey==4){fr=fr1;
elseif(inkey==5){fr=fr1;
elseif(inkey==6){fr=fr1;
elseif(inkey==7){fr=fr2;
elseif(inkey==8){fr=fr2;
elseif(inkey==9){fr=fr2;
elseif(inkey==10){fr=fr0;
fc=fc3;
elseif(inkey==11){fr=fr1;
elseif(inkey==12){fr=fr2;
elseif(inkey==13){fr=fr3;
elseif(inkey==14){fr=fr3;
elseif(inkey==15){fr=fr3;
for(i=0;
i<
Length;
i++)
xr[i]=sin(2*pi*fr*i/fs);
xc[i]=sin(2*pi*fc*i/fs);
x[i]=1*(1.0*xc[i]+1.0*xr[i]);
}
for(j=0;
j<
8;
j++)
{
for(i=0;
{
*out=(int)(x[i]*16300.0);
}
}
for(i=0;
Len;
v[2]=v[1]=v[0]=0;
for(j=0;
v[2]=2*(cos(2*pi*s[i]))*v[1]-v[0]+x[j];
vk[i][j]=v[2];
v[0]=v[1];
v[1]=v[2];
}
vs1[i]=vk[i][Length-1];
vs2[i]=vk[i][Length-2];
for(i=0;
m1=vk[i][Length-1]*vk[i][Length-1];
m0=vk[i][Length-2]*vk[i][Length-2];
z[i]=m1+m0-2*cos(2*pi*s[i])*vk[i][Length-1]*vk[i][Length-2];
max1=0.0;
(Len/2);
if(z[i]>
=max1){max1=z[i];
outkeyrow=i+1;
max2=0.0;
for(i=4;
=max2){max2=z[i];
outkeycol=i-4+1;
/*ShowthedetceedtKeyNumber*/
if(outkeyrow==1)
if(outkeycol==1)outkey='
1'
elseif(outkeycol==2)outkey='
2'
elseif(outkeycol==3)outkey='
3'
elseif(outkeycol==4)outkey='
A'
elseif(outkeyrow==2)
4'
5'
6'
B'
elseif(outkeyrow==3)
7'
8'
9'
C'
elseif(outkeyrow==4)
*'
0'
#'
D'
i=0;
**EndofFile––exp015.c