嵌入式系统综合实践.docx
- 文档编号:3769224
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:18
- 大小:147.18KB
嵌入式系统综合实践.docx
《嵌入式系统综合实践.docx》由会员分享,可在线阅读,更多相关《嵌入式系统综合实践.docx(18页珍藏版)》请在冰豆网上搜索。
嵌入式系统综合实践
嵌入式系统综合实践
课程设计(论文)
脉搏波心率测量算法设计
院(系)名称
电子与信息工程学院
专业班级
计算机666
学号
1104010xx
学生姓名
XX
指导教师
李晗讲师
起止时间:
2014.12.29—2015.01.09
课程设计(论文)任务及评语
院(系):
电子与信息工程学院教研室:
计算机科学与技术
学号
1104010
学生姓名
专业班级
计算机666
课程设计(论文)题目
脉搏波心率测量算法设计
课程设计(论文)任务
任务要求:
采集得到了脉搏波数字形式的数据,单片机通过这些数据计算心跳次数。
要求用Matlab设计心率计算方法,使其计算给定脉搏波数据(1组)反应的心率次数。
技术要求:
1、要求输入函数test(x),屏幕上出现脉搏波的心跳个数。
2、在屏幕上画出计算心率各个过程原始数据的变化情况。
3、分析把数据变化成什么样的形式才能用程序计算心率。
指导教师评语及成绩
平时成绩:
答辩成绩:
论文成绩:
总成绩:
指导教师签字:
年月日
注:
平时成绩占20%,答辩成绩占40%,论文成绩占40%。
目录
第1章绪论1
1.1算法研究的背景1
1.2算法研究的意义1
1.3开发工具1
第2章需求分析3
2.1主要研究内容3
2.2算法性能需求3
第3章算法的选择与比较4
3.1心电基线漂移去除方法的比较研究4
3.1.1形态滤波4
3.1.2FIR滤波4
3.1.3小波变换5
3.1.4中值滤波-小波变换5
3.1.5拟合基线法原理5
3.2快速中值滤波的应用6
第4章算法设计与编码8
4.1算法设计8
4.2编码设计与分析8
第5章设计结果与分析11
5.1脉搏波心率测量算法设计目的11
5.2脉搏波心率测量算法设计结果11
5.3脉搏波心率测量算法设计的分析14
第6章总结17
参考文献18
第1章绪论
1.1算法研究的背景
脉搏波信号处理算法的研究对于心血管疾病多参数检测技术的发展具有重大意义。
近年来,脉搏波信号的特征提取已经成为人体健康监护领域的研究热点之一。
通过脉搏波信号能够检测心血管功能的多项参数,具有无创、快速等特点,是防治心血管疾病的重要手段。
目前,脉搏波信号的处理算法研究还小成熟,特别是信号的特征提取,使其在检测设备中的应用发展缓慢,开展该方而的研究具有重要的实际应用价值及社会意义。
首先,对脉搏波信号特点及波形特征进行了分析,在此基础上采用了基于数学形态学的脉搏波信号预处理算法,分别设计了加权组介形态滤波器去除脉冲噪声和抑制基线漂移,并进行了仿真研究,该算法能够有效去除噪声而小损伤原信号的特征。
其次,针对脉搏波信号与振动系统的联系,建立了基于振动理论的脉搏波信号特征提取数学模型,在此基础上,提出了脉搏波信号特征提取算法,对该算法进行了数学分析,证明其物理可实现性,得到了相关参数的范围。
并针对脉搏波信号的周期、波形和血压信号特征,定义了相关的特征提取向量,并给出具体实现过程中的信号运算数学表达式。
运算量较小、耗费时间也较短,仿真实验结果表明该方法是有效实用的。
最后,脉搏波心率测量算法设计,利用实验系统采集到的脉搏波信号对算法进行验证,基于MATLAB对数据进行处理,得到最优算法。
这将对心血管检测、数据分析有很大的帮助。
1.2算法研究的意义
从人体采集到的脉搏波信号,由于脉搏波信号信噪比比较低,给后续参数的准确测量带来了困难,所以对于噪声干扰的去除是非常重要而必须的。
其中脉搏波信号中常见的噪声有工频干扰、基线漂移、肢体抖动、肌肉紧张而引起的干扰等,本文基于基线漂移法结合MATLAB对数据进行了实时的处理。
用MATLAB计算了所给脉搏波信号的心跳次数。
实现了MATLAB上对脉搏波信号的实时处理。
1.3开发工具
算法研究环境:
1.硬件PC(操作系统:
Winxp/Win7)2.软件Matlab
MATLAB(MatrixLaboratory,矩阵实验室)是由美国MathWorks公司开发的一种功能强、效率高、简单易学的可视化软件,覆盖面包括控制、通讯、金融、图像处理、建筑、生物学等几乎所有的行业与科学领域。
除了经典的一些算法外,MATLAB还提供了丰富的数据分析和处理功能模块,如神经网络、小波分析、信号处理、图像处理、自动控制、模糊控制、系统仿真等,因此MATLAB是一种高效的编程软件。
本文介绍利用MATLAB软件作为技术平台,实现对统脉搏波快速、准确实时显示,而且实现方法简单有效,有一定的实用性。
第2章需求分析
2.1主要研究内容
从上面的分析可以看到,尽管脉搏波信号处理领域的研究取得了较大的进展,并且相关处理方法在一定程度上得到了应用,但是,目前的信号处理方法还不够成熟,比如准确性不高,对非线性信号处理效果不理想;数学原理复杂,计算量大,不适合嵌入式应用;实时处理能力差,不利于在实时监护系统中的应用。
用Matlab计算所给脉搏波信号的心跳次数主要研究内容有:
(1)分析原始脉搏波数据的特点,研究脉搏波数据的预处理方法,寻找一种
新的更适于脉搏波信号特点的方法,有效去除高频脉冲噪声和基线漂移,并
且不损失原信号的特征,为脉搏波的特征提取奠定基础。
(2)研究脉搏波信号的特征提取算法,根据脉搏波信号特征提出一种新
的简单易实现、计算量小且具有在线处理功能的特征提取算法,对算法进行
数学分析,并设计算法的具体实现过程,给出信号运算的数学表达式,分别
实现脉搏波周期特征、波形特征与血压信号特征的提取,解决脉搏波的有效
应用中存在的困难。
(3)脉搏波信号测量算法设计,要求输入函数test(x),屏幕上出现脉搏波的心跳个数。
2.2算法性能需求
消除心电信号的基线漂移,是心电信号处理中的一个重要而又困难的问题。
因为基线漂移严重时,往往使波形识别和参数测量成为不可能,甚至无法记录。
发生基线漂移的原因有电极电阻变化、电极的极化电位变化、心电放大器的直流偏置漂移、人体呼吸或其他肌肉缓慢运动等。
基线漂移的频率很低,其范围为0.05Hz至几Hz,其主要分量在0.1Hz左右。
而心电信号的ST段频率也很低,其最大值约为0.6~0.7Hz,两者的频谱非常接近,所以如果使用高通滤波的方法消除基线漂移,即使采用线性相位的滤波器,也常常会引起严重失真。
对基线漂移纠正方法的研究,在心电信号处理中有着重要意义。
本文通过研究快速中值滤波在滤波心电图信号基线漂移中的应用,以及心电基线漂移去除方法的算法比较,得出简单、精确度比较高的算法,进而基于MATLAB求出脉搏波的心跳个数。
第3章算法的选择与比较
3.1心电基线漂移去除方法的比较研究
基线漂移是心电信号幅值测量与形态分析(尤其是ST段)的重要影响因素,抑制基线漂移是正确获心电信息的前提。
滤波法和拟合基线法是两类最常用的基漂抑制方法。
传统方法如小取心电信息的前提。
滤波法和拟合基线法是两类最常用的基漂抑制方法。
传统方法如小波分解、形态滤波、FIR滤波、中值滤波、基于全部数据的最小二乘拟合法、基于基线上关键点的函数拟合法等,都在心电基漂去除中得到了广泛的应用;近年来,新兴方法如自适应滤波、经验模值分解等也被尝试用于心电基漂去除的研究中。
然而,这些研究大多以定性分析为主,所分析的数据没有通用性,因此不便于在实际应用中对各种算法的取舍提供参考;即便有些研究使用MIT/BIH数据库的样本,但由于MIT/BIH数据都包含基漂、工频、运动伪迹等多种干扰(实际的体表ECG必然受噪声干扰),因此,不能定量比较各种算法对信噪比的改善程度。
这里依次阐述滤波法和拟合法的原理与特点。
3.1.1形态滤波
形态运算包括腐蚀、膨胀、形态开和形态闭等。
形态开可以抑制信号中的正脉冲噪声,而形态闭可以抑制信号中的负脉冲噪声。
通常使用形态开、闭运算的级联形式来同时滤除信号中的正、负脉冲噪声。
如果结构元素的宽度小于所有ECG特征波形的宽度,则开、闭运算后,ECG的特征波形会被保留,而信号中宽度小于结构元素的干扰脉冲会被清除。
另一方面,有基线漂移的ECG信号可看成缓慢变化的“基漂”信号上叠加有宽度相对狭窄的ECG信号,如果结构元素的宽度大于所有ECG特征波形(PQRSTU波)的宽度,则形态运算就能够从含噪信号中分离出基线漂移信号。
3.1.2FIR滤波
N阶FIR滤波器在Z平面内有NR个零点,其收敛域总是包括单位圆,因此FIR滤波器总是稳定的。
系数对称的FIR滤波器能够保持线性相位,这是ECG除噪所需要的,但需注意N阶偶对称或奇对称的FIR滤波器有N/2点延时。
FIR滤波的原理简单、无累积误差,适于实时场合,但幅频失真一般比较明显。
3.1.3小波变换
信号的小波变换相当于信号在不同尺度的带通和低通滤波,可分解得到信号的逼近分量和细节分量。
基线漂移主要为低频分量,在小波重构的过程中,只要将高尺度的逼近分量置零,就得到了去除基漂的信号。
在信号采样频率一定的情况下,对于某一确定小波,其不同尺度下的频率中心和窗宽都是确定的,由此可确心和窗宽都是确定的,由此可确定去除基线漂移的小波变换的最佳分解尺度。
形态运算-小波变换 形态滤波能够简单提取基漂的轮廓,但产生了一种近似矩形或梯形的波动,这是形态运算设置门限而带来的截断误差,可考虑用小波分解对粗糙的基漂进行平滑。
形态滤波与小波分解的联合算法是:
首先用形态滤波提取粗糙的基漂信号;再通过小波分解将粗糙的基漂分解在N个尺度上,重构时只保留2Hz以下的逼近分量和细节分量,这样就获得了平滑的基漂,进而获得滤除基漂干扰的信号。
综合算法中,形态滤波得到了有显著失真的粗糙基漂,小波分解与重构过程则实现了对粗糙基漂的平滑处理。
3.1.4中值滤波-小波变换
类似形态滤波,中值滤波能够粗略地提取基漂轮廓,但也产生了一种“台阶状”失真,这是中值运算所产生的截断误可首先用中值滤波提取粗糙的基漂信号,然后用小波分解重构方法再进一步对基漂进行平滑差。
原理类似形态滤波与小波分解的综合算法。
3.1.5拟合基线法原理
基线拟合分为整体拟合和分段拟合两种。
整体法是在得到全部参考点后再拟合基线,不能实时实现。
分段拟合具有简洁、快速的特点,适用于实时场合。
李惠军等对分段3次函数校正和抛物线校正给出了较透彻的分析,由于其方法是在每个心拍的TP段上选取一个参考点的坐标及其导数,故这里称其为“导数法”。
为了更细致的刻画基漂,也可每个心拍的TP段上选取3个“基准点”坐标,不计算导数,本文称之为“坐标法”。
直观上,这3点的最佳位置应该是:
TP段起点(即本心拍的T波终点),TP段终点(即下一个心拍的P波起点),TP段的中点。
一方面,室性早搏等情况下不存在P波;另一方面,由于噪声的影响,P波的准确定位有时比较困难。
因此,为了提高可行性和可信度,这里根据R波的峰点位置和RR间期来确定TP段的3个插值点。
几种滤波方法中,综合滤波算法的误差(STD)最小、SNR改善最多,但效果仍不理想。
究其原因,基漂是变化的,而滤波算法的自适应性不强。
形态运算的时间消耗较大,而且结构子越长,时耗越大。
结构子长度主要和信号的采样率联系,采样率越大,则结构子越长。
因此,在实时性要求较高的场合,应避免使用形态方法。
中值运算需要进行排序操作,时间消耗较大,因此中值滤波也不适合在实时场合使用。
改善的信噪比(SNR)和均方差(STD)成反相关,即信噪比的改善越高,则输出信号与理论信号的差别就越小。
线性相关系数r与改善的SNR(或STD)的变换趋势并不完全一致,反映了两个信号交流分量变化趋势的一致性程度,而STD则反映了两个信号的差别大小,SNR反映了信号能量与噪声能量的比值。
3.2快速中值滤波的应用
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,被广泛应用于去除脉冲噪声。
自1970年被提出以来,因其具有良好的边缘保持特性和滤除脉冲噪声的能力,被广泛用于数字图像处理。
中值滤波的定义:
信号()=0,1,…,N-1),取长度为L=2M+1(M为正整数)的滤波窗口,设在第n时刻输入信号序列在窗口中的采样点为x(n—M),…,X(r1),…,X(n+M)。
此时的输出为:
y(n)=med{x(n—)…,x(n)…x(n+)}(1.1-1)其中,med表示对窗口内所有数按从小到大排序后取中值的运算。
由公式(1.1-1)可以看出,中值滤波的主要运算是对窗口内的数据进行排序,然后取中值,对分查找流程图如图3.1所示。
图3.1对分查找
所以对窗口内数据的排序速度决定了中值滤波算法的处理速度。
假设原始心电数据序列长度为N,表示为(X(0),X
(1),…,X(N一1)),滤波窗口长度为2M+l,表示为(w(0),w
(1),…,w(2M)),中值滤波算法共需要N-2M次对长度为2M+1的心电数据进行排序。
有序序列w中元素的删除和内插如图3.2所示。
由数据结构中的知识可知,对n个元素进行排序时,所需的比较次数在理论上的最小:
O(nlog,r/)。
数据元素间的比较次数是影响排序速度的一个重要因素。
当原始心电信号数据序列较长或滤波窗口宽度较大时,传统中值滤波算法需要大量的计算时间。
图3.2元素的删除和内插
第4章算法设计与编码
4.1算法设计
对脉搏波心率测量可以通过Matlab软件设计算法,算法包括对脉搏数据通过图形的方式显示出来,从图形中可以直观的看出脉搏的波形图,并且可以观察到每个波形的峰值,其峰值就是每次的心跳次数。
这只是通过肉眼观察到的数据,那利用Matlab软件可以准确的将脉搏心跳次数显示在屏幕上,这就需要对原始图形进行处理,处理思路就是将弧形脉搏波改变为纯净的倒三角,最后通过一个计数函数对每个倒三角进行个数,并将所得值显示在屏幕上。
4.2编码设计与分析
1.脉搏波低通处理:
该阶段主要是对脉搏波波形进行处理,主要设计了低通滤波functiony=low_pass(x,f1,f3,rp,rs,Fs)和切比雪夫滤波器,最后可以通过plot()来查看滤波后的曲线,设计代码如下:
functiony=low_pass(x,f1,f3,rp,rs,Fs)
%低通滤波
%使用注意事项:
通带或阻带的截止频率的选取范围是不能超过采样率的一半
%即,f1,f3的值都要小于Fs/2
%x:
需要带通滤波的序列
%f1:
通带截止频率
%f3:
阻带截止频率
%rp:
边带区衰减DB数设置
%rs:
截止区衰减DB数设置
%FS:
序列x的采样频率
%rp=0.1;rs=30;%通带边衰减DB值和阻带边衰减DB值
%Fs=2000;%采样率
%
wp=2*pi*f1/Fs;
ws=2*pi*f3/Fs;
%设计切比雪夫滤波器;
[n,wn]=cheb1ord(wp/pi,ws/pi,rp,rs);
[bz1,az1]=cheby1(n,rp,wp/pi);
%查看设计滤波器的曲线
[h,w]=freqz(bz1,az1,256,Fs);
h=20*log10(abs(h));
figure;plot(w,h);title('所设计滤波器的通带曲线');
gridon;
y=filter(bz1,az1,x);%对序列x滤波后得到的序列y
end
2.微分处理:
该阶段是对图形变换处理,其目的主要在于准确求出不规则电脉冲随幅度变化的速率变化,通过常用的数学函数的微分变换,以及实现这种变换所用的微分器和实验装置,在双踪示波器屏幕上能够显示出速率变化图形。
这种图形,在医学上对研究肌肉和神经电脉冲是非常有用的。
设计代码如下:
functiondiff2=diff2(y1)
y2=low_pass(y1,100,500,0.1,30,4000);
y3=diff(y2);
diff2=diff(y3);
figure(3);
plot(diff2);
end
3.设定阀值:
在进行了一次微分后形成的脉搏波图形中有许多高低不齐的弧线,为了便于计算脉搏心跳数,需要设定一个阀值使成为一个纯净的倒三角,倒三角一个周期不存在唯一点能用>0或<0,到了设定阀值就需要调整。
计算机通过识别倒三角的个数最终确定脉搏波心跳次数。
设计代码如下:
fori=1:
899;
if(x2(i)>-1.5)%设定阀值使成为纯净的倒三角倒三角一个周期不存在唯一点能用>0or<0表示-1.5需要调整
x2(i)=0;
elseif(x2(i)<0)
x2(i)=x2(i);
end
end
end;
4.图形输出:
在Matlab中对脉搏波图形输出语句有plot()和figure(),这两个语句是成对出现的,将这两个语句放在指定的位置就可以显示相应的图形。
设计代码如下:
figure
(1);
plot(x2);
5.脉搏波心跳计数:
该过程是对处理后的图形进行计算峰值个数,通过两次微分之后输出的图形如图4.1所示,系统会根据图形来作出判断,当遇到有0变为1的时候系统会调用计数器count_pulse,并且count_pulse值加一,在这之前需要设置一个范围来去掉后期振荡。
设计代码如下:
%count0=0;%数0计数
count_pulse=0;
fori=1:
898;%去掉后期振荡
ifx3(i)==0&&x3(i+1)<0;
count_pulse=count_pulse+1;
end
end
result=count_pulse;%显示结果
图4.1两次微分图
第5章设计结果与分析
5.1脉搏波心率测量算法设计目的
脉搏波心率测量算法设计是为了方便对人体心率的计算,是一种智能化的将人体心跳直观的显示出来,在医学方面提高了对心跳数据的处理,是可靠性很高的一种设计方发。
它是在医学方面很重要和复杂的工作,而对测量设计可靠性保证具有极其重要的意义。
目前的条件下,脉搏波心率测量算法设计在未来相当长的一段时间内仍然是在医学上很实用的方法。
不足的设计会隐含着太多的错误,过度的设计则浪费人力物力。
因此再设计算法的时候只是对脉搏图形化并且能够显示心跳个数。
5.2脉搏波心率测量算法设计结果
根据第四章的内容可以将每个过程合并在一起,这样就形成了对脉搏波心率测量的算法了,并将代码放在test.m中,设计代码如下:
functionresult=test(x)%有返回值返回心跳次数
x1=low_pass(x,100,500,0.1,30,4000);%脉搏波低通处理
x2=diff(x1);%一次微分
x2=x2(100:
999);%去掉前期的振荡
figure
(1);
plot(x2);
fori=1:
899;
if(x2(i)>-1.5)%设定阀值使成为纯净的倒三角倒三角一个周期不存在唯一点能用>0or<0表示-1.5需要调整
x2(i)=0;
elseif(x2(i)<0)
x2(i)=x2(i);
end
end
end;
x3=diff(x2);%二次微分使=0<0后的点成为标定点
figure
(2);
plot(x3);
%count0=0;%数0计数
count_pulse=0;
fori=1:
898;%去掉后期振荡
ifx3(i)==0&&x3(i+1)<0;
count_pulse=count_pulse+1;
end
end
result=count_pulse;%显示结果
运行结果:
>>plot(x)
>>test(x)
ans=6
以上代码就是计算心率的代码,在执行代码之前还需要将原始脉搏波数据输入到MATLAB中,并且设置变量为x,该代码对所有输入的脉搏波数据都可以进行计算数。
然后在MATLAB中输入plot(x)函数就可以输出脉搏波数据的原始图形,如图5.1所示:
图5.1脉搏波数据的原始图形
如果要计算脉搏波心跳次数则需要输入函数test(x)来显示出最终的结果,其中还会输出两个类似图5.1的图形,两个图形所表示的含义是第一次微分和第二次微分后图形。
第一次微分的图形如图5.2所示,它是经过脉搏低通处理后,然后进行一次微分,通过这个图可以看出它原始图相比较更能体现出脉搏的形状。
第二次微分的图形如图5.3所示,它是在第一次微分图的基础上在此进行一次微分,发现改图与第一次微分后的图形峰值个数不相同,说明有错误,因此需要对程序进行改变。
图5.2第一次微分图
图5.3第二次微分图
5.3脉搏波心率测量算法设计的分析
1.对代码的修改
为了达到题目要求,要对test.m进行改变。
主要改变了在第一次微分后设置的阀值,并且在进行第二次微分之前加了一个图形输出语句figure(10)、plot(x2),这样就可以观察修改完阀值后的倒三角图形,如图5.4所示。
functionresult=test(x)%有返回值返回心跳次数
x1=low_pass(x,100,500,0.1,30,4000);%脉搏波低通处理
x2=diff(x1);%一次微分
x2=x2(100:
999);%去掉前期的振荡
figure
(1);%输出一次微分图形
plot(x2);
fori=1:
899;
if(x2(i)<0.7)%设定阀值,使成为纯净的倒三角,倒三角一个周期不存在唯一点能用>0or<0表示0.7需要调整
x2(i)=0;
elseif(x2(i)>0.7)
x2(i)=x2(i);%将大于0.7的输出原来的数据,小于0.7的都置为0
end
end
end;
figure(10);%输出设完阀值后的图形
plot(x2);
x3=diff(x2);%二次微分使=0<0后的点成为标定点
figure
(2);%输出二次微分后的图形
plot(x3);
%count0=0;%数0计数
count_pulse=0;
fori=1:
898;%去掉后期振荡
ifx3(i)==0&&x3(i+1)>0;
count_pulse=count_pulse+1;
end
end
result=count_pulse;%显示结果
运行结果:
>>test(x)
ans=8
图5.4修改阀值后的倒三角
图5.5修改后的二次微分图
改完后的图形如图5.5所示,从图中可以看出它与原始图的峰值个数相同,并且符合设计要求。
2.计算心率的原理
将原始数据以图形的方式显示,在通过两次微分后得到最终的图形图5.5。
而计算心率通过count_pulse来计数,然后对图5.5图形进行操作,首先初始化
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 综合 实践