DTMF信号的产生与解码.docx
- 文档编号:5012624
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:267.94KB
DTMF信号的产生与解码.docx
《DTMF信号的产生与解码.docx》由会员分享,可在线阅读,更多相关《DTMF信号的产生与解码.docx(21页珍藏版)》请在冰豆网上搜索。
DTMF信号的产生与解码
一、课程设计的目的和任务
“数字信号处理”课程是信息和通信工程专业必修的专业技术基础课程。
课程以信号与系统作为研究对象,研究对信号进行各种处理和利用的技术。
通过该课程的学习,学生应牢固掌握确定性信号和系统的分析方法、相关算法、系统实现等的相关知识的,借助于数字滤波器的设计及实现,学生可掌握数字系统的分析以及设计方法。
数字信号处理是理论性和工程性都很强的学科,本课程设计的目的就是使该课程的理论与工程应用的紧密结合,使学生深入理解信号处理的内涵和实质。
本课程设计要求学生在理解信号处理的数学原理的基础上,应用计算机编程手段,实现一种信号分析或处理的设计,达到对所学内容融会贯通,综合各部分知识,按照题目要求独立设计完成。
二、课程设计的题目和要求
1.课程设计题目:
DTMF信号的产生与解码
DTMF编解码广泛应用于数字电话拨号,简单通信协议等领域。
目前所有的电话和传真机按键都是采用DTMF信号进行编码和传输的,该方案实际是利用模拟信号对数字符号进行编码。
该编码方案共使用8个模拟频率对16个符号进行编码,这16个频率分为2个群:
高音群和低音群。
所以称为双音多频(Dual-ToneMultiple-Frequency)编码,其编码方案如图1。
由图可知每个符号由一个高音频率和一个低音频率唯一确定。
图1DTMF信号编码方案
对于该信号的产生,我们可以利用数字振荡器来完成。
而对这些信号的检测,则可以利用DFT来完成。
要注意的是,这里只需要计算16个频点的FFT输出,因此课本上介绍基2或基4算法并不是最优的,这时我们需要采用Goerzel算法完成所需的DFT。
当然我们也可以用16个窄带带通滤波器完成,窄带带通滤波器的中心频率就是上述各频率。
对窄带滤波器输出信号的输出做判决就可以得到解码的结果。
2.设计要求
编制程序生成并显示各符号的时域信号和对应的幅频曲线。
编程模拟电话拨号过程:
输入电话号码,生成各号码的时域信号,给时域信号加噪声,编程对含噪声的电话拨号信号进行解码。
编制程序测试编解码程序的正确性。
要列出表格,统计拨出的符号的解码成功率。
独立完成设计,选择自己熟悉的编程语言编写程序,最好能给出图形界面。
三、设计过程与结果
1.在MATLAB中建立一个GUI图形界面,将本课程设计所要实现的功能的一些工具拖进GUI界面,并根据需要修改各个工具的属性,建立的初始界面如图2所示。
图2GUI图形设计的初始界面
2.打开jink.fig界面所对应的源程序编辑窗口,其中MATLAB会自动生成界面的初始化程序代码以及1——D、“解码检测”和“退出”共18个按钮各按钮的函数名和参数功能解释。
在这里,我们需要对每个按钮要实现的具体功能编写程序,由于按钮函数较多,且1——D数字按钮的功能相似,故可以编写函数供每个这样的函数调用,从而避免程序的繁杂冗余。
例如对于点击数字键“1”时要实现的功能的函数可以为如下代码:
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'1');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'1');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
当运行程序后点击数字键“1”时,pushbutton1_Callback函数会调用PressKeyDown函数,从而完成发出相应的声音、在text1文本框中显示出点击的数字、在axes1和axes2画出对应的图形等功能。
点击几个数字或字母键后,在界面中运行的结果如图3所示。
图3拨号时界面的显示结果
3.在拨号后,要对所接收的拨号信号进行解码检测,检测两个正弦波的频率分别是多少,以判断所对应的十进制数字或字母符号。
检测方法有两种,一是用一组滤波器提取所关心的频率,根据两个滤波器的输出信号判断相应的数字或符号,另一是用DFT(FFT)对双音多频信号进行频谱分析,由信号幅度谱判断信号的两个频率,最后确定相应的数字或符号。
本设计所编写的相应的解码部分程序代码如下:
functionpushbutton17_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton17(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
handles.DecodeTelNumber='';%清空解码字符串变量,开始新一轮解码。
keys=['1','2','3','A';'4','5','6','B';'7','8','9','C';'*','0','#','D'];
fori=1:
length(handles.TelNumber)
Signal=dtmf(handles.TelNumber(i));
RowNumber=FindLowerFreq(Signal);
ColumnNumber=FindHigherFreq(Signal);
ResultKey=keys(RowNumber,ColumnNumber);
handles.DecodeTelNumber=strcat(handles.DecodeTelNumber,ResultKey);
set(handles.DecodeText,'string',handles.DecodeTelNumber);
end
handles.TelNumber='';%解码完成后,拨号变量清空,方便下一次拨号。
点击“解码检测”按钮,进行解码的运行结果如图4所示。
图4解码后的结果
由图4可以看出,在解码的文本框中显示出正确的拨号,表示解码正确。
点“退出”键后界面关闭退出。
四、课程设计总结
经过几天的努力,我终于完成了基于MATLAB的DTMF信号的产生与解码课程设计,由于刚上完数字信号处理这门课程,对相关的知识还是比较熟悉,但是对于数字信号处理的实质的理解还是不够深刻,因此刚开始不知如何下手,觉得困难比较多,不过最后经过多次修改和整理,还是完成了。
受到自己知识水平的限制,此次课程设计还有很多不足的地方。
通过这次课程设计,我发现自己以前关于数字信号处理这门课的看法太片面,课程设计不仅仅是对所学知识的一种检验,更是对自己能力的一种提高,这次课程设计使我明白前面所学的那点知识是非常欠缺的,要学的东西还很多。
比如在使用MATLAB制作图形界面上,以前上过这个课程,但没有学其中GUI界面设计部分,这就要求我们去自学。
在这次课程设计中,我遇到过很多问题,发现我所学的知识实在有限,好在同学之间可以相互讨论,还可以充分利用网络去查阅相关资料。
在整理与修改的过程中,我学到了很多新的知识,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对以后的学习工作都有很大的帮助,并且提高了自己的动手实践能力。
在这次课程设计的过程中,我得到了许多人的帮助,感谢指导老师耐心的讲解,也感谢在一起讨论的同学,从中我得到了很多好的建议和方法。
总之,本次课程设计的过程虽然曲折,但是收获还是蛮大的,这不是对知识的终结,而是我学习更多知识的一个平台。
五、参考文献
1.程耕国,信号与系统,北京:
机械工业出版社,2009.4
2.高西全、丁玉美,数字信号处理(第三版),西安:
西安电子科技大学出版社,2008.8
3.李正周,MATLAB数字信号处理与应用,北京:
清华大学出版社,2008
4.徐明远、刘增力,MATLAB仿真在信号处理中的应用,西安:
电子科技大学出版社,2007
5.李显宏,MTALAB7.x界面设计与编译技巧,北京:
电子工业出版社,2006
六、附录
源程序代码:
functionvarargout=jink(varargin)
%JINKMATLABcodeforjink.fig
%JINK,byitself,createsanewJINKorraisestheexisting
%singleton*.
%
%H=JINKreturnsthehandletoanewJINKorthehandleto
%theexistingsingleton*.
%
%JINK('CALLBACK',hObject,eventData,handles,...)callsthelocal
%functionnamedCALLBACKinJINK.Mwiththegiveninputarguments.
%
%JINK('Property','Value',...)createsanewJINKorraisesthe
%existingsingleton*.Startingfromtheleft,propertyvaluepairsare
%appliedtotheGUIbeforejink_OpeningFcngetscalled.An
%unrecognizedpropertynameorinvalidvaluemakespropertyapplication
%stop.Allinputsarepassedtojink_OpeningFcnviavarargin.
%
%*SeeGUIOptionsonGUIDE'sToolsmenu.Choose"GUIallowsonlyone
%instancetorun(singleton)".
%
%Seealso:
GUIDE,GUIDATA,GUIHANDLES
%Edittheabovetexttomodifytheresponsetohelpjink
%LastModifiedbyGUIDEv2.501-Jan-201213:
20:
27
%Begininitializationcode-DONOTEDIT
gui_Singleton=1;
gui_State=struct('gui_Name',mfilename,...
'gui_Singleton',gui_Singleton,...
'gui_OpeningFcn',@jink_OpeningFcn,...
'gui_OutputFcn',@jink_OutputFcn,...
'gui_LayoutFcn',[],...
'gui_Callback',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
%Endinitializationcode-DONOTEDIT
%---Executesjustbeforejinkismadevisible.
functionjink_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstojink(seeVARARGIN)
%Choosedefaultcommandlineoutputforjink
handles.output=hObject;
handles.DTMFSignal=[];
handles.TelNumber='';
handles.DecodeTelNumber='';%保存解码字符串变量
set(gcf,'CurrentAxes',handles.axes1);
xlabel('单位:
(s)');
set(gcf,'CurrentAxes',handles.axes2);
xlabel('单位:
(Hz)');
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesjinkwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);
%---Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=jink_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
%---Executesonbuttonpressinpushbutton1.
functionpushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton1(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'1');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'1');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton2.
functionpushbutton2_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton2(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'2');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'2');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton3.
functionpushbutton3_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton3(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'3');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'3');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton4.
functionpushbutton4_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton4(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'4');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'4');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton5.
functionpushbutton5_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton5(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'5');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'5');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton6.
functionpushbutton6_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton6(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(handles.DecodeText,'string','');%清空解码显示文本框
Signal=PressKeyDown(handles,'6');
handles.DTMFSignal=Signal;
handles.TelNumber=strcat(handles.TelNumber,'6');
%Updatehandlesstructure
guidata(hObject,handles);
set(handles.CodeText,'string',handles.TelNumber);
%---Executesonbuttonpressinpushbutton7.
functionpushbutton7_Callback(hObject,eventdata,handles)
%hObjecthandletopushbutton7(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(see
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DTMF 信号 产生 解码