双音多频信号由于具有抗干扰性强和高速率传输的优点,在世界范围内使用在按键式电话机上。近年来,DTMF信号也应用在交互式控制中,诸如语言菜单、语言邮件、电话银行和ATM终端以及VOIP系统中,研究其在 MATLAB下的仿真实现,有助于其具体系统的优化设计。
本文首先阐述了DTMF信号的原理,介绍了在MATLAB仿真软件中产生的DTMF信号的方法,对GEORTZEL算法和快速傅里叶变换法提取的频谱方面的性能进行分析比较。本文仿真时采用GEORTZEL算法,在白噪声的环境下对输入的DTMF信号提取频谱信息,即所谓的检测过程。
本文还用MATLAB的图形控制语句“uicontrol”创建一个按键“pushbutton”的DTMF信号的模拟键盘。发声部分的程序是按照国际标准规定的双音多频拨号系统的频率,每个按键对应低音频组的一个频率和高音频组的一个频率,即每按一键发出特定的双音,并且在频谱图上显示相应的双频。
DTMF,由高频群和低频群组成,高低频群各包含4个频率。一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。DTMF信令有16个编码。利用DTMF信令可选择呼叫相应的对讲机同时,双音多频信号是电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。脉冲拨号需要电信局中的操作员手工完成长途接续。
双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209赫兹(Hz)。交换机可以解码这些频率组合并确定所对应的按键。
DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。
表2-1 数字或功能键组合表
行频 列频 |
1209Hz |
1336Hz |
1477Hz |
1633Hz |
697Hz |
1 |
2 |
3 |
A |
770Hz |
4 |
5 |
6 |
B |
852Hz |
7 |
8 |
9 |
C |
941Hz |
* |
0 |
# |
D |
DTMF 是用两个特定的单音频组合信号来代表数字信号以实现其功能的一种编码技术。两个单音频的频率不同,代表的数字或实现的功能也不同。这种电话机中通常有16 个按键, 其中有10 个数字键0~9 和6 个功能键*、#、A、B、C、D。由于按照组合原理,一般应有8 种不同的单音频信号。因此可采用的频率也有8 种,故称之为多频,又因它采用从8 种频率中任意抽出2 种进行组合来进行编码,所以又称之为“8 中取2”的编码技术。
根据 CCITT 的建议,国际上采用的8个频率为:687Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz 和1633Hz。用这8 个频率可形成16 种不同的组合,从而代表16 个不同的数字或功能键,具体组合见表2-1。
假设时间连续的DTMF信号用x(t)=sin(2*pi*n*f1)+sin(2*pi*n*f2)表示,式中的f1和f2是按照表2-1中的两个频率,f1代表低频带频率中的一个,f2代表高频带频率中的一个。显然采用数字的方法产生DTMF信号,方便而且体积小。下面介绍用数字方法产生DTMF信号。规定用8kHz对DTMF信号进行采样,采样后得到的时域离散信号为:
x(t)=sin(2**n*f1/8000)+sin(2**n*f2/8000) (3-1)
形成上面序列有两种方法,一种是计算法,另一种是查表法。用计算法求正弦波序列值容易,但实际中要占用一些计算时间,影响运行速度。查表法是预先将正弦波的各序列值计算出来,存放在存储器中,运行时只要按顺序和一定的速度取出即可。这种方法要占用一定的存储空间,但是速度快。
采样频率是8kHz,因此要求每125ms输出一个样本,得到的序列再送到D/A变换器,它的输出经过平滑滤波便是连续时间的DTMF信号。DTMF信号再送到交换机。
在接收端,要对收到的双音多频信号进行检测,即检测两个正弦波频率,以判读对应的十进制数字或符号。显然这里可以用数字方法进行检测,因此要将收到的时间连续DTMF信号经过A/D变换,变成数字信号再进行检测。在这里我们用戈泽尔算法对信号进行检测。
产生、检测流程图如上图3-1所示。
具体程序分析如下:
程序分4段:
1. 设置参数,并读入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=input('输入8位电话号码=') %输入8位数字
TNr=0; %接收端电话号码初值为0
2. 根据输入的8位电话号码产生时域离散DTMF信号,并连续发出8位号码对应的双音多频音;
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 %检测与第m位号码相符的列号
end
if tm(p,q)==abs(d);break,end %检测与第m位号码相符的行号
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)
3. 对时域离散DTMF信号进行频率检测,画出幅度谱;
X=goertzel(x(1:N),K+1);
val=abs(X)
subplot(4,2,m);stem(K,val,'.');grid;xlabel('k');ylabel('|X(k)|')
4.根据幅度谱的两个峰值,分别查找并确定输入的8位电话号码;
limit=80; %基频检测门限为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) %表示成为一个8位数
end
disp('接收端检测到的号码为:')
disp(TNr)
在键盘上输入56784321,按回车,听到8声短音后,看到图像,如图3-2:
图3-2 系统显示结果