基于G-sensor有运动情景动态心电监护系统
2021-08-31谢俊松倪飞舟陈浩强
谢俊松,倪飞舟,陈浩强
安徽医科大学计算机系,安徽合肥230032
前言
近年来,和其他疾病相比,因心血管疾病而死亡的人数占到很大一部分,成为危害我国民众生命健康的主要原因之一[1]。24 h 动态心电图能较长时间记录佩戴者的心电信息,但是无法记录对应运动状态。医学上判断一个人心动过速的标准为心率大于100次/min,如果此人是在运动过程中,正常情况下的心率也会大于100 次/min,所以仅靠心电数据不能完全反映用户的健康情况。用户在剧烈运动后心跳恢复正常水平的时间在临床医学上也是心脏健康的一个重要指标。文献[2-5]研究基于Android 手机的心电监护。文献[6-8]研究了远程心电监护。
本文提出一种利用Android 手机内置的G-sensor(重力传感器,又名加速度传感器)采集x、y 和z 三轴加速度数据来分析运动状态和运动强度,然后与心电数据结合,得到有运动情景的动态心电图,进而提高心电图诊断的准确性。相比直接在心电采集器中集成新的传感器的设计方案,本文充分利用智能手机的功能,减少心电采集器和手机之间的数据通信量,提高心电采集器电池续航能力,降低医疗成本,这些优点都将促进该方案的推广和实施,具有广泛的社区和家庭应用前景。
1 系统总体设计
本系统由心电采集器、Android手机APP、中心服务器和客户端(移动端和PC 端)4 大部分组成,其中Android 手机APP 是核心,也是本文重点研究设计的部分,它承担着心电数据的接收和处理,三轴加速度数据的采集和处理,以及存储和发送心电和运动数据到中心服务器。
心电采集器负责采集心电数据,Android 手机通过蓝牙接收心电数据并处理,分析运动状态、运动强度,并将心电图和运动状态在手机上显示,给出常见的心电异常、跌倒警告,同时将数据通过移动网络(3G/4G/5G/WIFI)传送到中心服务器,用户家属和医务人员可以通过客户端与中心服务器通信,从而实时查看用户心电图和运动状态图。
1.1 心电采集器设计
采集器需要采集具有周期性的心电生理信号,同时接触人体皮肤工作,要求具有抗干扰和放大心电信号等功能。本文选择AD8232[9]调理模块,它是一款集成前端,适用于对心脏生物电信号进行信号调理来进行心率监护,内部主要由一个专用仪表放大器(IA)、一个运算放大器(A1)、一个右腿驱动放大器(A2)和一个中间电源电压基准电压缓冲器(A3)四大部分组成。此外,AD8232 内置导联脱落检测电路和一个自动快速恢复电路,该电路可在导联重新连接后迅速恢复信号。
心电信号采集后需要将数据传输到Android APP端,本文的研究前提是使用者随身携带着手机,所以两者距离较近,可以采用蓝牙通信方式,蓝牙传输具有安全、速度快和延迟低等特点[10-11]。本文采用ATK HC-05蓝牙模块,同时目前Android主流手机都自带蓝牙4.0模块,相比集成移动通信模块,节约了开发成本。
1.2 中心服务器后台设计
中心服务器需要不间断接收手机端传输的数据,以及为客户端提供服务,需要支持多用户、多设备并发连接,长连接和高并发是必不可少的,结合文献[12-13],本系统选用Netty 作为异步通信框架。
通过Netty的服务端功能,启动服务供手机端进行长连接。收到手机发起的连接请求后,分配一个Channel用于处理本次连接,接收手机传输的监护数据,定期发送心跳维持长连接。整体设计如图1所示。
图1 中心服务器整体设计图Fig.1 Overall design of central server
2 Android APP设计
APP需要通过蓝牙接收心电采集器传输的数据,绘制心电图,进行QRS 波检查和常见心电异常检测,采集三轴加速度数据并分析运动状态、绘制运动状态图,检测摔倒,存储并传输必要数据到中心服务器,其中心电图的绘制、异常检测、运动状态分析、绘制运动状态图是重点和难点。
2.1 心电图绘制
APP 使用openGL ES(OpenGL for Embedded Systems)来绘制心电图,它是三维图形APIOpenGL的子集,主要为手机、PDA和游戏主机等嵌入式设备而设计[14]。自定义控件类ECGView继承自GLSurfaceView,GLSurfaceView有两种渲染模式RENDERMODE_CONTINUOUSLY和RENDERMODE_WHEN_DIRTY。RENRENDERMODE_CONTINUOUSLY模式表示系统自动触发渲染,不需要主动调用代码,但触发时间间隔较短,经过小米8 手机测试大约每隔10~20 ms 即触发渲染动作,CPU 始终处于高负荷运转,手机耗电速度较快;RENDERMODE_WHEN_DIRTY 模式只有在创建和调用requestRender()时才会触发渲染,需要主动调用代码。 结合本系统实际情况,选用RENDERMODE_WHEN_DIRTY 作为心电图的渲染模式。
蓝牙连接成功后,使用BluetoothSocket 类的getInputStream()方法来获取输入流inputStream,随后每隔300 ms 读取一次输入流inputStream,并存入缓存队列ecgDataList 中。为了能及时处理缓存数据,同时降低CPU 开销,本文提出一种“依据缓存大小动态调整时间间隔”的方法,即如果缓存大于597 字节(3 个ecg 数据包)则等待100 ms 再次调用requestRender()方法刷新心电图,否则等待300 ms。采用此方法,使累积的数据得到及时处理,又降低了CPU使用率,心电图显示流畅,系统运行效果良好。
2.2 常见心电异常检测
本文使用开源的QRS波检查算法[15-16],下面着重介绍心电异常检测算法。
2.2.1 心动过速和心动过缓心动过速和心动过缓都是由于心脏跳动过快或者过慢引起的,表现为每分钟的心率值超过一定值或者低于一定值,具体的值该取多少也有不同的标准,如图2所示是本系统的算法流程,其中低运动强度指的是静止状态(站/躺/坐等):(1)心动过速:低运动强度下,连续检测到5 个心率值在100 次/min 以上,则判断为心动过速。使用参数iHrFastSum来标识满足条件(心率100次/min以上)的连续QRS波个数,每当检测到一个心率值在100以上,则iHrFastSum加1,同时判断iHrFastSum是否为5,等于5则检测到心动过速并把iHrFastSum置为0;每当检测到一个心率值在100以下,则把iHrFastSum置为0。另外,在高运动强度下不进行检测。(2)心动过缓:连续检测5个心率值在60次/min以下,则判断为心动过缓,其算法实现与心动过速类似。
图2 心动过速和过缓算法流程图Fig.2 Algorithm flowchart of tachycardia and bradycardia
2.2.2 二联律和三联律二联律和三联律在心电图上都表现为连续波形的周期性变化,下面是关于其检测算法的描述:(1)二联律:低运动强度下,相邻2n、2n+1 的RR 间隔超过100 ms,2n、2n+2、2n+4…RR 间隔小于50 ms;2n+1、2n+3、2n+5…RR 间隔小于50 ms。检测到5 个这样的周期变化波形则判断为二联律。检测算法思想为:使用一个队列iHrQueue存放RR 间隔值,变量iBigeminySum 记录已有满足二联律条件的QRS 波个数。首先从iHrQueue 队列尾部取最后4个数,看是否满足上述条件,不满足就将iBigeminySum 置0,并且退出函数。当最后4 个数满足条件时,再看iBigeminySum 的值,如果为0(表示n-1 到n-5 不满足条件),将iBigeminySum 置为4 并退出函数。如果不为0 则从后向前比较2n分别与2n+2、2n+4、2n+6…的RR间隔(iBigeminySum>0表示,前面几个数间的间隔已经比较过,2n与2n+1 间的间隔也已经比较过并都满足条件),如果哪一步间隔不满足条件,用比较时的临时变量给iBigeminySum 赋值(分奇偶不同),并退出函数。如果全部满足条件,则检查iBigeminySum是否为10,是则说明检测到二联律。(2)三联律:低运动强度下,相邻3n、3n+1、3n+2的RR间隔不同,最大和最小RR 间隔差距超过100 ms,RR间隔呈周期性变化。3n、3n+3、3n+6…RR 间隔小于50 ms;3n+1、3n+4、3n+7…RR 间隔小于50 ms;3n+2、3n+5、3n+8…RR间隔小于50 ms。检测到5个这样的周期变化波形则判断为三联律,其算法实现思想与二联律类似。
2.2.3 心律失常心律失常:低运动强度下,相邻RR间隔变化超过较短RR间隔的1/2,出现10次以上后则判断为心率失常。由于是通过相邻RR间隔比较得到是否异常,为了避免同一RR间隔和前后两个RR间隔比较得到两次异常,使用布尔变量isHrAbnormalRecord作标记。变量iHrAbnormalSum表示心率失常个数的累积量。当检测到一次心律失常时,iHrAbnormalSum加1,同时将isHrAbnormalRecord置为true。检测函数开始将判断isHrAbnormalRecord是否为true,是则退出函数,并把isHrAbnormalRecord置为false;不是则进行下面的检测。在iHrAbnormalSum加1后为10时,则判断检测到心律失常。
2.3 运动状态图绘制
为了和心电图作对比,软件设计将运动状态图放在心电图的下方,看到心电图的同时也能看到对应的运动状态,运动状态图和心电图运动方向一致,即自右向左移动。目前软件通过三轴加速度可以分析出静止(站/坐/躺)、走和跑3种常见的人体运动状态。
自定义SportView 控件继承自View 类,实现其onDraw()方法,在onDraw()方法里需要绘制不同运动状态对应的状态图。设计手机满屏下可以完整显示3 个运动状态图,每个运动状态图对应宽度为rWidth=screenWidth/3,并将绘制的运动状态数据放入stepValues列表中,每隔300 ms刷新一次。
3 关键技术研究实现
3.1 运动状态分析算法
Android内置G-sensor可以检测x、y和z轴3个方向的加速度(单位m/s2),运动姿态会产生相应方向加速度。根据文献[17-18]知道,不管如何佩戴手机,总有至少一个轴具有相对较大的周期性加速度变化。步行的时候主要运动方向是前进方向和垂直方向,呈现周期性变化;垂直方向:抬脚时,重心向上,加速度正向增加;两脚触地时,重心下移,加速度反向减少;水平方向:抬脚时,加速度增加;收脚时,加速度减小。
本文需要分析出正常步行和跑步,对于普通人来说,二者的区别仅仅是在步频上,正常步行的步频为90~120 步/min,如果大于120 步/min,则认为人处于跑的状态,通过步频来检测步行和跑状态[19]。将三轴的加速度值合成一个加速度矢量|V|,计算式子为,该值在步行时基本是正弦曲线变化规律。基本思想是,通过对该加速度矢量的长度和方向的判断,来判断是否经过波峰或者波谷,通过峰值的计算以及加速度的阈值决策来实时计算步数,得到步频,进而判断出运动状态,具体实现步骤如下:(1)使用均值滤波器对x、y、z的值进行滤波:每4个数求平均值,使用求得的平均值作为输出,来计算和加速度|V|,使数据更加平滑。(2)检测波峰波谷:使用变量isUp 来标识当前|V|值是上升还是下降,如果是上升则使用conUpCount 来记录持续上升次数,如果是下降将isUp=false,conUpCount=0。检测到波峰的条件是当前|V|值是下降,之前是上升并且上升次数至少大于2 或之前的值大于20。检测到波谷的条件是之前为下降现在为上升。(3)去干扰:文献[19]可知正常行走两步时间间隔为200~2 000 ms,由此检测最近两次波峰的时间差,去除高频噪音。(4)动态阈值(thresholdValue)判断波峰有效性:因为不同手机型号内置的加速度传感器可能不同,导致灵敏度也可能不同。算法通过调整动态阈值来判断波峰的有效性,只有当波峰的值peakValue 和波谷的值valleyValue 之间的差值大于thresholdValue 才是有效波峰。thresholdValue 的值是根据最近4 次波峰波谷的差值来计算。(5)去除错误步数:设计连续运动大于5步才正式计步,计算步频。
对于静止状态(站/坐/躺)检测比较简单,根据上面的步骤(1)计算得到的|V|,计算最近10 个值的方差,如果方差值小于0.1则说明处于静止状态。
3.2 摔倒算法
摔倒如果发生在老年人身上是非常危险的,特别是患有心脏疾病的老年人,所以本系统也把摔倒作为一个运动异常发出报警信息。结合文献[20]设计本系统的摔倒检测算法,具体步骤如下:(1)中值滤波:中值滤波器滤波函数为y=medfilt1(x,n),其中x是待滤波的三轴加速度信号|V|,n为窗口大小,此处n设计为3,150 个数据为一组进行滤波,即y(k)是x(k-1:k+1)的中值。当k处于边缘时,即k=0 或149 时,y(k)分别取Median[0 1 2]和Median[148 149 0]。(2)检测摔倒:使用阈值法,低阈值lowThresholdValue=5,高阈值highThresholdValue=25,根据步骤(1)得到的数据,如果前面有值小于lowThresholdValue,而后面的值至少有一个大于highThresholdValue,则判断为出现预摔倒。(3)降低误检率:如果发生摔倒,后面一段时间的运动状态不可能是走或跑,特别是老年人,系统为了降低误检率,当检测到预摔倒后,继续判断后面5 s内的运动状态,如果不是走或跑,则发出摔倒警告。
4 系统测试
本次测试使用的是小米8 手机,运动情景心电图界面如图3所示,可以正常查看到心电波形、运动状态、实时心率和步频。图4为连续检测到5个大于100次/min 的心率值,并且运动情景不是跑、走等高强度状态,弹出了警告信息,同时将警告短信发送至预留手机号,达到了预期设计。图5所示为PC 客户端对用户的监护界面,界面展示的信息更加全面,可以统计时段内的所有异常情况,实现了有运动情景的动态心电远程监护。
图3 运动情景心电图Fig.3 Electrocardiogram with the recognition of motion states
图4 心电异常Fig.4 Abnormal electrocardiogram
图5 PC客户端监护Fig.5 PC client monitoring
5 总结
本文研究设计了基于G-sensor的有运动情景动态心电监护系统,重点介绍了Android APP的设计,研究和实现了运动状态分析算法,最终完成了有运动情景心电图的显示,为医生的诊断提供了情景数据,同时在PC和手机端也能远程实时监护。该系统设计时充分使用了Android手机已有的功能,降低了设备和医疗成本,为将来的远程医疗提供了新的设计思路。