基于MATLAB的双音多频拨号系统的仿真
摘要
双音多频(Dual Tone Multi Frequency, DTMF)信号是音频电话中的拨号信号,由美国AT&T贝尔公司实验室研制,并用于电话网络中。DTMF信号在电话中有两种作用,一个是用拨号信号去控制交换机接通被叫的用户电话机,另一个作用是控制电话机的各种动作,如播放留言、语音信箱等。MATLAB语言是一种广泛应用于工程计算及数值
领域的新型高级语言,MATLAB功能强大、简单易学、编程效率高,深受广大科技工作者的欢迎。特别是MATLAB还具有信号分析工具箱,不需具备很强的编程能力,就可以很方便地进行信号分析、处理和设计。所以该课程设计利用MATLAB进行仿真,编写代码,运行程序,根据提示键入8位电话号码如12345678,回车后可以听见8位电话号码对应的DTMF信号的声音,并输出相应的8幅频谱图,最后显示检测到的电话号码12345678。说明DTMF信号的参数:采样频率、DFT的变换点数以及观测时间的确定原则。
关键词 多音双频 频谱图 采样频率
- 1 -
目 录
1引言 ................................................ - 3 -
2课程设计
目描述和要求 .............................. - 4 -
3课程设计
内容 .................................... - 5 -
3.1信号的产生及算法实现 ................................................................................................ - 5 -
3.2详细设计........................................................................................................................ - 9 -
3.3结果分析...................................................................................................................... - 11 -
................................................. - 13 -
- 2 -
1引言
DTMF)信号是音频电话中的拨号双音多频(Dual Tone Multi Frequency,
信号,由美国AT&T贝尔公司实验室研制,并用于电话网络中。这种信号制式具有很高的拨号速度,且容易自动监测识别,很快就代替了原有的用脉冲计数方式的拨号制式。这种双音多频信号制式不仅用在电话网络中,还可以用于传输十进制数据的其它通信系统中,用于电子邮件和银行系统中。这些系统中用户可以用电话发送DTMF信号选择语音菜单进行操作。
DTMF信号系统是一个典型的小型信号处理系统,它要用数字方法产生模拟信号并进行传输,其中还用到了D/A变换器;在接收端用A/D变换器将其转换成数字信号,并进行数字信号处理与识别。为了系统的检测速度并降低成本,还开发一种特殊的DFT算法,称为戈泽尔(Goertzel)算法,这种算法既可以用硬件(专用芯片)实现,也可以用软件实现。下面首先介绍双音多频信号的产生方法和检测方法,包括戈泽尔算法,最后进行模拟实验。下面先介绍电话中的DTMF信号的组成。
在电话中,数字0~9的中每一个都用两个不同的单音频传输,所用的8个频率分成高频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz和941Hz;高频带也有四个频率:1209Hz,1336Hz,1477Hz和1633Hz.。每一个数字均由高、低频带中各一个频率构成,例如1用697Hz和1209Hz两个频率,信号用
示,其中,。这样8个频率形成sin(2,ft),sin(2,ft)f,679Hzf,1209Hz1212
16种不同的双频信号。具体号码以及符号对应的频率如表1所示。表中最后一列在电话中暂时未用。
表1 双频拨号的频率分配
1209H1336H1477633H
z z Hz z 列
行
6971 2 3 A
Hz
770 4 5 6 B
Hz
- 3 -
852 7 8 9 C
Hz
942 * 0 # D
Hz
DTMF信号在电话中有两种作用,一个是用拨号信号去控制交换机接通被叫的用户电话机,另一个作用是控制电话机的各种动作,如播放留言、语音信箱等。 2课程设计题目描述和要求
DTMF(Double Tone Multi Frequency,双音多频)信号是音频电话拨号信号,由美国AT&T贝尔实验室开发。作为实现电话号码快速可靠传输的一种技术,它具有很强的抗干扰能力和较高的传输速度,因此,可广泛用于电话通信系统中。但绝大部分是用作电话的音频拨号。另外,它也可以在数据通信系统中广泛地用来实现各种数据流和语音等信息的远程传输。
这种拨号方法取代了脉冲拨号,在DTMF 通信系统中共有8 个频率,分为4 个高频音和4 个低频音. 用1 个高频音和1 个低频音的组合来表示一个信号. 这样,共能提供16 种组合,分别代表16 种信号. 图一为电话按键与信号频率的对应关系。
679HZ 1 2 3 A
4 5 6 B 770HZ 行
频
率 852HZ 7 8 9 C
0 # D 941HZ *
A
1290HZ 1366HZ 1477HZ 1633HZ
列 频 率
图一 DTMF编码
各种DTMF信号的应用都离不开DTMF信号的检测,这是DTMF信号应用的关键。对它的检测,主要通过数字信号处理的算法以及硬件实现。本文主要通过
- 4 -
MATLAB的软件编程来实现DTMF信号的仿真检测,从频域分析了快速傅立叶变换(FFT)和GOERTZEL两种方法,并对GOERTZEL算法进行了详细的推导,提出采用Goertzel 算法来实现DTMF 信号的检测。
3课程设计报告内容
3.1信号的产生及算法实现
DTMF编码, 是将电话拨号盘上的数字0, 9, 字母A,D,及*/E、#/F, 共16 个字符, 用音频范围的8 个频率表示出来。具体来说, 将8个频率分为高频群和低频群两组, 分别作为列频和行频。每一个键的频率模式由来自于列频和行频的两个频率叠加而成。DTMF 信号所规定的指标是: 传送/接收率为每秒10 个数字, 或每个数字100m s。每个数字传送过程中, 信号必须存在至少45 ms, 且不得多于55ms, 100ms 里的其余时间是静音。
)、DTMF信号的产生 1
假设时间连续的 DTMF信号用表示,式中x(t),sin(2,ft),sin(2,ft)f和f1212是按照表1选择的两个频率,代表低频带中的一个频率,代表高频带中的ff12
一个频率。显然采用数字方法产生DTMF信号,方便而且体积小。下面介绍采用数字方法产生DTMF信号。规定用8KHz对DTMF信号进行采样,采样后得到时域离散信号为
x(n),sin(2,fn/8000),sin(2,fn/8000)12
形成上面序列的方法有两种,即计算法和查表法。用计算法求正弦波的序列值容易,但实际中要占用一些计算时间,影响运行速度。查表法是预先将正弦波的各序列值计算出来,寄存在存储器中,运行时只要按顺序和一定的速度取出便可。这种方法要占用一定的存储空间,但是速度快。
因为采样频率是8000Hz,因此要求每125ms输出一个样本,得到的序列再送到D/A变换器和平滑滤波器,输出便是连续时间的DTMF信号。DTMF信号通过电话线路送到交换机。
2)、DTMF信号的检测
- 5 -
检测中采用了频域的方法,N 点数据的DFT公式为:
N,1knX(k),DFT[x(n)],x(n)W,N n,0
k,0,1,...,N,1
它的好处是可以得到DFT的所有N 点的值。也就是通过DFT可以计算出信号中所包含的频率成分。具体实现时,由于它的计算量非常大,因而主要使用它的
[3,4]快速算法——快速傅立叶变换(FFT)。
对上述产生的DTMF信号,经过200点FFT运算得到DTMF信号的频谱X(K)(如图二所示)。根据结果中两条谱线的位置K值可知其频率分别为820HZ和1290HZ,即对应了电话号码盘的数字“7”。从图中可以看出,FFT运算中出现了两个问题:1、由于数据的截断,带来了频谱泄漏误差;2、通过FFT运算,计算出了200点的频谱,而DTMF信号只需8个频率点,计算效率大大降低。
[5]为解决这个问题,文中采用了GOERTZEL算法。
图二 “7”的DTMF编码FFT频谱
GOERTZEL算法本身也是对DFT的快速运算,但可以有选择地计算个别点处的DFT,而对不需要的点不进行计算。
GOERTZEL算法原理如下:
GOERTZEL算法实质是一个两极点的IIR滤波器,其算法原理框图如图三所示:
- 6 -
Y(n) X(n) V (n) kk
k ,wN
图三 GOERTZEL算法原理框图 由图可知:
2k,v(n),x(n),2cos()v(n,1),v(n,2)0,n,NkkkN 2,,jkNX(k),y(N),v(N),ev(N,1)kkk
具体推导如下:
N,1k(n,N) X(k),x(n)W(DFT),Nn,0
令n=m
N,1,knk(m,N)X(k),x(m)W=(n=N) XnW(),,NNm,0
,kn所以对序列X(n)的DFT等价于X(n)与系统传递函数的第N个卷hnW(),N积值.
,kn对进行Z变换可得: hnW(),N
- 7 -
1k,11= Hz,()(1,WZ),,k1N,WZ1,2,1,2n1,2Zcosk,ZN因此, H(z)可看作是级联型网络:
1Hz, ()12,,1,2,Zk,Z12cosN
k,1 HzWZ()(1),,2N
因此
2, V(n),2coskV(n,1),V(n,2),X(n)N
其中V(-1)=V(-2)=0.
k. ynVnWVn()()(1),,,N
因而,系统输出的功率谱为:
2,222 其中n = N y(n),v(n),v(n,1),2cos(k)v(n)v(n,1)N
图四 “7”的DTMF编码GOERTZEL功率谱 根据以上算法,使用MATLAB语言具体实现,程序如下:
k=f/fn;
- 8 -
vk(1)=0;
vk(2)=0;
for i1=1:8
w=2*cos(2*pi*k(i1)/N);
for i2=3:202
vk(i2)=w.*vk(i2-1)-vk(i2-2)+x(i2);
end;
Xk(i1)=vk(202).^2+vk(201).^2-w*vk(202)*vk(201);
end;
程序运行结果如图四所示。从图中可以看出,利用GOERTZEL算法,只需计算出八个点的功率谱就可以进行拨号的判断,减少了运算量,提高了计算效率,使判断可以实时进行。
3.2详细设计
仿真界面图
DTMF信号的产生与识别仿真实验在MATLAB环境下进行,编写仿真程序,运行程序,送入8位电话号码,程序自动产生每一位号码数字相应的DTMF信
- 9 -
号,并送出双频声音,再用DFT进行谱分析,显示每一位号码数字的DTMF信号的DFT幅度谱,安照幅度谱的最大值确定对应的频率,再安照频率确定每一位对应的号码数字,最后输出8位电话号码,程序名为exp8。
程序分四段:第一段(2—7行)设置参数,并读入8位电话号码;第二段(9—20行)根据键入的6位电话号码产生时域离散DTMF信号,并连续发出8位号码对应的双音频声音;第三段(22—25行)对时域离散DTMF信号进行频率检测,画出幅度谱;第四段(26—33行)根据幅度谱的两个峰值,分别查找并确定输入8位电话号码。根据程序中的注释很容易分析编程思想和处理算法。程序清单如下:
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,1477,1633]; % 列频率向量
TN=str2num(get(handles.edit1,'string')); % 输入8位数字
TNr=0; %接收端电话号码初值为零
%figure(1)
for m=1:8;
d=fix(TN/10^(8-m));
TN=TN-d*10^(8-m);
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); % 发出声音
pause(0.1)
- 10 -
% 接收检测端的程序
X=goertzel(x(1:N),K+1); % 用Goertzel算法计算八点DFT样本
val = abs(X); % 列出八点DFT向量
%hw=handles.axes1;
%plot(val,'parent',hw);
subplot(4,2,m);
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-4)*10^(8-m);
set(handles.edit2,'string',num2str(TNr));
end
3.3结果分析
运行程序,根据提示键入8位电话号码12345678,回车后可以听见8位电话号码对应的DTMF信号的声音,并输出相应的8幅频谱图如图五所示,左上角的第一个图在k=18和k=31两点出现峰值,所以对应第一位号码数字1。最后显示检测到的电话号码12345678。
- 11 -
图五 频谱图
序列的N点DFT是对序列频谱函数在0,区间的N点等间隔采样,如果2,
是一个周期序列,截取周期序列的整数倍周期,进行DFT,其采样点刚好在周期信号的频率上,DFT的幅度最大处就是信号的准确频率。分析这些DTMF信号,不可能经过采样得到周期序列,因此存在检测频率的准确性问题。
- 12 -
总结
通过本次课程设计我学会了使用MATLAB语言实现DTMF的编解码。在做实训的过程中,也学到了很多,懂得了团队合作的精神。
在做MATLAB界面,做好以后同时会产一个M文件,只要把代码编写在对应的控件中即可以方便的实现仿真。试验结果表明基于MATLAB 的DTMF 编解码具有速度快、精度高、稳定性好以及便于灵活应用等特点。而利用MATLAB语言,可以较好地、快速地进行算法的仿真。
我要感谢我的老师和同学们在课程设计上给予我的指导、和帮助,感谢网络帮我解决了许多技术上的难题,让我能把信息处理实训做得更好。期间,我不仅学到了许多新的知识,而且也开阔了视野,提高了自己的设计能力。
- 13 -
实验成绩评定表
操作成综合成序号 实验名称 备注 绩 绩
1
2
3
4
5
6
7
8
9
10
实验方法:?有创新 ?有改进 ?有缺陷 ?合理 实验结果:?正确 ?有误 ?假设条件不严格 数据处理:?数据可靠 ?计算有误 ?无数据 ?不合理 评
图表安排: ?图 与表 重复 ?图 表 与文不符 语 ?图 与表 可合并 ?图 表 需重制
及 ?图 与表 可删去 ?图 表 不清晰
综 ?图 与表 标注不规范 ?其他 实验报告文字:?简明通顺 ?重复冗长 ?逻辑性差 合
?有语病 ?汉字、标点不规范 成 实验态度:?好 ?较好 ?一般 ?差
绩 总体评价:?优秀 ?良好 ?中 ?及格 ?不及格
指导教师: 年 月 日
班级:2009045202 学号:38 姓名:熊世华