1、实验一、数字信号处理在双音多频拨号系统中的应用一、实验目的一、实验目的1了解双音多频信号的产生、检测、包括对双音多频信号进行 DFT 时的参数选择等。2初步了解数字信号处理在是集中的使用方法和重要性。3掌握 matlab 的开发环境。二、实验原理二、实验原理双音多频(Dual Tone Multi Frequency,DTMF)信号是音频电话中的拨号信号,由美国 AT&T 贝尔公司实验室研制,并用于电话网络中。这种信号制式具有很高的拨号速度,且容易自动监测识别,很快就代替了原有的用脉冲计数方式的拨号制式。这种双音多频信号制式不仅用在电话网络中,还可以用于传输十进制数据的其它通信系统中,用于电子
2、邮件和银行系统中。这些系统中用户可以用电话发送 DTMF 信号选择语音菜单进行操作。DTMF 信号系统是一个典型的小型信号处理系统,它要用数字方法产生模拟信号并进行传输,其中还用到了 D/A 变换器;在接收端用 A/D 变换器将其转换成数字信号,并进行数字信号处理与识别。为了系统的检测速度并降低成本,还开发一种特殊的 DFT 算法,称为戈泽尔(Goertzel)算法,这种算法既可以用硬件(专用芯片)实现,也可以用软件实现。下面首先介绍双音多频信号的产生方法和检测方法,包括戈泽尔算法,最后进行模拟实验。下面先介绍电话中的 DTMF 信号的组成。在电话中,数字 0-9 的中每一个都用两个不同的单音
3、频传输,所用的 8 个频率分成高频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz 和941Hz;高频带也有四个频率:1209Hz,1336Hz,1477Hz 和 1633Hz.。每一个数字均由高、低频带中各一个频率构成,例如 1 用 697Hz 和 1209Hz 两个频率,信号用表示,其中,。这样 8 个频率形)2sin()2sin(21tftfHzf6791Hzf12092成 16 种不同的双频信号。具体号码以及符号对应的频率如表 4.1 所示。表中最后一列在电话中暂时未用。表 4.1 双频拨号的频率分配 列行1209Hz1336Hz1477Hz1633Hz697Hz
4、123A770Hz 4 5 6 B852Hz 7 8 9C942Hz *0#D DTMF 信号在电话中有两种作用,一个是用拨号信号去控制交换机接通被叫的用户电话机,另一个作用是控制电话机的各种动作,如播放留言、语音信箱等。2 电话中的双音多频(DTMF)信号的产生与检测(1)双音多频信号的产生假设时间连续的 DTMF 信号用表示,式中)2sin()2sin()(21tftftx是按照表 4.1 选择的两个频率,代表低频带中的一个频率,代表高21ff 和1f2f频带中的一个频率。显然采用数字方法产生 DTMF 信号,方便而且体积小。下面介绍采用数字方法产生 DTMF 信号。规定用 8KHz 对
5、DTMF 信号进行采样,采样后得到时域离散信号为 )8000/2sin()8000/2sin()(21nfnfnx形成上面序列的方法有两种,即计算法和查表法。用计算法求正弦波的序列值容易,但实际中要占用一些计算时间,影响运行速度。查表法是预先将正弦波的各序列值计算出来,寄存在存储器中,运行时只要按顺序和一定的速度取出便可。这种方法要占用一定的存储空间,但是速度快。因为采样频率是 8000Hz,因此要求每 125ms 输出一个样本,得到的序列再送到 D/A 变换器和平滑滤波器,输出便是连续时间的 DTMF 信号。DTMF 信号通过电话线路送到交换机。(2)双音多频信号的检测在接收端,要对收到的双
6、音多频信号进行检测,检测两个正弦波的频率是多少,以判断所对应的十进制数字或者符号。显然这里仍然要用数字方法进行检测,因此要将收到的时间连续 DTMF 信号经过 A/D 变换,变成数字信号进行检测。检测的方法有两种,一种是用一组滤波器提取所关心的频率,根据有输出信号的 2 个滤波器判断相应的数字或符号。另一种是用 DFT(FFT)对双音多频信号进行频谱分析,由信号的幅度谱,判断信号的两个频率,最后确定相应的数字或符号。当检测的音频数目较少时,用滤波器组实现更合适。FFT 是 DFT的快速算法,但当 DFT 的变换区间较小时,FFT 快速算法的效果并不明显,而且还要占用很多内存,因此不如直接用 D
7、FT 合适。下面介绍 Goertzel 算法,这种算法的实质是直接计算 DFT 的一种线性滤波方法。这里略去 Goertzel 算法的介绍(请参考文献19),可以直接调用 MATLAB 信号处理工具箱中戈泽尔算法的函数 Goertzel,计算 N 点 DFT 的几个感兴趣的频点的值。3 检测 DTMF 信号的 DFT 参数选择 用 DFT 检测模拟 DTMF 信号所含有的两个音频频率,是一个用 DFT 对模拟信号进行频谱分析的问题。根据第三章用 DFT 对模拟信号进行谱分析的理论,确定三个参数:(1)采样频率,(2)DFT 的变换点数 N,(3)需要对信号的观sF察时间的长度。这三个参数不能随
8、意选取,要根据对信号频谱分析的要求进pT行确定。这里对信号频谱分析也有三个要求:(1)频率分辨率,(2)谱分析的频谱范围,(3)检测频率的准确性。1 频谱分析的分辨率。观察要检测的 8 个频率,相邻间隔最小的是第一和第二个频率,间隔是73Hz,要求 DFT 最少能够分辨相隔 73Hz 的两个频率,即要求。DFTHzF73min的分辨率和对信号的观察时间有关,。考虑到可pTmsFTp7.1373/1/1min靠性,留有富裕量,要求按键的时间大于 40ms。2 频谱分析的频率范围 要检测的信号频率范围是 6971633Hz,但考虑到存在语音干扰,除了检测这 8 个频率外,还要检测它们的二次倍频的幅
9、度大小,波形正常且干扰小的正弦波的二次倍频是很小的,如果发现二次谐波很大,则不能确定这是 DTMF 信号。这样频谱分析的频率范围为 6973266Hz。按照采样定理,最高频率不能超过折叠频率,即,由此要求最小的采样频率应为 7.24KHz。因为数HzFs36225.0字电话总系统已经规定8KHz,因此对频谱分析范围的要求是一定满足的。sF按照,8KHz,算出对信号最少的采样点数msTp7.13minsF。110minminspFTN3 检测频率的准确性 这是一个用 DFT 检测正弦波频率是否准确的问题。序列的 N 点 DFT 是对序列频谱函数在 0区间的 N 点等间隔采样,如果是一个周期序列,
10、截取周期2序列的整数倍周期,进行 DFT,其采样点刚好在周期信号的频率上,DFT 的幅度最大处就是信号的准确频率。分析这些 DTMF 信号,不可能经过采样得到周期序列,因此存在检测频率的准确性问题。DFT 的频率采样点频率为(k=0,1,2,-,N-1),相应的模拟域Nkk/2采样点频率为(k=0,1,2,-,N-1),希望选择一个合适的 N,使用NkFfsk/该公式算出的能接近要检测的频率,或者用 8 个频率中的任一个频率代入kfkf公式中时,得到的 k 值最接近整数值,这样虽然用幅度最大点检/ksfF k N测的频率有误差,但可以准确判断所对应的 DTMF 频率,即可以准确判断所对应的数字
11、或符号。经过分析研究认为 N205 是最好的。按照8KHz,N205,算出 8 个频率及其二次谐波对应 k 值,和 k 取整数时的频sF率误差见表 4.2。表 4.28 个基频Hz最近的整数 k值DFT 的k 值绝对误差二次谐波Hz对应的k 值最近的整数 k值绝对误差69717.861180.139139435.024350.02477019.531200.269154038.692390.30885221.833220.167170442.813430.18794124.113240.113188247.285470.285120930.981310.019241860.752610.248
12、133634.235340.235267267.134670.134147737.848380.152295474.219740.219163341.846420.154326682.058820.058通过以上分析,确定8KHz,N205,。sFmsTp404 DTMF 信号的产生与识别仿真实验下面先介绍 MATLAB 工具箱函数 goertzel,然后介绍 DTMF 信号的产生与识别仿真实验程序。Goerztel 函数的调用格式额为Xgk=goertzel(xn,K)xn 是被变换的时域序列,用于 DTMF 信号检测时,xn 就是 DTMF 信号的 205 个采样值。K 是要求计算的 DF
13、Txn的频点序号向量,用 N 表示 xn 的长度,则要求1KN。由表 4.2 可知,如果只计算 DTMF 信号 8 个基频时,K=18,20,22,24,31,34,38,42,如果同时计算 8 个基频及其二次谐波时,K=18,20,22,24,31,34,35,38,39,42,43,47,61,67,74,82。Xgk 是变换结果向量,其中存放的是由 K 指定的频率点的 DFTx(n)的值。设X(k)=DFTx(n),则。()(),1,2,length()Xgk iX K iiKL DTMF 信号的产生与识别仿真实验在 MATLAB 环境下进行,编写仿真程序,运行程序,送入 6 位电话号码
14、,程序自动产生每一位号码数字相应的 DTMF 信号,并送出双频声音,再用 DFT 进行谱分析,显示每一位号码数字的 DTMF 信号的DFT 幅度谱,安照幅度谱的最大值确定对应的频率,再安照频率确定每一位对应的号码数字,最后输出 6 位电话号码。三、实验仪器和设备三、实验仪器和设备PC 机 1 台;matlab 编程软件;四、实验内容及步骤四、实验内容及步骤1安装 Matlab6.x 软件实验平台(如系统已安装 Matlab 6.软件,直接进第二步)。2.熟悉指导书介绍的相关知识原理和方法进行编程和调试实验。3.设置参数,并读入 6 或 8 位电话号码;4.据键入号码产生时域离散 DTMF 信号
15、,并连续发出 6 或 8 位号码对应的双音频声音;5.对时域离散 DTMF 信号进行频率检测,画出幅度谱;6.根据幅度谱的两个峰值,分别查找并确定输入 6 或 8 位电话号码。五、实验源代码五、实验源代码 16 位电话号码的 DTMF 双频拨号信号的生成和检测程序清单(上述 3-6 步骤的原代码)%DTMF 双频拨号信号的生成和检测程序tm=1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,68;%DTMF 信号代表的 16 个数N=205;K=18,20,22,24,31,34,38,42;f1=697,770,852,941;%行频率向量f2=1209,1336,147
16、7,1633;%列频率向量TN=input(键入 6 位电话号码=);%输入 6 位数字TNr=0;%接收端电话号码初值为零for l=1:6;d=fix(TN/10(6-l);TN=TN-d*10(6-l);for p=1:4;for q=1:4;if tm(p,q)=abs(d);break,end%检测码相符的列号 q end if tm(p,q)=abs(d);break,end%检测码相符的行号 p end n=0:1023;%为了发声,加长序列 x=sin(2*pi*n*f1(p)/8000)+sin(2*pi*n*f2(q)/8000);%构成双频信号 sound(x,8000)
17、;%发出声音 pause(0.1)%接收检测端的程序 X=goertzel(x(1:205),K+1);%用 Goertzel 算法计算 DFT 样本val=abs(X);%列出八点 DFT 向量 subplot(3,2,l);stem(K,val,.);grid;xlabel(k);ylabel(|X(k)|)%画出 DFT(k)幅度 axis(10 50 0 120)limit=80;%for s=5:8;if val(s)limit,break,end%查找列号 end for r=1:4;if val(r)limit,break,end%查找行号 end TNr=TNr+tm(r,s-
18、4)*10(6-l);enddisp(接收端检测到的号码为:)%显示接收到的字符disp(TNr)实验内容及结果实验内容及结果键入 6 位电话号码=814001接收端检测到的号码为:814001图 1 6 位电话号码 814001 的 DTMF 信号在 8 个近似基频点的 DFT 幅度28 位电话号码的 DTMF 双频拨号信号的生成和检测程序清单(上述 3-6 步骤的原代码)%clear all;clc;tm=1,2,3,65;4,5,6,66;7,8,9,67;42,0,35,68;%DTMF 信号代表的 16 个数N=205;K=18,20,22,24,31,34,38,42;f1=697
19、,770,852,941;%行频率向量f2=1209,1336,1477,1633;%列频率向量TN=input(键入 8 位电话号码=);%输入 8 位数字TNr=0;%接收端电话号码初值为零for l=1:8;d=fix(TN/10(8-l);TN=TN-d*10(8-l);for p=1:4;for q=1:4;if tm(p,q)=abs(d);break,end%检测码相符的列号 q end if tm(p,q)=abs(d);break,end%检测码相符的行号 p end n=0:1023;%为了发声,加长序列 x=sin(2*pi*n*f1(p)/8000)+sin(2*pi*
20、n*f2(q)/8000);%构成双频信号 sound(x,8000);%发出声音 pause(0.1)%接收检测端的程序 X=goertzel(x(1:205),K+1);%用 Goertzel 算法计算八点 DFT样本 val=abs(X);%列出八点 DFT 向量 subplot(4,2,l);stem(K,val,.);grid;xlabel(k);ylabel(|X(k)|)%画出 DFT(k)幅度 axis(10 50 0 120)limit=80;%for s=5:8;if val(s)limit,break,end%查找列号 end for r=1:4;if val(r)lim
21、it,break,end%查找行号 end TNr=TNr+tm(r,s-4)*10(8-l);enddisp(接收端检测到的号码为:)%显示接收到的字符disp(TNr)实验内容及结果:实验内容及结果:键入 8 位电话号码=15969672接收端检测到的号码为:15969672 图 2 8 位电话号码 15969672 的 DTMF 信号在 8 个近似基频点的 DFT 幅度3上述现象进行分析,及相关结论。第一段(27 行)设置参数,并读入 6 位电话号码;第二段(920 行)根据键入的 6 位电话号码产生时域离散 DTMF 信号,并连续发出 6 位号码对应的双音频声音;第三段(2225 行)
22、对时域离散 DTMF 信号进行频率检测,画出幅度谱;第四段(2633 行)根据幅度谱的两个峰值,分别查找并确定输入 6位电话号码。结论结论:1、根据提示键入 6 位电话号码 814001,回车后可以听见 6 位电话号码对应的 DTMF 信号的声音,并输出相应的 6 幅频谱图如图 1 所示,根据上图在k=22 和 k=34 两点出现峰值,可根据表 4.1,4.2 得出所对应第一位号码数字8。根据以上原理最后显示检测到的电话号码 814001。2、根据提示键入 8 位电话号码 15969672,回车后可以听见 8 位电话号码对应的 DTMF 信号的声音,并输出相应的 8 幅频谱图如图 1 所示,根
23、据上图在k=18 和 k=31 两点出现峰值,可根据表 4.1,4.2 得出所对应第一位号码数字1。根据以上原理最后显示检测到的电话号码 15969672。六六.思考题思考题1.简述识别原理简述识别原理。DTMF 信号的产生与识别仿真实验在 MATLAB 环境下进行,编写仿真程序,运行程序,送入 6 位电话号码,程序自动产生每一位号码数字相应的DTMF 信号,并送出双频声音,再用 DFT 进行谱分析,显示每一位号码数字的DTMF 信号的 DFT 幅度谱,按照幅度谱的最大值确定对应的频率,再安照频率确定每一位对应的号码数字,最后输出 6 位电话号码。观测时间的确定观测时间的确定:观察要检测的 8
24、 个频率,相邻间隔最小的是第一和第二个频率,间隔是73Hz,要求 DFT 最少能够分辨相隔 73Hz 的两个频率,即要求。HzF73minDFT 的分辨率和对信号的观察时间有关,。考pTmsFTp7.1373/1/1min虑到可靠性,留有富裕量,要求按键的时间大于 40ms。采样频率的确定采样频率的确定:频谱分析的频率范围为 6973266Hz。按照采样定理,最高频率不能超过折叠频率,即,由此要求最小的采样频率应为 7.24KHz。因为HzFs36225.0数字电话总系统已经规定8KHz,因此对频谱分析范围的要求是一定满足的。sFDFT 的变换点数的确定:的变换点数的确定:DFT 的频率采样点
25、频率为(k=0,1,2,-,N-1),相应的模拟域采Nkk/2样点频率为(k=0,1,2,-,N-1),希望选择一个合适的 N,使用该公NkFfsk/式算出的能接近要检测的频率,或者用 8 个频率中的任一个频率代入公式kfkf中时,得到的 k 值最接近整数值,这样虽然用幅度最大点检测的/ksfF k N频率有误差,但可以准确判断所对应的 DTMF 频率,即可以准确判断所对应的数字或符号。经过分析研究认为 N205 是最好的。2.表表 4.1 和表和表 4.2 的功能是什么的功能是什么?数字 0-9 的中每一个都用两个不同的单音频传输,所用的 8 个频率分成高频带和低频带两组。具体号码以及符号对
26、应的频率如表 4.1 所示。表中最后一列在电话中暂时未用。序列的 N 点 DFT 是对序列频谱函数在 0区间的 N 点等间隔采样,如果2是一个周期序列,截取周期序列的整数倍周期,进行 DFT,其采样点刚好在周期信号的频率上,DFT 的幅度最大处就是信号的准确频率。分析这些 DTMF 信号,不可能经过采样得到周期序列,因此存在检测频率的准确性问题。经过分析研究认为 N205 是最好的。按照8KHz,N205,算出 8 个频率及其二次谐sF波对应 k 值,和 k 取整数时的频率误差见表 4.2。经过两表可以减少误差,准确确定 k 值,得出对应号码。七、实验心得七、实验心得通过此次实验明白了解了双音多频信号的产生、检测、包括对双音多频信号进行 DFT 时的参数选择等及数字信号处理在是集中的使用方法和重要性。掌握了 matlab 的开发环境。明白实验需理论与实践相结合。通过此次实验进一步加强了我对 MATLAB 的理解。特此也要感谢高诺老师和杨建老师的指导。