|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本次课程设计利用MATLAB对产生的信号进行采集与
: x. e' C" m0 d# }& N5 V( Y# z: y+ ]分析,实现了DA转换的信号发生与分析。通过MATLAB" l2 a2 n) T" N: x6 {: p9 u5 }1 H
GUI 设计信号采集与分析系统,对来自上位机的正弦) d, \$ ^8 o0 e- X
波,三角波,锯齿波等函数信号进行采集与幅频特性! w/ _. ?9 ]2 j
分析,并将分析的结果通过串口发送命令给单片机系8 x" M7 s" X8 `4 l& M, B( [
统,控制相应的数码管或LED 发光显示相应信号参
* H$ { @3 V) u9 }8 m- h- J. K数,从而达到对数字信号的分析与处理的目的。
0 k5 l) k8 T6 l8 z: H第一章 MATLAB 简介+ w+ M5 B2 a+ ]4 b/ x
MATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运* G5 s4 W* @* G* o
算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式
5 e5 Q5 e, [$ t1 r7 t! O3 k$ ?9 q/ |工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工' H* H, E s. n! z. r% Q# ~0 [: E
程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰8 `7 W" j' h6 _& F8 B
富的功能函数, 利用这些功能函数可以快捷而又方便地完成语音信号的处
( r- P9 C8 i& ]; b7 `理和分析以及信号的可视化,使人机交互更加便捷。
4 M+ n, ?1 l9 S4 BMATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂
1 J* Z$ M% S, j7 B& E的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由
6 Y9 ]( m8 g* e; u; e4 w主包和各类工具箱构成。其中,主包基本是一个用CC++等语言编写成的( @- X7 @ W1 c/ a5 @
函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上0 V0 E: N( g$ n0 L# c
的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广
3 Q& D# J' J$ Z8 h度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和
# v& m q8 L5 m n: ^发展, MATLAB功能越来越强大,应用也越来越广泛。
k3 J, T, C) i, p2 E2 l; D随着计算机技术和信息技术的发展,语音交互已经成为人机交互的
5 q+ k. j, g0 _8 Z必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是
8 J- d' r' s/ i a$ {! n7 r, z8 p计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采) w i |- ^# }6 V
样保持、AD和DA转换等功能。尽管在Windows附件的娱乐中带有一个录
+ M5 \; B, t% n$ @0 k( O' h7 p- {音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对) F" f3 w' Y% X; _ C4 N. G" q
采集的信号进一步分析处理就必须另外编程或通过其它软件,而且
8 I* Q( X( |! \Windows 附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math: E# C! V4 s4 Y" m4 w+ |
Works 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵
. W! O$ c8 K; ?运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互( [0 Z( R# w0 L9 r
式工作环境中。在MATLAB环境中, 可以通过多种编程方法驱动声卡,实3 ?" I* G6 P- x6 c; X5 P9 E+ l
现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功" F4 `% R$ c. a( R) [6 ~
能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分8 ]6 A- D+ {8 x7 J8 @ h/ Z
析提供了十分丰富的功能函数, 利用这些功能函数可以快捷而又方便地完& d# r: P9 V3 N6 k
成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。8 }, R4 K3 g4 E+ }3 l
第二章采集信号级处理的相关知识
6 K2 v4 d6 c, Q; h, j2.1MATLAB信号采集的相关知识
$ g; \2 b# J( d0 m: Q* d- k& `MATLAB 对串行口的编程控制主要分为四个步骤。
5 k/ x* U1 Z/ K' r3 _①创建串口设备对象并设置其属性。
; S0 ]) j/ M. E4 V1 wscom=serial('com1');% 创建串口1 的设备对象scom
. J- ?- r1 q. @! s& ? F. p- oscom.InputBufferSize=1024;% 输入缓冲区为256B 缺省值为512B8 o! Q" o! f! B; \* r3 S; {, j. s! }; {
scom.Timeout=0.5;%Y 设置一次读或写操作的最大完成时间为0.5s, 缺省值
- i+ J( Q4 S% V# N! b+ T. _7 `* z+ e为10s
% Q2 T; d! z* J8 x( M( J. Os.ReadAsyncMode='continuous'( 缺省方式);% 在异步通信模式方式下, 读取) Z x; f1 h* A# h$ c$ W' j/ A5 `
串口数据采用连续接收数据(continuous) 的缺省方式,那么下位机返回的数+ S1 |( I8 B7 ~
据会自动地存入输入缓冲区中.
/ D2 c/ f) j+ j+ c0 N; x! Z3 \0 P这里串口还有很多其他属性可以设置不一一列举。; e5 z! y6 ~+ B1 T% j9 D$ x% X9 N9 I
②打开串口设备对象。fopen(scom);
, ~$ _+ C4 G* s- }& I③读写串口操作。初始化并打开串口调协对象之后现在可以对串口设
1 q! z4 n0 G" O& e8 K" Y备对象进行读写操作* R: }2 q- F q1 Z! E L
串口的读写操作支持二进制和文本ASCII 两种方式。当MA TLAB 通9 F( L/ X) g. p: ?: r" |/ f A
信数据采用西方ASCII6 ` z1 q% H, u! M" q( s
方式时读写串口设备的命令分别是fscanf、fpritf 当MATLAB 通信数
( u I) r, g8 b) L F# g据采用二进制方式时
9 x9 i% Y7 z1 V Z% e, s; w* f读写串口设备的命令分别是fread、fwrite 。我们这里使用fread 可以一5 m4 w3 Z- U) O: }! t% t
次性把数据读进来。# p* K. P( ~/ w! `
④关闭并清除设备对象。" ~7 ?0 g3 i7 C1 ?' |% s Y* y; N
fclose(scom) %关闭串口设备对象: `5 i2 j: {- z( I w" y4 U
delete(scom);%删除内存中的串口设备对象
* R3 L! u8 T. X6 v& U9 L bclear scom; %清除工作空间中的串口设备对象
" R4 U- ~9 t( F1 u当不再使用该串口设备对象时顺序使用以上3 条命令可以将所创建的
& D: F+ o) @+ \3 G2 T+ B8 e串口对象清除,以免占用系统资源。
1 f, B5 ]0 T* ~/ i" n. k# t(2)基于MATLAB 中断方式的实时串行通信编程
9 M" R2 p, S @在MA TLAB 环境下以中断的方式进行串行通信实际上是采用事件驱动' R: `% }) B% C0 q7 q+ O$ @ K5 y$ S
的方法实现的。MATLAB 提供了instrcallback(obj,event) 回调函数用户, z* J) M4 ]1 N' m/ e/ @( D
根据需要可以自行设置具体的串行通信事件。
# l# k* z2 I' @$ Q1 {9 _& [其编程步骤如下
5 ?" n8 U( s8 I, v①建立一个串行通信主程序serial.m 文件在主程序中进行串口设备初
% ^' p* n: j( O- {始化操作,并指定
$ o0 d) S: y, `/ i' D, P& n& G# h回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中
0 [7 T- a/ z3 s8 Z! Y) G5 r8 |0 `有n 字节的数据时, 触发中断事件。此后主程序自动调用; j. j3 f2 N/ s7 Y
instrcallback(obj,event) 回调函数s.BytesAvaibleFcnMode='byte';% 中断触发; u9 ]6 }+ Z7 H G* x
事件为‘ bytes-available Event ’3 J/ c7 E! G( `% b( S0 |
s.BytesAvailableFcnCount=n;% 接收缓冲区每收到n 个字节时,触发回调函
0 N+ V( \6 u; K' Y数+ i6 O3 u0 U2 Q7 ] o# J
s.BytesAvailableFcn=@instrcallback;% 得到回调函数句柄。
8 y+ `. q2 ^' G m# t%另外s.BytesAvailableFcn={@instrcallback,s}; 得到回调函数句柄,并将
0 W2 o; r2 \5 g: ^* k0 T! p7 d5 p变量s 渗透到instrcallback 中。9 a C5 j$ Z9 M. p3 P
fopen(s);% 连接串口设备对象
) [/ B: e. g; o. ?: y! ofwrite(s,255);% 写串口发送握手信号0xFF( 等价于十进制下的数值255)
0 i3 z* d3 k; p" x* z+ v" j②修改instrcallback(obj,event) 回调函数对所发生的串口通信事件进行处( O0 Y' |, @' U
理。; k2 m" ]) N* I8 }( s/ K
MATLAB 缺省的回调函数instrcallback(obj,event) 存在于instrcallback.m 文9 ~% v5 H4 B/ z* R- J1 g3 O$ o
件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些
# s) B# l# T* n) N4 }最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事
* l" K; O) h+ Z8 `. c件所发生的时间以及导致事件发生的对象名等信息。修改回调函数文件
, N* K' r1 s0 @! v+ E! Q* {4 W时, 注意要取消文件中相应信息后的分号才能够在MATLAB 的命令
9 L- F* m/ ?+ i窗口command! E# o' ^8 N7 h* n }( V. M0 D
window 中将这些信息显示出来。中断发生后的通信事件处理以及通
4 B$ U* ~2 g" P( O5 i信数据的分析处理任
3 k* Y# [* H4 R6 t" x) `务需要用户自行添加相应的服务程序代码。MATLAB 安装目标下有两- p- {5 J& k( z1 }* L/ O
个instrcallback.m 文件8 {, u( N7 j, U, T+ F' r
我们只需要修改@instrument 目录下的instrcallback.m 文件即可。如果
# O8 M$ J$ P. D/ NMATLAB 安装在C 盘
& A% o' P" z4 {7 ~instrcallback.m 文件目录为8 d- `+ y9 I3 J/ f) U
(一定要替换, 不然串口无法启动)$ Q3 N( H Q+ T% a; N' D) t
1.gui_cc2430receive.m 是数据采集程序运行后选择‘开始’ 开始采集3 Z6 v8 D; m [6 G
数据点击希望观' s8 G0 G5 s: {3 L* J4 `; ~, H
察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点/ r; }! @& v0 h9 z/ y
上有五个传感器”的- O. ~% E! R$ q; g* d) d6 f
情况不一定通用。( n7 C7 X( o" Q( |0 V* _- ~! @
2.instrcallback.m 是系统的回调函数满足中断条件时会进入此函数。) C+ @4 p3 Z: L# v( ~ X: g2 F
3.callbackDealWithData.m 是实时处理函数当程序进入回调函数* S5 a5 V" a1 c0 u V) s2 E
instrcallback 时就会调用此函
* P+ F: i: u9 c- R7 }1 s: _数在callbackDealWithData 里面可以添加希望执行的指令代码完成数- E3 ^+ o" N- @5 ^
据解析、保存、数4 X. O% A7 q/ C8 L0 H; W4 l2 l
据滤波、画图、实时跟踪等功能。
# l/ h: O) C5 {* @8 hgui_cc2430receive.m 文件是启动本采集系统的关键其中设置的“开始”! i' g( O2 E) {
按钮为代码中的b1
* V% E9 X: _# N按下按钮会进入b1callback 函数。% c( K$ [% P" M; T0 y
2.2 快速傅里叶变换 j8 C- ^0 U8 [9 J+ o
有限长序列可以通过离散傅里叶变换(DFT) 将其频域也离散化成有限
6 o" T& q1 W/ v长序列. 但其计算量太大, 很难实时地处理问题, 因此引出了快速傅里叶变5 R; v1 @8 v3 w( T- M
换(FFT). 1965 年, Cooley 和Tukey 提出了计算离散傅里叶变换( DFT)2 C T! W1 n1 Z/ o9 O$ c
的快速算法,将DFT 的运算量减少了几个数量级。从此,对快速傅里叶2 m- k3 o. S$ K
变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随
; u; t! Q8 q& X$ P; nFFT 的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生
, d+ p. a, m- n. v" J9 Z" t了FFT 的多种算法,基本算法是基2 DIT 和基2 DIF。FFT 在离散傅里叶
9 Q* P8 A; Y' S1 F6 \8 i' v反变换、线性卷积和线性相关等方面也有重要应用。
% |! D8 }7 Z; Q% O7 B! {" N# U快速傅氏变换( FFT),是离散傅氏变换的快速算法,它是根据离散
" m- u8 y* Z5 y* |/ N) ?2 ]. q/ q傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进5 h' Y' p$ {/ l/ \/ P
获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统2 {; o- t/ n' L4 u% J/ g6 n
或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。+ t& W9 k' T6 b7 \# n, Q6 ?
设x(n) 为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要5 o& y& n$ k3 r8 z( l4 _& G' z
N 次复数乘法和N-1 次复数加法,而一次复数乘法等于四次实数乘法和两# ?8 R7 o8 p% p3 j
次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和
2 F$ h/ ^% H+ g' n* _一次复数加法定义成一次“运算” (四次实数乘法和四次实数加法) ,那3 U$ X8 s5 E& Z. d; k3 i2 S% ^: \( p
么求出N项复数序列的X(m) , 即N点DFT变换大约就需要N^2 次运算。
0 C1 F, w3 q$ Z9 K* w7 X用WN的周期性和对称性,把一个N项序列(设N=2k,k 为正整数),分为1 o$ V/ k N, h% l
两个N2项的子序列,每个N2点DFT变换需要( N2)2 次运算,再用N次) o+ i) ?5 v9 a+ W) K
运算把两个N2 点的DFT 变换组合成一个N 点的DFT 变换。这样变换以
4 d, M' S! l: P: @' m L) @后,总的运算次数就变成N+2( N2)2=N+N22。继续上面的例子, N=10243 o( Y: f! W @; T8 M: a) t
时,总的运算次数就变成了525312 次,节省了大约50%的运算量。而如
- [) z3 a/ u; o果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的( z' `4 Y) q% w0 p
DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算, N 在
! L! ^4 g8 }5 M* ~8 A* b& W8 R1024 点时,运算量仅有10240 次,是先前的直接算法的1%,点数越多,
/ C% m; G& Y6 o% o A运算量的节约就越大,这就是FFT的优越性。
) k: s7 G$ f( V# G离散傅里叶变换X(k) 可看成是z 变换在单位圆上的等距离采样值。" B1 [0 B4 B% K6 d( P$ ?' B5 @
同样, X(k) 也可看作是序列傅氏变换的采样,采样间隔为ω N=2πN 。由' s+ `8 Q% o8 ?- A
此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有
& a8 U7 b. x" P: ~选择性( ωk=2π kN),在这些点上反映了信号的频谱。& j; r5 t( G8 O" ^9 ^& k- i
根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失' V/ `" [) u) z1 H# Q
任何信息, FFT 变换则说明对于时间有限的信号( 有限长序列) ,也可以对
+ z$ j+ x8 a. H7 g$ w7 E其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样
+ E! @4 W. y! j: t6 _0 K4 U I: {足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT 可以用% J' k9 M% a; I
以进行连续信号的频谱分析。& @* q, o# P. n3 M1 S( T
6 N8 F2 w3 }8 z f
m' c1 @4 {* I% v4 M- ^7 S1 r
$ [: _+ |, [8 s* q7 M; ~% g9 Q% M
|
|