|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本次课程设计利用MATLAB对产生的信号进行采集与; a o% T% W4 ~' u+ ?* L. G q+ B9 D7 B
分析,实现了DA转换的信号发生与分析。通过MATLAB
. r. o9 E. ]1 b7 ?2 lGUI 设计信号采集与分析系统,对来自上位机的正弦, R8 i" f+ E* t+ S2 M- ~- G0 K, m
波,三角波,锯齿波等函数信号进行采集与幅频特性
6 O1 Q9 l% [5 G& G& o. X: _分析,并将分析的结果通过串口发送命令给单片机系
6 ~5 o& H" c g% F y- S% Y$ b统,控制相应的数码管或LED 发光显示相应信号参
8 y- Z# ?. x1 u Q5 {数,从而达到对数字信号的分析与处理的目的。; _ Z* P4 n1 J$ O& C( f( B
第一章 MATLAB 简介
7 D2 h" A! l0 BMATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运/ q% d0 a0 h- E& z5 J
算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式5 _2 e3 h( M4 p' U. i
工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工: L7 g r3 T# C7 n( c7 F% F
程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰
1 ~0 F) \5 O8 M( Z7 e$ J3 c富的功能函数, 利用这些功能函数可以快捷而又方便地完成语音信号的处. B4 u% A' B) ?2 h1 R* b/ u' W
理和分析以及信号的可视化,使人机交互更加便捷。- G/ T i3 @# f0 f6 z
MATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂7 q9 s' }: r! `( N' N
的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由
9 `6 ]) j& m2 v3 p; }; d" i主包和各类工具箱构成。其中,主包基本是一个用CC++等语言编写成的
) l W; t9 k: B, R. V6 U函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上
& z* T4 X$ V- S8 {的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广; k" p- H( U# o
度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和4 q, _/ t( x- K: m8 y2 Q
发展, MATLAB功能越来越强大,应用也越来越广泛。/ K; G0 }) o- Z3 h' @. d: c' y
随着计算机技术和信息技术的发展,语音交互已经成为人机交互的+ s: e0 j* U) e% [' V
必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是) Q; W! y* f7 i$ D4 V: q
计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采
- D! ^; Q* p! s" K( k2 j$ W样保持、AD和DA转换等功能。尽管在Windows附件的娱乐中带有一个录; y$ N" s* W. ?- F6 Y. }2 g
音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对
; N! R6 s6 [ v6 g采集的信号进一步分析处理就必须另外编程或通过其它软件,而且
# s7 s3 a3 u7 w! A e5 oWindows 附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math0 Q# _, ]8 T$ R) Q- ^# [
Works 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵2 i- Y+ X: E: K' I
运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互
% E% ^9 H- Z' v& u式工作环境中。在MATLAB环境中, 可以通过多种编程方法驱动声卡,实" a- A9 y( v( W0 M7 n
现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功
( P8 w+ K" x$ N* ^7 U/ j能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分
- c/ \) o7 b" ^. Y, n1 i. n析提供了十分丰富的功能函数, 利用这些功能函数可以快捷而又方便地完" P7 Q6 W- d$ I2 w$ o
成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。# R$ N& x+ v' Z! W; i
第二章采集信号级处理的相关知识4 o6 K. e; z( t6 D8 B$ y" Q
2.1MATLAB信号采集的相关知识. u* f% n* O( _8 K6 e8 w* J
MATLAB 对串行口的编程控制主要分为四个步骤。# `5 ]- }# p0 E. s( H
①创建串口设备对象并设置其属性。, _* ~! x5 z- j9 P7 C
scom=serial('com1');% 创建串口1 的设备对象scom- g6 o' `* j1 N7 V$ T2 M
scom.InputBufferSize=1024;% 输入缓冲区为256B 缺省值为512B: l# Q4 n3 ~4 O m- w1 y
scom.Timeout=0.5;%Y 设置一次读或写操作的最大完成时间为0.5s, 缺省值
5 ~/ H! V5 K( `7 w为10s
, n0 n' U& A# n" [+ ls.ReadAsyncMode='continuous'( 缺省方式);% 在异步通信模式方式下, 读取
9 G4 C# s+ g8 u* B/ U' O* i串口数据采用连续接收数据(continuous) 的缺省方式,那么下位机返回的数
1 R; C7 _2 j, B T: `2 Q; J7 b据会自动地存入输入缓冲区中./ f6 R( t) ]& l, u* w
这里串口还有很多其他属性可以设置不一一列举。
8 d- y! O% P8 G; v; }* H②打开串口设备对象。fopen(scom);4 `' S6 U& Q2 D* r& _
③读写串口操作。初始化并打开串口调协对象之后现在可以对串口设
6 ]" R' d$ M: P+ ~% R7 S1 I- F' x备对象进行读写操作
$ V2 ]" b8 @7 b1 c! m) C& T- G串口的读写操作支持二进制和文本ASCII 两种方式。当MA TLAB 通! N4 g/ M) _: C b# K9 O# S
信数据采用西方ASCII) t' K. I3 k; I# n3 ]& O; k
方式时读写串口设备的命令分别是fscanf、fpritf 当MATLAB 通信数* s$ u u6 \+ l7 A% O/ T I7 Z
据采用二进制方式时6 S d% k* X) v- }7 {' y
读写串口设备的命令分别是fread、fwrite 。我们这里使用fread 可以一
' X4 w4 z. `, o3 ?5 H1 L次性把数据读进来。3 [6 a0 d' Q' r& w. E1 E. F' ?- K
④关闭并清除设备对象。' d9 @" A: s8 n4 M2 D) x9 L- a
fclose(scom) %关闭串口设备对象
( e$ o* n8 b! Mdelete(scom);%删除内存中的串口设备对象, H9 s( D5 S+ y( ?& Q& t* g
clear scom; %清除工作空间中的串口设备对象, Y) l& G8 J! l7 ]# Z
当不再使用该串口设备对象时顺序使用以上3 条命令可以将所创建的
5 n" b4 S5 i) g* i3 X: o5 S8 {串口对象清除,以免占用系统资源。& h7 P" c- b9 n% |3 t
(2)基于MATLAB 中断方式的实时串行通信编程
8 f Q# A* ]6 m" X6 _6 c, I在MA TLAB 环境下以中断的方式进行串行通信实际上是采用事件驱动8 w; m6 G" n+ N
的方法实现的。MATLAB 提供了instrcallback(obj,event) 回调函数用户0 j9 M! b- S+ o# g! B
根据需要可以自行设置具体的串行通信事件。
* a9 h/ k1 b' z: Q' T! _其编程步骤如下
T; g2 d' T+ u①建立一个串行通信主程序serial.m 文件在主程序中进行串口设备初# ^$ k. ^* c5 l( e8 `4 F8 Y
始化操作,并指定
2 y6 T G" A+ ^回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中
* G: C! { b# n7 D' s有n 字节的数据时, 触发中断事件。此后主程序自动调用
+ n2 g0 W0 D' Y0 y6 ^% d3 ainstrcallback(obj,event) 回调函数s.BytesAvaibleFcnMode='byte';% 中断触发
# x6 e# I m0 m7 D0 Y, }事件为‘ bytes-available Event ’
# _2 X: ?! }$ P6 N$ l) Ps.BytesAvailableFcnCount=n;% 接收缓冲区每收到n 个字节时,触发回调函0 n+ y+ m3 ~$ T4 P- G$ ^: ]% F
数
, M" R" _( i) N3 }8 as.BytesAvailableFcn=@instrcallback;% 得到回调函数句柄。
! [% c8 @4 P* g G4 E1 g* s%另外s.BytesAvailableFcn={@instrcallback,s}; 得到回调函数句柄,并将/ |9 N( c K& A# A; _. A4 C4 X
变量s 渗透到instrcallback 中。
. ]$ ?8 `3 @) [8 Rfopen(s);% 连接串口设备对象
! N. J. o3 d! I$ q- Efwrite(s,255);% 写串口发送握手信号0xFF( 等价于十进制下的数值255)& N% n# T9 n8 y
②修改instrcallback(obj,event) 回调函数对所发生的串口通信事件进行处
4 X/ A) P- W7 e9 q理。) ~: ? B9 E3 N( U
MATLAB 缺省的回调函数instrcallback(obj,event) 存在于instrcallback.m 文1 I* i4 c9 f9 |* V* t3 e% l+ n
件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些1 l+ u8 ?0 ?4 j
最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事
) g- p+ r( B' a' ?+ v1 O件所发生的时间以及导致事件发生的对象名等信息。修改回调函数文件( x4 X# K1 ~4 g% ^/ x
时, 注意要取消文件中相应信息后的分号才能够在MATLAB 的命令7 u/ i9 O; v, Z$ m
窗口command2 Z3 [- O C9 S1 e2 n: v3 B3 D/ J
window 中将这些信息显示出来。中断发生后的通信事件处理以及通5 S+ ]$ A+ `& |$ N3 U2 {
信数据的分析处理任) w V2 T+ d: \: F2 F8 y D
务需要用户自行添加相应的服务程序代码。MATLAB 安装目标下有两
6 g$ ^$ H. u4 F/ G& r$ A! d个instrcallback.m 文件8 b' w. E- F: k- J H3 b+ L% r- b
我们只需要修改@instrument 目录下的instrcallback.m 文件即可。如果
' G% b) U7 t) N2 a/ tMATLAB 安装在C 盘
1 Y, `! M0 `4 u Hinstrcallback.m 文件目录为
7 y( C* a6 z4 \* ](一定要替换, 不然串口无法启动)
3 Y! \* X: `+ A2 A1.gui_cc2430receive.m 是数据采集程序运行后选择‘开始’ 开始采集- n8 v3 J, o4 s$ ^" \( W, }
数据点击希望观
" Z& ~8 H0 z& s7 I* W察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点
T# X: @$ L* b/ R$ \/ ?上有五个传感器”的* J2 K+ f5 b# F& R$ @
情况不一定通用。6 D; x6 y3 q- Q
2.instrcallback.m 是系统的回调函数满足中断条件时会进入此函数。- P+ L9 o/ A& F0 g7 m
3.callbackDealWithData.m 是实时处理函数当程序进入回调函数
/ l8 R7 `; G& G* I* M& Y- K1 O' Kinstrcallback 时就会调用此函
. @) G: |/ Y1 ^: ]5 W* D数在callbackDealWithData 里面可以添加希望执行的指令代码完成数
% E" c0 L2 j9 `据解析、保存、数, j$ H) I/ e+ D2 j. a: K/ u
据滤波、画图、实时跟踪等功能。# z. p/ K0 q5 }) G% F
gui_cc2430receive.m 文件是启动本采集系统的关键其中设置的“开始”* T i7 S4 s% m2 E1 q4 P
按钮为代码中的b1/ p" f# K4 _- H9 J/ n; v% c
按下按钮会进入b1callback 函数。
3 d6 n! Y# p' o' n+ E, D2.2 快速傅里叶变换
. S, u# Z% k1 k有限长序列可以通过离散傅里叶变换(DFT) 将其频域也离散化成有限% q+ Y$ F! v& m' l# \
长序列. 但其计算量太大, 很难实时地处理问题, 因此引出了快速傅里叶变
, s- r ]& u+ C7 K! j v: f换(FFT). 1965 年, Cooley 和Tukey 提出了计算离散傅里叶变换( DFT)
$ K) l+ y% t! j的快速算法,将DFT 的运算量减少了几个数量级。从此,对快速傅里叶% s3 L3 {. q8 f8 K, {* n) d+ I, ]
变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随0 U: r* \+ I, |! G) t
FFT 的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生
8 q& T+ z9 o) @( [9 q1 f6 o9 s/ `了FFT 的多种算法,基本算法是基2 DIT 和基2 DIF。FFT 在离散傅里叶
# e+ M' I/ i% x7 _+ ]# ?3 r3 h; y( c反变换、线性卷积和线性相关等方面也有重要应用。" l! e: P3 D# Y, g7 F% ]
快速傅氏变换( FFT),是离散傅氏变换的快速算法,它是根据离散6 ^9 F( r2 G4 c3 p: f$ Q
傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进
\0 Q W! u# h$ Y% b; i获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统$ Z; U: N& y) Z5 k! |* s
或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。6 t) T' {, m' r4 ~0 n
设x(n) 为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要
% m/ \: a3 k- M- Z4 JN 次复数乘法和N-1 次复数加法,而一次复数乘法等于四次实数乘法和两
# E( w; i g) r次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和
5 L3 _" y1 R9 P9 D* S" y( {7 b一次复数加法定义成一次“运算” (四次实数乘法和四次实数加法) ,那0 M: ?; |3 L7 M2 O# B* {7 V$ C
么求出N项复数序列的X(m) , 即N点DFT变换大约就需要N^2 次运算。
2 e; C' `2 W3 o0 Y用WN的周期性和对称性,把一个N项序列(设N=2k,k 为正整数),分为
/ C2 M' H& m8 |, D* I两个N2项的子序列,每个N2点DFT变换需要( N2)2 次运算,再用N次/ b, l, e( U, X4 r7 @, t8 k
运算把两个N2 点的DFT 变换组合成一个N 点的DFT 变换。这样变换以
2 M" G2 w+ z5 E$ [后,总的运算次数就变成N+2( N2)2=N+N22。继续上面的例子, N=1024* X; X: H3 E; {) ~9 K5 ]
时,总的运算次数就变成了525312 次,节省了大约50%的运算量。而如7 \3 W. m0 T" p' X6 D: R" E
果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的 u/ o* m# \6 \ k4 n0 }
DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算, N 在4 B' B. o! j G* K0 ^
1024 点时,运算量仅有10240 次,是先前的直接算法的1%,点数越多," N' S4 C. J; w4 g& N `! |
运算量的节约就越大,这就是FFT的优越性。3 w" p3 _! H1 d1 k) O; M
离散傅里叶变换X(k) 可看成是z 变换在单位圆上的等距离采样值。# B8 r( A) B6 i' w; k' y' E+ T F. T
同样, X(k) 也可看作是序列傅氏变换的采样,采样间隔为ω N=2πN 。由$ N7 ~/ x7 H* P7 I' c) A2 ^
此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有$ A' B! f$ b: s! R0 R
选择性( ωk=2π kN),在这些点上反映了信号的频谱。& J5 o$ J. Z- j, V5 Z
根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失
2 X x6 T9 P" i: g, n, p任何信息, FFT 变换则说明对于时间有限的信号( 有限长序列) ,也可以对( R2 s1 r, O; C5 D% [; U' _9 F
其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样, A" _- X" m S, P
足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT 可以用
2 a$ {! a B- p- a# [% E以进行连续信号的频谱分析。% B5 Q! [# _- L6 \7 R
* N+ ~& U% U7 b1 U5 m# S
: z( @# W/ E& W4 H1 B( E0 H" p/ O+ F* m
+ f6 X) K6 f# a8 b* R7 E1 I9 a1 o
|
|