基于MATLAB的函数信号发生器1.docx
《基于MATLAB的函数信号发生器1.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的函数信号发生器1.docx(15页珍藏版)》请在冰点文库上搜索。
信息系统仿真设计实训报告
学院
信息电子技术
专业
****
班级
******8
学号
********8
姓名
***
指导教师
***
2014年7月25日
实训报告
基于MATLAB的函数信号发生器
1、目的
函数信号发生器是基于软硬件实现的一种波形发生仪器。
在工工程实践中需要检测和分析的各种复杂信号均可分解成各简单信号之和,而这些简单信号可由函数信号发生器模拟产生,因此它在工程分析和实验教学有着广泛的应用。
MATLAB是一个数据分析和处理功能十分强大的工程实用软件,他的数据采集工具箱为实现数据的输入和输出提供了十分方便的函数和命令,在信号处理方面方便实用。
本文介绍了使MATLAB建立一个简单函数信号发生器的基本流程,并详细叙述了简单波形(正弦波、方波、三角波、锯齿波、白噪声、脉冲)信号的具体实现方法。
通过此次的设计对MATLAB有个更深刻的了解,熟练的使用MATLAB的GUI设计简单的界面程序。
2、工作原理与计算
该虚拟信号发生器的设计由GUI界面及其对应的程序组成。
设计函数发生器有正弦信号、方波信号、三角波、锯齿波、白噪声、脉冲信号。
其中,前五种波形都可以利用MATLAB提供的函数实现,并根据输入的幅值、相位、频率等信息进行调整。
根据脉冲信号在某一时刻出现的一冲激特点,可由编写程序来实现。
界面主要由MATLAB创建,之后编写界面所用的函数,从而实现函数信号发生器。
(1)正弦信号的实现
正弦波信号的数学表达式如
(1)。
y=Asinωt+φ
(1)
其中:
为幅值;ω为频率;为相位。
在MATLAB中,幅值、频率、相位、在用户界面输入。
y的表达式都得到以后,用plot二维作图函数获得波形显示。
(2)方波信号的实现
与正弦波一样,从用户界面获得幅值、频率、相位、采样频率等信息,用square函数获得对应y坐标值,用plot绘图,格式如
(2)。
y=squaret,duty
(2)
其中duty为占空比。
(3)三角波和锯齿波的实现
这两种波形的表达式皆要借助于sawtooth命令。
Swathooth(t)用来产生周期为2π,幅值为从-1到+1的锯齿波。
当width=1时,产生标准的锯齿波。
其表达式如(3)。
y=Aswatoothωt+φ,1(3)
其中A为幅值,ω为频率,φ为相位。
Sawtooth(t,width)用于产生三角波,其中width是取值介于0和1之间的一个参数,它决定了在一个周期中峰值的发生点。
本设计中取width=0.5,可以获得标准形状的三角波。
其表达式如(4)。
y=Aswatoothωt+φ,0.5(4)
其中A为幅值,ω为频率,φ为相位。
(4)白噪声的实现
白噪声,是一种功率频谱密为常数的随机信号或随机过程。
换句话说,此信号在各个频段上的功率是一样的,由于白光是由各种频率(颜色)的单色光混合而成,因而此信号的这种具有平坦功率谱的性质被称作是“白色的”,此信号也因此被称作白噪声。
相对的,其他不具有这一性质的噪声信号被称为有色噪声。
白噪声在数学处理上比较方便,因此它是系统分析的有力工具。
一般,只要一个噪声过程所具有的频谱宽度远远大于它所作用系统的带宽,并且在该带宽中其频谱密度基本上可以作为常数来考虑,就可以把它作为白噪声来处理。
在MATLAB中白噪声的实现借助于randn函数,它的功能是产生一个均值为零方差为1的随机高斯分布序列,其表达式如(5)。
y=A*randn1,lengtht-0.5(5)
(5)脉冲信号的实现
脉冲信号是指瞬间突然变化,作用时间极短的电压或电流。
可以是周期性重复的,也可以是非周期性的或单次的。
脉冲信号表现在平面坐标上就是一条有无数断点的曲线,也就是说在周期性的一些地方点的极限不存在。
在MATLAB中脉冲信号可以由表达式(6)
y=A*t==n(6)
其中A为幅值,在t=n的时候出现脉冲。
3、步骤
3.1搭建函数信号发生器GUI
图形用于界面(GraphicalUserInterfaces,GUI)是提供人机交互的工具和方法。
GUI是包含图形对象(如窗口、图标、菜单和文本)的用户界面。
以某种方式选择或激活这些对象时,通常会引起动作或者发生变化。
一个设计优秀的GUI能够非常直观的让用户知道如何操作MATLAB界面,并且了解设计者的开发意图。
MATLAB的GUI为开发者提供了一个不脱离MATLAB的开发环境,有助于MATLAB程序的GUI集成。
这样可以使开发者不必理会一大堆烦杂的代码,简化程序,但是同样可以实现向决策者提供图文并茂的界面,甚至达到多媒体的效果。
可以说MATLAB提供了一个简便的开发环境,可以让开发者快速上手,提高了开发者的工作效率。
具体搭建GUI的步骤如下:
1)在Command里面输入GUIDE或者从菜单里面,或者从快捷按钮均可进入GUIDE,然后新建一个GUI,进入布局编辑器。
2)为GUI添加控件:
编辑框(EditText)控件、静态文本(StaticText)、滚动条(Slider)控件、按钮(PushButton)控件、坐标轴(Axes)控件等。
按照自己的规划摆放GUI,进行布局设计。
3)设置控件的属性。
可以改变控件的名称、大小字体显示以及颜色等等
根据上述步骤做出的GUI如下图1所示
图1函数信号发生器界面
3.2编写M文件
搭建好界面后保存,系统将自动生成M文件与Fig文件,并且M文件内部已经按照GUI界面中组件的类别,自动生成了相应的模块调用函数。
根据需要,我们对生成的各个函数进行补充,完成函数功能的实现及各个函数的调用关系。
本次实训主要对控件的回调函数(callback)下写入相应的程序。
下面这段程序(部分程序)实现了函数根据用户的输入生成不同的正弦波、三角波、方波、锯齿波等,最终将波形显示在坐标轴上。
其中,sliderfuzhi,editfuzhi输入幅值,当用户在输入一个新的幅值时,A为对应幅值变量,发生相应改变,并判断选择的是何种波型,然后对相应的波型的幅值进行修改,最终通过绘图函数的调用将新波形显示在图上。
同理,当我们逐渐改变频率和相位时,波形也会对应发生变化,在此不再赘述。
其部分程序如下:
1、正弦按钮的回调函数(CallBack)
functionpushbuttonZHENGXIAN_Callback(hObject,eventdata,handles)
globalp1;%定义全局变量
globalp2;
globalp3;
globalp4;
globalp5;
globalp6;
p6=0;
p5=0;%按钮正弦波按下
p2=0;
p3=0;
p4=0;
p1=get(handles.pushbuttonZHENGXIAN,'value');%获取正弦按钮的当前值并赋给p1
j=get(handles.sliderfuzhi,'value');%获取幅值滚动条的值,且赋给j
k=get(handles.sliderpinlv,'value');%获取频率滚动条的值,且赋给k
l=get(handles.sliderxiangwei,'value');%获取相位滚动条的值,且赋给l
set(handles.editfuzhi,'string',num2str(j));%修改editfuzhi的值为滚动条当前的值
set(handles.editpinlv,'string',num2str(k));%修改editpinlv的值为滚动条当前的值
set(handles.editxiangwei,'string',num2str(l));%修改editxiangwei的值为滚动条当前的值
A=str2num(get(handles.editfuzhi,'string'));%获取幅值选择框的值,并且赋给A
f=str2num(get(handles.editpinlv,'string'));%获取频率选择框的值,并且赋给f
P=str2num(get(handles.editxiangwei,'string'));%获取相位选择框的值,并且赋给P
t=0:
0.001:
8*pi;
y=A*sin(2*pi*f*t+P*2*pi);%正弦波表达式
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);%设定显示的背景颜色,
axis([0,8*pi,-1.2,1.2]);%曲线的颜色同时给出坐标并显示网格
gridon;
方波、锯齿波、三角波、白噪声、脉冲信号与其类似在此省略其回调函数的代码。
2、关闭按钮的调用(CallBack)
p6=0;
p5=0;
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);
set(gca,'color',[0,0,0]);
axis([0,8*pi,-1.2,1.2]);
3、滚动条的回调函数(CallBack)
globalp1;
globalp2;
globalp3;
globalp4;
globalp5;
globalp6;
j=get(handles.sliderfuzhi,'value');%获取幅值滚动条的值,并且赋给j
k=get(handles.sliderpinlv,'value');%获取频率滚动条的值,并且赋给k
l=get(handles.sliderxiangwei,'value');%获取相位滚动条的值,并且赋给l
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'));%获取幅值选择框的值,并且赋给A
f=str2num(get(handles.editpinlv,'string'));
P=str2num(get(handles.editxiangwei,'string'));
while1%一直判断,遇到有按键就执行,然后退出。
ifp1==1%如果选择了正弦波
t=0:
0.001:
8*pi;
y=A*sin(2*pi*f*t+P*2*pi);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
axis([0,8*pi,-1.2,1.2]);
end
ifp2==1%如果选择了方波
t=0:
0.001:
6;y=A*square(2*pi*f*t+4*P/f,50);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
axis([0,6,-1.2,1.2]);
end
ifp3==1%如果选择了锯齿波
t=0:
0.001:
20;y=A*sawtooth(pi*f*t+4*P/f,1);
%plot(t,y);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
axis([0,20,-1.2,1.2]);
end
ifp4==1%如果选择了三角波
t=0:
0.001:
20;y=A*sawtooth(pi*f*t+4*P/f,0.5);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
axis([0,20,-1.2,1.2]);
end
ifp5==1%如果选择白噪声
t=0.005:
0.01:
20;y=A*(rand(1,length(t))-0.5);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
axis([0,20,-1.2,1.2]);
end
ifp6==1%如果选择脉冲信号
t=0.02:
0.01:
50;
n=12;
y=A*(t==n);
plot(t,y,'r');
set(gca,'color',[0,1,0.5]);
gridon;
end
break;
end
4、问题解决方法
问题一:
刚开始设计GUI时,新建的的显示屏幕太小,自己当时并不知道怎样把屏幕扩大。
后来通过上网搜索知道可以双击鼠标右键然后拉动光标即可实现屏幕的扩大
问题二:
刚开始放滚动条的时候,滚动条的方向都是垂直的,可是我想用水平滚动条,经过多次尝试没有成功,最后自己通过“我爱MATLAB论坛”找到了该问题的解决方法。
通过改滑动条的高度和宽度的值可以把滚动条变成水平的。
问题三:
做白噪声信号时,无论如何那个白噪声按钮都不起作用。
自己尝试了很多种方法就是不起作用。
最后经过多次的尝试,自己找到了原因。
因为自己把白噪声的表达式写错了。
改过之后,白噪声按钮可以使用了。
问题四:
当白噪声完成之后,自己一按频率和幅值的滚动条,白噪声信号就变成了另外一种信号。
自己当时怎么想都没想出哪里出现错误,后来仔细查看程序,原来幅值滚动条调用的时候出现问题。
自己把以前的幅值滑动条程序直接复制到白噪声下,没有改变按钮的名称。
当自己把按钮名称改对之后,白噪声按钮可以正常使用了。
问题五:
刚开始的时候显示为白色的图像,自己想把显示界面变的和实际接近。
改完之后运行出现了错误,自己当时不知什么原因,经过自己仔细的查看程序,发现在画图的那个语句中,自己用了汉语输入法的小括号,经过改正屏幕可以变成自己想要的颜色。
5、结果(数据)与分析
1.正弦波的显示如图2所示.
图2正弦波
2.方波的显示如图3所示。
图3方波
3.锯齿波的显示如图4所示。
图4锯齿波
4.三角波的显示如图5所示。
图5三角波
5.白噪声的波形显示如图6所示。
图6白噪声
6.脉冲信号的显示如图7所示。
图7脉冲信号
7.关闭函数发生器显示如图8所示。
图8关闭函数发生器
最后结果分析:
由图1可知,通过使用MATLAB的GUI设计的函数信号发生器,其界面简单友好,任何人都可以通过相应的按钮操作实现相应的功能。
该函数信号发生器界面设计满足了操作简单,使用方便的功能,达到预期设计的要求。
图2显示的正弦波,对比幅度滚动条和显示波形幅值,滚动条的值和显示波形的值一致。
对比频率滚动条和根据显示波形计算出的频率,得出频率滚动条值和显示波形频率一致。
滑动相位滚动条,可以看出显示波形的初相位也随之改变,由计算可知相位滚动条显示值和波形相位一致。
图3显示为方波,滑动幅值滚动条和频率滚动条,可以看出其滚动条的幅值和频率值与显示方波的幅值和频率一致。
图4为锯齿波的显示波形,同样可以看到显示波形的频率参数,幅值参数和相位参数与滚动条上的显示一致。
图5三角波波形的显示,改变各滚动条的值,观察到其波形的频率、幅值、相位和滚动条显示一致。
图6显示信号为白噪声信号,由其特点可知,它是随机信号,只有幅值参数的改变。
滑动幅值滚动条,可以得到滚动条上显示与显示波形的幅值一致。
图7显示的为脉冲信号,这里脉冲信号的幅值可以随滚动条的改变而改变。
同样可以得出显示的幅值与滚动条幅值一致。
图8为关闭时函数信号发生器的显示,当关闭按钮按下,屏幕显示为黑色,没有任何波形,关闭按钮功能得以实现。
有上述可知,基于MATLAB的函数信号发生器制作成功。
14
佳木斯大学信息电子技术学院