MATLAB课程设计虚拟信号发生器.doc
课程名称:计算机辅助分析大作业设计题目: 虚拟信号发生器 院 系: 专 业: 年 级: 姓 名: 指导教师: 西南交通大学峨眉校区2011 年 5 月 20 日一、 原理分析 该虚拟信号发生器的设计由GUI界面及其对应的程序组成。信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛地应用。各种波形曲线均可以用三角函数方程式来表示。能够产生多种波形,如三角波、锯齿波、方波、正弦波的电路被称为函数信号发生器。函数信号发生器在电路实验和设备检测中具有十分广泛的用途。本文设计了一种可以产生正弦波、方波、三角波、锯齿波的虚拟信号发生器。1、 建立图形用户界面图形用户界面(Graphical User Interface,简称GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。具体步骤如下:1) 在Command 里面输入 GUIDE 或者从菜单里面,或者从快捷按钮均可进入GUIDE,然后新建一个GUI,进入布局编辑器。2) 为GUI添加控件:编辑框(Edit Text)控件、静态文本(Static Text)、 滚动条(Slider)控件、按钮(Push Button)控件 、坐标轴(Axes)控件、面板(Panel)控件,并按照自己的想象摆放GHI控件,即做布局设计。3) 设置控件的属性 图1 对象浏览器控件主要属性列表:控件名称StringTag按钮(Push Button)控件 正弦波pushbuttonZHENGXIAN方波pushbutton2FANGBO三角波pushbutton4SANJIAO锯齿波pushbutton3JUCHIBO清除Pushbutton5滚动条(Slider)控件SlidersliderxiangweiSlidersliderpinlvSlidersliderfuzhi编辑框(Edit Text)控件默认editpinlv默认editfuzhi默认editxiangwei静态文本(Static Text)频率Text1幅值Text2相位Text3注:其余属性中,大小位置就不叙述了,其他默认,或者在m文件中有设置4) 为各个控件添加回调函数,然后保存或者运行它,自动生成FIG文件和M文件5) 在M文件对应回调函数中编程界面外观:图2 GUI界面2、 GUI程序设计1)正弦按钮的Callback函数:global p1;%GLOBAL Define global variable.global p2;global p3;global p4;p2=0;p3=0;p4=0;p1=get(handles.pushbuttonZHENGXIAN,'value');%获取正弦按钮的当前值并赋给p1while p1=1j=get(handles.sliderfuzhi,'value');%获取幅值滚动条的值,并且赋给jk=get(handles.sliderpinlv,'value');l=get(handles.sliderxiangwei,'value');set(handles.editfuzhi,'string',num2str(j);%修改editfuzhi 的值为滚动条当前的值set(handles.editpinlv,'string',num2str(k);set(handles.editxiangwei,'string',num2str(l);A=str2num(get(handles.editfuzhi,'string');%获取幅值选择框的值,并且赋给Af=str2num(get(handles.editpinlv,'string');P=str2num(get(handles.editxiangwei,'string');t=0:0.001:8*pi;y=A*sin(2*pi*f*t+P*2*pi);plot(t,y);axis(0,8*pi,-1.2,1.2); grid on;break;end2) 方波按钮的Callback函数:global p1;global p2;global p3;global p4;p1=0;p3=0;p4=0;p2=get(handles.pushbutton2FANGBO,'value');j=get(handles.sliderfuzhi,'value');k=get(handles.sliderpinlv,'value');l=get(handles.sliderxiangwei,'value');set(handles.editfuzhi,'string',num2str(j);set(handles.editpinlv,'string',num2str(k);set(handles.editxiangwei,'string',num2str(l);A=str2num(get(handles.editfuzhi,'string');f=str2num(get(handles.editpinlv,'string');P=str2num(get(handles.editxiangwei,'string');t=0:0.001:6; y=A*square(2*pi*f*t+4*P/f,50);plot(t,y);grid on;axis(0,6,-1.2,1.2);3) 锯齿波按钮的Callback函数:global p1;global p2;global p3;global p4;p1=0;p2=0;p4=0;p3=get(handles.pushbutton3JUCHIBO,'value');% - Executes on slider movement.j=get(handles.sliderfuzhi,'value');k=get(handles.sliderpinlv,'value');l=get(handles.sliderxiangwei,'value');set(handles.editfuzhi,'string',num2str(j);set(handles.editpinlv,'string',num2str(k);set(handles.editxiangwei,'string',num2str(l);A=str2num(get(handles.editfuzhi,'string');f=str2num(get(handles.editpinlv,'string');P=str2num(get(handles.editxiangwei,'string');t=0:0.001:20; y=A*sawtooth(pi*f*t+4*P/f,1);plot(t,y);grid on;axis(0,20,-1.2,1.2);4) 三角波按钮的Callback函数:global p1;global p2;global p3;global p4;p2=0;p3=0;p1=0;p4=get(handles.pushbutton4SANJIAO,'value');j=get(handles.sliderfuzhi,'value');k=get(handles.sliderpinlv,'value');l=get(handles.sliderxiangwei,'value');set(handles.editfuzhi,'string',num2str(j);set(handles.editpinlv,'string',num2str(k);set(handles.editxiangwei,'string',num2str(l);A=str2num(get(handles.editfuzhi,'string');f=str2num(get(handles.editpinlv,'string');P=str2num(get(handles.editxiangwei,'string');t=0:0.001:20; y=A*sawtooth(pi*f*t+4*P/f,0.5);plot(t,y);grid on;axis(0,20,-1.2,1.2);5) 滚动条的Callback函数(各个滚动条都一样)global p1;global p2;global p3;global p4;j=get(handles.sliderfuzhi,'value');%获取幅值滚动条的值,并且赋给jk=get(handles.sliderpinlv,'value');%获取频率滚动条的值,并且赋给kl=get(handles.sliderxiangwei,'value');%获取相位滚动条的值,并且赋给lset(handles.editfuzhi,'string',num2str(j);%修改editfuzhi 的值为滚动条当前的值set(handles.editpinlv,'string',num2str(k);set(handles.editxiangwei,'string',num2str(l);A=str2num(get(handles.editfuzhi,'string');%获取幅值选择框的值,并且赋给Af=str2num(get(handles.editpinlv,'string');P=str2num(get(handles.editxiangwei,'string');while 1 %一直判断,遇到有按键就执行,然后退出。if p1=1 %如果选择了正弦波t=0:0.001:8*pi;y=A*sin(2*pi*f*t+P*2*pi);plot(t,y);grid on;axis(0,8*pi,-1.2,1.2); endif p2=1 %如果选择了方波t=0:0.001:6; y=A*square(2*pi*f*t+4*P/f,50);plot(t,y);grid on;axis(0,6,-1.2,1.2);endif p3=1 %如果选择了锯齿波t=0:0.001:20; y=A*sawtooth(pi*f*t+4*P/f,1);plot(t,y);grid on;axis(0,20,-1.2,1.2);endif p4=1 %如果选择了三角波 t=0:0.001:20; y=A*sawtooth(pi*f*t+4*P/f,0.5);plot(t,y);grid on;axis(0,20,-1.2,1.2);endbreak;end6) 清除按钮的Callback函数t=0:pi/360:8*pi;y=0;global p1;global p2;global p3;global p4;p1=0;p2=0;p3=0;p4=0;set(handles.sliderfuzhi,'value',0);set(handles.sliderpinlv,'value',0);set(handles.sliderxiangwei,'value',0);set(handles.editfuzhi,'string',num2str(0);set(handles.editpinlv,'string',num2str(0);set(handles.editxiangwei,'string',num2str(0);plot(t,y);grid on;axis(0,8*pi,-1.2,1.2); 二、 仿真结果 图3 正弦波(对应参数见图)图4 方波(对应参数见图)图5 锯齿波(对应参数见图)图6 三角波(对应参数见图)图6 清除三、 结果分析 通过建立GUI界面,编辑控件对应的回调函数,然后运行仿真,即可实现虚拟信号发生器的功能。通过选择信号类型,虚拟信号发生器能够实现正弦、方波、三角波、锯齿波的信号的输出,调节滚动条得到需要波形的频率幅值相位参数,就能得到对应波形。四、 结论 使用matlab 软件产生信号波形,实现了虚拟数字信号发生器的设计。设计界面简单直观,具有一定的参考应用价值。五、 参考文献【1】董振海精通MATLAB编程与数据库应用,2007.9【2】薛定宇,陈阳泉.基于MATLAN/Simulink的系统仿真技术与应用,清华大学出版社,2006