|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本次课程设计利用MATLAB对产生的信号进行采集与
! \4 @' I! g" U分析,实现了DA转换的信号发生与分析。通过MATLAB
# j+ b( z' X4 A1 U. K1 u4 UGUI 设计信号采集与分析系统,对来自上位机的正弦
' p* J: ]( A4 T波,三角波,锯齿波等函数信号进行采集与幅频特性
; b! c% J- y$ O* {9 ?分析,并将分析的结果通过串口发送命令给单片机系, v! M! ~. ~9 w; A& _: D# h- H3 g
统,控制相应的数码管或LED 发光显示相应信号参
H2 e f) m. _4 ?* L数,从而达到对数字信号的分析与处理的目的。" D" Y5 y. D: f- f. ]; d7 t3 Q# u
第一章 MATLAB 简介 f1 t) |* ]9 J- @- B
MATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运* h+ d( @# {$ s# W
算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式" m6 {7 q) E5 f7 t
工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工) D$ A# J* z ]6 } }' ?& W, l" `
程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰. p3 F( b+ V8 ]- T, K3 j. Y
富的功能函数, 利用这些功能函数可以快捷而又方便地完成语音信号的处
; f, Q$ I, ^; g# c) L4 U理和分析以及信号的可视化,使人机交互更加便捷。
) P& Y( y! D& K. ^9 xMATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂* P- c2 I- d0 z' h, O" U. T
的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由
4 q1 f/ t* V/ C主包和各类工具箱构成。其中,主包基本是一个用CC++等语言编写成的% f5 ~3 j8 G V; U1 t
函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上
2 _( m4 g. Y- L$ Q! `的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广, C3 |% o3 s+ I. U' y) P5 @% R
度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和
- {% D1 ^7 s( f1 w7 V发展, MATLAB功能越来越强大,应用也越来越广泛。
# s2 d/ ]0 ^$ E$ f随着计算机技术和信息技术的发展,语音交互已经成为人机交互的3 @! T3 O$ { x+ `. w
必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是
: ~2 l$ R, N z计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采1 `7 @9 c( ^ c$ }/ f( w* h
样保持、AD和DA转换等功能。尽管在Windows附件的娱乐中带有一个录5 a4 l( {/ l4 ]$ m; f5 r: q" j
音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对( k/ s# B( H% K, _) w7 Y
采集的信号进一步分析处理就必须另外编程或通过其它软件,而且. y5 Q% j% z- }
Windows 附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math
, a. ]4 Y3 t# w8 C) o* \7 IWorks 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵
! a3 X3 z R+ W, Z8 {! C运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互: O4 k( \ Q6 S) L
式工作环境中。在MATLAB环境中, 可以通过多种编程方法驱动声卡,实
+ d: H, l9 Y7 F% a现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功- {" h: }7 E& _$ `) t2 I& \. \
能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分# `8 Q0 D, p2 d
析提供了十分丰富的功能函数, 利用这些功能函数可以快捷而又方便地完
+ a! ^. A$ A, \' r( r+ a0 v; ?成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。# P$ t1 }' [" K, h0 p5 `8 z: p
第二章采集信号级处理的相关知识
! N1 W( b/ [ i( }2.1MATLAB信号采集的相关知识9 Y: L; M" i/ @6 v6 \
MATLAB 对串行口的编程控制主要分为四个步骤。
$ L- D% n. r3 [. S# |0 \①创建串口设备对象并设置其属性。1 `' M! H0 x7 e$ E5 _
scom=serial('com1');% 创建串口1 的设备对象scom; P2 `; g7 y7 S! j% W$ F8 U
scom.InputBufferSize=1024;% 输入缓冲区为256B 缺省值为512B
" @. W! M2 P9 C5 ^scom.Timeout=0.5;%Y 设置一次读或写操作的最大完成时间为0.5s, 缺省值& h# I6 g! }' P- p; ~ ^
为10s3 [, p' D' l* w$ c3 {0 J
s.ReadAsyncMode='continuous'( 缺省方式);% 在异步通信模式方式下, 读取
" Z* `9 G& k" @" \4 }0 f# A串口数据采用连续接收数据(continuous) 的缺省方式,那么下位机返回的数
) u# @3 l3 V3 C据会自动地存入输入缓冲区中. @9 c P: ]' Z
这里串口还有很多其他属性可以设置不一一列举。
# P( q( N0 T. P1 |/ N②打开串口设备对象。fopen(scom);
; `& x/ i; J8 m3 Z7 X$ q$ S③读写串口操作。初始化并打开串口调协对象之后现在可以对串口设
0 i' n( d" b3 E# d备对象进行读写操作* o, m% ^: u4 \
串口的读写操作支持二进制和文本ASCII 两种方式。当MA TLAB 通
- k9 @6 d3 f3 m. i( {& ^* _/ a信数据采用西方ASCII
( F! V4 T& A( Z' V/ }; L% L方式时读写串口设备的命令分别是fscanf、fpritf 当MATLAB 通信数
, W) ^- }+ H! K: V$ g0 p& ~据采用二进制方式时4 ]6 [! x! f/ w- K- x$ {' H
读写串口设备的命令分别是fread、fwrite 。我们这里使用fread 可以一
7 m1 n d) o& Y* h1 p0 u3 P5 {# [次性把数据读进来。
6 M! B c3 v+ E/ z' u④关闭并清除设备对象。6 G8 h# ]5 @9 Z7 ? |# V
fclose(scom) %关闭串口设备对象: a5 {# Q# B7 B. T3 H& G
delete(scom);%删除内存中的串口设备对象
* ~- ?' x: R7 t/ K7 Iclear scom; %清除工作空间中的串口设备对象: F x2 F9 I5 p- x! p
当不再使用该串口设备对象时顺序使用以上3 条命令可以将所创建的1 b; B4 V4 ?2 d% _. v5 c, \3 u
串口对象清除,以免占用系统资源。/ h0 T. l5 B( V) {. }1 D3 g
(2)基于MATLAB 中断方式的实时串行通信编程. u' Z/ a5 x% z5 ^
在MA TLAB 环境下以中断的方式进行串行通信实际上是采用事件驱动6 v0 R3 a0 y& y% z4 f8 P; {! s
的方法实现的。MATLAB 提供了instrcallback(obj,event) 回调函数用户
! a: l6 T: O! P根据需要可以自行设置具体的串行通信事件。$ @7 j. ?/ Q9 n i* w; U
其编程步骤如下
5 J" u( t& g; j+ q+ B G4 }①建立一个串行通信主程序serial.m 文件在主程序中进行串口设备初$ \! }; G* Y9 R& R
始化操作,并指定% \1 E/ k: K7 `
回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中
6 ~* v& b# K! Y% e有n 字节的数据时, 触发中断事件。此后主程序自动调用
) ?# C) d# ^* E& M' t) R7 Qinstrcallback(obj,event) 回调函数s.BytesAvaibleFcnMode='byte';% 中断触发$ O8 s( n* k4 I* t7 r e5 X
事件为‘ bytes-available Event ’
" t+ [7 A; X# ` Qs.BytesAvailableFcnCount=n;% 接收缓冲区每收到n 个字节时,触发回调函) f5 M( i9 b W; W! X8 }# P" k
数+ n g# N- }/ j1 F/ ~
s.BytesAvailableFcn=@instrcallback;% 得到回调函数句柄。
) F8 r, [: y/ x2 k. S& l+ B%另外s.BytesAvailableFcn={@instrcallback,s}; 得到回调函数句柄,并将: E S, o3 X# n4 y4 H2 d0 e' J6 t
变量s 渗透到instrcallback 中。; ], L/ d+ F& x/ ?
fopen(s);% 连接串口设备对象
* E5 k9 p4 K& A. Q$ `$ t% `fwrite(s,255);% 写串口发送握手信号0xFF( 等价于十进制下的数值255)
2 ~& }( O& R; R8 k; \$ v②修改instrcallback(obj,event) 回调函数对所发生的串口通信事件进行处8 V7 f. p4 P' h& u
理。
; S# ?+ D, c; S) L% @MATLAB 缺省的回调函数instrcallback(obj,event) 存在于instrcallback.m 文
M1 M+ N2 {( `件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些
) j1 \7 A: H4 y. c0 q2 z" a# G. V最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事4 k; d5 d/ E9 L' {( V) I
件所发生的时间以及导致事件发生的对象名等信息。修改回调函数文件8 g3 Q" `+ B9 [5 h2 u$ C% D
时, 注意要取消文件中相应信息后的分号才能够在MATLAB 的命令3 h3 h* h' Z% {) T
窗口command D& o4 {6 L y6 e# t
window 中将这些信息显示出来。中断发生后的通信事件处理以及通7 g6 y8 `# @9 f& e1 g
信数据的分析处理任
+ }! y# t7 G/ k$ S8 X务需要用户自行添加相应的服务程序代码。MATLAB 安装目标下有两
$ J& q6 U( W( ?8 T' q& `个instrcallback.m 文件
8 l/ s8 H" ^% n0 p我们只需要修改@instrument 目录下的instrcallback.m 文件即可。如果8 q5 d+ N ^% Q7 W6 a
MATLAB 安装在C 盘
2 J# L" y; r8 c; u6 H0 x6 S+ Minstrcallback.m 文件目录为$ l5 J1 C. L; x% E& n' I5 c- S
(一定要替换, 不然串口无法启动)
7 ?+ y4 B6 H$ j1.gui_cc2430receive.m 是数据采集程序运行后选择‘开始’ 开始采集) Y8 N# @( H" b B% ~# }4 q! i
数据点击希望观9 b3 o# \) M' c- B$ X6 w
察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点. d. a. [+ `1 t( r
上有五个传感器”的: h- {' s% p! Q$ g( N
情况不一定通用。
* V9 ^, r2 A+ r, ]' ^2.instrcallback.m 是系统的回调函数满足中断条件时会进入此函数。: r" l3 D2 J1 ~/ {3 g
3.callbackDealWithData.m 是实时处理函数当程序进入回调函数0 m- \9 N1 a: o8 I! ?% w
instrcallback 时就会调用此函
+ t! k. n% a; Q# q2 {! T" a2 P0 B数在callbackDealWithData 里面可以添加希望执行的指令代码完成数' r2 ]5 h& { u; d, e: v/ B
据解析、保存、数
2 S9 x; R' U i$ u8 V据滤波、画图、实时跟踪等功能。
8 H) }9 B+ I1 b* ~gui_cc2430receive.m 文件是启动本采集系统的关键其中设置的“开始”
1 e8 [. f3 O% r2 S% S6 n2 Y按钮为代码中的b1
, j+ X: V" r2 l* F按下按钮会进入b1callback 函数。
' }$ |- m0 }9 U/ J$ V2.2 快速傅里叶变换0 Y5 @/ {, y+ _: y8 f
有限长序列可以通过离散傅里叶变换(DFT) 将其频域也离散化成有限
# |$ b( \6 S( R7 S: ~/ Z( Y长序列. 但其计算量太大, 很难实时地处理问题, 因此引出了快速傅里叶变' y3 S# a- V5 S, W" D
换(FFT). 1965 年, Cooley 和Tukey 提出了计算离散傅里叶变换( DFT)" ?& o1 F* M$ z1 C6 m
的快速算法,将DFT 的运算量减少了几个数量级。从此,对快速傅里叶) D9 W' J' w5 {
变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随
' g" ?# H" ~. y9 A4 p/ K& cFFT 的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生# o9 N% p: I) ~4 L: g2 l( m, a
了FFT 的多种算法,基本算法是基2 DIT 和基2 DIF。FFT 在离散傅里叶( O# t; V# k; D" C
反变换、线性卷积和线性相关等方面也有重要应用。
! o0 m* a& y# N: ^快速傅氏变换( FFT),是离散傅氏变换的快速算法,它是根据离散
3 z) R% I& U5 D/ ~傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进
8 F5 _2 b6 M1 y( L" p获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统
4 Y4 c2 _% r' F. @& f, q或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。# x! x8 a4 {# D* w% t
设x(n) 为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要
" U8 E, N9 _( D# `N 次复数乘法和N-1 次复数加法,而一次复数乘法等于四次实数乘法和两* ^) k5 j8 x* V1 g' U+ N
次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和
$ }! F3 ^1 F/ t$ N& h) h4 A9 j3 }一次复数加法定义成一次“运算” (四次实数乘法和四次实数加法) ,那
+ ^) C8 G1 L% j7 Y7 c7 d; x么求出N项复数序列的X(m) , 即N点DFT变换大约就需要N^2 次运算。) @1 |( g- r, r% W6 o
用WN的周期性和对称性,把一个N项序列(设N=2k,k 为正整数),分为0 l, ] Z* z$ V9 [
两个N2项的子序列,每个N2点DFT变换需要( N2)2 次运算,再用N次
0 U) m, D N2 C% j& [' ]运算把两个N2 点的DFT 变换组合成一个N 点的DFT 变换。这样变换以2 F) Q" a' A: R& j) a
后,总的运算次数就变成N+2( N2)2=N+N22。继续上面的例子, N=1024
) f8 h8 a* T+ W时,总的运算次数就变成了525312 次,节省了大约50%的运算量。而如% P4 X6 G3 b& H1 X6 v; @2 ]0 R
果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的8 Y) D1 K- A s/ m" T
DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算, N 在
% [* x' X2 X5 y' C$ R9 c1 v1 T1024 点时,运算量仅有10240 次,是先前的直接算法的1%,点数越多,: m) X1 r0 q5 E' r: C/ J$ K. T
运算量的节约就越大,这就是FFT的优越性。
5 _& S& X( J$ P3 j离散傅里叶变换X(k) 可看成是z 变换在单位圆上的等距离采样值。3 F, P' V% ]! V; {' e+ ^5 }
同样, X(k) 也可看作是序列傅氏变换的采样,采样间隔为ω N=2πN 。由
; Y+ c, c$ }$ d" ` n此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有
t% y0 b' v# C+ I9 I/ F7 d. a选择性( ωk=2π kN),在这些点上反映了信号的频谱。
6 ]) F4 Q1 p. A- {7 \' Q根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失- K Z& V! b' Y0 Q
任何信息, FFT 变换则说明对于时间有限的信号( 有限长序列) ,也可以对
- a: [9 f/ ~ x7 K: |其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样
( n' Q% L+ q- t$ K H$ k. x% C足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT 可以用
, l0 p: i* h; R5 I: o9 m1 Q2 p% |- i以进行连续信号的频谱分析。
9 B# U; ^7 e" c' @2 ?/ \9 q7 c
% @) s+ g- i# U* v+ u) x/ e% P) a8 o5 _3 p# X
1 H, f9 E2 A3 t% }
3 O o, W1 k& v2 _- f8 r
|
|