当前位置:文档之家› DTMF 电话拨号音的合成与识别

DTMF 电话拨号音的合成与识别

辽宁工业大学通信综合设计课程设计(论文)题目:电话拨号音的合成与识别院(系):电子与信息工程学院专业班级:学号:08学生姓名:指导教师:***教师职称:讲师起止时间:2011.12.23-2012.01.06通信综合设计与制作(论文)任务及评语目录第1章电话拨号音合成与识别的目的及原理 (1)1.1电话拨号音合成与识别的目的 (1)1.2 电话拨号音合成与识别的原理 (1)第2章图形接口的制作及仿真 (2)2.1 关于MATLAB (2)2.2 gui图形接口功能模块的设计与仿真 (2)2.3 DTMF 信号的产生合成 (3)2.4 DTMF信号的检测识别仿真 (5)第3章按键的频率响应 (7)设计总结: (10)参考文献: (11)第1章电话拨号音合成与识别的目的及原理1.1电话拨号音合成与识别的目的1876年,贝尔发明电话,对通讯事业的发展做出巨大贡献,被载入史册,电话通讯便注定要成为人们生活中的一部分,而其中最基本的一项功能,拨号该如何来产生呢?如果只用单一的频率来表示某个按键被按下,那么在以前电子元器件的精度极不稳定的情况下,出现偏差的肯能性极大,即使在今天,也很难达到万无一失,于是这就催生了另外一种想法,如果同时用两种频率来表示一个按键信号,既二维矩阵的模式,增大频率之间的间隔,适当放宽误差范围,那么通过这种方法合成的拨号音,出现拨号音识别错误的可能性便会大大降低。

也正是因为这个优点,所以现在国际上普遍采用双音多频(DTMF)的编译码方法,其原理将在下一节中介绍。

1.2 电话拨号音合成与识别的原理基于对电话通信系统中拨号音合成与识别的仿真实现其主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 FFT 算法实现对电话通信系统中拨号音的合成与识别。

能够利用矩阵不同的基频合成 0-9不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。

进一步利用 GUI 做出简单的图形操作接口,要求接口清楚,画面简洁,易于理解,操作简单。

从而实现对电话拨号音系统的简单的计算机仿真。

双音多频 DTMF(Dual Tone Multi Frequency),由高频群和低频群组成,高低频群各包含4个频率。

一个高频信号和一个低频信号迭加组成一个组合信号,代表一个数字。

DTMF信令有16个编码。

利用DTMF信令可选择呼叫相应的对讲机。

双音多频信号(DTMF),电话系统中电话机与交换机之间的一种用户信令,通常用于发送被叫号码。

在使用双音多频信号之前,电话系统中使用一连串的断续脉冲来传送被叫号码,称为脉冲拨号。

脉冲拨号需要电信局中的操作员手工完成长途接续。

双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。

双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。

每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209赫兹(Hz)。

交换机可以译码这些频率组合并确定所对应的按键。

在本次课程设计中,由于只是简单的模拟电话键盘拨号音的合成与识别,所以只采用电话键盘上常用的按键,数字0~9,及功能按键*,#。

DTMF编译码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。

一个DTMF信号由两个频率的音频信号迭加构成。

这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。

每一对这样的音频信号唯一表示一个数字或符号。

电话机中通常有16个按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。

由于按照组合原理,一般应有8种不同的单音频信号。

因此可采用的频率也有8种,故称之为多频,又因它采用从8种频率中任意抽出2种进行组合来进行编码,所以又称之为“8中取2”的编码技术。

根据CCITT的建议,国际上采用的多种频率为687Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。

用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键,具体组合见表1-1。

表 1-1 DTMF 的组合功能第2章图形接口的制作及仿真2.1 关于MATLABMATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。

其功能之强大让人叹为观止,在此郑重向软件制作团队致敬!2.2 gui图形接口功能模块的设计与仿真图形电话拨号面板的制作是利用 GUI 图形用户接口设计工具制作电话拨号面板,把DTMF 信号和电话机的键盘矩阵对应起来。

其中选用我们熟悉的 10 个数字键 0 — 9 , 2 个功能键“ * ”、“#”,另四个键省略。

按照图 1 电话机键盘矩阵的排列方式制作四行三列的按键控件。

每个按键可用( Push Button )添加。

然后,为了更直观的反映对应的按键号码,可以设置一个编辑框,用于动态的显示拨号号码,模拟实际电话的拨号显示窗口。

编辑框可用( Edit Text )添加。

另外,为了图形电话拨号面板的简洁美观,可以添加空白区域作为背景,并用静态文本框制作文字信息。

背景可用( Frame )添加,静态文本框可用( Static Text )添加。

最终利用 GUI 图形用户接口设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,如图3-1所示。

这里将其保存为num.fig文件。

图3-1 电话拨号音面板2.3 DTMF 信号的产生合成现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对num.m 檔进行编辑。

其主要的功能是使对应的按键,按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的迭加输出。

此外,对于图形接口的需要,还要使按键的号码数字显示在拨号显示窗口中。

鉴于 CCITT 对 DTMF 信号规定的指针,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。

以便区别连续的两个按键信号。

间隔的静音信号也是在按键时产生的。

以按键 0 为例,简单介绍拨号音产生的过程:% 按键 0 的响应函数function varargout = pushbutton0_Callback(h, eventdata, handles, varargin)n=[1:1000]; % 每个数字 1000 个采样点表示d0=sin(0.7217*n)+sin(1.0247*n); % 对应行频列频迭加 n0=strcat(get(handles.edit1,'string'),'0'); % 获取数字号码 set(handles.edit1,'string',n0); % 显示号码 space=zeros(1,100); %100 个 0 模拟静音信号 global NUM phone=[NUM,d0];NUM=[phone,space]; % 存储连续的拨号音信号 wavplay(d0,8192); % 产生拨号音 程序解释:NUM 为定义的全局变量,用于存储连续的拨号音( DTMF )信号,包括数字信号音以及静音信号。

D0=sin(0.7217*n)+sin(1.0247*n) 中的行频与列频是由表 1 中 0 键对应的Hz f L 941=,Hz f H 1336=计算得出,已知声音取样频率 Hz f s 8192=,则取样后7217.0/2==s L L f f πω,0247.1/2==s H H f f πω。

对于保留的两个功能键“ * ”“#”,按照现行键盘式拨号电话的习惯,将“ * ”作为删除键,“#”作为确认键。

“ * ”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元 NUM 中退回一位拨号音信号和静音信号。

删除可以进行连续的操作。

“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元 NUM 中的信号即为最后用于识别的连续拨号音 DTMF 信号,并在显示窗口中显示“#”号作为标记。

% 删除键的响应函数function varargout = pushbuttonback_Callback(h, eventdata, handles, varargin) n=[1:1000];num=get(handles.edit1,'string'); l=length(num);n11=strrep(num,num,num(1:l-1)); %去掉末尾号码在面板上的显示d11=sin(0.7217*n)+sin(0.9273*n);set(handles.edit1,'string',n11);global NUML=length(NUM);NUM=NUM(1:L-1100); %删除末尾号码在拨号音信号中的存储wavplay(d11,8192);2.4 DTMF信号的检测识别仿真要实现电话拨号音( DTMF )信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。

这里采用 FFT 算法对信号进行译码分析。

首先对接收到的数字信号作 FFT 分析,计算出其幅频谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。

对于连续的双音多频( DTMF )信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用 FFT 算法对信号进行译码分析。

MATLAB 实现信号音的识别如下:% 信号音识别 ---------------------------------------------------------------- function varargout = pushbuttonNUM_Callback(h, eventdata, handles, varargin) global NUMwavplay(NUM,8192);L=length(NUM);n=L/1100;number='';for i=1:nj=(i-1)*1100+1;d=NUM(j:j+999); % 截取出每个数字f=fft(d,2048); % 以 N=2048 作 FFT 变换a=abs(f);p=a.*a/10000; % 计算功率谱num(1)=find(p(1:250)==max(p(1:250))); % 找行频num(2)=300+find(p(300:380)==max(p(300:380))); % 找列频if (num(1) < 180) row=1; % 确定行数elseif (num(1) < 200) row=2;elseif (num(1) < 220) row=3;else row=4;endif (num(2) < 320) column=1; % 确定列数elseif (num(2) < 340) column=2;else column=3;endz=[row,column]; % 确定数位if z==[4,2] tel=0;elseif z==[1,1] tel=1;elseif z==[1,2] tel=2;elseif z==[1,3] tel=3;elseif z==[2,1] tel=4;elseif z==[2,2] tel=5;elseif z==[2,3] tel=6;elseif z==[3,1] tel=7;elseif z==[3,2] tel=8;elseif z==[3,3] tel=9;endt(i)=tel;c=strcat(number,int2str(tel)); number=c;i=i+1;endset(handles.edit3,'string',number); 程序解释:确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率8192Hzsf=,而做FFT的N=2048,则频谱分辨率为/8192/20484HzsF f N===,由此可算出频谱图上任意点对应的频率/K f F = 。

相关主题