心电信号的频谱分析-FFT分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书
(指导教师填写)
课程设计名称微机应用技术课程设计学生姓名专业班级
设计题目心电信号的频谱分析-FFT分析
一、课程设计目的
1.了解心电信号的特点;
2.熟悉MATLAB程序设计方法;
3.理解频谱分析的作用和相关概念;
二、设计内容、技术条件和要求
1.采样点数N=1000,采样频率f=360HZ 和 100HZ;
2.利用Matlab软件对心电信号进行时域分析(包括均值,方差,标准差,峰峰值,极大值和极小值)和频域分析(FFT),其中涉及的参数根据需要自主选择;
三、时间进度安排
第1周:查阅资料;
第2周:实现设计内容
第3周:整理资料,撰写课程设计任务书
四、主要参考文献
参考《模拟电子技术》、《Matlab信号处理与应用》和《医学仪器》教材指导教师签字:年月日
目录
摘要···············错误!未定义书签。
引言···············错误!未定义书签。
一、心电信号的特点········错误!未定义书签。
二、 MATLAB软件介绍········错误!未定义书签。
三、心电信号的分析方法 (6)
3.1时域分析 (6)
3.2频域分析 (6)
3.3 FFT分析 (7)
四、心电信号的Matlab实现 (9)
4.1 Matlab编程实现 (9)
4.2 Matlab时域分析结果 (10)
4.3 Matlab频域分析结果·······错误!未定义书签。
心得体会 (12)
参考文献 (13)
摘要
本次课程设计介绍了一种运用信号系统知识和MATLAB 相结合的思想,设计出用傅里叶变换分析MIT-BIH心电数据库的心电信号的方法。
运用该方法既能简便的对心电信号进行分析,又能把所学知识应用于解决实际问题。
该方法简单易懂,能加深初学者对傅里叶变换的理解,并且可以得到许多有用的信息,对于诊断疾病有非常重要的参考价值。
关键字:心电信号 Matlab 傅里叶变换
引言
美国麻省理工学院提供的MIT-BIH数据库是一个权威性的国际心电图检测标准库,近年来应用广泛,为我国的医学程界所重视。
MIT-BIH数据库共有48个病例,每个病例数据时长30min,共116000多个心拍,包含有正常心拍和异常心拍,内容丰富完整,为了读取方便,采用txt格式的数据文件作为我们的原心电信号数据。
利用Matlab提供的textread函数,读取txt数据文件中的信号,并还原为实际波形。
本设计课题主要研究数字心电信号的初步分析及matlab应用。
通过完成本课题的设计,主要达到以下几个目的:
(1)了解MATLAB软件的特点和使用方法,熟悉基于了解人体心电信号的时域特征和频谱特征;
(2)进一步了解数字信号的分析方法;
(3)通过本课题的设计,培养学生运用所学知识分析和解决实际问题的能力。
一、心电信号的特点
心电信号属生物医学信号,具有如下特点:
(1)信号具有近场检测的特点,离开人体表微小的距离,就基本上检测不到信号;
(2)心电信号通常比较微弱,至多为mV量级;
(3)属低频信号,且能量主要在几百赫兹以下;
(4)干扰特别强。
干扰既来自生物体内,如肌电干扰、呼吸干扰等;也来自生物体外,如工频干扰、信号拾取时因不良接地等引入的其他外来串扰等;
(5)干扰信号与心电信号本身频带重叠(如工频干扰等)。
二、 MATLAB软件介绍
MATLAB是矩阵实验室的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是由美国MathWorks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB和Mathematica、Maple并称为三大数学软件。
它在数学类科技应用软件中在数值计算方面首屈一指。
MATLAB可以进行矩阵运算、绘制函数和数据、实现算法、创建用户界面、连接其他编程语言的程序等,主要应用于工程计算、控制设计、信号处理与通讯、图像处理、信号检测、金融建模设计与分析等领域。
MATLAB的基本数据单元是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解决问题要比用C,FORTRAN
等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的使用程序导入到MATLAB 函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
三、心电信号分析方法
按照信号与系统问题可以分为两大类基本分析方法:时域分析方法和频域分析方法。
两种方法各有不同,互相补充。
3.1 时域分析
时域分析方法是对连续信号进行采样、量化和编码形成离散的二进制数字序列,再采用数字信号处理技术进行处理。
信号的采样过程如果满足一定条件,那么得到的这种离散的二进制序列在形状特征以及内在属性上完全可替代原连续信号,只是这样方便人们分析处理信号并提取有用信息。
对心电信号进行的时域处理通常包括信号的均值,方差,标准差,峰峰值,极大值和极小值六种。
3.2 频域分析
离散系统的频域分析就是研究离散信号通过离散系统以后在频谱结构上所产生的变化,为此首先必须了解描述离散系统频率特性的有关特征量。
信号的有些信息在用空域分析是得不到的,而如果用频域分析方法的话,可以得到其中许多有价值的信息。
3.3 FFT 分析
有限长序列可以通过离散傅里叶变换(DFT)将其频域也
离散化成有限长序列,但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT)。
快速傅氏变换(FFT )是离散傅氏变换的快速算法,它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。
它对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2DIT 和基2DIF 。
设x(n)为N 项的复数序列,由DFT 变换,任一X (m )
的计算都需要N 次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N 项复数序列的X (m ),即N 点DFT 变换大约就需要2N 次运算。
当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT 中,利用WN 的周期性和对称性,把一个N 项序列(设N=2k,k 为正整数),分为两个N/2项的子序列,每个N/2点DFT 变换需要()22N 次运算,再用N 次运算把两个N/2点的DFT 变换组合成一个N 点的DFT 变换。
这样变换以后,总的运算次数就变成()22222N N N N +=+。
继续上面的例子,N=1024时,
总的运算次数就变成了525312次,节省了大约50%的运算量。
而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要N
log次的运算,N在1024点时,运算量仅有10240次,N
2
是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
FFT是离散傅立叶变换的快速算法,可以将一个信号变换到频域。
有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。
这就是很多信号分析采用FFT变换的原因。
另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。
一个模拟信号,经过ADC采样之后,就变成了数字信号。
采样得到的数字信号,就可以做FFT变换了。
N个采样点,经过FFT之后,就可以得到N个点的FFT结果。
为了方便进行FFT运算,通常N取2的整数次方。
假设采样频率为Fs,信号频率F,采样点数为N。
那么FFT之后结果就是一个为N点的复数。
每一个点就对应着一个频率点。
这个点的模值,就是该频率值下的幅度特性。
假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A的N/2倍。
而第一个点就是直流分量,它的模值就是直流分量的N倍。
而每个点的相位就是在该频率下的信号的相位。
如果要要提高频率分辨率,就需要增加采样点数,也即采样时
间。
频率分辨率和采样时间是倒数关系。
四、心电信号的 Matlab实现
4.1 Matlab编程实现
clear;
close all;
%时域分析
z=textread('e:\ECG.txt');
ECG1=z(:,2); %取第二列作为分析数据
A=ECG1(1:1000);
fprintf('\n数据基本信息:\n')
fprintf('最小值=%7.3f\n',min(A))
fprintf('平均值=%7.3f\n',mean(A))
fprintf('最大值=%7.3f\n',max(A))
fprintf('标准方差=%7.3f\n',std(A))
fprintf('峰峰值=%7.3f\n',max(A)-min(A))
fprintf('方差=%7.3f\n',exp(std(A)))
figure;
plot(z(1:1000),A);
xlabel('时间(s)');
ylabel('幅值');
title('原始信号(时域)');
grid on; %画出分格线
%频域分析
ECG1=z(:,2);
x=ECG1(1:1000);
y=fft(x,1000); %做1000点傅里叶变换
mag=abs(y);
f=2*pi/1000:2*pi/1000:2*pi; %长度为1000的采样点列向量
figure;
plot(f,mag);%做频谱图
axis([0,7,0,100]); %设定坐标范围xlabel('频率(100Hz)');
ylabel('幅值');
title('心电幅频谱图 N=1000');
grid on;
4.2 Matlab时域分析结果
数据基本信息:
最小值= -0.935
平均值= -0.054
最大值= 2.945
标准方差= 0.580
峰峰值= 3.880
方差= 1.786
4.3 Matlab频域分析结果
心得体会
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
回顾此次关于“心电信号频谱分析-FFT”的课程设计,感触颇深。
虽然总是遇到瓶颈,但是我确实学到了很多东西,不仅巩固了以前所学过的知识,而且还学到了很多课外的知识。
这次课程设计使我懂得了理论与实际相结合的很重要性,只有理论是远远不够的,只有把所学的理论知识与实践相结合起来,从实践中得出结论,进而提高自己的实际动手和独立思考的能力。
毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中也发现了自己的很多不足之处,对以前所学过的知识理解得不够深刻,但通过这次课程设计之后,我对以前所学过的知识有了重新认识
这次课程设计的顺利完成,得益于同学和老师的帮助大力帮助,解决了编程设计过程中的所有问题,在此给帮助过我的所有同学和各位指导老师再次表示忠心的感谢!
参考文献
[1] 徐效文,等.MIT-BIH数据库心电数据重采样研究
[J].1002-8331,A, 2011(08):0245-0249.
[2]雷万军,胡志刚.生物医学工程专业实验指导.河南:郑州大学出版社,2012
[3]张志涌,杨祖樱,等.Matlab教程.北京:北京航空航天大学出版社,2010
[4]楼天顺,于卫,闫华梁. MATLAB程序设计语言.西安:西安电子科技大学出版社,1998
Welcome !!! 欢迎您的下载,资料仅供参考!。