燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.docx
《燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.docx》由会员分享,可在线阅读,更多相关《燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.docx(19页珍藏版)》请在冰豆网上搜索。
![燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析.docx](https://file1.bdocx.com/fileroot1/2023-6/2/874e6a00-013f-4fe0-8211-58789ab4bce7/874e6a00-013f-4fe0-8211-58789ab4bce71.gif)
燕山大学数字数字信号处理课程设计基于DA转换的信号发生与分析
燕山大学
课程设计说明书
题目:
基于D/A转换的信号发生与分析
学院(系):
电气工程学院
年级专业:
学号:
学生姓名:
指导教师:
教师职称:
课程名称:
“单片机原理及应用——数字信号处理”课程设计基层教学单位:
指导教师:
学号
学生姓名
(专业)班级
设计题目
基于D/A转换的信号发生与分析
设
计
技
术
参
数
1、独立完成设计任务。
2、编程,上机调试。
3、连接硬件实验线路,实现所要求的功能。
4、完成设计,提交课程设计报告。
设
计
要
求
1、采用模块:
DA0832、单片机串口通信、Matlab信号处理工具箱
2、利用DAC0832,编制程序产生锯齿波、三角波、正弦波、三种波,并将波形数据通过单片机串口发送给PC系统。
3、对比不同波形信号的时域波形和频谱特性。
其中可调参数包括幅值、相位、频率、采样频率等。
设计软件分析界面。
工
作
量
软件编程与硬件调试相结合,绘制设计流程图,编制相应软件界面,实现单片机控制与信号处理任务的综合应用
参
考
资
料
1)《微型计算机控制系统》赖寿宏,机械工业出版社(教材)
2)《单片机及应用》李大友,高等教育出版社(教材)
3)《信号处理原理及应用》谢平等机械工业出版社(教材)
4)《Matlab程序设计及其在信号处理中的应用》聂祥飞等西南交通大学出版社
周次
第一周
第二周
应
完
成
内
容
熟悉伟福单片机编程环境,调试单片机各基本功能模块;熟悉matlab信号处理工具箱,信号处理系统基本功能模块学习和调试
单片机系统与信号处理系统综合进行硬件调试,
撰写课程设计报告
指导教
师签字
基层教学单位主任签字
说明:
1、此表一式四份,系、指导教师、学生各一份,报送院教务科一份。
2、学生那份任务书要求装订到课程设计报告前面。
摘要……………………………………………………3
第一章MATLAB简介………………………………4
第二章采集信号级处理的相关知识………………..5
2.1MATLAB信号采集相关知识……………………………5
2.2快速傅里叶变换……………………………………7
第三章MATLAB处理流程……………………………8
3.1图形界面设计………………………………………8
3.2程序设计……………………………………………10
第四章MATLAB处理后的仿真图……………………14
4.1方波及其频谱图……………………………………14
4.2锯齿波及其频谱图…………………………………15
4.3三角波及其频谱图…………………………………16
4.4正弦波及其频谱图…………………………………17
第五章心得总结……………………………………18
参考文献………………………………………………19
摘要
本次课程设计利用MATLAB对产生的信号进行采集与分析,实现了D/A转换的信号发生与分析。
通过MATLABGUI设计信号采集与分析系统,对来自上位机的正弦波,三角波,锯齿波等函数信号进行采集与幅频特性分析,并将分析的结果通过串口发送命令给单片机系统,控制相应的数码管或LED发光显示相应信号参数,从而达到对数字信号的分析与处理的目的。
第一章MATLAB简介
MATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。
同时由于MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。
MATLAB是解决工程技术问题的技术平台。
利用它能够轻松完成复杂的数值计算,数据分析,符号计算和数据可视化等任务。
MATLAB软件由主包和各类工具箱构成。
其中,主包基本是一个用C/C++等语言编写成的函数库。
该函数库提供矩阵(或数组)的各种算法以及建立在此基础上的各种应用函数和一些相关的用户有好操作界面。
而工具箱从深度和广度上大大扩展了MATLAB主包的功能和应用领域。
随着自身的不断完善和发展,MATLAB功能越来越强大,应用也越来越广泛。
随着计算机技术和信息技术的发展,语音交互已经成为人机交互的必要手段,而语音信号的采集和处理是人机交互的前提和基础。
声卡是计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采样保持、A/D和D/A转换等功能。
尽管在Windows附件的娱乐中带有一个录音机,通过它可以驱动声卡采集语音信号并保存为语音文档。
但是要对采集的信号进一步分析处理就必须另外编程或通过其它软件,而且Windows附件中的录音机功能极其有限且不能扩展。
MATLAB是美国MathWorks公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式工作环境中。
在MATLAB环境中,可以通过多种编程方法驱动声卡,实现对语音信号的采集和回放。
同时由于MATLAB是一个数据分析和处理功能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰富的功能函数,利用这些功能函数可以快捷而又方便地完成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。
第二章采集信号级处理的相关知识
2.1MATLAB信号采集的相关知识
MATLAB对串行口的编程控制主要分为四个步骤。
①创建串口设备对象并设置其属性。
scom=serial('com1');%创建串口1的设备对象scom
scom.InputBufferSize=1024;%输入缓冲区为256B缺省值为512B
scom.Timeout=0.5;%Y设置一次读或写操作的最大完成时间为0.5s,缺省值为10s
s.ReadAsyncMode='continuous'(缺省方式);%在异步通信模式方式下,读取串口数据采用连续接收数据(continuous)的缺省方式,那么下位机返回的数据会自动地存入输入缓冲区中.
这里串口还有很多其他属性可以设置不一一列举。
②打开串口设备对象。
fopen(scom);
③读写串口操作。
初始化并打开串口调协对象之后现在可以对串口设备对象进行读写操作
串口的读写操作支持二进制和文本ASCII两种方式。
当MATLAB通信数据采用西方ASCII
方式时读写串口设备的命令分别是fscanf、fpritf当MATLAB通信数据采用二进制方式时
读写串口设备的命令分别是fread、fwrite。
我们这里使用fread可以一次性把数据读进来。
④关闭并清除设备对象。
fclose(scom)%关闭串口设备对象
delete(scom);%删除内存中的串口设备对象
clearscom;%清除工作空间中的串口设备对象
当不再使用该串口设备对象时顺序使用以上3条命令可以将所创建的串口对象清除,以免占用系统资源。
(2)基于MATLAB中断方式的实时串行通信编程
在MATLAB环境下以中断的方式进行串行通信实际上是采用事件驱动的方法实现的。
MATLAB提供了instrcallback(obj,event)回调函数用户根据需要可以自行设置具体的串行通信事件。
其编程步骤如下
①建立一个串行通信主程序serial.m文件在主程序中进行串口设备初始化操作,并指定
回调函数中串行通信的事件。
设置回调函数触发事件—当串口缓冲区中有n字节的数据时,触发中断事件。
此后主程序自动调用instrcallback(obj,event)回调函数s.BytesAvaibleFcnMode='byte';%中断触发事件为‘bytes-availableEvent’
s.BytesAvailableFcnCount=n;%接收缓冲区每收到n个字节时,触发回调函数
s.BytesAvailableFcn=@instrcallback;%得到回调函数句柄。
%另外s.BytesAvailableFcn={@instrcallback,s};得到回调函数句柄,并将变量s渗透到instrcallback中。
fopen(s);%连接串口设备对象
fwrite(s,255);%写串口发送握手信号0xFF(等价于十进制下的数值255)
②修改instrcallback(obj,event)回调函数对所发生的串口通信事件进行处理。
MATLAB缺省的回调函数instrcallback(obj,event)存在于instrcallback.m文件中。
该文件实际上是一个有待于用户修改的程序模块。
其中只有一些最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事件所发生的时间以及导致事件发生的对象名等信息。
修改回调函数文件时,注意要取消文件中相应信息后的分号才能够在MATLAB的命令窗口command
window中将这些信息显示出来。
中断发生后的通信事件处理以及通信数据的分析处理任
务需要用户自行添加相应的服务程序代码。
MATLAB安装目标下有两个instrcallback.m文件
我们只需要修改@instrument目录下的instrcallback.m文件即可。
如果MATLAB安装在C盘
instrcallback.m文件目录为
C:
\ProgramFiles\MATLAB\R2007a\toolbox\MATLAB\iofun\@instrument。
(一定要替换,不然串口无法启动)
1.gui_cc2430receive.m是数据采集程序运行后选择‘开始’开始采集数据点击希望观
察的节点可查看该节点的数据波形图。
此程序有针对目前使用的“节点上有五个传感器”的
情况不一定通用。
2.instrcallback.m是系统的回调函数满足中断条件时会进入此函数。
3.callbackDealWithData.m是实时处理函数当程序进入回调函数instrcallback时就会调用此函
数在callbackDealWithData里面可以添加希望执行的指令代码完成数据解析、保存、数
据滤波、画图、实时跟踪等功能。
gui_cc2430receive.m文件是启动本采集系统的关键其中设置的“开始”按钮为代码中的b1
按下按钮会进入b1callback函数。
2.2快速傅里叶变换
有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT).1965年,Cooley和Tukey提出了计算离散傅里叶变换(DFT)的快速算法,将DFT的运算量减少了几个数量级。
从此,对快速傅里叶变换(FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随FFT的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT的多种算法,基本算法是基2DIT和基2DIF。
FFT在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅氏变换(FFT),是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在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%,点数越多,运算量的节约就越大,这就是FFT的优越性。
离散傅里叶变换X(k)可看成是z变换在单位圆上的等距离采样值。
同样,X(k)也可看作是序列傅氏变换
的采样,采样间隔为ωN=2π/N。
由此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有选择性(ωk=2πk/N),在这些点上反映了信号的频谱。
根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失任何信息,FFT变换则说明对于时间有限的信号(有限长序列),也可以对其进行频域采样,而不丢失任何信息。
所以只要时间序列足够长,采样足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT可以用以进行连续信号的频谱分析。
第三章MATLAB处理流程
3.1图形界面设计
(1)打开MATLAB,新建一个空白的图形界面文件,计算需要添加的
控件种类及个数并设计它们的布局。
(a)添加2个axes控件,用于显示时域波形和频谱分析;
(b)添加5个statictext控件作为窗口说明使用;
(c)添加4个statictext控件用于显示幅值、均值等信号信息;
(e)添加4个pushbutton空间用于各种操作的开始控制;
双击各个控件并修改其颜色、大小及string属性。
得到界面如下:
(2)各控件对应的回调函数的编辑界面控件及布局创建完成以后,自动生成包含各控件回调函数在内的m文件。
点击保存时可以修改fig及m文件名。
系统自动生成的m文件包括:
functionvarargout=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',
以及各个控件对应的回调框架,如:
functionxiaojian01_OpeningFcn(hObject,eventdata,handles,varargin)等。
3.2程序设计
根据界面内控件的功能,在相应的控件下写入欲实现其功能的程序,对应在m文件中的最终程序为:
functionvarargout=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',[]);
ifnargin&&ischar(varargin{1})
gui_State.gui_Callback=str2func(varargin{1});
end
ifnargout
[varargout{1:
nargout}]=gui_mainfcn(gui_State,varargin{:
});
else
gui_mainfcn(gui_State,varargin{:
});
end
functionxiaojian01_OpeningFcn(hObject,eventdata,handles,varargin)
handles.output=hObject;
%guidata(hObject,handles);
functionvarargout=xiaojian01_OutputFcn(hObject,eventdata,handles)
varargout{1}=handles.output;
functionpushbutton1_Callback(hObject,eventdata,handles)
globalout
globalz
globalff
globalfftx
globalfs
globalnfft
fs=100;
%z=fft(out)
%mag=abs(z);%求幅值
%freq=fs/mean(z);
%set(handles.text8,'string',num2str(freq));
%f=(0:
length(z)-1)*fs/length(z);%进行对应的频率转换
nfft=2^nextpow2(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');
ylabel('Amplitude');
%D=max(out);%最大值
%
functionpushbutton2_Callback(hObject,eventdata,handles)
globalout
globaln
set(gcf,'CurrentAxes',handles.axes1)
plot(out)
xlabel('DataPoints');
ylabel('Amplitude');
fs=100;
%A=mean(out);%标准差
%B=fs/mean(out);
C=Var(out);%方差
D=max(out);%最大值
A=mean(out);%平均值
E=min(out);%最小值
%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));
functionpushbutton3_Callback(hObject,eventdata,handles)
globalg
globalout
g=serial('com1');
g.InputBufferSize=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);
%clearg;
%set(gcf,'CurrentAxes',handles.axes1)
%plot(out)
functionpushbutton4_Callback(hObject,eventdata,handles)
close
functionaxes1_CreateFcn(hObject,eventdata,handles)
xlim([01000])
ylim([0300])
set(gca,'ytick',[0:
50:
300])
functionaxes2_CreateFcn(hObject,eventdata,handles)
xlim([01000])
ylim([0300])
set(gca,'ytick',[0:
50:
300])
functionedit1_Callback(hObject,eventdata,handles)
functionedit1_CreateFcn(hObject,eventdata,handles)
ifispc&&isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
functiontext8_CreateFcn(hObject,eventdata,handles)
第四章MATLAB处理后的仿真图
4.1方波及其频谱图
方波的一些特性参数
4.2锯齿波及其频谱图
锯齿波的一些特性参数
4.3三角波及其频谱图
三角波的一些特性参数
4.4正弦波及其频谱图
正弦波的一些特性参数
第五章心得总结
通过本次课程设计,我们学习了使用MATLAB对信号进行分析与处理的基本方法,对于课上所学知识更产生了进一步的认识,通过分组合作的形式不仅增进了我们的团队协作能力,更增强了我们的实践能力,培养了我们自主分析问题,解决问题的能力。
在此次课程设计的过程中,我们同样遇到了很多问题与难题,但是因为得到了老师和学长们的帮助,使得许多问题得以迎刃而解,为此感谢老师和学长们的不吝赐教!
参考文献
1)《微型计算机控制系统》赖寿宏,机械工业出版社(教材)
2)《单片机及应用》李大友,高等教育出版社(教材)
3)《信号处理原理及应用》谢平等机械工业出版社(教材)
4)《MATLAB程序设计及其在信号处理中的应用》聂祥飞等西南交通大学出版社
燕山大学课程设计评审意见表
指导教师评语:
1、认真、很好的完成课设各阶段的任务。
【】
2、能够较好的完成课设各阶段的任务。
【】
3、能够按时完成课设各阶段的任务。
【】
4、不按时完成课设各阶段的任务。
【】
成绩:
指导教师:
2013年07月04日
答辩小组评语:
1、