实验名称:电工电子教学基地
DSP课程设计
实 验 报 告
DTMF信号的产生及检测
DTMF信号的产生及检测
一、实验设计内容
基本部分:
1.使用C语言编写DTMF信号的发生程序,可以通过键盘的输入产生0~9对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
2.使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕上显示。 发挥部分:
利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。
二、实验目的
1、 了解、掌握DTMF的性质作用。 2、 掌握DTMF的产生和检测的思想和方法。 3、 了解Goertzel算法优化运算过程。
4、 熟练运用C语言进行编程实现DTMF的产生与检测。 5、 熟练使用CCS5402的操作方法和调试检验方式。
三、实验器材
DSP5402开发板两块,CCS软件环境
四、实验原理
双音多频DTMF(Dual Tone Multi-Frequency)信令,逐渐在全世界范围内使用在按键式电话机上,因其提供更高的拨号速率,迅速取代了传统转盘式电话机使用的拨号脉冲信令。近年来DTMF也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端等。将DTMF信令的产生与检测集成到任一含有数字信号处理器(DSP)的系统中,是一项较有价值的工程应用。
DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。电话机键盘上每一个键通过由图1所示的行频与列频唯一确定。DTMF的编解码方案无需过多的计算量,可以很容易的在DSP系统里与其他任务并发执行。一个DTMF 信号由两个频率的音频信号叠加构成。这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。每组分别包括4 个频率,分别抽出一个频率进行组合就可以组成16 种DTMF 编码,分别记作0~9、*、#、A、B、C、D。 1、 DTMF信号的产生
DTMF编码器基于两个二阶数字正弦波振荡器,一个用于产生行频,一个用于产生列频。向DSP装入相应的系数和初始条件,就可以只用两个振荡器产生所需的八个音频信号。典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足Nyquist
条件。正弦波是任何波形构成的基本单元,产生正弦波的方法一般有:采样回放法、查表法、泰勒级数展开法、数字正弦振荡器法。
我们直接采用sin函数产生离散的正弦值,生成DTMF的公式为:buffer[t]=sin(t*2*pi*f1/fs)+sin(t*2*pi*f1/fs),其中t为采样序数,由0开始递增;f1,f2为生成DTMF信号的两个正弦波的频率;fs为采样频率;buffer[t]为序数t时的得出的采样值。将这些数据转换为Q15格式然后通过codec发送出去。
2、 DTMF信号的检测
在输入信号中检测DTMF信号,并将其转换为实际的数字,这一解码过程本质是连续的过程,需要在输入的数据信号流中连续地搜索DTMF信号频谱的存在。整个检测过程分两步:首先采用Goertzel算法在输入信号中提取频谱信息;接着作检测结果的有效性检查。
2.1 Goertzel算法
DTMF解码即是在输入信号中搜索出有效的行频和列频。计算数字信号的频谱可以采用DFT及其快速算法FFT,而在实现DTMF解码时,采用Goertzel算法要比FFT更快。通过FFT可以计算得到信号所有谱线,了解信号整个频域信息,而对于DTMF信号只用关心其8个行频/列频及其二次谐波信息即可(二次谐波的信息用于将DTMF信号与声音信号区别开)。此时Goertzel算法能更加快速的在输入信号中提取频谱信息。G直接计算DFT,需要很多复系数,即使只计算一点的DFT也需要N个复系数.采用数字信号处理中的Goertzel算法,则可明显地提高速度。
利用二阶复共轭极点可以得到只有一个实系数的差分方程:
1st Harmonics (N = 205) fs = 8 ksps 2nd Harmonics (N=201) fs = 8 ksps k 18 20 22 24 31 34 38 42 frequency (k/N)fs/Hz 702 780 858 936 1210 1326 1483 1639 coefficient cos(2pi k/N) 0.85162 0.81793 0.78115 0.74142 0.58157 0.50442 0.39505 0.27972 k 35 39 43 47 61 67 74 82 frequency (k/N)fs/Hz 1393 1552 1711 1871 2428 2667 2945 3264 coefficient cos(2pi k/N) 0.45886 0.34445 0.22470 0.10141 -0.32974 -0.50000 -0.67606 -0.83740 ?vk(n)?2cos(2k)?vk(n?1)?vk(n?2)?x(n)Nwhere vk(?1)?0 vk(?2)?0 x(n)?input
在实际的DTMF检测中,只需DFT的幅度(本算法为平方幅度)信息就足够了,因此在Goertzel滤波器中,当N点(相当于DFT数据块的长度)样值输入滤波器后,滤波器输出伪DFT值vk(n),由vk(n)即可确定频谱的平方幅度。
2?kkX(k)?y(N)y(N)22? ?vk(N)?vk(N?1)?2cos(2Nk)vk(N)vk(N?1)
Goertzel算法的特点
? Goertzel算法的IIR滤波器结构涉及两个复共轭极点,但对于实际的DTMF音频检
测,只要有幅度信息就够了(实际上使用幅度平方),从而简化为只需要一个实系数参与计算。
? Goertzel算法要比FFT快得多,因为只需要提供8个行/列频和它们的二次谐
波的信息(二次谐波的信息用于将DTMF与话音或音乐区别开来)。
2.2 DTMF检测器流程
把检测程序作为C54x的McBsp接收中断服务子程序,在每一个接收中断到来时,表明采到一个新样点。样点值代入式(2),迭代计算8个行频/列频的中间变量vk(n)(k为8个行频/列频分别对应的数字频率),直到采到N=125个样点(在8kHz采样频率下,约为15ms)。此时再按式(4)计算8个行频/列频的幅度平方|X(k)|2。接下来将|X(k)|2与门限作比较,并作二次谐波检测,判决出有效的音频信号。将音频信号映射为数字信号后,再与上一个检测到的数字信号比较,最终判决出有效的数字信号。
五、实验程序及注释:
1、DTMF信号的产生和发送程序:
/*****************************************************************/
/* DTMFsignal 发送程序 send.c */ /*****************************************************************/ #include
void send(int num);
HANDLE hHandset; s16 out_buffer[256]; float buffer[256]; s16 n=0; int c=0,a;
float pi=3.1415926;
void main() {
if(brd_init(100)) {
return; }
/* Open Handset Codec */
hHandset = codec_open(HANDSET_CODEC); /* Acquire handle to codec */ /* Set codec parameters */
codec_dac_mode(hHandset, CODEC_DAC_15BIT); /* DAC in 15-bit mode */ codec_adc_mode(hHandset, CODEC_ADC_15BIT); /* ADC in 15-bit mode */
codec_ain_gain(hHandset, CODEC_AIN_6dB); /* 6dB gain on analog input to ADC */
codec_aout_gain(hHandset, CODEC_AOUT_MINUS_12dB); /* -12dB gain on analog output from DAC */
codec_sample_rate(hHandset,SR_8000); /* 8KHz sampling rate */ send(n); }
void send(int n) {
int k=0; int i;
float f1,f2,ff;
ff=2*pi/8000;
i=k;
//键盘输入DTMF信号,每个信号发送40次
while(1)
{ while (!MCBSP_XRDY(HANDSET_CODEC)) {};////如果D/A未准备好,则等待
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库DTMF信号的产生及检测在线全文阅读。
相关推荐: