基于MATLAB的信号发⽣器设计
基于 MATLAB 的信号发⽣器设计
虚拟仪器能充分利⽤现有计算机资源,通过配以独特设计的软硬件,实现普通仪器的全部功能以及⼀些在普通仪器上⽆法实现的功能的软件或程序。本设计的主要内容就是基于 MATLAB 来实现⼀个信号发⽣器。
⼀、前⾔
⽬前,MATLAB 已经⼴泛地应⽤于⼯程设计的各个领域,如电⼦、通信等领域,它已成为国际上最流⾏的计算机仿真软件设计⼯具。MATLAB 不再仅仅是⼀个矩阵实验室,⽽是⼀种功能强⼤的的实⽤⾼级计算机编程语⾔。
GUI是 MATLAB ⾃带的数据获取⼯具箱,其中包含了许多有⽤的函数供⽤户调⽤,这些函数根据各⾃不同的功能⼤致可分为以下⼏组:数据获取对象的构造,获取和设置参数,执⾏,模拟输⼊/输出函数,数字输⼊/输出函数。在本次设计通⽤信号发⽣器的过程中,⼤量使⽤了以上函数, 并采⽤两种不同的⽅式完成数/模转换的⼯作。鄙夷
describe是什么意思⼆、信号发⽣器的设计和实现
程序简介
程序参考 MATLAB 的 Data Acquisition Toolbox 实现。在 MATLAB 的 GUI 设计中,有两种设计⽅式:利⽤ GUI 编辑器和编写 M ⽂件。
GUI 是⽤户的操作界⾯,是选择波形、设定和修改波形参数、设定采样率、选择输出通道和运⾏、停⽌程序的⼈机交互接⼝。本程序的界⾯中,可选波形包括正余弦(sin),Sa 波(sinc),⽅波(square),三⾓波(triangle),锯齿波
(tooth),噪声波(random),频变波(chirp),以及⾃定义波形(读取图形和数据⽂件)。波形参数包括频率(frequency),幅度(amplitude),直流偏置
(offt),初相位(pha),占空⽐(duty cycle),频变⽅法(method),频 变时间(target time),初始频率
(initial(F)),⽬标频率(target(F))等。
触发 start 按钮将使程序进⼊运⾏状态,这包括计算波形(⼆维数组),绘制波形(在 PC 界⾯坐标系中),以及输出波形(在选定的输出板卡中)。触发 stop 按钮(运⾏状态时start 按钮就转变为 stop 按钮了)将停⽌程序的运⾏,以及数组数据输出到板卡上。
界⾯浏览
本信号发⽣器的界⾯⼤致是有以下五个区域组成:菜单区,参数设定区
(output1,output2),波形绘制区(output1,output2),输出选择区,以及输出控制区。界⾯如图 1 所⽰。
信号⽣成
图 1 信号发⽣器界⾯图
信号⽣成,即是⽤数学⽅法将所选波形(连续信号)按采样率离散为数字序列,序列中的各个数字既是信号在采样率分之⼀时间间隔的采样值。再将各相邻采样点⽤短直线相连,即可近似还原出原波形。可见,同等情况下,采样率越⾼, 信号的恢复程度越好。
正弦波(sin)
表 1 正弦波参数
参数名频率frequency幅度amplitude直流偏置offt初相位pha
默认值500100
正弦波参数如表 1 所⽰。设采样率:samp 数组表⽰:
t=0:(1/samp):1;permafrost
y= offt + amplitude *sin(2*pi*frequency*t+pha*pi/180);
说明:t 在 1 秒内有 samp 个均匀采样点,y 做为 samp×1 的⼀维数组输出到板卡的⼀个通道。
Sa 波(sinc)
表 2 Sa 波参数
参数名频率frequency幅度amplitude直流偏置offt初相位pha
默认值500100
Sa 波参数如表 2 所⽰。设采样率:samp 数组表⽰:youk
t=0:(1/samp):1; y=offt+amplitude*sin(2*pi*frequency*t+pha*pi/180+eps)./
(2*pi*frequency*t+pha*pi/180+eps);
这 ⾥ “ / ” ⽤ 的 是 “ ./ ”, 表 ⽰ 数 组 中 对 应 元 素 运 算 。 为 了2*pi*frequency*t+pha*pi/180=0 的情况表达式仍然有效,加⼊⽆限⼩量
“eps”。
⽅波(square)
表 3 ⽅波参数
参数名频率frequency幅度amplitude直流偏置offt占空⽐duty cycle
默认值5001050
厄立特里亚⽅波参数如表 3 所⽰。设采样率:samp 数组表⽰:
t=0:(1/samp):1;
y= offt + amplitude* sign(duty/100/ frequency -mod(t, 1/frequency));
三⾓波(triangle)
表 4 三⾓波参数
参数名频率frequency幅度amplitude直流偏置offt
默认值50010
谷歌金山词霸三⾓波参数如表 4 所⽰。设采样率:samp 数组表⽰:
t=0:(1/samp):1;
y=(4*amplitude*frequency*mod(t,1/frequency)-2*amplitude).*sign(mo d(t1,1/frequency)-1/frequency/2)-amplitude+offt;上升和下降的占空⽐均为 50%。
锯齿波(tooth)
miconductor表 5 锯齿波参数
参数名频率frequency幅度amplitude直流偏置offt
默认值50010
锯齿波参数如表 5 所⽰。设采样率:samp
数 组 表 ⽰ : t=0:(1/samp):1;
y1=2 *amplitude *frequency *mod(t,1/ frequency)- amplitude+ offt;
噪声波(random)
表 6 噪声波参数
参数名种⼦ed幅度amplitude直流偏置offt
默认值50010
噪声波参数如表 6 所⽰。设采样率:samp 数组表⽰:
t=0:(1/samp):1;
y=2* amplitude*(rand(1,length(t))-0.5)+ offt;
说明:ed 为每个周期内的采样点数,t 在 1 秒内有 samp 个均匀采样点,y 做为 samp×1 的⼀维数组输出到板卡的⼀个通道。
频变波(chirp)
表 7 频变波参数
参数名频变⽅法method变化时间targetTime初始频率initial F⽬标频率target F
默认值Linear150100
频变波参数如表 7 所⽰。设采样率:samp 数组表⽰:
t=0:(1/samp):1;
method=linear 时y=sin(2*pi*mod(t,tTime).*(iF+mod(t,tTime)*(tF-iF)/tTime));
method=log 时y=sin(2*pi*mod(t,tTime).*mod(t,tTime)*exp(log(tF/iF))*iF/tTime)
说明:t 在 1 秒内有 samp 个均匀采样点,y 做为 samp×1 的⼀维数组输出到板卡的⼀个通道。频率变化的⽅式不同,输出表达式也不同。
注意:method 有两个选项:linear 和 log; 符号“./”⽤于数组间运算。
⾃定义波(lf-define)
表 8 ⾃定义波参数
参数名频率frequency幅度amplitude⽂件名filename
默认值5001
⾃定义波参数如表 8 所⽰。设采样率:samp
说明:本选项是信号发⽣器的扩展功能之⼀,通过菜单区操作可以读取保存为图像和数据的⽂件,输出信号到输出板卡上。
①读取图像⽂件(*.bmp) 源 程 序 段 : h1=imread(filename);
h2=rgb2gray(h1) [m,n]=size(h2); for i=1:n
x(i)=0;
end
for i=1:n
mountainview
for j=1:m
if (h2(j,i)~=255)
x(i)=1-j/m; end
end
end
说明:imread 函数按象素读取图像⽂件的 RGB 值(24 位颜⾊时每个象素需要
3 个字节),存储为⼆维数组,rgb2gray 将彩⾊图转变为灰度图(每个象素 1 个字节)。读到⼀个不为⽩⾊(255)的象素既是画线所在,因为图像原点在左上⾓, 所以还要经过求反和归⼀化处理(x(i)=1-j/m)。
②读取数据⽂件(*.txt)
菲仪源程序段:
fid = fopen(filename);
x = fscanf(fid,'%g',[1 inf]) fclo(fid)
说明:fscanf 函数可以读取已打开⽂本⽂件中的数字,放到⼀维数组中。注意:数据⽂件格式―数据值在 0~1 之间,以空格,Tab 为间隔。
举例:0.1 0.2 0.4 0.9 0.3 0.5 0.7 0.6
③数组长度-插值
因为读取图像和数据⽂件得到的数组长度和采样率所需点数⽆关,所以涉及到数组长度的改变,进⽽引出了插值的问题。
源 代 码 段 : p1=round(samp/frequency); for k=2:p1
l1=(k-1)*(length(x)-1)/(p1-1)+1; l3=ceil(l1);
l2=l3-1;
y1(k)=(x(l3)*(l1-l2)+(l3-l1)*x(l2))*amplitude; y1(1)=x(1)* amplitude;
end
for i=1:(samp+1) y(i)=y1(mod(i-1,p1)+1);
end
说明:这⾥⽤到了线性插值的⽅法来重构采样值。所谓线性插值就是所重构的点的值与其所对应的在原数组中相邻的点的值成直线关系。
例如:y(i)对应 x(2.3),则有 y(i)=x(3)*0.3+x(2)*0.7
注意:源代码中如表 9 所⽰,
表 9 线性插值
l1l2l3
Y()所对的 x()的下标⽐ l1 ⼩的最⼤整数⽐ l1 ⼤的最⼩整数笔译价格
第⼀个 for 循环将原数组延拓为⼀个周期的点数(samp/frequency);第⼆个 for 循环再将其延拓为 1 秒的点数 samp(此处为
samp+1)。