您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > DSP_实验9_电话拨号音的合成与识别
武汉大学教学实验报告电子信息学院通信工程专业2015年_10月10日实验名称电话拨号音的合成与识别指导教师卢昕姓名莫帮杰年级2013学号2013301200227成绩一、预习部分1.实验目的2.实验基本原理3.主要仪器设备(含必要的元器件、工具)一、实验目的本实验基于对电话通信系统中拨号音合成与识别的仿真实现,主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用MATLAB软件以及FFT算法实现对电话通信系统中拨号音的合成与识别。并进一步利用MATLAB中的图形用户界面GUI制作简单直观的模拟界面。使其对电话通信系统拨号音的合成与识别有个基本的了解。能够利用矩阵不同的基频合成0-9不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。进一步利用GUI做出简单的图形操作界面。要求界面清楚,画面简洁,易于理解,操作简单。从而实现对电话拨号音系统的简单的实验仿真。二、实验基本原理双音多频DTMF(DualToneMulti-Frequency)信号,是用两个特定的单音频率信号的组合来代表数字或功能。在DTMF电话机中有16个按键,其中10个数字键0—9,6个功能键*、#、A、B、C、D。其中12个按键是我们比较熟悉的按键,另外由第4列确定的按键作为保留,作为功能键留为今后他用。根据CCITT建议,国际上采用697Hz、770Hz、852Hz、94lHz低频群及1209Hz、1336Hz、1477Hz、1633Hz高频群。从低频群和高频群任意各抽出一种频率进行组合,共有16种组合,代表16种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如表1所示。三、主要仪器设备MATLAB(软件)涉及的MATLAB函数1.Set功能:设置对象属性。基本调用格式:set(H,'PropertyName',PropertyValue,...)用属性值'PropertyValue'设置关于用参量H标志的对象(一个或个)的属性名'PropertyName'(一个或多个)。H可以为一句柄的向量。在这种情形下,命令set可以设置所有对象的属性值。2.find功能:找出矩阵X中非0项的坐标和取值。基本调用格式:[row,col]=find(X,...)常与逻辑运算法一起使用,可进一步明确搜索数值的范围。3.disp功能:显示文本或数组。基本调用格式:disp(X)4.struct功能:创建一个结构体数组。基本调用格式:s=struct('field1',values1,'field2',values2,...)给每一个域名赋值,赋值可以为矢量也可以为标量,但是矢量必须有相同的维数。3、实验操作部分1.实验数据、表格及数据处理2.实验操作过程(可用图表示)3.实验结论一、实验过程1.图形电话拨号面板的制作利用GUI图形用户界面设计工具制作电话拨号面板,把DTMF信号和电话机的键盘矩阵对应起来,如下图所示。2.DTMF信号的产生合成现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对tu1.m文件进行编辑。其主要的功能是使对应的按键,按照表1的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。鉴于CCITT对DTMF信号规定的指标,这里每个数字信号取1000个采样点模拟按键信号,并且每两个数字之间用100个0来表示间隔来模拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键时产生的。以按键0为例,简单介绍拨号音产生的过程:%按键0的响应函数functionvarargout=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模拟静音信号globalNUMphone=[NUM,d0];NUM=[phone,space];%存储连续的拨号音信号wavplay(d0,8192);%产生拨号音程序解释:NUM为定义的全局变量,用于存储连续的拨号音(DTMF)信号,包括数字信号音以及静音信号。d0=sin(0.7217*n)+sin(1.0247*n)中的行频与列频是由表1中0键对应的𝑓𝐿=941Hz,𝑓𝐻=1336HZ计算得出,已知声音取样频率𝑓𝑠=8192HZ,则取样后对于保留的两个功能键“*”“#”,按照现行键盘式拨号电话的习惯,将“*”作为删除键,“#”作为确认键。“*”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元NUM中退回一位拨号音信号和静音信号。删除可以进行连续的操作。“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元NUM中的信号即为后用于识别的连续拨号音DTMF信号,并在显示窗口中显示“#”号作为标记。%删除键的响应函数functionvarargout=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);globalNUML=length(NUM);NUM=NUM(1:L-1100);%删除末尾号码在拨号音信号中的存储wavplay(d11,8192);3.DTMF信号的检测识别要实现电话拨号音(DTMF)信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。这里采用FFT算法对信号进行解码分析。首先对接收到的数字信号作FFT分析,计算出其幅度谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。对于连续的双音多频(DTMF)信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT算法对信号进行解码分析。MATLAB实现信号音的识别如下:%信号音识别---------------------------------------------------------------functionvarargout=pushbuttonNUM_Callback(h,eventdata,handles,varargin)globalNUMwavplay(NUM,8192);L=length(NUM);n=L/1100;number='';fori=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;64elseif(num(1)220)row=3;elserow=4;endif(num(2)320)column=1;%确定列数elseif(num(2)340)column=2;elsecolumn=3;endz=[row,column];%确定数字ifz==[4,2]tel=0;elseifz==[1,1]tel=1;elseifz==[1,2]tel=2;elseifz==[1,3]tel=3;elseifz==[2,1]tel=4;elseifz==[2,2]tel=5;elseifz==[2,3]tel=6;elseifz==[3,1]tel=7;elseifz==[3,2]tel=8;elseifz==[3,3]tel=9;endt(i)=tel;c=strcat(number,int2str(tel));number=c;i=i+1;endset(handles.edit3,'string',number);程序解释:确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率𝑓𝐿=8192Hz,而做FFT的N=2048,则频谱分辨率为,由此可算出频谱图上任意点对应的频率。例如,数字8的高、低端频率为则在谱图上对应的点。二、思考题1.打印出一个数字拨号音的频谱图,加以分析说明,并解释DTMF信号的检测识别的原理。数字拨号音‘1’的频谱图如图1,已知输入信号的取样频率8192Hzsf。而做FFT的N=2048,则频谱分辨率为4Hz8192/2048/NfFs,由此可算出频谱图上任意点对应的频率FfK/。数字‘1’的高、低端频率为1209HzHf、Hz976Lf,则在谱图上对应的点302/FfKHH,174/FfKLL。显然在频谱图中可以观察到点174和点302处分别出现了一个峰值。图1:拨号音‘1’频谱图2.DTMF信号的检测识别的原理要实现电话拨号音(DTMF)信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。这里采用FFT算法对信号进行解码分析。首先对接收到的数字信号作FFT分析,计算出其幅度谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。对于连续的双音多频(DTMF)信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用FFT算法对信号进行解码分析。3.添加功能键,实现号码的预存储和来电识别。考虑不同位数号码的存储实现。设计面板如下图,程序当中预存储了3个号码,在‘#’号确认键程序中DTMF信号识别成功以后,添加如下代码,将识别的号码与电话本进行匹配:图2GUI面板预存储程序:globalBOOK;%定义全局电话薄BOOK{1}='10086';%预存号码BOOK{2}='ChinaMobile';BOOK{3}='10000';BOOK{4}='ChinaTelecom';BOOK{5}='10010';BOOK{6}='ChinaUnion';sum=length(BOOK);temp=number;%识别出的号码forj=1:sum-1if(strcmp(BOOK{j},number))%与电话本中的号码匹配temp=BOOK{j+1};endj=j+2;endset(handles.edit2,'string',temp);%在确认栏显示名称例如输入‘10000’,按‘#’确认后,运行结果如图3图3来电显示储存新联系人的步骤是在拨号栏内输入号码,在确认栏内输入名称,点击储存即可,储存键的回调函数如下:functionpushbutton13_Callback(hObject,eventdata,handles)num=get(handles.edit1,'string');%获取号码name=get(handles.edit2,'string');%获取名称globalBOOK;sum=length(BOOK);BOOK{sum+1}=num;%存入新联系人BOOK{sum+2}=name;例如将‘110’存为‘EmergencyNumber’,则再次输入‘110’,按‘#’确认后将显示号码如图4:图4新存入联系人一、实验效果分析(包括仪器设备等使用效果)本次试验中实现了使用MATLAB来进行电话拨音信号的合成与识别,以及模拟电话号码的新增、识别和储存,掌握了通
本文标题:DSP_实验9_电话拨号音的合成与识别
链接地址:https://www.777doc.com/doc-2910452 .html