《毕业论文-基于matlab信号发生器设计说明书》由会员分享,可在线阅读,更多相关《毕业论文-基于matlab信号发生器设计说明书(63页珍藏版)》请在金锄头文库上搜索。
1、MatLab 信号处理-基于 MATLAB 的信号发生器设计姓名: 学号: 班级: 2010.12基于 MATLAB 的信号发生器设计虚拟仪器能充分利用现有计算机资源,通过配以独特设计的软硬件,实现普通仪器的全部功能以及一些在普通仪器上无法实现的功能的软件或程序。本设计的主要内容就是基于 MATLAB 来实现一个信号发生器,除具有信号发生器一般功能外,还应能通过文件或图形获取波形数据,以实现任意波形的生成,并以 PCI-6024 DAQ 卡作为硬件平台输出。一、前言目前,MATLAB 已经广泛地应用于工程设计的各个领域,如电子、通信等领域,它已成为国际上最流行的计算机仿真软件设计工具。MATL
2、AB 不再仅仅是一个矩阵实验室,而是一种功能强大的的实用高级计算机编程语言。Data Acquisition Toolbox 是 MATLAB 自带的数据获取工具箱,其中包含了许多有用的函数供用户调用,这些函数根据各自不同的功能大致可分为以下几组:数据获取对象的构造,获取和设置参数,执行,模拟输入/输出函数,数字输入/输出函数。在本次设计通用信号发生器的过程中,大量使用了以上函数,并采用两种不同的方式完成数/模转换的工作。二、信号发生器的设计和实现程序简介程序参考 MATLAB 的 Data Acquisition Toolbox 实现。在 MATLAB 的 GUI设计中,有两种设计方式:利用
3、 GUI 编辑器和编写 M 文件。GUI 是用户的操作界面,是选择波形、设定和修改波形参数、设定采样率、选择输出通道和运行、停止程序的人机交互接口。本程序的界面中,可选波形包括正余弦(sin) ,Sa 波(sinc) ,方波(square) ,三角波(triangle) ,锯齿波(tooth) ,噪声波(random) ,频变波(chirp) ,以及自定义波形(读取图形和数据文件) 。波形参数包括频率(frequency) ,幅度(amplitude) ,直流偏置(offset) ,初相位(phase) ,占空比(duty cycle) ,频变方法(method) ,频变时间(target t
4、ime) ,初始频率(initial(F) ) ,目标频率(target(F) )等。因为 PCI-6024E 只有 2 路 DAC,所以输出通道的选择只有这 2 路,或者只输出其中的一路。运行、停止则是开始和停止计算波形、输出波形的过程。编写 M 文件来处理 GUI 界面的事件的响应。本设计的独特之处在于输出通道的可选择性,可选择 NI-DAQ(PCI-6024E) ,声卡,或者并行等。考虑到信号幅度范围对于不同硬件也是不同的(PCI-6024E是-1010v) ,超出范围的部分是无效的,程序同样会报错并停止运行。 触发 start 按钮将使程序进入运行状态,这包括计算波形(二维数组) ,绘
5、制波形(在 PC 界面坐标系中) ,以及输出波形(在选定的输出板卡中) 。触发stop 按钮(运行状态时 start 按钮就转变为 stop 按钮了)将停止程序的运行,以及数组数据输出到板卡上。界面浏览本信号发生器的界面大致是有以下五个区域组成:菜单区,参数设定区(output1,output2) ,波形绘制区(output1,output2) ,输出选择区,以及输出控制区。界面如图 1 所示。图 1 信号发生器界面图信号生成信号生成,即是用数学方法将所选波形(连续信号)按采样率离散为数字序列,序列中的各个数字既是信号在采样率分之一时间间隔的采样值。再将各相邻采样点用短直线相连,即可近似还原出
6、原波形。可见,同等情况下,采样率越高,信号的恢复程度越好。正弦波(sin)表 1 正弦波参数参数名频率frequency幅度amplitude直流偏置offset初相位phase默认值 500 1 0 0正弦波参数如表 1 所示。设采样率:samp数组表示:t=0:(1/samp):1;y= offset + amplitude *sin(2*pi*frequency*t+phase*pi/180);说明:t 在 1 秒内有 samp 个均匀采样点,y 做为 samp1 的一维数组输出到板卡的一个通道。Sa 波(sinc)表 2 Sa 波参数参数名频率frequency幅度amplitude直
7、流偏置offset初相位phase默认值 500 1 0 0Sa 波参数如表 2 所示。设采样率:samp数组表示:t=0:(1/samp):1;y=offset+amplitude*sin(2*pi*frequency*t+phase*pi/180+eps)./ (2*pi*frequency*t+phase*pi/180+eps);这里“/”用的是“./” ,表示数组中对应元素运算。为了2*pi*frequency*t+phase*pi/1800 的情况表达式仍然有效,加入无限小量“eps”。方波(square)表 3 方波参数参数名频率frequency幅度amplitude直流偏置of
8、fset占空比duty cycle默认值 500 1 0 50方波参数如表 3 所示。设采样率:samp数组表示:t=0:(1/samp):1;y= offset + amplitude* sign(duty/100/ frequency -mod(t, 1/frequency);三角波(triangle)表 4 三角波参数参数名频率frequency幅度amplitude直流偏置offset默认值 500 1 0三角波参数如表 4 所示。设采样率:samp数组表示:t=0:(1/samp):1;y=(4*amplitude*frequency*mod(t,1/frequency)-2*amp
9、litude).*sign(mod(t1,1/frequency)-1/frequency/2)-amplitude+offset;上升和下降的占空比均为 50。锯齿波(tooth)表 5 锯齿波参数参数名频率frequency幅度amplitude直流偏置offset默认值 500 1 0锯齿波参数如表 5 所示。设采样率:samp数组表示:t=0:(1/samp):1;y1=2 *amplitude *frequency *mod(t,1/ frequency)- amplitude+ offset;噪声波(random)表 6 噪声波参数参数名种子seed幅度amplitude直流偏置o
10、ffset默认值 500 1 0噪声波参数如表 6 所示。设采样率:samp数组表示:t=0:(1/samp):1;y=2* amplitude*(rand(1,length(t)-0.5)+ offset;说明:seed 为每个周期内的采样点数,t 在 1 秒内有 samp 个均匀采样点,y 做为 samp1 的一维数组输出到板卡的一个通道。频变波(chirp)表 7 频变波参数参数名频变方法method变化时间targetTime初始频率initial F目标频率target F默认值 Linear 1 50 100频变波参数如表 7 所示。设采样率:samp数组表示:t=0:(1/sam
11、p):1;methodlinear 时y=sin(2*pi*mod(t,tTime).*(iF+mod(t,tTime)*(tF-iF)/tTime);methodlog 时y=sin(2*pi*mod(t,tTime).*mod(t,tTime)*exp(log(tF/iF)*iF/tTime)说明:t 在 1 秒内有 samp 个均匀采样点,y 做为 samp1 的一维数组输出到板卡的一个通道。频率变化的方式不同,输出表达式也不同。注意:method 有两个选项:linear 和 log;符号“./”用于数组间运算。自定义波(self-define)表 8 自定义波参数参数名频率frequ
12、ency幅度amplitude文件名filename默认值 500 1自定义波参数如表 8 所示。设采样率:samp说明:本选项是信号发生器的扩展功能之一,通过菜单区操作可以读取保存为图像和数据的文件,输出信号到输出板卡上。读取图像文件(*.bmp)源程序段:h1=imread(filename);h2=rgb2gray(h1)m,n=size(h2);for i=1:nx(i)=0;endfor i=1:nfor j=1:mif (h2(j,i)=255)x(i)=1-j/m;endendend说明:imread 函数按象素读取图像文件的 RGB 值(24 位颜色时每个象素需要 3 个字节)
13、,存储为二维数组,rgb2gray 将彩色图转变为灰度图(每个象素1 个字节) 。读到一个不为白色(255)的象素既是画线所在,因为图像原点在左上角,所以还要经过求反和归一化处理(x(i)=1-j/m) 。读取数据文件(*.txt)源程序段:fid = fopen(filename);x = fscanf(fid,%g,1 inf) fclose(fid)说明:fscanf 函数可以读取已打开文本文件中的数字,放到一维数组中。注意:数据文件格式数据值在 01 之间,以空格,Tab 为间隔。举例:0.1 0.2 0.4 0.9 0.3 0.5 0.7 0.6数组长度插值因为读取图像和数据文件得到
14、的数组长度和采样率所需点数无关,所以涉及到数组长度的改变,进而引出了插值的问题。源代码段:p1=round(samp/frequency);for k=2:p1l1=(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;endfor i=1:(samp+1)y(i)=y1(mod(i-1,p1)+1); end说明:这里用到了线性插值的方法来重构采样值。所谓线性插值就是所重构的点的值与其所对应的在原数组中相邻的点的
15、值成直线关系。例如:y(i)对应 x(2.3),则有 y(i)=x(3)*0.3+x(2)*0.7注意:源代码中如表 9 所示,表 9 线性插值l1 l2 l3Y()所对的 x()的下标 比 l1 小的最大整数 比 l1 大的最小整数第一个 for 循环将原数组延拓为一个周期的点数(samp/frequency) ;第二个 for 循环再将其延拓为 1 秒的点数 samp(此处为 samp+1) 。信号输出这个部分,就是把上一部分生成的数组输出到输出板卡上。目前本信号发生器只支持 PCI-6024E 和 winsound。因为 MATLAB 对 PC 扩展板卡的支持十分全面,集成化,所以驱动和
16、 winsound 的代码是非常相似的。硬件设定硬件设定包括板卡选择和通道选择。板卡选择源代码段:out = daqhwinfo;device=out.InstalledAdaptorsset(handles.device,string,device);说明:daqhwinfo.InstalledAdaptors 包含安装的硬件板卡的信息,将其加入作为下拉列表框的选项。通道选择源代码段:if strcmp(get(handles.channel1,checked),on)y1=zeros(1,samp+1);endif strcmp(get(handles.channel2,checked),on)y2=zeros(1,samp+1);end说明:通道 1 或 2 不输出其实就是把输出数组置为全