基于MATLAB的脉搏信号处理软体系统
1
基于MATLAB 的脉搏信号处理软件系统
摘要: 本文根据在实验室里测得的脉搏数据,基于MATLBA设计一个脉搏信号的GUI处理界面,并利用MATLAB强大数字信号处理功能还原脉搏波形,并对波形的特征信息进行提取及存储。原始信号进行了去除基线漂移、通过巴特沃斯带通滤波器以及二阶切比雪夫滤波器去除50HZ工频干扰,并且能计算实时的脉率并更新,显示脉率变化趋势曲线,进行频谱分析和输出文档。
此软件有两个GUI界面,第一个为密码登陆界面,第二个为脉搏信号处理系统GUI界面。第二个GUI界面主要分为五大模块:1.打开与退出模块包括打开数据和退出系统;2.信号回放模块包括对原信号和滤波信号的回放、暂停回放、继续回放、关闭窗口;3.信号放大与缩小模块包括对信号的X轴和Y轴的放大、缩小处理;信号快进退模块包括对信号的快进、慢进、快退、慢退处理;4.脉率实时处理模块包括输出脉率曲线、暂停回放、输出脉搏信息、脉搏频谱分析、清除波形、输出文档;5.脉率信号输出模块包括输出实时的脉率更新、以及脉搏数据的信息,诸如脉搏采样频率、采样时间、最大脉率值、最小脉率等。
关键词:脉搏;脉率 ;Matlab ;GUI ;
1 引言
人体内部各个生理系统之间(如循环系统、呼吸系统等)是相互耦合的。反映人身体健康状态相对最重要、最全面的是心脏血液循环系统,因此通过采集脉搏波进而分析心脏循环系统功能,能从一个方面较全面反映人体的健康情况。从脉搏波中提取人体的生理病理信息作为临床诊断和治疗的依据,历来都受到中外医学界的重视。几乎世界上所有的民族都用过“摸脉”作为诊断疾病的手段。脉搏波所呈现出的形态(波形)、强度(波幅)、速率(波速)和节律(周期)等方 面的综合信息,在很大程度上反映出人体心血管系统中许多生理病理的血流特征,因此对脉搏波采集和处理具有很高的医学价值和应用前景。目前脉搏信息的研究已经应用于以下几个方面:(1)中医脉象信息的检测与识别;(2)血压的临床检测;(3)心率稳定性的一种简便估计方法;(4)心输出量的一种测量方法;(5)血管功能的一种早期、无创检测方法。
MATLAB(Matrix Laboratory,矩阵实验室)是由美国MathWorks公司开发的一种功能强、效率高、简单易学的可视化软件,覆盖面包括控制、通讯、金融、图像处理、建筑、生物学等几乎所有的行业与科学领域。除了经典的一些算法外,MATLAB基于MATLAB的脉搏信号处理软体系统
2 还提供了丰富的数据分析和处理功能模块,如神经网络、小波分析、信号处理、图像处理、自动控制、模糊控制、系统仿真等,因此MATLAB是一种高效的编程软件。本文介绍利用MATLAB软件作为技术平台,实现对统脉搏波快速、准确实时显示,而且实现方法简单有效,有一定的实用性。
2 软件总体界面与总体设计思路
2.1密码登陆系统
图2.1 未运行前密码登陆界面
图2.2 运行后输入错误的密码登陆界面
图2.3 运行后输入正确的密码登陆界面
基于MATLAB的脉搏信号处理软体系统
3 2.2 脉搏信号处理系统界面
图2.4 未运行前的脉搏信号处理系统界面
图2.4运行后的脉搏原信号与滤波信号回放 基于MATLAB的脉搏信号处理软体系统
4
图2.6运行后的脉率曲线回放与判断脉率正常、输出脉搏信息
图2.7运行后的频谱分析
基于MATLAB的脉搏信号处理软体系统
5
2.3 软件总体设计思路
包含功能 包含功能 包含功能 包含功能 包含功能
暂停回放
输出脉搏信息 判断脉率正常与否
输出脉搏信号的采样频率、采样时间、最大脉率、最小脉率等 输出脉率曲线 文本框中脉率的更新
脉率变化趋势曲线
脉率峰值变化曲线 继续回放 X轴缩小 X轴放大
X轴缩小 X轴缩小
信号快进
信号快退 信号慢进
信号慢退 退出系统
关闭窗口 暂停回放 打开数据
原始信号与滤波后的信号回放 输入正确用户名和密码
登陆脉搏信号处理系统 运行登陆软件
频谱分析
清除波形 输出文档 输出信号幅频谱曲线、功率谱曲线
输出按当前日期和时间命名的文档,包含有脉率及各种信息 基于MATLAB的脉搏信号处理软体系统
6
3 信号回放模块设计
3.1 脉搏波信号滤波
脉搏信号是强干扰下的微弱信号,脉搏信号幅度很小,大约是微伏到毫伏的
数量级范围,其主要频带范围在0~20Hz之间。一般情况下为1Hz左右,脉搏信号可看成一个准直流信号,也可看成是一个甚低频交变信号。根据脉搏功率谱能量分析,健康人脉搏能量绝大多数分布于0.5~5Hz,而病人脉搏在1Hz以下和较高频段(如5Hz以上或10Hz以上)仍有相当一部分的能量分布。脉搏信号极容易引入干扰,一般情况下,由体表检测到的脉搏波主要有三种干扰:基线漂移,高频随机干扰和运动伪差噪声,还有一些干扰,比如工频干扰,等,这些干扰较之前三种干扰比较小,而且很容易去掉]。
1).基线漂移:这种噪声是由于被测对象的呼吸运动和身体移位而产生的,呼吸的频率分量通常在0.8Hz以下,每个人的呼吸频率也不同;身体移位也可以用低频分量来表征,因此基线漂移基本上都是趋势分量和低频分量。
2).高频随机干扰:脉搏信号的采集过程中有好多随机噪声和环境干扰的影响,这些噪声都表现为高频噪声,在5Hz以上。
3).运动伪差噪声:由于对病人进行血氧检测时,病人手指(或脚趾)经常会发生
运动,使手指(或脚趾)与传感器之间的距离发生位移,从而得到导致测量的病人脉
搏波形很不稳定的一种噪声,这种噪声和信号在同一个频带范围内,是脉搏信号
去噪的一个重点和难点。
所以,为了对信号做准确的分析,在分析处理之前必须做一些必要的预处理。针对信号中存在噪声的特点,基线漂移和呼吸等低频干扰在1Hz 以下,而脉搏信号主要在低频范围,所以可以设计让信号先通过一个巴特沃斯带通滤波器,借以滤除基线漂移、呼吸引起的干扰(考虑到不丢失太多的其他信息,通带截止频率设置为Wp=[0.9,50],阻带截止频率设置为Ws=[0.3,140],通带波纹系数Rp=3,阻带波纹系数Rs=10),如图3.2,然后再通过一个切比雪夫二型滤波器滤除固定的工频干扰(通带截止频率设置为Wp=[30,65],阻带截止频率Ws=[45,55],通带波纹系数Rp=3,阻带波纹系数Rs=60),如图3.3。
由于Butterworth滤波器通带内有最大的平滑特性,信号经过后衰减小,因此我们选用Butterworth带通滤波器滤除基线漂移和呼吸等引起的干扰,但由于IIR滤波器本身固有的缺点,信号通过Butterworth带通滤波器后相位会失真,故我们可设计零相位Butterworth带通滤波器去噪。50Hz固定工频在频域中是一个点,因而要求设计的带阻滤波器有好的截止特性,而切比雪夫II型滤波器有较好的截止基于MATLAB的脉搏信号处理软体系统
7 特性,并且在其通带内单调,故而设计零相位切比雪夫II型滤波器滤除工频干扰。流程图如下:
图3.1 脉搏信号滤波流程图
图3.2 巴特沃斯带通滤波器 图3.3 带阻切比雪夫II型滤波器
3.2 脉搏信号回放按钮设计思路
信号回放模块设计如图3.4,考虑到用户使用的方便性,信号回放过程中才可对信号进行放大与缩小操作,或者快进退操作,在回放过程中,退出系统按钮处于不激活状态,关闭窗口和继续回放也处于不激活状态,只有当信号暂停时,才使前面三个按钮激活,或者进行下一步,输出脉率曲线功能。 Load命令读取脉搏信号TXT文件
去除基线漂移
通过Buttord和butter命令组成的巴特沃斯带通滤波器
通过cheb2ord和cheby命令构成的切比雪夫二阶滤波器
原信号回放 滤波信号回放 基于MATLAB的脉搏信号处理软体系统
8
图 3.4 信号回放模块设计
1).信号回放:主要采用了Matlab中的while、if、plot、axis、global、set、pause命令。思路先是将信号和滤波信号用plot命令分别在axes1、和axes2上画出图形,接着用axis移动坐标轴,用while进行死循环,让信号不停的回放。
2).信号暂停:主要利用if-break语句来实现,在信号回放的控件Callback函数中,定义一个全局变量flg1,初始flg1=1,接着在while每次循环中,检测flg1的值,为1继续循环回放,为0的话跳出循环,停止回放。所以,要信号暂停回放,只需要在信号暂停按钮的Callback函数中,定义一个全局变量flg1,并命flg1=0即可。
3).继续回放:也是利用全局变量来实现,当信号暂停回放时,记录下些时的X轴和Y轴的长度大小,点击继续回放就还是用plot命令分别在axes1、和axes2上画出图形,接着用axis移动坐标轴,用while进行死循环,让信号不停的回放。只不过这里要注意的是,此时坐标轴的移动不是从0开始,而是从暂停时的记录下来的全局变量X轴的长度大小xmin、xmax。
4).关闭窗口:直接用delete(allchild(handles.axes1));
delete(allchild(handles.axes2)); 语句 基于MATLAB的脉搏信号处理软体系统
9
图 3.5原信号和滤波后的脉搏信号回放
4信号放大与缩小模块设计
4.1 设计界面
考虑到信号回放过程中每个人的脉搏的曲线都会有所不一样,两个波峰之间的时间,波峰的数值大小,为了能方便看到每个点的数据,我在信号放大与缩小模块中加了四个按钮,可沿X轴缩小放大和沿Y轴缩小放大,如图4.1。另外,考虑到操作的方便性,设计了在信号回放或者继续回放的过程中,这四个按钮才被激活,信号暂停时,这四个按钮都处于不激活的状态。
图4.1 信号放大与缩小模块
4.2 信号放大与缩小按钮设计思路
1).X轴缩小: 即将信号沿X轴压缩,如图4.3,X轴的长度变长,但是Y轴保持不变,这里,主要也是利用axis命令,实时的改变X轴长度,并且用while进行死循环,直到遇到flg1=0,才跳出循环。程序流程图如下: