版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计的目的和任务“数字信号处理〞课程是信息和通信工程专业必修的专业技术根底课程。课程以信号与系统作为研究对象,研究对信号进行各种处理和利用的技术。通过该课程的学习,学生应牢固掌握确定性信号和系统的分析方法、相关算法、系统实现等的相关知识的,借助于数字滤波器的设计及实现,学生可掌握数字系统的分析以及设计方法。数字信号处理是理论性和工程性都很强的学科,本课程设计的目的就是使该课程的理论与工程应用的紧密结合,使学生深入理解信号处理的内涵和实质。本课程设计要求学生在理解信号处理的数学原理的根底上,应用计算机编程手段,实现一种信号分析或处理的设计,到达对所学内容融会贯穿,综合各局部知识,按照题目要求独立设计完成。课程设计的题目和要求1.课程设计题目:DTMF信号的产生与解码DTMF编解码广泛应用于数字拨号,简单通信协议等领域。目前所有的和机按键都是采用DTMF信号进行编码和传输的,该方案实际是利用模拟信号对数字符号进行编码。该编码方案共使用8个模拟频率对16个符号进行编码,这16个频率分为2个群:高音群和低音群。所以称为双音多频(Dual-ToneMultiple-Frequency)编码,其编码方案如图1。由图可知每个符号由一个高音频率和一个低音频率唯一确定。图1DTMF信号编码方案对于该信号的产生,我们可以利用数字振荡器来完成。而对这些信号的检测,那么可以利用DFT来完成。要注意的是,这里只需要计算16个频点的FFT输出,因此课本上介绍基2或基4算法并不是最优的,这时我们需要采用Goerzel算法完成所需的DFT。当然我们也可以用16个窄带带通滤波器完成,窄带带通滤波器的中心频率就是上述各频率。对窄带滤波器输出信号的输出做判决就可以得到解码的结果。编制程序生成并显示各符号的时域信号和对应的幅频曲线。编程模拟拨号过程:输入号码,生成各号码的时域信号,给时域信号加噪声,编程对含噪声的拨号信号进行解码。编制程序测试编解码程序的正确性。要列出表格,统计拨出的符号的解码成功率。独立完成设计,选择自己熟悉的编程语言编写程序,最好能给出图形界面。设计过程与结果1.在MATLAB中建立一个GUI图形界面,将本课程设计所要实现的功能的一些工具拖进GUI界面,并根据需要修改各个工具的属性,建立的初始界面如图2所示。图2GUI图形设计的初始界面翻开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');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);当运行程序后点击数字键“1〞时,pushbutton1_Callback函数会调用PressKeyDown函数,从而完成发出相应的声音、在text1文本框中显示出点击的数字、在axes1和axes2画出对应的图形等功能。点击几个数字或字母键后,在界面中运行的结果如图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);endhandles.TelNumber='';%解码完成后,拨号变量清空,方便下一次拨号。点击“解码检测〞按钮,进行解码的运行结果如图4所示。图4解码后的结果由图4可以看出,在解码的文本框中显示出正确的拨号,表示解码正确。点“退出〞键后界面关闭退出。课程设计总结经过几天的努力,我终于完成了基于MATLAB的DTMF信号的产生与解码课程设计,由于刚上完数字信号处理这门课程,对相关的知识还是比拟熟悉,但是对于数字信号处理的实质的理解还是不够深刻,因此刚开始不知如何下手,觉得困难比拟多,不过最后经过屡次修改和整理,还是完成了。受到自己知识水平的限制,此次课程设计还有很多缺乏的地方。通过这次课程设计,我发现自己以前关于数字信号处理这门课的看法太片面,课程设计不仅仅是对所学知识的一种检验,更是对自己能力的一种提高,这次课程设计使我明白前面所学的那点知识是非常欠缺的,要学的东西还很多。比方在使用MATLAB制作图形界面上,以前上过这个课程,但没有学其中GUI界面设计局部,这就要求我们去自学。在这次课程设计中,我遇到过很多问题,发现我所学的知识实在有限,好在同学之间可以相互讨论,还可以充分利用网络去查阅相关资料。在整理与修改的过程中,我学到了很多新的知识,也培养了独立思考和设计的能力,树立了对知识应用的信心,相信会对以后的学习工作都有很大的帮助,并且提高了自己的动手实践能力。在这次课程设计的过程中,我得到了许多人的帮助,感谢指导老师耐心的讲解,也感谢在一起讨论的同学,从中我得到了很多好的建议和方法。总之,本次课程设计的过程虽然曲折,但是收获还是蛮大的,这不是对知识的终结,而是我学习更多知识的一个平台。参考文献李正周,MATLAB数字信号处理与应用,北京:清华大学出版社,2023徐明远、刘增力,MATLAB仿真在信号处理中的应用,西安:电子科技大学出版社,2007李显宏,MTALAB7.x界面设计与编译技巧,北京:电子工业出版社,2006附录源程序代码:functionvarargout=jink(varargin)%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-202313:20:27%Begininitializationcode-DONOTEDITgui_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});endifnargout[varargout{1:nargout}]=gui_mainfcn(gui_State,varargin{:});elsegui_mainfcn(gui_State,varargin{:});end%Endinitializationcode-DONOTEDIT%---Executesjustbeforejinkismadevisible.functionjink_OpeningFcn(hObject,eventdata,handles,varargin)%Thisfunctionhasnooutputargs,seeOutputFcn.%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%varargincommandlineargumentstojink(seeVARARGIN)%Choosedefaultcommandlineoutputforjinkhandles.output=hObject;handles.DTMFSignal=[];handles.TelNumber='';handles.DecodeTelNumber='';%保存解码字符串变量set(gcf,'CurrentAxes',handles.axes1);xlabel('单位:〔s〕');set(gcf,'CurrentAxes',handles.axes2);xlabel('单位:〔Hz〕');%Updatehandlesstructureguidata(hObject,handles);%UIWAITmakesjinkwaitforuserresponse(seeUIRESUME)%uiwait(handles.figure1);%---Outputsfromthisfunctionarereturnedtothecommandline.functionvarargout=jink_OutputFcn(hObject,eventdata,handles)%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%Getdefaultcommandlineoutputfromhandlesstructurevarargout{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');%Updatehandlesstructureguidata(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');%Updatehandlesstructureguidata(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');%Updatehandlesstructureguidata(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');%Updatehandlesstructureguidata(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');%Updatehandlesstructureguidata(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');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton7.functionpushbutton7_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton7(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'7');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'7');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton8.functionpushbutton8_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton8(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'8');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'8');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton9.functionpushbutton9_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton9(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'9');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'9');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton10.functionpushbutton10_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton10(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'*');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'*');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton11.functionpushbutton11_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton11(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'0');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'0');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton12.functionpushbutton12_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton12(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'#');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'#');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton13.functionpushbutton13_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton13(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'A');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'A');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton14.functionpushbutton14_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton14(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'B');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'B');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton15.functionpushbutton15_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton15(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'C');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'C');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton16.functionpushbutton16_Callback(hObject,eventdata,handles)%hObjecthandletopushbutton16(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)set(handles.DecodeText,'string','');%清空解码显示文本框Signal=PressKeyDown(handles,'D');handles.DTMFSignal=Signal;handles.TelNumber=strcat(handles.TelNumber,'D');%Updatehandlesstructureguidata(hObject,handles);set(handles.CodeText,'string',handles.TelNumber);%---Executesonbuttonpressinpushbutton17.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);endhandles.TelNumber='';%解码完成后,拨号变量清空,方便下一次拨号。%Updatehandlesstructureguidata(hObject,handles);%RowNumber=FindLowerFreq(handles.DTMFSignal);%ColumnNumber=FindHigherFreq(handles.DTMFSignal);%ResultKey=keys(RowNumber,ColumnNumber);%set(handles.DecodeText,'string',char(ResultKey));functionSignal=PressKeyDown(handles,key)Signal=dtmf(key);sound(Signal,8000);%利用声卡播放拨号音set(gcf,'CurrentAxes',handles.axes1);NSignal=length(Signal);t=1/8000:1/8000:NSignal/8000;plot(t,Signal);grid;%画信号的时域波形xlabel('单位:〔s〕');Spectrum=fft(Signal);Spectrum=fftshift(Spectrum);%计算信号的频谱N=length(Spectrum);nStep=(2*pi)/(N-1);w=-pi:nStep:pi;set(gcf,'CurrentAxes',handles.axes2);plot(w/(2*pi)*8000,abs(Spectrum));grid;%画信号的频谱图axis([-2000,2000,0,200]);xlabel('单位:〔Hz〕');functionx=dtmf(key);fs=8000;N=0.1*fs;%信号时间为100ms,N=Tpmin*Fs;Tpmin根据频率分辨率得到,DTMF信号的最小频率间隔为73HZ,故至少需要110点R=1;fl=0;fh=0;n=0:100;switchkeycase{'1','2','3','A'}fl=697;case{'4','5','6','B'}fl=770;case{'7','8','9','C'}fl=852;case{'*','0','#','D'}fl=941;endswitchkeycase{'1','4','7','*'}fh=1209;case{'2','5','8','0'}fh=1336;case{'3','6','9','#'}fh=1477;case{'A','B','C','D'}fh=1633;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学科交叉渗透在高中生物学教学中的实践研究
- 2026儿童绘本出行业市场容量与发展趋势预测报告
- 2026举一例子蓝色沙滩行业市场发展调研研究发展框架投资建议书
- 基础护理中的多学科团队合作
- 专业护理剪指甲方法详解
- 中医护理智慧:课件创意展示
- 湖南长沙市长沙市雅礼集团八校联考2024-2025学年高一下学期4月期中生物试题
- 深度解析(2026)《GBT 26237.1-2022信息技术 生物特征识别数据交换格式 第1部分:框架》
- 深度解析(2026)《GBT 25749.9-2012机械安全 空气传播的有害物质排放的评估 第9部分:净化指数》
- 深度解析(2026)《GBT 25000.24-2017系统与软件工程 系统与软件质量要求和评价(SQuaRE) 第24部分:数据质量测量》
- 世界各地高中教育体系比较
- 原料不合格处置管理培训
- 四川省成都市成华区片区联考2025-2026学年八年级(上学期)期中英语试卷(含解析)
- 2025年顺丰快递员劳动合同模板
- 2026年中考语文专题复习:标点符号 讲义
- 常见病小儿推拿培训
- 政务颁奖礼仪培训
- 疝气手术护理宣教
- 行文格式规范培训
- 肝癌破裂出血的护理
- 持续时间模型的估计与检验
评论
0/150
提交评论