找回密码
 注册
关于网站域名变更的通知
查看: 556|回复: 2
打印 上一主题 下一主题

[毕业设计] 燕山大学数字数字信号处理毕业论文基于DA转换的信号发生与分析

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-11-25 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本次课程设计利用MATLAB对产生的信号进行采集与
" n1 E, D  o- \0 ?+ [& n分析,实现了DA转换的信号发生与分析。通过MATLAB
' w  x4 z! \7 }" R6 gGUI 设计信号采集与分析系统,对来自上位机的正弦4 I; J# L  q0 f$ C  }
波,三角波,锯齿波等函数信号进行采集与幅频特性4 X: H2 C. Z  V$ h/ @7 u
分析,并将分析的结果通过串口发送命令给单片机( o" m7 V: s6 G  u4 f3 ?
统,控制相应的数码管或LED 发光显示相应信号参
& j8 {% X9 H" V! K" u/ P7 D数,从而达到对数字信号的分析与处理的目的。; F- W; Y& t- C8 S- E3 i) {. J0 {: |
第一章 MATLAB 简介
2 Y7 [& P; @& ~" e& F9 H1 LMATLAB是一种面向工程和科学计算的交互式计算软件,它以矩阵运+ i0 @4 ^1 t, |4 q9 h% r
算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互式
* F* b, M5 u* T" d* [+ x工作环境中。同时由于MATLAB是一个数据分析和处理功能十分强大的工* C0 v! f+ d, M5 v! ?  S
程实用软件,它的信号处理与分析工具箱为语音信号分析提供了十分丰- I' P4 Z' I! H$ S% \1 U, ?: z  O! ~
富的功能函数, 利用这些功能函数可以快捷而又方便地完成语音信号的处
2 M7 }) U2 q7 @( s" a* _理和分析以及信号的可视化,使人机交互更加便捷。7 T3 v, I& Q! w. ]4 o* \
MATLAB是解决工程技术问题的技术平台。利用它能够轻松完成复杂
; h% X2 o+ X5 S& i1 G8 P- j的数值计算,数据分析,符号计算和数据可视化等任务。MATLAB软件由6 P! o: [/ D# p4 `
主包和各类工具箱构成。其中,主包基本是一个用CC++等语言编写成的+ \* e% T) ?6 u! \$ \
函数库。该函数库提供矩阵(或数组)的各种算法以及建立在此基础上0 b  F0 A$ T. x  V1 h9 {; \
的各种应用函数和一些相关的用户有好操作界面。而工具箱从深度和广
* b( z) n; m1 @" I9 |1 u度上大大扩展了MATLAB主包的功能和应用领域。随着自身的不断完善和
4 G6 F' h* @2 c! N% x发展, MATLAB功能越来越强大,应用也越来越广泛。- n$ p- v. w2 H6 v( X( {
随着计算机技术和信息技术的发展,语音交互已经成为人机交互的
8 _, ^6 V9 l& e: Y必要手段,而语音信号的采集和处理是人机交互的前提和基础。声卡是" B* N3 `' W" ]' ~$ a% \1 C
计算机对语音信号进行加工的重要部件,它具有对信号滤波、放大、采: w  p9 o; D  C9 H; H8 @& h4 D" p& _
样保持、AD和DA转换等功能。尽管在Windows附件的娱乐中带有一个录4 q+ y) C5 {2 y4 N; L
音机,通过它可以驱动声卡采集语音信号并保存为语音文档。但是要对
$ V8 Y9 p5 T  w* @) j采集的信号进一步分析处理就必须另外编程或通过其它软件,而且7 Z. K/ k, }% o( s' z
Windows 附件中的录音机功能极其有限且不能扩展。MATLAB是美国Math+ M' }+ E# s) [9 z; @4 o8 \
Works 公司推出的一种面向工程和科学计算的交互式计算软件,它以矩阵
& _5 ?! ~! b7 R* I: F( u* V运算为基础,把计算、可视化、程序设计融合到了一个简单易用的交互
4 f" o/ n% ?$ Z( x$ ~1 _式工作环境中。在MATLAB环境中, 可以通过多种编程方法驱动声卡,实" P1 s2 J* p2 b* z
现对语音信号的采集和回放。同时由于MATLAB是一个数据分析和处理功
% a& E- t, r- k# M/ K能十分强大的工程实用软件,它的信号处理与分析工具箱为语音信号分  S# O. |3 F( K! a' a1 X/ s
析提供了十分丰富的功能函数, 利用这些功能函数可以快捷而又方便地完/ `( K! W% K+ ]" S0 B; z( q
成语音信号的处理和分析以及信号的可视化,使人机交互更加便捷。
8 I* s1 X9 r1 f* h2 A第二章采集信号级处理的相关知识) y& ^# F: I3 i5 l+ f6 B, I) x, o
2.1MATLAB信号采集的相关知识
2 D- a/ z6 Z2 G- [9 W" p( uMATLAB 对串行口的编程控制主要分为四个步骤。
3 T+ d6 n" _( ]+ p8 B; J; r4 g; @) O①创建串口设备对象并设置其属性。  q2 J. j7 L; B( ?
scom=serial('com1');% 创建串口1 的设备对象scom
/ X+ D6 @0 k7 ~  d( fscom.InputBufferSize=1024;% 输入缓冲区为256B 缺省值为512B
) X& k; y  j, o! x. Y! yscom.Timeout=0.5;%Y 设置一次读或写操作的最大完成时间为0.5s, 缺省值
8 d. o/ i# i) G9 L* T为10s9 O: S& ~0 x2 F
s.ReadAsyncMode='continuous'( 缺省方式);% 在异步通信模式方式下, 读取
3 k( D- D; a# M8 D# y3 @串口数据采用连续接收数据(continuous) 的缺省方式,那么下位机返回的数
3 c* S# E) w2 I9 B: g$ N8 o据会自动地存入输入缓冲区中.$ F9 M9 [8 s% O. j+ b
这里串口还有很多其他属性可以设置不一一列举。
) M0 |+ }+ G. V9 A. `②打开串口设备对象。fopen(scom);
  |$ A) `0 e. u* `  m) {4 O③读写串口操作。初始化并打开串口调协对象之后现在可以对串口设
4 r; f  a; G! h/ L2 f5 P备对象进行读写操作9 s# a7 G  K+ m/ @  B( k+ _# p
串口的读写操作支持二进制和文本ASCII 两种方式。当MA TLAB 通
+ _' X# `: [2 C- o7 u+ p信数据采用西方ASCII
& M6 C. D( M6 G# S: c方式时读写串口设备的命令分别是fscanf、fpritf 当MATLAB 通信数
8 }1 p4 P+ _. m2 I1 |) `& T据采用二进制方式时( j5 w. i+ l: }* g$ U
读写串口设备的命令分别是fread、fwrite 。我们这里使用fread 可以一/ `# M* L3 G" y9 O
次性把数据读进来。8 x8 {* s8 A. ]: c- f2 ^! q! Q, Q. Y
④关闭并清除设备对象。- g- h$ F% _* A2 v
fclose(scom) %关闭串口设备对象
% O( T6 ^; ]. u! Tdelete(scom);%删除内存中的串口设备对象
5 ]3 ~- e; y# a* `clear scom; %清除工作空间中的串口设备对象
' C1 w3 M5 t4 F& \当不再使用该串口设备对象时顺序使用以上3 条命令可以将所创建的
2 l, g6 l6 O& B串口对象清除,以免占用系统资源。3 t# b9 S, U/ t5 [1 `
(2)基于MATLAB 中断方式的实时串行通信编程
+ k. X' N) g2 b1 j6 f; W7 O在MA TLAB 环境下以中断的方式进行串行通信实际上是采用事件驱动$ }1 M9 M& \7 e7 m- M
的方法实现的。MATLAB 提供了instrcallback(obj,event) 回调函数用户& x% R) k* j7 C. v  c
根据需要可以自行设置具体的串行通信事件。& G/ ^" X, V2 ]* |( L% N4 q- \
其编程步骤如下7 n4 |$ Q' R0 W/ [. j8 Y# c
①建立一个串行通信主程序serial.m 文件在主程序中进行串口设备初
7 B0 k4 m( {) R) H$ [始化操作,并指定
, S$ V( M9 w" ?$ F8 s0 `9 X8 p回调函数中串行通信的事件。设置回调函数触发事件—当串口缓冲区中! c. j) V+ z; p! E7 G" m
有n 字节的数据时, 触发中断事件。此后主程序自动调用
" |' o+ J5 K+ }5 N2 c& q# Zinstrcallback(obj,event) 回调函数s.BytesAvaibleFcnMode='byte';% 中断触发
9 y0 e, B" K% H4 {/ U: [事件为‘ bytes-available Event ’
7 w$ n1 d: ^; d+ J/ As.BytesAvailableFcnCount=n;% 接收缓冲区每收到n 个字节时,触发回调函
* J7 V* x& M: o* o; r5 E  E' t3 h9 Z7 r! K4 _2 R% d( N
s.BytesAvailableFcn=@instrcallback;% 得到回调函数句柄。
  r6 P  x* S7 V0 R%另外s.BytesAvailableFcn={@instrcallback,s}; 得到回调函数句柄,并将
8 \! x5 ~9 t" P+ P变量s 渗透到instrcallback 中。1 u0 o- e# U1 f4 O8 y
fopen(s);% 连接串口设备对象3 S! V2 r- K4 j( F6 q
fwrite(s,255);% 写串口发送握手信号0xFF( 等价于十进制下的数值255)# P" T8 [1 ~* E7 d" t
②修改instrcallback(obj,event) 回调函数对所发生的串口通信事件进行处
% ?; N/ o3 `0 r: ?) n- n7 K: p: p理。
, u% m. ^. y) X* Z; D$ mMATLAB 缺省的回调函数instrcallback(obj,event) 存在于instrcallback.m 文
/ o, \! I; W' S. U件中。该文件实际上是一个有待于用户修改的程序模块。其中只有一些
. D+ ]  q3 E9 ]4 G最基本的程序代码能够显示导致串口中断发生的是哪一类事件,中断事  W0 ]# x3 r6 E& H( [' |4 `
件所发生的时间以及导致事件发生的对象名等信息。修改回调函数文件" h: e: U. g# r! U
时, 注意要取消文件中相应信息后的分号才能够在MATLAB 的命令
" V; a; K! w1 o- v0 _窗口command
5 ?# U; d' Z# xwindow 中将这些信息显示出来。中断发生后的通信事件处理以及通
0 c6 w0 g! p- Z  \& Y7 m: X信数据的分析处理任' T5 _1 Z& I5 K7 E
务需要用户自行添加相应的服务程序代码。MATLAB 安装目标下有两
1 O3 {  Z) V# d个instrcallback.m 文件/ t! O6 u# R/ |/ ^/ k
我们只需要修改@instrument 目录下的instrcallback.m 文件即可。如果& H- H8 e) b6 g) x: x. N" s
MATLAB 安装在C 盘
6 M- P' W4 p+ C7 l- Finstrcallback.m 文件目录为
8 t2 x1 I9 H, r, W2 u4 }" i(一定要替换, 不然串口无法启动)
) D4 y7 r$ U  D( s1.gui_cc2430receive.m 是数据采集程序运行后选择‘开始’ 开始采集
8 ~- W' f, F+ G' u$ J- _! ?2 ]数据点击希望观* R% S8 w* o# X" r- @, n# G: i
察的节点可查看该节点的数据波形图。此程序有针对目前使用的“节点. l7 @9 D; E( ~% X
上有五个传感器”的
6 N/ C2 h, P) h# N2 n1 i# ^  z. s: n& b情况不一定通用。
8 J2 ]. {0 \* w( R; R: j& }2 S6 r2.instrcallback.m 是系统的回调函数满足中断条件时会进入此函数。
, ]9 s: n" s; r  M2 p3.callbackDealWithData.m 是实时处理函数当程序进入回调函数
- `4 a# \2 j4 s) I. ~8 \instrcallback 时就会调用此函) k, F$ x9 |# m8 v$ Y4 @
数在callbackDealWithData 里面可以添加希望执行的指令代码完成数6 y8 f- O" a; {
据解析、保存、数8 r' `. @6 ]0 ?
据滤波、画图、实时跟踪等功能。1 Z  ?3 G- D% V# V+ g6 X
gui_cc2430receive.m 文件是启动本采集系统的关键其中设置的“开始”) g6 w1 E# m7 j  w& W. O/ n
按钮为代码中的b1
( K. w" P4 D" y: o2 h! s7 D+ h, S按下按钮会进入b1callback 函数。
  r& `1 X" r. d! O% u' s& H% ]2.2 快速傅里叶变换
" A% u6 I2 z3 s1 w) V7 K6 {( O有限长序列可以通过离散傅里叶变换(DFT) 将其频域也离散化成有限) P% I" _( Q! Y/ W9 D
长序列. 但其计算量太大, 很难实时地处理问题, 因此引出了快速傅里叶变$ Y9 R' i0 h. e! ?$ r- _! ~8 z: u9 E
换(FFT). 1965 年, Cooley 和Tukey 提出了计算离散傅里叶变换( DFT)% x* P! [, }! |# ?/ G% b
的快速算法,将DFT 的运算量减少了几个数量级。从此,对快速傅里叶
8 x* a- z9 u+ `: d变换( FFT)算法的研究便不断深入,数字信号处理这门新兴学科也随
4 g6 ~5 `7 o' A1 m2 Q% WFFT 的出现和发展而迅速发展。根据对序列分解与选取方法的不同而产生6 Y. ~/ \& J# e2 l8 w4 e6 r- t
了FFT 的多种算法,基本算法是基2 DIT 和基2 DIF。FFT 在离散傅里叶
' v* R- K9 k7 v2 l$ E反变换、线性卷积和线性相关等方面也有重要应用。
& \( b  Y/ M' u0 j1 ?快速傅氏变换( FFT),是离散傅氏变换的快速算法,它是根据离散
) D1 F8 J: B3 O6 \6 ?+ m4 q傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进
+ `+ [# J7 v( s- Z0 O) c  B获得的。它对傅氏变换的理论并没有新的发现,但是对于在计算机系统
; B( E& w+ r: u, b6 J5 [' f* X或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
- m+ I/ ~& T& S7 i2 s7 B设x(n) 为N 项的复数序列,由DFT 变换,任一X(m)的计算都需要
; z2 u" ~; [/ X9 A2 G3 sN 次复数乘法和N-1 次复数加法,而一次复数乘法等于四次实数乘法和两+ J. `  F) W% T* n
次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和# L4 x1 x; \; H: O! P) U+ H& x  R' z+ q9 j
一次复数加法定义成一次“运算” (四次实数乘法和四次实数加法) ,那, C& \5 a/ S! C& c
么求出N项复数序列的X(m) , 即N点DFT变换大约就需要N^2 次运算。
5 x/ Q4 M# ~% E用WN的周期性和对称性,把一个N项序列(设N=2k,k 为正整数),分为
$ S$ S) B' J" q/ h! y  B两个N2项的子序列,每个N2点DFT变换需要( N2)2 次运算,再用N次
9 _: \- s4 |5 `; d8 U运算把两个N2 点的DFT 变换组合成一个N 点的DFT 变换。这样变换以6 L8 V$ \+ w9 C2 g3 G8 x" d' `
后,总的运算次数就变成N+2( N2)2=N+N22。继续上面的例子, N=10246 l' p- b; X% ?6 k1 X
时,总的运算次数就变成了525312 次,节省了大约50%的运算量。而如! |2 a6 o. S1 z4 u
果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的" k! o; l$ F! S" }% }# h. N
DFT 运算单元,那么N 点的DFT 变换就只需要Nlog2N 次的运算, N 在8 Z9 f( P+ w% _+ J. P( M
1024 点时,运算量仅有10240 次,是先前的直接算法的1%,点数越多,. d6 F$ V3 u9 W0 M
运算量的节约就越大,这就是FFT的优越性。4 ^+ [5 K3 o* m& o  N  j
离散傅里叶变换X(k) 可看成是z 变换在单位圆上的等距离采样值。
8 f* }1 l8 D. f同样, X(k) 也可看作是序列傅氏变换的采样,采样间隔为ω N=2πN 。由4 A8 \+ s2 W1 J) R
此看出,离散傅里叶变换实质上是其频谱的离散频域采样,对频率具有! t7 d: \& W# ]) |; [' H) H2 g
选择性( ωk=2π kN),在这些点上反映了信号的频谱。1 C: Q# T1 b/ Y7 ]+ w6 K# o# A+ d
根据采样定律,一个频带有限的信号,可以对它进行时域采样而不丢失+ _2 p2 A" l8 L9 t5 ?+ v+ h# _
任何信息, FFT 变换则说明对于时间有限的信号( 有限长序列) ,也可以对
/ a4 v* q! j% }4 j- @' u1 _) O& f其进行频域采样,而不丢失任何信息。所以只要时间序列足够长,采样
& @3 ^4 d& E7 x' r3 u4 _; t9 F足够密,频域采样也就可较好地反映信号的频谱趋势,所以FFT 可以用
( i: \* N6 H0 t# |1 w( J以进行连续信号的频谱分析。9 W5 M* Y5 B+ i& k+ N) z$ F% h

/ K  F, I$ g( K7 ~3 [- M8 c1 w: Q9 H6 O) m0 W
游客,如果您要查看本帖隐藏内容请回复
( g5 l* b3 i" C  u* o# k9 z$ i3 W
6 M: R  X' B0 v* z

该用户从未签到

2#
发表于 2019-11-26 11:16 | 只看该作者
学习一下啊

该用户从未签到

3#
发表于 2022-12-25 11:28 | 只看该作者
学习一下,谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-9 20:12 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表