DSP课程设计---DTMF信号的产生及检测
DSP课程设计
实 验 报 告
DTMF信号的产生及检测
院(系): 电子信息工程学院通信工程专业
设计人员:宋佳阳 学号目录
一、设计任务书- 3 -
二、设计内容- 3 -
三、设计方案、算法原理说明- 4 -
1.DTMF信号的产生- 4 -
2.DTMF信号的检测- 5 -
四、程序设计、调试与结果分析- 7 -
1.程序设计部分:- 7 -
2.调试与结果分析部分:- 28 -
五、设计(安装)与调试的体会- 33 -
六、参考文献- 33 -
设计任务书
设计要求及目标
基本部分:
(1)使用C语言编写DTMF信号的发生程序,要求循环产生0~9、*、#、A、B、C、D对应的DTMF信号,并且符合CCITT对DTMF信号规定的指标。
(2)使用C语言编写DTMF信号的检测程序,检测到的DTMF编码在屏幕上显示。
发挥部分:
利用DTMF信号完成数据通讯的功能,并试改进DTMF信号的规定指标,使每秒内传送的DTMF编码越多越好。
设计内容
双音多频DTMF(Dual Tone Multi Frequency)是在按键式电话机上得到广泛应用的音频拨号信令,一个DTMF信号由两个频率的音频信号叠加构成。这两个音频信号的频率分别来自两组预定义的频率组:行频组和列频组。每组分别包括4个频率,分别抽出一个频率进行组合就可以组成16种DTMF编码,分别记作0~9、*、#、A、B、C、D。如图2-1所示。
图2-1 DTMF信令的编码
要用DSP产生DTMF信号,只要产生两个正弦波叠加在一起即可;DTMF检测时采用改进的Goertzel算法,从频域搜索两个正弦波的存在。
设计方案、算法原理说明
DTMF信号的产生
DTMF发生器基于两个二阶数字正弦振荡器,一个用于产生行频,一个用于产生列频。DSP只要装载相应的系数和初始条件,就可以只用两个振荡器产生所需的八种音频信号。典型的DTMF信号频率范围是700~1700Hz,选取8000Hz作为采样频率,即可满足奈奎斯特定理。
正弦波是任何波形构成的基本元素,产生正弦波的方法一般有:查表法和计算法(泰勒级数展开法或数字正弦振荡器法)。
这里我们使用计算法产生正弦波,有以下两种方案:
方案一:使用数字正弦振荡器计算法产生正弦波
图3-1 DTMF数字振荡器对
由图3-1所示数字振荡器对的框图,可以得到DTMF数字振荡器对的二阶系统函数的差分方程为:
其中 , , , 为采样频率, 为输出正弦波的频率, 为输出正弦波的幅度。该式初值为 , 。
其中,上面一个数字振荡器用于产生行频,下面一个数字振荡器用于产生列频,将行频信号和列频信号通过加法器进行叠加即可产生DTMF信号。
方案二:使用sin函数产生正弦波
直接利用sin函数生成离散的正弦值,其生成DTMF信号的方程为:
y[t]=sin(t*2*pi*f1/fs)+sin(t*2*pi*f2/fs)
其中t为采样序数,由0开始递增;f1,f2为生成DTMF信号的两个正弦波的频率;fs为采样频率,由前面的分析可知,采样频率应该设定为8000Hz。
将行频信号的采样值与列频信号的采样值进行叠加,即可得到序数为t时的采样值,即为y[t]。
将两种方案进行比较后,我们认为,使用正弦振荡器计算法这种方法计算时所需的计算量小,但是由于使用了迭代的方法产生样点值,所以当前时刻的输出序列需要反馈到输入端。在程序中实现,就需要不断对y(n-1)和y(n-2)的值进行更新。同时,当前时刻的输出序列也会影响下一时刻和下两个时刻的输出。因此,如果用这种方法来产生长时间连续的正弦信号和余弦信号,则累积误差较大。
直接使用sin函数产生正弦波的方法,其计算时所需的计算量与方案一相当,并且也能达到误差要求。同时,由于使用方案二的方法产生正弦波,其当前时刻的输出序列只与当前时刻行频和列频的输入有关,所以不会产生累积误差,适合用来产生长时间连续的DTMF信号。
综上所述,我们使用方案二来产生DTMF信号。
根据CCITT的规定,数字之间必须有适当长度的静音,因此编码器有两个任务,一是产生双音频信号的任务,二是静音任务。由于采样频率为8000Hz,所以DSP有足够的计算时间,可以使用查询模式通过D/A转换器输出DTMF信号。CCITT规定每秒传送/接收10个数字,即每个数字持续100ms。由于1秒采样8000个点,则每个数字采样800个点。由于代表数字的音频信号必须持续至少45ms,但不超过55ms。100ms内其他时间为静音,以便区别连续的两个按键信号。所以,需要设置800个点的缓存,其中400个点用于产生DTMF信号中的音频信号,另外400个点用于产生DT