Hefei University课程论文(设计)BACH ELOR DISSERTATION设计名称:电话拨号音的识别指导教师:胡学友班级: 12电子专升本 _姓名:常琦 ___________杨浩 __________陶翠玲 ________日期: 2013年12月3日目录第一章Matlab仿真1.1简介1.2基本原理1.3具体内容1.3.1 图形电话拨号面板的制作1.3.2 DTMF信号的产生合成1.3.3 DTMF信号的检测识别1.3.4 仿真结果---数字“8”的模拟第二章实际电路2.1用到的芯片2.2接线电路第三章总结致谢参考文献附录第一章 Matlab仿真1.1简介基于对电话通信系统中拨号音识别的仿真实现,主要涉及到电话拨号音识别的基本原理和主要方法,利用 MATLAB 软件以及 FFT 算法实现对电话通信系统中拨号音的识别。
实验目的是:能够利用矩阵不同的基频合成 0 - 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出号码数字的过程。
进一步利用 GUI 做出简单的图形操作界面。
从而实现对电话拨号音系统的简单的计算机仿真。
1.2基本原理双音多频 DTMF(Dual Tone Multi Frequency),由高频群和低频群组成,高低频群各包含4个频率。
一个高频信号和一个低频信号叠加组成一个组合信号,代表一个数字。
DTMF信令有16个编码。
双音多频信号是贝尔实验室发明的,其目的是为了自动完成长途呼叫。
双音多频的拨号键盘是4×4的矩阵,每一行代表一个低频,每一列代表一个高频。
每按一个键就发送一个高频和低频的正弦信号组合,比如'1'相当于697和1209赫兹(Hz)。
交换机可以解码这些频率组合并确定所对应的按键。
DTMF编解码器在编码时将击键或数字信息转换成双音信号并发送,解码时在收到的DTMF信号中检测击键或数字信息的存在性。
一个DTMF信号由两个频率的音频信号叠加构成。
这两个音频信号的频率来自两组预分配的频率组:行频组或列频组。
每一对这样的音频信号唯一表示一个数字或符号。
电话机中通常有16个按键,其中有10个数字键0~9和6个功能键*、#、A、B、C、D。
由于按照组合原理,一般应有8种不同的单音频信号。
因此可采用的频率也有8种,故称之为多频,又因它采用从8种频率中任意抽出2种进行组合来进行编码,所以又称之为“8中取2”的编码技术。
根据CCITT的建议,国际上采用的多种频率为697Hz、770Hz、852Hz、941Hz、1209Hz、1336Hz、1477Hz和1633Hz等8种。
用这8种频率可形成16种不同的组合,从而代表16种不同的数字或功能键,具体组合见下表。
表一:DTMF 的组合功能1.3具体内容1.3.1图形电话拨号面板的制作利用GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。
其中选用我们熟悉的 10 个数字键 0 — 9 ,2 个功能键“ * ”、“#”,另四个键省略。
按照图 1 电话机键盘矩阵的排列方式制作四行三列的按键控件。
每个按键可用( Push Button )添加。
然后,为了更直观的反映对应的按键号码,可以设置一个编辑框,用于动态的显示拨号号码,模拟实际电话的拨号显示窗口。
编辑框可用( Edit Text )添加。
另外,为了图形电话拨号面板的简洁美观,可以添加空白区域作为背景,并用静态文本框制作文字信息。
背景可用( Frame )添加,静态文本框可用( Static Text )添加。
最终利用 GUI 图形用户界面设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,如下图所示。
这里将其保存为tu1.fig文件。
1.3.2 DTMF 信号的产生合成现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对 tu1.m 文件进行编辑。
其主要的功能是使对应的按键,按照表 1 的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。
此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。
鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。
以便区别连续的两个按键信号。
间隔的静音信号也是在按键时产生的。
1.3.3 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);程序解释:确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率,而做FFT的N=2048,则频谱分辨率为,由此可算出频谱图上任意点对应的频率。
例如,数字8的高、低端频率为,则在谱图上对应的点。
Goertzel算法实现:Goertzel基本算法在每次采样后立即进行处理,在每个第N次采样进行一次音调检测。
在采用FFT算法时,我们要对成块的采样进行处理,但这并不意味着必须按块来处理数据。
数字处理的时间很短,因此如果每次采样都存在一次中断,那么这些数字处理完全可以在中断服务程序(ISR)内完成。
或者,如果系统中存在采样缓存,那么可以持续采样,然后进行批处理。
在真正运行Goertzel算法之前,必须进行下面的初步计算:a. 决定采样率;b. 选择块大小,即N;c. 预先进行一次余弦和正弦计算;d. 预先计算一个系数。
这些计算均可以预先完成,然后硬编码到程序中,从而节省RAM和ROM空间,也可以动态方式计算。
选择合适的采样率实际上,采样率可能已经由应用本身决定了。
例如,在电信应用中普遍采用8kHz的采样率,即每秒8,000个采样。
又如,模数转换器(或编解码器)的工作频率可能是由一个我们无法控制的外部时钟或外部晶振决定。
但如果我们可以选择采样率,那么就必须遵循奈奎斯特采样定理:采样率至少不低于最高信号频率的两倍。
这是是因为如果我们要检测多个频率,那么采用更高的采样率可能会得到更好的结果。
而且我们都希望采样率与每一个感兴趣的频率之间均呈整数倍关系。
块大小的设置Goertzel算法中的块大小N与相应的FFT中的点数类似,它控制了频率分辨率的大小。
例如,若采样率为8kHz,而N为100个采样,那么频率分辨率就是80Hz。
这就可能使我们为了获取最大的频率分辨率而尽量将N取高。
然而N越大,检测到每个音调所需的时间就越多,因为我们必须等所有这N个采样都完成后才能开始处理。
例如,采样率为8kHz时,累积800个采样需要100ms。
若想缩短检测音调的时间,就必须适当调整N的值。
影响N的选择的另一个因素是采样率和目标频率之间的关系。
比较理想情况是目标频率在相应的频率分辨率的中点范围内,也就是说,我们希望目标频率是sample_rate/N比值的整数倍。
值得庆幸的是,Goertzel算法中的N与FFT 中不同,不必是2的整数次幂。
预计算常数在采样率和块大小确定之后,只须通过下面5个简单的计算来得出处理时所需要的常数:k = (N*target_freq)/sample_tatew = (2*π/N)*kcosine = cos wsine = sin wcoeff = 2 * cosine每一次采样处理中都需要3个变量,我们称其为Q0'、Q1'和Q2。
Q1是前一次采样处理的Q0值,Q2是在两次采样前的Q0值(或Q1在本次采样前的值)。
在每个采样块的开始时,都必须将Q1和Q2初始化为0。
每个采样都需要按照下面三个等式进行计算:Q0 = coeff * Q1 - Q2 + sampleQ2 = Q1Q1 = Q0在进行N次预采样计算之后,可以检测到音调是否存在。
real = (Q1 - Q2 * cosine)imag = (Q2 * sine)magnitude2 = real2 + imag2这时只需进行一次简单的幅度门限测试就可以判断出是否有音调存在。
之后,将Q2和Q1复位到0,开始下一个块的处理。