专题七-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页未读 继续免费阅读

下载本文档

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

文档简介

DTMF在C5400下的实现讲演:管庆

主要内容DTMF码的基本原理DTMF码的产生DTMF码的检测

在DSP/BIOS环境下实现DTMF的产生和解码

DTMF产生和解码演示DSP解决方案案例--DTMF双音多频DTMF(DualToneMultiFrequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语音菜单、语音邮件、电话银行和ATM终端等。 DTMF原理DTMF编码器:基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频,DSP用软件产生两个正弦波叠加在一起后发送。

DTMF解码器:本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。采用Goertzel算法,这是一种在输入信号中提取频谱信息的快速有效方法。DTMF信号的产生

DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。DTMF信号的产生H(Z)含有位于单位圆上的复共扼极点。另外,冲击响应函数为:二阶系统函数的差分方程为其中,DTMF信号的产生CCITT对DTMF信号规定的指标是,传送/接收率为每秒10个数字,即每个数字100ms。代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms中的其他时间为静音,以便区别连续的两个按键信号。数字之间必须有适当长度的静音,因此编码器有两个任务,其一是音频信号任务,产生双音样本,其二是静音任务,产生静音样本。DTMF信号的产生启动下一个任务前(音频信号任务或静音任务),都必须复位定时器变量。因为音频信号任务和静音任务都通过定时器变量,决定音频或静音的持续时间。在静音任务结束后,从数字缓存中调出下一个数字,判决该数字信号所对应的行频和列频信号,并根据不同频率确定其初始化参数整个程序可以置于DSP发射串口中断服务子程序里,由外部送入的8000Hz串口时钟触发中断,即可实时处理和恒定样本输出。DTMF信号的检测

在输入信号中检测DTMF信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。整个检测过程首先要确定检测算法,这是最重要的一步。采用Goertzel算法,这是一种在输入信号中提取频谱信息的快速有效方法。其次作检测结果的有效性检查。收集频谱信息

DTMF解码即是在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT计算可以得到信号所有谱线,可以了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。此时Goertzel算法则具有更优的运算效率。(P425)收集频谱信息Goertzel算法原理框图收集频谱信息DFT计算可以等价为另外,在DTMF检测中,对于输入的实数序列并不需要检测出8个行频/列频的相位,只需要计算出其幅度平方即可。有效性检查确认可能的DTMF信号对是否有足够的强度。程序计算出的行频/列频成分高于一定的门限因为语音信号总会含有明显的8个行频/列频的偶次谐波。如果行频/列频成分二次谐波和基波成分之比低于一定门限,即可肯定检测到了代表一个数字信息的有效DTMF信号对将检测到的数字与前面最后一个数字比较,只有当数字之间是一段静音信号时,才可判决当前的数字为有效数字,区分开两次按键。

DTMF在DSP/BIOS下的实现

已经在CCS下完成DTMF码的产生和解调。分析实现过程,主要有以下几个任务:1.

DTMF码的产生:分双音与静音,分别持续50ms。2.DTMF的解码运算:每收到一个A/D数据的处理并完成DTMF码的判别。3.A/D及D/A中断服务程序:DA完成双音码的数模转换;AD完成数据的接收并设置数据到达标志(全局变量)。4.‘AC01芯片的初始化:设置采样率等参数,需要使用串口发送中断。DSP/BIOS下线程考虑拨号任务:定义周期性模块(PRD)每5秒运行一次FXN_Dial_Number()函数。该函数将需要拨出的号码缓冲设置好,初始化全局计数变量和指针,并开启串口发送中断,开始拨号。拨号缓冲中的数字为拨出的号码,0xff表示静音期,当遇到0xffff时,拨号结束,关闭串口发送中断。注意:FXN_Dial_Number将反复运行!拨号任务相关函数transmit():

串口发送中断服务函数,并完成对发送数据的计数以便确定拨号音与静音的时间。set_freq_coff(NowTel):当前拨号数字所需要的频率系数。iir_to_dtmf():根据前面的频率系数,产生响应的正弦波形。接收任务的考虑将整个de_dtmf()函数定义为一个TSK对象(_FXN_TSK_de_dtmf)。该任务线程由McBSP的接收中断每收到一个新的数据就发出一个旗语(semaphore)(SEM_New_Sample)触发。同时在中断服务程序内对收到数据计数,并使用全局变量IsNew_N,决定是否判断输出一个收到的号码。

接收相关函数

de_dtmf():对每个收到的数据做DFT,并对N点数据做能量累加。receive():接收中断服务子程序。choose_code():判断输出一个号码。

init_mem():初始化接收运算的一些变量。该函数应该在FXN_Dial_Number中运行。

初始化AC01的考虑初始化AC01通过串口的发送中断,将采样率、通道设置等参数发到AC01。用汇编代码完成,并且取代DSP/BIOS的串口发送中断,直接完成中断服务响应。初始化完成后需要恢复,即串口发送中断仍然由DSP/BIOS管理,双音数据的发送程序也是挂接在DSP/BIOS硬件中断中完成。相关代码:

/*ThefollowingcodeareusedtosetupAC01*/C54_plug(20,&_start_ac01);/*changeinterruptvector*/

oldmask=C54_disableIMR(0xffff);/*closeallIMR*/start_ac01();/*indtmf.asm,usedtoinitAC01&McBSP0*/C54_enableIMR(oldmask);/*restoreoldIMR*//*----------EndsetupAC01!-----------------------*/

中断函数的插入和打开

DSP/BIOS提供函数HWI_dispatchPlug(vecid,fxn,attrs)用于中断服务函数的插入。该函数将使用HWI_dispatch功能,不将函数fxn直接插入中断向量表。后者可以使用函数C54_plug(vecid,fxn)。下面是例子:

#include"DTMF5410_BIOScfg.h"#include<hwi.h>……..HWI_dispatchPlug(20,&pllx100,NULL);C54_enableIMR(0x20);/*#20h:bit5->BXINT0,

bit4->BRINT0,enableBXINT0,其他中断不影响!*/HWI_enable();……..图1任务拨号+解码任务,采样频率f

温馨提示

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

评论

0/150

提交评论