《燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.doc》由会员分享,可在线阅读,更多相关《燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.doc(22页珍藏版)》请在三一办公上搜索。
1、 燕山大学 课 程 设 计 说 明 书 题目:基于D/A转换的信号发生与分析 学院(系): 电气工程学院 年级专业: 学 号: 学生姓名: 指导教师: 教师职称: 课程名称: “单片机原理及应用数字信号处理”课程设计 基层教学单位: 指导教师 :学号学生姓名(专业)班级设计题目基于D/A转换的信号发生与分析设计技术参数1、独立完成设计任务。2、编程,上机调试。3、连接硬件实验线路,实现所要求的功能。4、完成设计,提交课程设计报告。设计要求1、采用模块:DA0832、单片机串口通信、Matlab信号处理工具箱2、利用DAC0832,编制程序产生锯齿波、三角波、正弦波、三种波,并将波形数据通过单片
2、机串口发送给PC系统。3、 对比不同波形信号的时域波形和频谱特性。其中可调参数包括幅值、相位、频率、采样频率等。设计软件分析界面。工作量软件编程与硬件调试相结合,绘制设计流程图,编制相应软件界面,实现单片机控制与信号处理任务的综合应用参考资料1)微型计算机控制系统 赖寿宏,机械工业出版社(教材)2)单片机及应用李大友,高等教育出版社(教材)3)信号处理原理及应用 谢平 等 机械工业出版社(教材)4)Matlab程序设计及其在信号处理中的应用聂祥飞等 西南交通大学出版社周次第一周第二周应完成内容熟悉伟福单片机编程环境,调试单片机各基本功能模块;熟悉matlab信号处理工具箱,信号处理系统基本功能
3、模块学习和调试单片机系统与信号处理系统综合进行硬件调试,撰写课程设计报告指导教师签字基层教学单位主任签字说明:1、此表一式四份,系、指导教师、学生各一份,报送院教务科一份。 2、学生那份任务书要求装订到课程设计报告前面。摘要3第一章 MATLAB简介4第二章 采集信号级处理的相关知识.52.1MATLAB信号采集相关知识52.2快速傅里叶变换7第三章MATLAB处理流程83.1图形界面设计83.2程序设计10第四章MATLAB处理后的仿真图144.1方波及其频谱图144.2锯齿波及其频谱图154.3三角波及其频谱图164.4正弦波及其频谱图17第五章 心得总结18参考文献19 摘要本次课程设计
4、利用MATLAB对产生的信号进行采集与分析,实现了D/A转换的信号发生与分析。通过MATLAB GUI设计信号采集与分析系统,对来自上位机的正弦波,三角波,锯齿波等函数信号进行采集与幅频特性分析,并将分析的结果通过串口发送命令给单片机系统,控制相应的数码管或LED发光显示相应信号参数,从而达到对数字信号的分析与处理的目的。第一章 MATLAB简介MATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十
5、分丰富的功能函数,利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。MATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由主包和各类工具箱构成。其中,主包基本是一个用C/C+等语言编写成的函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和发展,MATLAB功能越来越强大,应用也越来越广泛。 随着计算机技术和信息技术的发展,语音交互已
6、经成为人机交互的必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采样保持、A/D和D/A转换等功能。尽管在Windows附件的娱乐中带有一个录音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对采集的信号进一步分析处理就必须另外编程或通过其它软件,而且Windows附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math Works公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。在MATLAB环境中,可以通过多种编程方
7、法驱动声卡,实现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。第二章 采集信号级处理的相关知识2.1MATLAB信号采集的相关知识MATLAB对串行口的编程控制主要分为四个步骤。 创建串口设备对象并设置其属性。 scom=serial(com1);%创建串口1的设备对象scom scom.InputBufferSize=1024;%输入缓冲区为256B缺省值为512Bscom.Timeout
8、=0.5;%Y设置一次读或写操作的最大完成时间为0.5s, 缺省值为10ss.ReadAsyncMode=continuous(缺省方式);%在异步通信模式方式下, 读取串口数据采用连续接收数据(continuous)的缺省方式,那么下位机返回的数据会自动地存入输入缓冲区中.这里串口还有很多其他属性可以设置不一一列举。打开串口设备对象。fopen(scom);读写串口操作。初始化并打开串口调协对象之后现在可以对串口设备对象进行读写操作串口的读写操作支持二进制和文本ASCII两种方式。当MATLAB通信数据采用西方ASCII方式时读写串口设备的命令分别是fscanf、fpritf当MATLAB通
9、信数据采用二进制方式时读写串口设备的命令分别是fread、fwrite。我们这里使用fread可以一次性把数据读进来。关闭并清除设备对象。fclose(scom)%关闭串口设备对象delete(scom);%删除内存中的串口设备对象clear scom; %清除工作空间中的串口设备对象当不再使用该串口设备对象时顺序使用以上3条命令可以将所创建的串口对象清除,以免占用系统资源。(2)基于MATLAB中断方式的实时串行通信编程在MATLAB环境下以中断的方式进行串行通信实际上是采用事件驱动的方法实现的。MATLAB提供了instrcallback(obj,event)回调函数用户根据需要可以自行设
10、置具体的串行通信事件。其编程步骤如下建立一个串行通信主程序serial.m文件在主程序中进行串口设备初始化操作,并指定回调函数中串行通信的事件。设置回调函数触发事件当串口缓冲区中有n字节的数据时,触发中断事件。此后主程序自动调用instrcallback(obj,event)回调函数s.BytesAvaibleFcnMode=byte;%中断触发事件为bytes-available Events.BytesAvailableFcnCount=n;%接收缓冲区每收到n个字节时,触发回调函数s.BytesAvailableFcn=instrcallback;%得到回调函数句柄。%另外s.Bytes
11、AvailableFcn=instrcallback,s;得到回调函数句柄,并将变量s渗透到instrcallback中。fopen(s);%连接串口设备对象fwrite(s,255);%写串口发送握手信号0xFF(等价于十进制下的数值255)修改instrcallback(obj,event)回调函数对所发生的串口通信事件进行处理。MATLAB缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事件所发生的时间以及导致事件发
12、生的对象名等信息。修改回调函数文件时,注意要取消文件中相应信息后的分号才能够在MATLAB的命令窗口commandwindow中将这些信息显示出来。中断发生后的通信事件处理以及通信数据的分析处理任务需要用户自行添加相应的服务程序代码。MATLAB安装目标下有两个instrcallback.m文件我们只需要修改instrument目录下的instrcallback.m文件即可。如果MATLAB安装在C盘instrcallback.m文件目录为C:Program FilesMATLABR2007atoolboxMATLABiofuninstrument。(一定要替换,不然串口无法启动)1.gui_
13、cc2430receive.m是数据采集程序运行后选择开始开始采集数据点击希望观察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点上有五个传感器”的情况不一定通用。2.instrcallback.m是系统的回调函数满足中断条件时会进入此函数。3.callbackDealWithData.m是实时处理函数当程序进入回调函数instrcallback时就会调用此函数在callbackDealWithData里面可以添加希望执行的指令代码完成数据解析、保存、数据滤波、画图、实时跟踪等功能。gui_cc2430receive.m文件是启动本采集系统的关键其中设置的“开始”按钮为代码中的b1
14、按下按钮会进入b1callback函数。2.2快速傅里叶变换有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley和Tukey提出了计算离散傅里叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基DIT和基DIF。FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。快速傅氏变换(F
15、FT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N2次运算。当N=1024点甚至更多的时候,需要N2=104
16、8576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2(N/2)2=N+N2/2。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多
17、,运算量的节约就越大,这就是FFT的优越性。离散傅里叶变换X(k)可看成是z变换在单位圆上的等距离采样值。同样,X(k)也可看作是序列傅氏变换的采样,采样间隔为N=2/N 。由此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有选择性(k=2k/N),在这些点上反映了信号的频谱。 根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失任何信息,FFT变换则说明对于时间有限的信号(有限长序列),也可以对其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT可以用以进行连续信号的频谱分析。第三章MATLAB处理流程
18、3.1图形界面设计 (1)打开MATLAB,新建一个空白的图形界面文件,计算需要添加的控件种类及个数并设计它们的布局。 (a) 添加2个axes控件,用于显示时域波形和频谱分析; (b) 添加5个static text 控件作为窗口说明使用; (c) 添加4个static text控件用于显示幅值、均值等信号信息; (e) 添加4个push button 空间用于各种操作的开始控制; 双击各个控件并修改其颜色、大小及string属性。得到界面如下: (2)各控件对应的回调函数的编辑 界面控件及布局创建完成以后,自动生成包含各控件回调函数在内的m文件。点击保存时可以修改fig及m文件名。系统自动
19、生成的m文件包括:function varargout = xiaojian01(varargin)gui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, xiaojian01_OpeningFcn, . gui_OutputFcn, xiaojian01_OutputFcn, . gui_LayoutFcn, , . gui_Callback, 以及各个控件对应的回调框架,如:function xiaojian01_OpeningFc
20、n(hObject, eventdata, handles, varargin)等。3.2程序设计根据界面内控件的功能,在相应的控件下写入欲实现其功能的程序,对应在m文件中的最终程序为:function varargout = xiaojian01(varargin)gui_Singleton = 1;gui_State = struct(gui_Name, mfilename, . gui_Singleton, gui_Singleton, . gui_OpeningFcn, xiaojian01_OpeningFcn, . gui_OutputFcn, xiaojian01_OutputF
21、cn, . gui_LayoutFcn, , . gui_Callback, );if nargin & ischar(varargin1) gui_State.gui_Callback = str2func(varargin1);end if nargout varargout1:nargout = gui_mainfcn(gui_State, varargin:);else gui_mainfcn(gui_State, varargin:);endfunction xiaojian01_OpeningFcn(hObject, eventdata, handles, varargin)han
22、dles.output = hObject; %guidata(hObject, handles); function varargout = xiaojian01_OutputFcn(hObject, eventdata, handles) varargout1 = handles.output; function pushbutton1_Callback(hObject, eventdata, handles)global outglobal zglobal ffglobal fftxglobal fsglobal nfftfs=100;%z=fft(out)%mag=abs(z);%求幅
23、值%freq=fs/mean(z);%set(handles.text 8,string,num2str(freq);%f=(0:length(z)-1)*fs/length(z);%进行对应的频率转换nfft= 2nextpow2(length(out);%找出大于y的个数的最大的2的指数值ff=fs*(0:nfft/2-1)/nfft;%FFT变换后对应的频率的序列fftx=fft(out,nfft);%求FFT变换set(gcf,CurrentAxes,handles.axes2);plot(ff,abs(fftx(1:nfft/2)*2/nfft);xlabel(Frequency);
24、ylabel(Amplitude);%D=max(out); % 最大值%function pushbutton2_Callback(hObject, eventdata, handles)global outglobal nset(gcf,CurrentAxes,handles.axes1)plot(out)xlabel(Data Points);ylabel(Amplitude);fs=100;%A=mean(out); % 标准差%B=fs/mean(out);C=Var(out); % 方差D=max(out); % 最大值A=mean(out); % 平均值E=min(out); %
25、 最小值%F=D-E; % 峰峰值set(handles.text8,string,num2str(A);set(handles.text12,string,num2str(D);%set(handles.text,string,num2str(D);set(handles.text13,string,num2str(E);set(handles.text14,string,num2str(C); function pushbutton3_Callback(hObject, eventdata, handles)global gglobal outg=serial(com1);g.InputB
26、ufferSize=4096;g.timeout=60;g.BaudRate=1200;g.Parity=none;g.StopBits=1;g.Terminator=LF;g.FlowControl=hardware;fopen(g);%打开串口设备对象s%fwrite(g,255);%以二进制的方式发送握手信号0xFF,缺省为异步通信方式out=fread(g,100,uint8)fclose(g);%delete(g);%clear g;%set(gcf,CurrentAxes,handles.axes1)%plot(out) function pushbutton4_Callback(
27、hObject, eventdata, handles)closefunction axes1_CreateFcn(hObject, eventdata, handles)xlim(0 1000)ylim(0 300)set(gca,ytick,0:50:300) function axes2_CreateFcn(hObject, eventdata, handles)xlim(0 1000)ylim(0 300)set(gca,ytick,0:50:300) function edit1_Callback(hObject, eventdata, handles)function edit1_
28、CreateFcn(hObject, eventdata, handles)if ispc & isequal(get(hObject,BackgroundColor), get(0,defaultUicontrolBackgroundColor) set(hObject,BackgroundColor,white);end function text8_CreateFcn(hObject, eventdata, handles)第四章MATLAB处理后的仿真图4.1方波及其频谱图方波的一些特性参数4.2锯齿波及其频谱图锯齿波的一些特性参数4.3三角波及其频谱图三角波的一些特性参数4.4正弦波
29、及其频谱图正弦波的一些特性参数第五章 心得总结 通过本次课程设计,我们学习了使用MATLAB对信号进行分析与处理的基本方法,对于课上所学知识更产生了进一步的认识,通过分组合作的形式不仅增进了我们的团队协作能力,更增强了我们的实践能力,培养了我们自主分析问题,解决问题的能力。 在此次课程设计的过程中,我们同样遇到了很多问题与难题,但是因为得到了老师和学长们的帮助,使得许多问题得以迎刃而解,为此感谢老师和学长们的不吝赐教!参考文献1)微型计算机控制系统 赖寿宏,机械工业出版社(教材)2)单片机及应用李大友,高等教育出版社(教材)3)信号处理原理及应用 谢平 等 机械工业出版社(教材)4)MATLAB程序设计及其在信号处理中的应用聂祥飞等 西南交通大学出版社燕山大学课程设计评审意见表指导教师评语:1、认真、很好的完成课设各阶段的任务。【 】2、能够较好的完成课设各阶段的任务。【 】3、能够按时完成课设各阶段的任务。【 】4、不按时完成课设各阶段的任务。【 】成绩: 指导教师: 2013年 07月04日答辩小组评语:1、全面、得体的回答老师的提问。【 】2、能够简要回答老师的提问。【 】3、能够回答部分老师的提问。【 】4、不能回答老师的提问。【 】成绩: 组长: 2013年 07月04日课程设计总成绩:答辩小组成员签字:2013年07月04日