基于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%一直判断,遇到有按键就执行,然后退出。
if