




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第二讲MATLAB的,21脚本文件和函数文件22函数调用和参数传递23MATLAB的程序结构和控制流24M文件的调试25程序设计实例251音频信号的分析与合成252音频频谱分析仪253幅度调制,程序设计,2,21脚本文件和函数文件,211M脚本文件,对于一些比较简单的问题,在指令窗中直接输入指令计算。,对于复杂计算,采用脚本文件(Scriptfile)最为合适。,MATLAB只是按文件所写的指令执行。,M脚本文件的特点是:,脚本文件的构成比较简单,只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集合。,脚本文件运行后,所产生的所有变量都驻留在MATLAB基本工作空间(Baseworkspace)中。只要用户不使用清除指令(clear),MATLAB指令窗不关闭,这些变量将一直保存在基本工作空间中。,M文件有两种形式:脚本文件(ScriptFile)和函数文件(FunctionFile)。这两种文件的扩展名,均为“.m”。,3,21脚本文件和函数文件(续1),212M函数文件,与脚本文件不同,函数文件犹如一个“黑箱”,把一些数据送进并经加工处理,再把结果送出来。,MATLAB提供的函数指令大部分都是由函数文件定义的。,M函数文件的特点是:,从形式上看,与脚本文件不同,函数文件的笫一行总是以“function”引导的“函数申明行”。,从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间,称为函数工作空间(Functionworkspace)。当执行文件最后一条指令时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除。,MATLAB允许使用比“标称数目”较少的输入输出宗量,实现对函数的调用。,4,21脚本文件和函数文件(续2),213M文件的一般结构,由于从结构上看,脚本文件只是比函数文件少一个“函数申明行”,所以只须描述清楚函数文件的结构。,典型M函数文件的结构如下:,函数申明行:位于函数文件的首行,以关键字functio开头,函数名以及函数的输入输出宗量都在这一行被定义。,笫一注释行:紧随函数申明行之后以%开头笫一注释行。该行供lookfor关键词查询和help在线帮助使用。,在线帮助文本区:笫一注释行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。,编写和修改记录:与在线帮助文本区相隔一个“空”行,也以%开头,标志编写及修改该M文件的作者和日期等。,函数体:为清晰起见,它与前面的注释以“空”行相隔。,例2_2_1:M函数文件示例。,5,22函数调用和参数传递,221局部变量和全局变量,局部(Local)变量:它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身。,全局(Global)变量:通过global指令,MATLAB也允许几个不同的函数空间以及基本工作空间共享同一个变量,这种被共享的变量称为全局变量。,222函数调用,在MATLAB中,调用函数的常用形式是:,输出参数1,输出参数2,=函数名(输入参数1,输入参数2,),函数调用可以嵌套,一个函数可以调用别的函数,甚至调用它自己(递归调用)。,6,22函数调用和参数传递(续),223参数传递,MATLAB在函数调用上有一个与众不同之处:函数所传递的参数具有可调性。,传递参数数目的可调性来源于如下两个MATLAB永久变量:,函数体内的nargin给出调用该函数时的输入参数数目。,函数体内的nargout给出调用该函数时的输出参数数目。,只要在函数文件中包括这两个变量,就可以知道该函数文件调用时的输入参数和输出参数数目。,值得注意:nargin、nargout本身都是函数,不是变量,所以用户不能赋值,也不能显示。,“变长度”输入输出宗量:varargin、varrgout。具有接受“任意多输入”、返回“任意多输出”的能力。,跨空间变量传递:evalin。,(参考:circle.m,am1.m),7,23MATLAB的程序结构和控制流,231程序结构,循环结构:MATLAB提供两种循环方式。,顺序结构,分支结构:ifelseend。,forend循环和while-end循环。,232程序流控制,常用指令:return,echo,input,pause,keyboard,break。,switch-case结构。,try-catch结构。,警示指令:error,warning。,8,23MATLAB的程序结构和控制流(续),233图形用户界面(GUI)编程,现代的主流应用程序已经从命令行的交互方式转变为以图形界面为主的交互方式,这主要是由于它给用户带来了操作和控制的方便与灵活性。(面向对象编程),MATLAB能够以比较简单的方式实现一系列的图形界面功能。通过对控件、菜单属性的设置和Callback的编写,就能够满足大多数用户的需求。,控件的Callback属性:Callback属性的取值是字符串,可以是某个M文件名或一小段MATLAB语句。当用户激活控件对象(例如:在控件对象图标上单击鼠标左键)时,应用程序就运行Callback属性定义的子程序。,菜单的Callback属性:Callback属性的取值是字符串,可以是某个M文件名或一小段MATLAB语句。当用户激活菜单对象时,若没有子菜单就运行Callback属性定义的子程序。若有,先运行Callback属性定义的子程序,再显示子菜单。,9,24M文件的调试,编写M文件时,错误(Bug)在所难免。错误有两种:语法(Syntax)错误和运行(Run-time)错误。,语法错误是指变量名、函数名的误写,标点符号的缺、漏等。对于这类错误,通常能在运行时发现,终止执行,并给出相应的错误原因以及所在行号。,运行错误是算法本身引起的,发生在运行过程中。相对语法错误而言,运行错误较难处理。尤其是M函数文件,它一旦运行停止,其中间变量被删除一空,错误很难查找。,有两种调试方法:直接调试法和工具调试法。,10,24M文件的调试(续1),直接调试法:可以用下面方法发现某些运行错误。,在M文件中,将某些语句后面的分号去掉,迫使M文件输出一些中间计算结果,以便发现可能的错误。,在适当的位置,添加显示某些关键变量值的语句(包括使用disp在内)。,利用echo指令,使运行时在屏幕上逐行显示文件内容。echoon能显示M脚本文件;echoFunNsmeon能显示名为FunNsme的M函数文件。,在原M脚本或函数文件的适当位置,增添指令keyboard。keyboard语句可以设置程序的断点。,通过将原M函数文件的函数申明行注释掉,可使一个中间变量难于观察的M函数文件变为一个所有变量都保留在基本工作空间中的M脚本文件。,11,24M文件的调试(续2),GUI界面调试法:,MATLAB5.x版提供了一个基于GUI界面的调试。使用它,可以对函数进行调试。,Debug菜单的使用:,Continue:恢复程序运行至结束或另一个断点。,SingleStep:单步执行函数。,StepIn:深入下层局部工作区。,QuitDebugging:退出调试状态。,Set/ClearBreakpoint:设置/清除光标处的断点。,ClearAllBreakpoints:清除程序中的所有断点。,StopifError:运行至出错或结束。,StopifWarning:运行至警告消息或结束。,StopifNaNofInf:运行至运算结果出现NaN或Inf。,12,25程序设计实例,251音频信号的分析与合成,(韩利竹P262-sigspec.m,stereospec.m),采用MATLAB分析WAV文件。,步骤一:选择一个WAV文件作为分析的对象。(ding.wav),步骤二:读WAV文件数据并画时域图形。,步骤三:进行FFT变换并画频域图形。,步骤四:进行该声波主要频谱的分析。,步骤五:根据该声音的频谱,反演时域图形。(有失真),常用函数:,x,fs,bits=waveread(filename),d=FFT(w,l),sound(w,fs,bits),步骤六:进行付立叶逆变换IFFT并画频域图形。,13,252音频频谱分析仪,(车晴P199-audspec.m),M函数文件audspec.m用于对音频频谱分析仪进行仿真,它通过鼠标来选择一个WAV文件,它可以播放该声音文件、显示音频输入信号的波形和频谱。,WAV文件的输入方式采用uigetfile函数,该函数打开一个标准的对话框,然后可以选择声音文件的路径和文件的名称。,信号波形生成使用绘图函数就可以完成,而信号的频谱是通过快速付立叶变换而得到的。,常用函数:,strcmp(action,initialized);,strcmp(action,Play);,strcmp(action,Zoom);,strcmp(action,Spectrum);,14,253幅度调制,(车晴P203-am.m),幅度调制,即载波幅度随调制信号变化的调制(AM)。幅度调制有多种实现方式,包括:标准幅度调制(SAM),双边带幅度调制(DSB-AM),单边带幅度调制(SSB),残留边带调制(VSB)和平衡正交幅度调制(QAM)等。,假定调制信号为m(t),其幅度为1v,载波信号为,各种调幅方式的已调波的表达式如下:,SAM:,是调制度。,DSB-AM:,SSB:,是调制信号的希尔伯特变换。,QAM:,15,M脚本文件入门,返回,通过M脚本文件,画出下列分段函数所表示的曲面。,(s_file.m),16,M脚本文件入门(续),返回,%s_file.mThisismyfirstexample.a=2;b=2;clf;x=-a:0.2:a;y=-b:0.2:b;fori=1:length(y)forj=1:length(x)ifx(j)+y(i)1z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j);elseifx(j)+y(i)=-1z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2+1.5*x(j);elsez(i,j)=0.7575*exp(-y(i)2-6.*x(j)2);endendendaxis(-a,a,-b,b,min(min(z),max(max(z);colormap(flipud(winter);surf(x,y,z);,17,例2_2_1:M函数文件示例。,返回,sa=circle(r,s)%CIRCLEplotacircleofradiirinthelinespecifiedbys.%r指定半径的数值%s指定线色的字符串%sa圆面积%circle(r)利用蓝实线画半径为r的圆周线.%circle(r,s)利用串s指定的线色画半径为r的圆周线.%sa=circle(r)计算圆面积,并画半径为r的蓝色圆面.%sa=circle(r,s)计算圆面积,并画半径为r的s色圆面.%编写于1999年4月7日,修改于1999年8月27日。张志涌EX8.4.4.-1(P299)程序文本。,18,控件的Callback属性,返回,M2_ex2_3_1.m(张志涌P426),对于传递函数为的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。,在编辑框输入0.3,可以看到一根曲线。在编辑框输入0.1:0.1:1,可以看到十根曲线。,本例设置断点演示:(A)图形界面的大致生成过程;,(B)静态文本和编辑框的生成;,(C)坐标方格控制键的形成;,(D)如何使用该界面。,运行程序sub_of_M2_ex2_3_1.m,验证Callback属性定义的子程序。,19,菜单的Callback属性,返回,本例的目标是:在图形窗上自制一个名为【Test】的“顶层菜单项”;当用鼠标点动该菜单项时,将产生一个带分格的封闭坐标轴。通过本例说明:,(A)回调属性的运作机理;,(B)用户顶层菜单项的制作;,(C)uimenu属性的设置方法;,(D)复杂字符串的构成方法和注意事项。,M2_ex2_3_2.m(张志涌P432),20,音频信号的分析与合成程序,(韩利竹P262-sigspec.m,stereospec.m),返回,y=sigspec(action);%SIGNALSPECTRUMANALYSERTHEE2001/10%y=sigspec(action);%Usage:y=sigspec;%=clear;ifnargin1;action=initialized;end;fname,pname=uigetfile(*.wav,OpenWaveFile);file=pname,fname;x,fs,bits=wavread(file);%读入声音文件(*.wav)sound(x,fs,bits);%数据通过声卡转换为声音%=选择声道=%y=x(:);%双声道信号波形数据y=x(:,1);%左声道信号波形数据%y=x(:,2);%右声道信号波形数据%=,21,音频信号的分析与合成程序(续1),%=disp(按任意键显示左声道声音波形!);disp(-);pauseplot(y);set(gca,FontName,Arial,FontSize,10);title(左声道声音波形);xlabel(采样点数);disp(按任意键听左声道信号三次!);disp(-);pausesound(y,fs,bits);%数据通过声卡转换为声音pausesound(y,fs,bits);pausesound(y,fs,bits);k=fft(y,32768);disp(按任意键显示左声道声音频域的幅值!);disp(-);,22,音频信号的分析与合成程序(续2),disp(-);pauseplot(abs(k);set(gca,FontName,Arial,FontSize,10);title(左声道声音频域的幅值);xlabel(采样点数);m1,i1=max(abs(k);%找出频域最大值F1=i1/32768*fs;F1t=num2str(F1)Hz;text(1500,450,F1t);m2,i2=max(abs(k(4000:5000);%找出频域次大值F2=(4000+i2)/32768*fs;F2t=num2str(F2)Hz;text(3000,40,F2t);m3,i3=max(abs(k(10000:12000);%找出频域次次大值F3=(10000+i3)/32768*fs;F3t=num2str(F3)Hz;text(8000,20,F3t);%=,23,音频信号的分析与合成程序(续3),%=t=(0:0.0001:1);y1=(sin(2*pi*788*t)+sin(2*pi*3174*t)*(22.65/490)+sin(2*pi*6936*t)*(2.996/490)*0.18;disp(按任意键显示左声道简单合成声音波形!);disp(-);pauseplot(t,y1);set(gca,FontName,Arial,FontSize,10);title(左声道简单合成声音波形);disp(按任意键听简单合成左声道信号三次!);disp(-);pausesound(y1,fs,bits);%数据通过声卡转换为声音pausesound(y1,fs,bits);pausesound(y1,fs,bits);k1=fft(y1,32768);disp(按任意键显示左声道简单合成声音的频域幅值!);disp(-);,24,音频信号的分析与合成程序(续4),disp(-);pauseplot(abs(k1);set(gca,FontName,Arial,FontSize,10);title(左声道简单合成声音的频域幅值);xlabel(采样点数);m1_r,i1_r=max(abs(k1);%找出简单合成声音频域最大值F1_r=i1_r/32768*10000;F1_rt=num2str(F1_r)Hz;text(3000,850,F1_rt);m2_r,i2_r=max(abs(k1(10000:12000);F2_r=(10000+i2_r)/32768*10000;%找出简单合成声音频域次大值F2_rt=num2str(F2_r)Hz;text(9000,60,F2_rt);end;%=,25,音频频谱分析仪程序,(车晴P199-audspec.m),返回,y=audspec(action);%AUDIOSPECTRUMANALYSERTHEE2001/10%=globalxtdtfsc1c2H_oscH2fnyystrKtypeifnargin1;action=initialized;end;ifstrcmp(action,initialized);%示波器clc;%清除工作区v=version;%MATLAB版本fname,pname=uigetfile(*.wav,OpenWaveFile);%打开对话框输入文件file=pname,fname;%文件名称和路径ifstrcmp(v(1),5);%读入声音文件(*.wav)x,fs,nbits=wavread(file);%x是采样数据,fs是采样速率(Hz)m,n=size(x);%nbits是每次采样比特数file=filefs=int2str(fs)Hz,int2str(nbits)bits;ifn=2;file=file,stero;x=x(:);%若是双声道,将数据合并为一列%x=x(:,1);%取左声道数据%x=x(:,2);%取右声道数据end;elseifstrcmp(v(1),4);x,fs=wavread(file);file=filefs=int2str(fs)Hz,;end;,26,音频频谱分析仪程序(续1),%增加菜单项(Zoom,Play,Spectrum),生成信号波形,回应(Callback)分别调用%函数audspec(Zoom),audspec(Play)和audspec(Spectrum)。H_osc=figure(Name,OSCILLOSCOPETHEE2001/8blanks(6)file,.NumberTitle,off,Position,1078640480);uimenu(Label,27,音频频谱分析仪程序(续2),elseifstrcmp(action,Play);%播放声音文件v=axis;%返回当前轴坐标的设置del=t(2)-t(1);del=del*.5;%v(1)和v(2)是X轴坐标的设置n1=find(abs(t-v(1)del);n2=find(abs(t-v(2)del);ifisempty(n2);n2=length(x);end;xx=x(n1:n2);sound(xx,fs);%以采样速率fs输出声音文件数据elseifstrcmp(action,Zoom);%放大zoom(H_osc,xon);%只能X轴放大elseifstrcmp(action,Spectrum);%频谱分析仪v=axis;%返回当前轴坐标的设置del=t(2)-t(1);del=del*.5;%v(1)和v(2)是X轴坐标的设置n1=find(abs(t-v(1)20);fn=fn(I);y=y(I);plot(fn,y,c2);%画信号频谱分析图形ystr=(dB);Ktype=-1;set(gca,Ygrid,on,YLim,-600,.%gca是返回当前轴的句柄并设置FontName,Arial,FontSize,10);xlabel(frequency(Hz);ylabel(ystr);zoomxon;elseifstrcmp(action,Log);%线性/对数坐标(频率)ifKtype=-1;semilogx(fn,y,c2);%半对数坐标(X轴)画频谱分析图形elseifKtype=1;plot(fn,y,c2);end;Ktype=-Ktype;set(gca,Ygrid,on,YLim,-600,.FontName,Arial,FontSize,10);xlabel(frequency(Hz);ylabel(ystr);zoomxon;end;%=,30,幅度调制程序,(车晴P203-am.m),返回,function=am(action)%AMModulateTHEE2001/10%=am(action);%=globalyxtfcfsftstrKwKmodmH1H2H3H42H52v=version;ifnargin1;set(H3,value,1);end;elseifstrcmp(action,wave);Kw=get(gco,Value);y,x,t,fc,fs,tstr=am1(f,fc,m,Kmod,Kw,1);elseifstrcmp(action,mr);k=get(gco,Value);mt=1.9.875.7.6.5;m=mt(k);ifKmod=1;y,x,t,fc,fs,tstr=am1(f,fc,m,Kmod,Kw,1);else;set(H3,value,1);end;elseifstrcmp(action,f);f=get(gco,string);f=str2num(f);y,x,t,fc,fs,tstr=am1(f,fc,m,Kmod,Kw,1);,33,幅度调制程序(续3),elseifstrcmp(action,fc);fc=get(gco,string);fc=str2num(fc);y,x,t,fc,fs,tstr=am1(f,fc,m,Kmod,Kw,1);elseifstrcmp(action,restore);f=15.625e+03;fc=38e+06;m=1;Kw=1;Kmod=1;y,x,t,fc,fs,tstr=am1(f,fc,m,Kmod,Kw,1);set(H42,string,15.625e+03);set(H52,string,38e+06);set(H1,value,1);set(H2,value,1);set(H3,value,1);elseifstrcmp(actio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030费托蜡行业数字化转型与智能制造实施路径报告
- 2025-2030费托蜡行业原材料价格联动机制与采购策略
- 2025-2030费托蜡生产废水处理技术迭代与可持续发展报告
- 2025-2030费托蜡企业ESG实践评价与可持续发展战略
- 2025-2030自动驾驶高精地图数据合规采集与动态更新机制建设报告
- 公共关系危机应对及媒体沟通策略
- 小学语文作文创新训练课件合集
- 小学生物理知识普及课件设计方案
- 企业内部审计工作流程与报告模板
- 小学科学实验教学设计与评价案例
- 基金考试题库大全及答案
- 2025至2030中国生物基化学品行业产业运行态势及投资规划深度研究报告
- 雾化吸入课件
- 航海船舶运输管理总结
- 采购战略合作协议范本5篇
- 财务部安全生产培训报告课件
- 会计毕业论文烟草专业
- 年产5万吨电熔锆刚玉新材料扩建项目环境影响报告表
- 材料科学基础复习题及答案
- 药监系统官方培训06细菌内毒素方法介绍-蔡彤
- 慢性中耳炎的并发症课件
评论
0/150
提交评论