专题七DSP应用举例-DTMF的产生和解码v1.0_第1页
专题七DSP应用举例-DTMF的产生和解码v1.0_第2页
专题七DSP应用举例-DTMF的产生和解码v1.0_第3页
专题七DSP应用举例-DTMF的产生和解码v1.0_第4页
专题七DSP应用举例-DTMF的产生和解码v1.0_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、DTMFDTMF在在C5400C5400下的实现下的实现讲演:讲演: 管庆管庆 主要内容lDTMFDTMF码的基本原理码的基本原理lDTMFDTMF码的产生码的产生lDTMFDTMF码的检测码的检测 l在在DSP/BIOSDSP/BIOS环境下实现环境下实现DTMFDTMF的产生和的产生和解码解码 lDTMFDTMF产生和解码演示产生和解码演示DSPDSP解决方案案例解决方案案例DTMFDTMFl双音多频双音多频DTMF(Dual Tone Multi Frequency)信令,逐渐在)信令,逐渐在全世界范围内使用在按键式电话全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,机上,因其

2、提供更高的拨号速率,迅速取代了传统转盘式电话机使迅速取代了传统转盘式电话机使用的拨号脉冲信令。用的拨号脉冲信令。l近年来近年来DTMF也应用在交互式控也应用在交互式控制中,诸如语音菜单、语音邮件、制中,诸如语音菜单、语音邮件、电话银行和电话银行和ATM终端等。终端等。DTMF原理lDTMF编码器:基于两个二阶数字正编码器:基于两个二阶数字正弦波振荡器,一个用于产生行频,一弦波振荡器,一个用于产生行频,一个用于产生列频,个用于产生列频, DSP用软件产生两用软件产生两个正弦波叠加在一起后发送。个正弦波叠加在一起后发送。 lDTMF解码器:本质是连续的过程,解码器:本质是连续的过程,需要在输入的数

3、据信号流中连续地搜需要在输入的数据信号流中连续地搜索索DTMF信号频谱的存在。采用信号频谱的存在。采用Goertzel算法,这是一种在输入信号中算法,这是一种在输入信号中提取频谱信息的快速有效方法提取频谱信息的快速有效方法 。DTMF信号的产生信号的产生 lDTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。 +列频DTMF信号+ZZ-1a1ZZ+a1-1行频DTMF信号的产生信号的产生lH(Z)含有位于单位圆上的复共扼极点。另外,冲击响应函数为:l二阶系统函数的差分方程为 l其中,)() 1sin()(0nunAnh)()2() 1()(021nbnyanyany

4、1,cos2,sin20100aaAbDTMF信号的产生信号的产生lCCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。l代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms中的其他时间为静音,以便区别连续的两个按键信号。l数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。 DTMF信号的产生信号的产生l启动下一个任务前(音频信号任务或静音任务),都必须复位定时器变量。l因为音频信号任务和静音任务都通过定时器变量,决定音频或静音的持续时间。l在静音任务结束后,从数字缓存中调出

5、下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数l整个程序可以置于DSP发射串口中断服务子程序里,由外部送入的8000Hz串口时钟触发中断,即可实时处理和恒定样本输出。DTMF信号的检测信号的检测 l在输入信号中检测DTMF信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。l整个检测过程首先要确定检测算法,这是最重要的一步。采用Goertzel算法,这是一种在输入信号中提取频谱信息的快速有效方法。l其次作检测结果的有效性检查。 收集频谱信息收集频谱信息 lDTMF解码即是在输入信号中搜索出有效的

6、行频和列频。l计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。l通过FFT计算可以得到信号所有谱线,可以了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。l此时Goertzel算法则具有更优的运算效率。 (P425)收集频谱信息收集频谱信息lGoertzel算法原理框图 ZZkNje2)2cos(2Nk-1)(nxe)(nvk)(nyk0)(Nxe0)2() 1(kkvv收集频谱信息收集频谱信息lDFT计算可以等价为 l另外,在DTMF检测

7、中,对于输入的实数序列并不需要检测出8个行频/列频的相位,只需要计算出其幅度平方即可。 NnnvnvNknxnvkkk0),2() 1()2cos(2)()() 1()()()(2NveNvNykXkkNjkk) 1()()2cos(2) 1()()()(2222NvNvNkNvNvNykXkkkkk有效性检查有效性检查l确认可能的DTMF信号对是否有足够的强度。程序计算出的行频/列频成分高于一定的门限l因为语音信号总会含有明显的8个行频/列频的偶次谐波。如果行频/列频成分二次谐波和基波成分之比低于一定门限,即可肯定检测到了代表一个数字信息的有效DTMF信号对 l将检测到的数字与前面最后一个数

8、字比较,只有当数字之间是一段静音信号时,才可判决当前的数字为有效数字,区分开两次按键。 DTMF 在在DSP/BIOS下的实现下的实现l已经在已经在CCS下完成下完成DTMF码的产生和解调。码的产生和解调。l分析实现过程,主要有以下几个任务:分析实现过程,主要有以下几个任务:1. DTMF码的产生码的产生:分双音与静音,分别持续分双音与静音,分别持续50ms。2. DTMF的解码运算的解码运算:每收到一个每收到一个A/D数据的处理并完成数据的处理并完成DTMF码的判别。码的判别。3. A/D及及D/A中断服务程序中断服务程序:DA完成双音码的数模转换;完成双音码的数模转换;AD完成数据的接收并

9、设置数据到达标志(全局变量)。完成数据的接收并设置数据到达标志(全局变量)。4. AC01芯片的初始化芯片的初始化: 设置采样率等参数,需要使用设置采样率等参数,需要使用串口发送中断。串口发送中断。DSP/BIOS下线程考虑下线程考虑l拨号任务:定义周期性模块(拨号任务:定义周期性模块(PRD)每)每5秒秒运行一次运行一次FXN_Dial_Number()函数。函数。l该函数将需要拨出的号码缓冲设置好,初该函数将需要拨出的号码缓冲设置好,初始化全局计数变量和指针,并开启串口发始化全局计数变量和指针,并开启串口发送中断,开始拨号。送中断,开始拨号。 l拨号缓冲中的数字为拨出的号码,拨号缓冲中的数

10、字为拨出的号码,0 xff表示表示静音期,当遇到静音期,当遇到0 xffff时,拨号结束,关闭时,拨号结束,关闭串口发送中断串口发送中断 。 l注意:注意:FXN_Dial_Number将反复运行将反复运行 !拨号任务相关函数拨号任务相关函数transmit(): 串口发送中断服务函数,串口发送中断服务函数,并完成对发送数据的计数以便确定拨号并完成对发送数据的计数以便确定拨号音与静音的时间。音与静音的时间。set_freq_coff(NowTel): 当前拨号数字当前拨号数字所需要的频率系数。所需要的频率系数。iir_to_dtmf(): 根据前面的频率系数,根据前面的频率系数,产生响应的正弦

11、波形。产生响应的正弦波形。接收任务的考虑接收任务的考虑l将整个将整个de_dtmf()函数定义为一个函数定义为一个TSK对象对象(_FXN_TSK_de_dtmf)。)。l该任务线程由该任务线程由McBSP的接收中断每收到一的接收中断每收到一个新的数据就发出一个旗语(个新的数据就发出一个旗语(semaphore)(SEM_New_Sample)触发。)触发。l同时在中断服务程序内对收到数据计数,同时在中断服务程序内对收到数据计数,并使用全局变量并使用全局变量IsNew_N,决定是否判断,决定是否判断输出一个收到的号码。输出一个收到的号码。 接收相关函数接收相关函数 de_dtmf(): 对每个

12、收到的数据做对每个收到的数据做DFT,并对并对N点数据做能量累加。点数据做能量累加。receive(): 接收中断服务子程序。接收中断服务子程序。choose_code(): 判断输出一个号码。判断输出一个号码。 init_mem(): 初始化接收运算的一些变初始化接收运算的一些变量。该函数应该在量。该函数应该在FXN_Dial_Number中运中运行。行。 初始化初始化AC01的考虑的考虑l初始化初始化AC01通过串口的发送中断,将采样通过串口的发送中断,将采样率、通道设置等参数发到率、通道设置等参数发到AC01。 l用汇编代码完成,并且取代用汇编代码完成,并且取代DSP/BIOS的串的串口

13、发送中断,直接完成中断服务响应。口发送中断,直接完成中断服务响应。 l初始化完成后需要恢复,即串口发送中断初始化完成后需要恢复,即串口发送中断仍然由仍然由DSP/BIOS管理,双音数据的发送管理,双音数据的发送程序也是挂接在程序也是挂接在DSP/BIOS硬件中断中完硬件中断中完成。成。l相关代码:相关代码: /*The following code are used to setup AC01*/ C54_plug(20,&_start_ac01); /* change interrupt vector */ oldmask=C54_disableIMR(0 xffff); /* cl

14、ose all IMR */ start_ac01(); /* in dtmf.asm, used to init AC01 & McBSP0 */ C54_enableIMR(oldmask); /* restore old IMR */ /*-End setup AC01 !-*/ 中断函数的插入和打开中断函数的插入和打开 lDSP/BIOS提供函数提供函数HWI_dispatchPlug(vecid, fxn, attrs)用于中用于中断服务函数的插入。断服务函数的插入。 l该函数将使用该函数将使用HWI_dispatch功能,不将函功能,不将函数数fxn直接插入中断向量表。后者可以使用直接插入中断向量表。后者可以使用函数函数C54_plug(vecid, fxn)。 l下面是例子:下面是例子: #include DTMF5410_BIOScfg.h#include .HWI_dispatchPlug(20,&pllx100,NULL);C54_enableIMR(0 x20); /* #20h: bit5-BXINT0, bit4-BRINT0, enable BXINT0 , 其他中断不影响! */HWI_enable(); .图图1 任务拨号任务拨号+解码任务,采样频率解码

温馨提示

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

评论

0/150

提交评论