1、DSP课程设计实 验 报 告DTMF信号的产生及检测院(系): 电子工程信息学院设计人员: 黄 炜 学号:07291039曹 磊 07211193成绩: 工程设计50 报告20 答辩30 总分评语:指导教师签字: 日期:- 1 -目 录一、设计任务书1二、设计内容5三、设计方案、算法原理说明10四、程序设计、 调试与结果分析15五、设计(安装)与调试的体会25六、参考文献26- 2 -一、实验目的:(1) 熟悉CCS的编程环境和基本试验调试流程和方法; (2) 了解并掌握DTMF信号的产生和检测远离核试验流程;(3) 编写C语言程序,并在CCS集成开发环境下调试通过;(4) 熟练使用软件CCS
2、5000对程序的完整调试过程。二、实验内容: 1) 利用DTMF信号产生的原理合成数字信号并分析其时域波形和频谱; 2) 生成各个按键信号; 3) 分析09, AD,*、 #几个拨号信息的频谱,观察频谱图中的峰值点的幅值以及它们出现的位置。根据谱峰的幅值和位置,识别各DTMF信号所对应对应的数字; 4) 编写Goertzel算法的程序,识别各DTMF信号所对应对应的数字。 5) 生成一串拨号音,例如8位电话号码,进行识别;三、实验原理及程序设计:1、DTMF(双音多频)信号简介双音多频 DTMF(Dual Tone MultiFrequency)信号在全世界范围内得到广泛应用,将 DTMF 信
3、号的产生与检测集成到含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。双音多频 DTMF(Dual Tone MultiFrequency)信号,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信号。近年来 DTMF 也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和 ATM 终端等。将 DTMF 信号的产生与检测集成到任一含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。CCITT( 国 际 电 报 电 话 咨 询 委 员 会 ) 建议, 国际上采用697Hz、770Hz、852Hz、941Hz、120
4、9Hz、1336Hz、1477Hz、1633Hz 12 个频率, 并将其分成两个群, 即低频群和高频群。从低频群和高频群中任意抽出一个频率进行叠加组合, 具有 16 种组合形式, 让其代表数字和功率, 如下图电话机键盘的频率矩阵所列。 本实验的目的是使用 TMS320C52 来制作 DTMF 发生器和检测器。DTMF 信号是音频电话的拨号信号,这种拨号方法取代了脉冲拨号,每一个号码由两个音频信号组成,该双音频由按键所在的行和列对应的频率决定(如图所示)。 - 3 -电话中的双音多频信号(DTMF)有两种作用:一是用于双音多频信号的拨号,去控制交换机接通被叫的用户电话机;二是利用双音多频信号控制
5、电话机各种动作,如播放留言、语言信箱等。这些功能的实现离不开 DTMF 信号的正确产生和检测,专用数字处理信号芯片(DSP)的出现,使这个问题得到轻松的解决。2、DTMF 的产生DTMF 的产生原理DTMF 发生器基于两个二阶数字正弦振荡器,一个用于产生行频,一个用于产生列频。DSP 只要装载相应的系数和初始条件,就可以只用两个振荡器产生所需的八种音频信号。典型的 DTMF 信号频率范围是 7001700Hz,选取 8000Hz作为采样频率,即可满足奈奎斯特定理。设 xk为DTMF信号,产生方式为: xk=Asin( k)+ Bsin( k) hWl式中 =2*pi* / 和 =2*pi* /
6、 分别表示高频和低频频率, A hWfhsamlflsam、B 分别为低频群和高频群样值的量化基线。振荡器实现过程中,首先将每个频率的常数存在一个表中,用来初始化给定键的振荡器;再按照上式的算法迭代计算,就得到正弦序列的输出;将两个这样的输出叠加即可得到双音频的输出。每一个数字抢出的样本数取决于数字速率与采样速率.双音频中的每一个音调之后是同样长度的无音周期,从而可以检测到按键的释放。CCITT对DTMF 信号规定的指标是,传送/ 接收率为每秒10个数字,即每个数字100ms 。代表数字的音频信号必须持续至少 45ms,但不超过55ms。100ms 内其他时间为静音(无信号),以便区别连续的两
7、个按键信号。下图为 DTMF 频率及其对应的键值 - 4 -3、DTMF信号的识别常用的多频信号检测手段主要有 FFT 变换、滤波器组和线性滤波法三种。DTMF 解码即是在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以采用 DFT 及其快速算法 FFT,而在实现 DTMF 解码时,采用 Goertzel 算法要比 FFT 更快。 Goertzel 算法属于线性滤波法,它可从 DTFT 和 DFT 中推导。通过 FFT 可以计算得到信号所有谱线,了解信号整个频域信息,而对于 DTMF 信号只用关心其 8 个行频/ 列频及其二次谐波信息即可(二次谐波的信息用于将DTMF 信号与声音信号区
8、别开) 。此时 Goertzel 算法能更加快速的在输入信号中提取频谱信息。Goertzel 算法实质是一个两极点的 IIR 滤波器。如图知,DFT 计算可以等价为:在实际的 DTMF 检测中,只需 DFT 的幅度(本算法为平方幅度)信息就足够了。对于实序列 x(n), Goertzel 算法所需的内部变量 vk(n)也为实数。因此计算 如下在识别 DTMF 信号时,要求确定抽样点数 N,国际上通用 N=205 点或 N=125点。下表列出了 N=205 点时,各个频率所对应的 DFT 结果 Xm中的序号 m。N=205 时频率对应的抽样信息- 5 -基频 准确值 m 最近的整数m值 两点的绝
9、对误差 697 17.861 18 0.139 770 19.731 20 0.269 852 21.833 22 0.167 941 24.113 24 0.113 1209 30.981 31 0.019 1336 34.235 34 0.235 1477 37.848 38 0.152 由于 k 的舍入误差反映的是频率的偏移,因此必须选择 k 舍入误差小的 N值。同时还要兼顾每个频率,每个频率 k 舍入误差都比较小,或者尽可能的都取“舍”或者都取“入” ,这样就会使偏移比较小或者都向同一个方向偏移。4、 DTMF检测C54x 的 MCBSP 接收 DTMF 信号,每采到一个新样点,样点值
10、代入式,迭代计算 8 个行频/列频的中间变量 (k 为 8 个行频/ 列频分别对应的数字频率) ,直到采到 N205 个样点(在 8kHz 采样频率下,约为 25ms) 。此时再按式子计算 8 个行频/列频的幅度平方 。接下来将 与门限作比较,判决出有效的音频信号。四、实验程序及注释:#include “stdio.h“ / 头文件#include “math.h“#include “type.h“#include “board.h“/函数原型 void delay(int period); / 定义延时子程序void generate(float dtmf16*800,int start,i
11、nt num10,int m); / 定义 DTMF 信号产生子程序void detect(float dtmf16*800 ,int start); / 定义 DTMF 检测子程序int data;float freq162=941,1336,697,1209,697,1336,697,1447,770,1209,770,1336,770,1447,852,1209,852,1336,852,1447,697,1633,770,1633,852,1633,941,1633,941,1209,941,1477;- 6 -/按顺序,每一行代表 09,AD,*,#对应的数字频率float pi=3
12、.1415926; int n;int num10;s16 cnt=2;/-主程序-void main()int i;int num10=0,0,0,0,0,0,0,0,0,0; /初始化数组 num10float dtmf16*800; char ch22;/-dsk 板的初始化- if (brd_init(100) return; while ( cnt- ) /循环闪灯brd_led_toggle(BRD_LED0);delay(1000);brd_led_toggle(BRD_LED1);delay(1000);brd_led_toggle(BRD_LED2);delay(1000);
13、/-printf(“请输入要输入字符的位数,要求小于等于 8rn“);scanf(“%d“,printf(“请输入 n 个字符,0-9 或 A、B 、C 或 D,或*,或#rn“);n=2*n;for(i=0;i=0)num(i-1)/2=(int)(chi)-48; / 09 代表信号09else if(chi=A)num(i-1)/2=(int)(chi)-65+10; /1013 代表信号ADfor(i=0;i1; j+);/-双音信号产生子程序-void generate(float dtmf,int start,int num,int m) - 8 -float x=0,y=0,z=
14、0; int j; /模拟数字频率的转换。x=freqnumm0/8000*2*pi; /低频音与采样频率之比。y=freqnumm1/8000*2*pi; /高频音与采样频率之比。for(j=1;j300) /对 result 中的值进行检测,与 300 比较 /当超过 300 时,判断此频率点上信号存在j+;printf(“dtmf%d:%frn“,i,resulti);if(j=1) /j=1 时 i 的值赋给 x,代表低频的信息x=i; else if(j=2) /j=2 时 i 的值赋给 y,代表高频的信息y=i;ch=e; if(j=2)if(x=0 /这两个频率所对应的数为 1e
15、lse if(x=0 /这两个频率所对应的数为 2else if(x=0 else if(x=1 else if(x=1 else if(x=1 else if(x=2 else if(x=2 else if(x=2 else if(x=3 else if(x=3 else if(x=3 else if(x=0 - 11 -else if(x=1 else if(x=2 else if(x=3 if(ch!=e) /满足以上一种情况,则输出检测的信号printf(“The DTMF signal is “%c“.rn“,ch);else /以上情况都不满足,则输出错误信息提示printf(“T
16、he number inputted in is wrong!n“);五、CCS5000 程序调试1、编译过程、工程架构、编译环境设置1)创建新的工程2)向工程中添加文件- 12 -从Project/Add Files to Project,分别选择 DTMF.c ,5402.cmd(这个文件将片段映射到存储器中),rts.lib(这个库提供目标DSP 运行时间支持(runtime-support))等文件。.h 文件将出现在 Project View 窗中的 Libraries 文件夹。头文件不能手动添加,自动到:当前目录(源文件所在)或预编译器的“include Search Path-
17、13 -(-i)”option 所指定的位置。显示头文件:Projectshow Dependencies. 右击 dtmf.pjt,选择 Scan All Dependencies.3)编译与运行程序选择 Project/Rebuild All 或单击(Rebuild All)菜单条按钮,CCS 重新进行编辑、汇编、连接工程里的所有文件。得到结果:选择 File/Load Program.选中 dtmf.out,并按 Open。CCS 将程序装载到目标DSP 上,打开显示程序仿汇编指令的 Disassembly 窗口。- 14 -选择 Debug/Go Main。从主程序开始执行程序执行过程
18、需输入数据- 15 - 16 -2、程序运行结果及图像:观察信号时域图- 17 -观察信号频域图- 18 -信号检测输出六、实验总结及感想:通过此次 DSP 课程设计,使我对上课学过的知识有了进一步的认识。DTMF信号是我们日常生活中经常接触到的,即电话拨号信令。在做课程设计时,参考了图书馆的一些书籍以及网上查的资料,从而对双音多频的产生与检测机理有了初步的掌握,然后在 CCS 编程调试过程中不断实践,改进程序。在调试程序的过程中,遇到了很多困难,请教了同学以及大四的学长,最后终于成功了。本实验主要是 DTMF 双音多频信号的产生与识别,按键信号是由相应两个频- 19 -率的正弦信号相加而成,
19、通过公式 x=freqnum0/8000*2*pi 以及公式y=freqnum1/8000*2*pi,实现对模拟行频和列频向数字的转换,对产生的正弦信号进行 400 点抽样,存入 dtmf 数组中,以便检测时调用。本实验是通过Goertzel 算法实现对信号的检测。通过对迭代方程的计算,得出信号幅值的平方,在八个频率点处与已知常数进行比较,检测出符合条件的频率组合,并输出数值,完成识别过程。当然,在实验过程中,遇到了很多困难,比如说,程序文件 5402.cmd 文件,刚开始直接调用,编译时出现错误,根据提示,在一系列的修改尝试后,补加了段 sysmem SCRATCH PAGE 1,产生了 8
20、 个信号。通过此次实验,我们对DTMF的基础知识有了较深刻的了解,掌握了DTMF的信号产生及信号检验的原理及方法,并熟悉了用C语言对DTMF的编程的方法,通过程序的调用及调式,我们熟悉了DSP5402的体 系 结 构 、 指 令 系 统 等 。 我 们定 会 总 结 实 验 方 法 , 掌 握 理 论 知 识 , 汲 取 经 验 教 训 , 为 进 一 步 掌 握DSP的 设 计 、 CCS的 使 用 打 下 基 础 。参考文献(1) 高海林、钱满义DSP技术及其应用讲义 (2) TMS320C54x DSP Reference Set Volume 1: CPU and PeripheralsSPRU131G Texas Instrument Inc,2001(3) DTMF Tone Generation and Detection:An Implementation Using the TMS320C54x. SPRA096a ,TI.Inc.2000(4) 基于TMS320LF2407A的DTMF产生与检测实验系统设计.pdf(5) 基于DSP的DTMF信号检测.nh(6) 在DSP上实现PCM_FSK_DTMF信号变换.kdh