1、双音多频拨号系统DTMF的实验报告双音多频拨号系统DTMF的实验报告 双音多频拨号系统DTMF的实验设计报告 所谓双音多频(DTMF),就是用两个频率行频和列频来表示电话机键盘上的一个数字。DTMF 电话的指令正在迅速的取代脉冲指令。除了在电话呼叫信号中使用外,DTMF 还广泛的使用在交互式控制应用,例如电话银行、电子邮件甚至家电远程控制等,用户可以从电话机发送DTMF 信号来做菜单选择。本文基于MATLAB的双音多频拨号系统的仿真实现。主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 DFT 算法实现对电话通信系统中拨号音的合成与识别。并进一步利用 MATLA
2、B 中的图形用户界面 GUI 制作简单直观的模拟界面。还能够利用矩阵不同的基频合成 0 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程,进一步利用 GUI 做出了简单的图形操作界面。本文具有界面清楚,画面简洁,易于理解,操作简单的优点,从而实现对电话拨号音系统的简单的信号仿真。关键词 :双音多频(DTMF) MATLAB GUI 信号仿真 在电话中,数字09的中每一个都用两个不同的单音频传输,所用的8个频率分成高频带和低频带两组,低频带有四个频率:679Hz,770Hz,852Hz和941Hz;高频带也有四个频率:1209Hz,1336Hz,1477
3、Hz和1633Hz.。每一个数字均由高、低频带中各一个频率构成,例如1用697Hz和1209Hz两个频率,信号用 表示,其中 , 。这样8个频率形成16种不同的双频信号。一,利用GUI 作图(简单的电话界面)如下:利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。其中选用我们熟悉的 10 个数字键 0 9 , 3 个功能键“ 回删 ”、“拨号”,“解码”。按照图 电话机键盘矩阵的排列方式制作五行三列的按键控件。每个按键可用 ( Push Button )添加。静态文本框可用 ( Static Text )添加,如图再加个解码键( Push But
4、ton )二,再点运行,得出与上图对应的m文件,再用鼠标右击上图的每个键,点callback导入每个键的编译程序如下:1,按键1的程序:% - Executes on button press in pushbutton4.function pushbutton4_Callback(hObject, eventdata, handles)x=get(handles.text1,string); % 把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal
5、)else n=1:1000;%每个数字1000个采样点y=sin(0.5345*n)+sin(0.9272*n);%对应行频列频时域叠加,数字1的低频697Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);%100个0模拟静音信号global NUM phone=NUM,y;% 循环储存NUM=phone,space; % 储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,1;set(handles.text1,string,NoCtrl);end2,按键2的程序:function pushbutton5_Callb
6、ack(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.5345*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字2的低频697Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 10
7、0个0模拟静音信号global NUM phone=NUM,y; %循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,2;set(handles.text1,string,NoCtrl);end 3按键3的程序: % - Executes on button press in pushbutton6.function pushbutton6_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) erro
8、rdlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.5345*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字3的低频697Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUM phone=NUM,y; %循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,
9、3;set(handles.text1,string,NoCtrl);end4,按键4的程序:% - Executes on button press in pushbutton10.function pushbutton10_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数
10、字1000个采样点y=sin(0.5905*n)+sin(0.9272*n);% 对应行频列频时域叠加,数字4的低频770Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUM phone=NUM,y; %循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,4;set(handles.text1,string,NoCtrl);end5,按键5的程序:% - Executes on button press in pushbutton9
11、.function pushbutton9_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上 if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;%每个数字1000个采样点vy=sin(0.5905*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字5的低频770Hz和高频1336Hz叠加wavplay(y,8192) %
12、产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUM phone=NUM,y;% 循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,5;set(handles.text1,string,NoCtrl);end6,按键6的程序: % - Executes on button press in pushbutton8.function pushbutton8_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把
13、数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.5905*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字6的低频770Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUM phone=NUM,y;% 循环储存 NUM=phone,space; %储存连续的拨
14、号音信号 NoCtrl=x;NoCtrl=NoCtrl,6;set(handles.text1,string,NoCtrl);end 7,按键7的程序:% - Executes on button press in pushbutton13.function pushbutton13_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上 if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input E
15、rror,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.6534*n)+sin(0.9272*n);% 对应行频列频时域叠加,数字7的低频852Hz和高频1209Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUM phone=NUM,y;% 循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,7;set(handles.text1,string,NoCtrl);end8,按键8的程序:% - Executes
16、on button press in pushbutton12.function pushbutton12_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.6534*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字8的低频85
17、2Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100);% 100个0模拟静音信号global NUM phone=NUM,y; %循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,8;set(handles.text1,string,NoCtrl);end 9,按键9的程序:% - Executes on button press in pushbutton14.function pushbutton14_Callback(hObject, eventdata, handle
18、s)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you have input is too long !,Input Error,modal)else n=1:1000;% 每个数字1000个采样点y=sin(0.6534*n)+sin(1.1328*n);% 对应行频列频时域叠加,数字9的低频852Hz和高频1477Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUM phone=NUM,
19、y;% 循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,9;set(handles.text1,string,NoCtrl);end10,按键0的程序:% - Executes on button press in pushbutton17.function pushbutton17_Callback(hObject, eventdata, handles)x=get(handles.text1,string); %把数字显示在屏幕上if(length(x)15) errordlg(Sorry . The number you
20、have input is too long !,Input Error,modal)else n=1:1000; 每个数字1000个采样点y=sin(0.7217*n)+sin(1.0247*n);% 对应行频列频时域叠加,数字0的低频941Hz和高频1336Hz叠加wavplay(y,8192) %产生拨号音space=zeros(1,100); %100个0模拟静音信号global NUM phone=NUM,y;% 循环储存 NUM=phone,space; %储存连续的拨号音信号 NoCtrl=x;NoCtrl=NoCtrl,0;set(handles.text1,string,No
21、Ctrl);end11,按键#号程序: % - Executes on button press in pushbutton16.function pushbutton16_Callback(hObject, eventdata, handles)set(handles.text1,string,);set(handles.tbutton,visible,off);set(handles.tbutton,value,0); clear all12,按键*的程序:% - Executes on button press in pushbutton18.function pushbutton18_
22、Callback(hObject, eventdata, handles)set(handles.text1,string,);set(handles.tbutton,visible,off);set(handles.tbutton,value,0); clear all13,回删键的程序:% - Executes on button press in pushbutton20.function pushbutton20_Callback(hObject, eventdata, handles)x=get(handles.text1,string);% 把数字显示在屏幕上if(isempty(
23、x) errordlg(Please input the phone No.,Input error,modal)elsexll=length(x);x(xll)=;%去掉末尾号在面板上的显示set(handles.text1,string,x);global NUMll=length(NUM);%删除末尾号码在拨号音信号中的储存for i=ll-1100+1:ll NUM(ll)=; ll=length(NUM);endend14,拨号键的程序:% - Executes on button press in pushbutton21.function pushbutton21_Callbac
24、k(hObject, eventdata, handles)x=get(handles.text1,string); % 把数字显示在屏幕上xx=str2num(x);global NUM if(isempty(NUM) errordlg(Please input the phone No.,Input error,modal)else wavplay(NUM,8192); msgbox(拨号成功!若需再次拨号请按#号复位!,Done,help) set(handles.tbutton,visible,on); set(handles.text1,string,Dieling Done.);e
25、nd14,关闭键的程序:% - Executes on button press in pushbutton22.function pushbutton22_Callback(hObject, eventdata, handles)clear allclose all 15,解码的程序:% - Executes on button press in tbotton.function tbotton_Callback(hObject, eventdata, handles)global NUML=length(NUM);n=L/1100;number=;for i=1:nj=(i-1)*1100
26、+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; end if (nu
27、m(2) 320) column=1; %确定列数 elseif (num(2) 340) column=2; else column=3; endz=row,column; % 确定数字 if z=4,2 tel=0; %0在4行2列 elseif z=1,1 tel=1; %1在1行1列 elseif z=1,2 tel=2; %2在1行2列 elseif z=1,3 tel=3; %3在1行3列 elseif z=2,1 tel=4; %4在2行1列 elseif z=2,2 tel=5; %5在2行2列 elseif z=2,3 tel=6; %6在2行3列 elseif z=3,1
28、tel=7; %7在3行1列 elseif z=3,2 tel=8; %8在3行2列 elseif z=3,3 tel=9; %9在3行3列 endt(i)=tel;c=strcat(number,int2str(tel);number=c;i=i+1;end set(handles.text1,string,解码中.);h = waitbar(0,Decoding.Please wait.);steps = 1500;for step = 1:steps % computations take place here waitbar(step / steps)endclose(h);set(h
29、andles.text1,string,number); % hObject handle to tbotton (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)三,运行以上程序调出如下图界面:即可以进行仿真拨号。 四,程序具体说明: 1. 按下任意09键就可以实现仿真拨号:这里每个数字信号取1000个采样点模拟按键信号,并且每两个数字之间用100个0来表示间隔模拟静音,间隔也是在按键时产生的。如:按键1 y=sin(0.5345*n)+sin(0.9272*n)算法,sin(低频*2pi/采样频率8192*采样点n)+sin(高频*2pi/采样频率8192*采样点n); 2.*号和#号功能一样,清空文本框确定保留号码,实现从新拨号;即将前面拨过的号码进行确认保留,意味着此时连续拨号音信息的储存单元NUM中的信号即为最后用于识别的连续拨号音DTMF信号,并在显示窗口中显示“#”号作为标记3.回删键的作用:是将前面拨错的号码删除退回,表现为将显示窗口已
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1