| 
 | 
	
    
 
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册  
 
x
 
本次课程设计利用MATLAB对产生的信号进行采集与" [2 k# R2 \( a" {' C/ G 
分析,实现了DA转换的信号发生与分析。通过MATLAB 
" f( }- v8 ?* M& p! ~GUI 设计信号采集与分析系统,对来自上位机的正弦 
4 y. l& O# H/ c4 q3 g8 l' w波,三角波,锯齿波等函数信号进行采集与幅频特性# }4 X% \( ]/ D( }0 v 
分析,并将分析的结果通过串口发送命令给单片机系8 |; C5 c- l  C4 o 
统,控制相应的数码管或LED 发光显示相应信号参, m- ~8 u- T9 x 
数,从而达到对数字信号的分析与处理的目的。2 Z3 n  P" Y7 S6 D1 ^ 
第一章 MATLAB 简介 
1 D4 A, W) {  }* k2 S3 c* aMATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运 
1 x( d. C' p3 l; [/ `算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式 
) ~, o$ x) o% @# ~5 S: x工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工 
" X6 O/ O8 B+ Z( p% E8 a$ k程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰 
$ Z3 t6 Q& }* L2 r; i! J& z/ h富的功能函数, 利用这些功能函数可以快捷而又方便地完成语音信号的处0 i$ E6 ?2 G- v$ h: \8 n" Q 
理和分析以及信号的可视化,使人机交互更加便捷。: F6 ?; k7 r! Z 
MATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂! G7 z2 t8 _9 P' G1 a0 j 
的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由( p- u- h; J6 ~' _% ^ 
主包和各类工具箱构成。其中,主包基本是一个用CC++等语言编写成的( o' s% W' C/ S# ~9 a* | 
函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上: U1 M( ~& t4 }# z; x 
的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广 
% M/ i$ \+ ~8 y0 v0 Z6 `% Y度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和 
4 C# n5 ^6 n3 n/ N  ]! _. C发展, MATLAB功能越来越强大,应用也越来越广泛。8 S1 ?7 }: E1 `; l0 Q1 g4 O; @: m4 Y 
随着计算机技术和信息技术的发展,语音交互已经成为人机交互的* E/ Y% o- K+ y1 G 
必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是 
& m, m; G: S$ K& C- X6 A计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采 
. }' N- d5 k$ p- L1 t: q( g样保持、AD和DA转换等功能。尽管在Windows附件的娱乐中带有一个录3 L1 ^) F0 q# _ 
音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对 
3 l: i0 t# }9 g. S$ w采集的信号进一步分析处理就必须另外编程或通过其它软件,而且 
, r. w! v8 e0 A+ X9 @5 B5 Z( bWindows 附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math8 r" k5 @5 n% k# I1 f. N, ] 
Works 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵 
) [* _. j; T* B运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互% L$ p" Z7 E9 q& n5 }" e* p' E 
式工作环境中。在MATLAB环境中, 可以通过多种编程方法驱动声卡,实* R5 Q  J; }2 D( I$ Q/ X4 V 
现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功 
8 u9 ^' x- p9 `% r/ a) _能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分+ Z" P/ N: Q) N" _0 I3 X$ M 
析提供了十分丰富的功能函数, 利用这些功能函数可以快捷而又方便地完 
- G3 }  ?/ P( m" V, {+ N成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。3 ?% G& B* h) w; H6 {# x7 N 
第二章采集信号级处理的相关知识 
' s( Y% A7 h  M' F. o2.1MATLAB信号采集的相关知识' e. n. m1 L) i5 m  E1 m0 ^/ d 
MATLAB 对串行口的编程控制主要分为四个步骤。 
- D- D# m; U" A/ y, z( s①创建串口设备对象并设置其属性。! b8 h' Z& [5 `. |: t. @ 
scom=serial('com1');% 创建串口1 的设备对象scom 
4 t% J) @0 k: K$ \1 Yscom.InputBufferSize=1024;% 输入缓冲区为256B 缺省值为512B 
; D% S9 C2 J; M* i, p0 N. x% Tscom.Timeout=0.5;%Y 设置一次读或写操作的最大完成时间为0.5s, 缺省值 
; S0 Q( g( `! X0 F/ R) `) u6 K为10s$ g3 f) V3 u& [4 Z 
s.ReadAsyncMode='continuous'( 缺省方式);% 在异步通信模式方式下, 读取 
, j' I- H6 Q2 G7 d串口数据采用连续接收数据(continuous) 的缺省方式,那么下位机返回的数 
# J+ f2 a. S! j  h9 L据会自动地存入输入缓冲区中.2 U4 N  Y) f3 A: k 
这里串口还有很多其他属性可以设置不一一列举。 
6 V, M& ^9 @# j& m8 Y②打开串口设备对象。fopen(scom); 
$ W5 U* @. p7 R) Y, Z( V③读写串口操作。初始化并打开串口调协对象之后现在可以对串口设/ Z2 I. \$ d/ E2 |% K 
备对象进行读写操作 
; w+ Q6 r. K4 K串口的读写操作支持二进制和文本ASCII 两种方式。当MA TLAB 通 
  C$ _: {- R. n7 F4 ~3 R) n' F) z信数据采用西方ASCII 
% m* ]5 o4 v* O7 d( H方式时读写串口设备的命令分别是fscanf、fpritf 当MATLAB 通信数 
# S$ {4 `/ x3 l; |, R据采用二进制方式时 
- k$ E: m. c8 L, i读写串口设备的命令分别是fread、fwrite 。我们这里使用fread 可以一. S, [- Y8 k9 u" c0 D 
次性把数据读进来。 
  o& c7 ~' ]3 l* V3 n④关闭并清除设备对象。 
4 X: z: |; m( A" z! r! j4 X5 W! rfclose(scom) %关闭串口设备对象  E# a. x' X3 w7 K$ b; R 
delete(scom);%删除内存中的串口设备对象; a8 n$ F& l- t+ I9 u 
clear scom; %清除工作空间中的串口设备对象 
0 O9 V: |' Q* G' d  i9 t当不再使用该串口设备对象时顺序使用以上3 条命令可以将所创建的 
+ h& D1 z3 t8 ^: }+ _! l+ q+ N串口对象清除,以免占用系统资源。, A' @! b2 R2 d3 b" _# e- p+ f7 x 
(2)基于MATLAB 中断方式的实时串行通信编程 
4 F6 W( U" B% i* L4 m. ?( w8 a在MA TLAB 环境下以中断的方式进行串行通信实际上是采用事件驱动 
1 W( M7 w  s1 V& ?2 z的方法实现的。MATLAB 提供了instrcallback(obj,event) 回调函数用户 
5 f. o/ ?7 I7 b, x. l( n根据需要可以自行设置具体的串行通信事件。 
" L1 P2 a- [$ n6 N, a其编程步骤如下 
  ]# \( \5 g3 w/ `! p8 C①建立一个串行通信主程序serial.m 文件在主程序中进行串口设备初$ S2 F: ]; V+ e1 [$ ] 
始化操作,并指定 
' Q7 c4 J7 q  D' b* ^回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中 
6 j" E1 [  G) c2 o0 g+ x有n 字节的数据时, 触发中断事件。此后主程序自动调用- O2 c* k3 ]1 W. n- F 
instrcallback(obj,event) 回调函数s.BytesAvaibleFcnMode='byte';% 中断触发 
1 S  C# G; j& s! Q, [$ G% z事件为‘ bytes-available Event ’8 n% _: {5 ]9 |1 Z& Z* k5 ^ 
s.BytesAvailableFcnCount=n;% 接收缓冲区每收到n 个字节时,触发回调函 
7 H9 A) k! s7 K% |2 L' z0 T数 
" g2 n! P0 W; g/ _! F3 J" C& k4 as.BytesAvailableFcn=@instrcallback;% 得到回调函数句柄。 
3 Y0 x5 \" U5 c+ B4 y5 T9 E%另外s.BytesAvailableFcn={@instrcallback,s}; 得到回调函数句柄,并将 
. {* q' z8 M) O变量s 渗透到instrcallback 中。 
4 F0 q( A9 z& N1 mfopen(s);% 连接串口设备对象 
2 ~- Q4 `3 r/ ^( J+ N* `fwrite(s,255);% 写串口发送握手信号0xFF( 等价于十进制下的数值255) 
" x, s6 g) A3 P2 F3 H②修改instrcallback(obj,event) 回调函数对所发生的串口通信事件进行处 
3 l# w6 x: [! s; p理。 
! q  ^2 e8 x! H3 o. I% A* pMATLAB 缺省的回调函数instrcallback(obj,event) 存在于instrcallback.m 文/ h  {% o& e5 \% \ 
件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些 
; Z0 m1 `5 c4 B* p; J8 v0 p4 H最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事 
0 T6 w% J8 N$ ~5 c件所发生的时间以及导致事件发生的对象名等信息。修改回调函数文件 
# ~- [* ?4 P& R: v; @4 d时, 注意要取消文件中相应信息后的分号才能够在MATLAB 的命令$ e4 P. i- G6 f- S8 S 
窗口command7 ]6 s# _7 R. {; |4 [ 
window 中将这些信息显示出来。中断发生后的通信事件处理以及通4 m+ n( @; }6 T8 c4 S) ~ 
信数据的分析处理任 
: ]" b' y* j& r/ B1 d务需要用户自行添加相应的服务程序代码。MATLAB 安装目标下有两1 |0 X, t9 ], u' @ 
个instrcallback.m 文件0 o: V: s; a( N9 _ 
我们只需要修改@instrument 目录下的instrcallback.m 文件即可。如果 
* s  `% i  F" @% V  V% ~/ jMATLAB 安装在C 盘 
% V6 P0 {6 O. M, H! B( f* Ginstrcallback.m 文件目录为 
% s& e( K6 a. i- c4 C. z(一定要替换, 不然串口无法启动)4 e. k6 G( Q: W# j" L 
1.gui_cc2430receive.m 是数据采集程序运行后选择‘开始’ 开始采集$ Z9 R' ]7 S; E 
数据点击希望观* d/ g4 I6 ~- r 
察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点; v% a& O- u; {& ]9 [. b 
上有五个传感器”的6 r2 |6 x& S; n0 d3 O% M 
情况不一定通用。7 B7 x7 U) ~: W$ `- z: {% L 
2.instrcallback.m 是系统的回调函数满足中断条件时会进入此函数。 
0 O3 o0 _% Y8 O5 p3.callbackDealWithData.m 是实时处理函数当程序进入回调函数; c7 O" w8 e& p6 S& X$ p 
instrcallback 时就会调用此函9 }9 M: G2 B2 }# g; f- W 
数在callbackDealWithData 里面可以添加希望执行的指令代码完成数+ G& k, s& b: @! T, O- k' G$ p9 g- v 
据解析、保存、数 
9 Q3 C2 b8 j; M( k6 @据滤波、画图、实时跟踪等功能。: X4 u5 r0 V* Z 
gui_cc2430receive.m 文件是启动本采集系统的关键其中设置的“开始” 
  o% O' Q. \8 M3 h4 {9 k9 F按钮为代码中的b1 
2 M( N( E/ o' [1 `/ ^# i& {按下按钮会进入b1callback 函数。/ {" u$ Y2 ^% ?% u 
2.2 快速傅里叶变换 
+ a) J! ~5 b3 {8 D0 r有限长序列可以通过离散傅里叶变换(DFT) 将其频域也离散化成有限 
+ V" K2 l# V, O* B( x/ j长序列. 但其计算量太大, 很难实时地处理问题, 因此引出了快速傅里叶变 
$ R7 Q" T5 k/ H* F% y: v换(FFT). 1965 年, Cooley 和Tukey 提出了计算离散傅里叶变换( DFT) 
9 v7 m- ~& `" T7 J8 R0 B, [0 i的快速算法,将DFT 的运算量减少了几个数量级。从此,对快速傅里叶 
- {+ K/ F' F; p6 A9 q! \% H变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随- t& A$ j/ F1 C. z1 P1 ^* k/ n 
FFT 的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生: @6 k* V; G6 b 
了FFT 的多种算法,基本算法是基2 DIT 和基2 DIF。FFT 在离散傅里叶9 V' y, D: O' x& s 
反变换、线性卷积和线性相关等方面也有重要应用。 
, P0 a0 }, `- o" y* q9 E! j快速傅氏变换( FFT),是离散傅氏变换的快速算法,它是根据离散 
* ?1 Z% q$ Z. T) N  M4 z: A傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进 
/ m8 t% N9 t* h8 d. v获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统0 }' \5 n7 Y1 }  O4 W" B 
或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。! c" M* h& n7 r7 }, A1 ]# G5 `5 \ 
设x(n) 为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要 
% S; s* r; Z4 f* D; zN 次复数乘法和N-1 次复数加法,而一次复数乘法等于四次实数乘法和两 
- D8 h+ L3 A$ k, X次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和$ a6 h+ ^( f2 U2 M5 K5 a$ ~, Z  q" j 
一次复数加法定义成一次“运算” (四次实数乘法和四次实数加法) ,那 
# n1 k  p4 t) K么求出N项复数序列的X(m) , 即N点DFT变换大约就需要N^2 次运算。$ \: N* v, C8 _3 Q; }5 [4 v 
用WN的周期性和对称性,把一个N项序列(设N=2k,k 为正整数),分为 
5 c& a; V% \" p. a6 M; f两个N2项的子序列,每个N2点DFT变换需要( N2)2 次运算,再用N次2 P( ~5 L1 u) n2 q5 D 
运算把两个N2 点的DFT 变换组合成一个N 点的DFT 变换。这样变换以 
* E- H* A! `6 s9 K( B" j2 M: m后,总的运算次数就变成N+2( N2)2=N+N22。继续上面的例子, N=1024& \# N" T$ }! s; }1 i 
时,总的运算次数就变成了525312 次,节省了大约50%的运算量。而如 
+ @' f2 U; f- {8 ?- V) N" b果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的 
8 t( ?" o( F7 W: xDFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算, N 在- ~( ~, g; ~5 A 
1024 点时,运算量仅有10240 次,是先前的直接算法的1%,点数越多, 
- L% }* I$ C1 }; S, I# H8 Q6 O运算量的节约就越大,这就是FFT的优越性。 
* c6 i; @1 [1 H& Q3 E9 @2 K  e离散傅里叶变换X(k) 可看成是z 变换在单位圆上的等距离采样值。& q  X& C* G9 q) X$ B: Q) g' [. i 
同样, X(k) 也可看作是序列傅氏变换的采样,采样间隔为ω N=2πN 。由 
/ {3 P! {+ W( \) O此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有* O) @* S8 @: Y9 `. e# D* m 
选择性( ωk=2π kN),在这些点上反映了信号的频谱。 
; R8 |; S- M. E; [* C根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失8 _2 K& J' Q) I& N5 u; h7 h 
任何信息, FFT 变换则说明对于时间有限的信号( 有限长序列) ,也可以对; F! R1 z' _& f  f  j, b$ x 
其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样8 r) Y% ~# ]( @( [0 a* M5 p 
足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT 可以用4 x; Y) p, f7 w' F; I 
以进行连续信号的频谱分析。 
3 X$ `, U: I* ] 
* M" u( @7 p; b& n  ^$ N: U4 o; K 
0 X: Q7 D& q8 ]5 l+ F- p 
8 B" F) a, v: W: G' j+ ?+ `3 S4 D* m# s$ M! A+ F- ?) e8 w 
 |   
 
 
 
 |