APP下载

基于Android的心电监护软件系统设计与实现

2013-09-11坤,张

计算机工程与设计 2013年8期
关键词:重传心电监护心电

蓝 坤,张 跃

(清华大学深圳研究生院 嵌入式系统与技术实验室,广东 深圳518055)

0 引 言

在医疗监护系统中,心电监护处于十分重要的地位,据世界卫生组织统计,截至2011年,平均每年有接近1700万的人死于心血管疾病,约占全球死亡人数的29%。其中,80%以上发生在低收入和中等收入国家,到2030年,几乎有2360万人将死于心血管病[1]。由于医院监护条件、患者经济条件和个人时间的制约,对这部分人群的监护覆盖面不足,无法在患者病危时及时施救,无法及时跟踪亚健康人群的生理参数作到有效预防心血管疾病的发生。针对这种需求,清华大学深圳研究生院嵌入式系统与技术实验室研发了远程无线多生理参数实时监测与分析网络平台[2],通过3G无线网络、Internet、移动监护终端、服务器实时分析软件完成远程无线多生理参数的监测和分析。

当前移动互联网技术的发展以及智能手机等移动终端的普及,使得移动终端在医疗监护系统中扮演者越来越重要的角色。目前主流的智能终端操作系统包括Android,IOS,Windows Phone,相对于IOS的封闭性和 Windows Phone昂贵的价格,Android平台的免费和开放得到众多手机开发商的支持[3]。当前基于智能手机平台进行医疗监护的应用较少,主要应用于医生移动办公和远程信息查询,本文的目标是设计和实现一个基于Android平台的心电监护软件系统,充分利用智能手机等移动终端,结合医疗监控的相关传感器模块、串口、蓝牙、USB、3G无线网络等,完成心电数据的实时采集、分析和网络传输,降低监护成本,提高心电监护的便捷性。

1 Android平台心电监护软件系统结构

Android平台心电监护软件系统是本实验室研发的远程无线监护系统的重要组成部分,主要由心电数据采集单元、数据网络传输单元、智能终端数据分析单元等组成,通过蓝牙、串口连接心电采集设备获取实时心电采集数据,在Android智能手机上存储心电数据,对心电数据进行实时分析,及时将分析结果、心电波形显示给用户查看,并将心电数据通过无线网络实时传输到监护中心,软件系统结构如图1所示。

图1 心电监护软件系统结构

2 心电监护软件系统设计与实现

2.1 心电数据的采集和存储

实时心电数据的采集包括采集模块和智能手机两个硬件组成部分,如图2所示,涉及两个过程:①通过心电信号采集模块,使用导联线连接人体获取心电信号,采样频率为500Hz,心电信号通过硬件滤波放大,并通过A/D转换器得到数字信号;②在采集模块内部对心电信号进行软件滤波,将去除高频干扰、肌电干扰、工频干扰、基线漂移后的心电信号发送至Android智能移动终端供运行于智能移动终端的心电监护软件处理。

图2 心电数据采集

2.1.1 心电数据采集与接收

数据采集所采用的采集模块是基于本实验室远程心电实时监护终端[4]实现,通过串口和蓝牙与Android智能手机完成通信。

为了从采集模块完整的接收心电数据,心电信号采集模块与智能手机之间采用数据包的形式来完成数据通信。每完成一次采样,采集模块将12导联的心电数据按照指定的格式打包后发送至智能手机,心电数据包的格式如图3所示。

心电数据包各位的意义见表1。

图3 心电数据包格式

表1 心电数据包项

Android平台的心电监护软件在接收到心电数据后,将数据保存在一个缓冲队列中,使用缓冲队列的目的是为了后续的数据处理做准备。针对心电数据采样率高 (500Hz),数据量大的特点,需要一个较大的队列来保存心电数据。Android的进程内存限制使得当应用程序在Dalvik虚拟机进程内存空间内使用较多内存来存储数据队列时,会导致应用程序响应缓慢。解决办法是使用Android NDK,向系统申请一个6M的存储空间作为心电数据缓冲队列,队列中每个数据包保存着50ms的数据。对缓冲队列的操作如图4所示。

图4 心电数据接收流程

操作步骤包括:

(1)对从采集模块取回的数据,保存于一个50ms数据大小的连续存储空间;

(2)连续存储空间数据满后,将数据复制到缓冲队列的尾部,等待收取新的数据;

(3)在队列头部,使用一个观察器,将队列头部数据块复制到前端处理的3个线程做进一步处理。

2.1.2 无锁缓冲队列的设计

在后续的数据处理中,采用多线程技术来对数据进行存储、分析、显示、网络传送等,并且为了提高数据从采集接收到分发的快速完成,有必要将入队操作和出队操作放入不同的线程中,因此该缓冲队列必须是线程安全的。对并发数据结构进行操作时,常用的方法为使用互斥的读写锁,即使用一个互斥锁来保证缓冲队列在同一时刻只有一个线程操作。使用互斥锁来管理同步实现简单,但是存在较大的效率问题:等待互斥锁消耗许多宝贵的时间,而每次读写操作都需要进行锁的获取和释放。因此,出于对效率和性能的考虑,本文设计使用一个无锁队列,降低队列数据读写的等待时间,提高心电数据采集的实时性能。无锁队列的实现一般包括CAS,MCAS,WSTM,OSTM等[5]。

在本文设计的心电监护软件系统中,实时心电数据接收队列只有一个数据生产者和一个数据消费者,参考CAS技术的实现原理,本文实现的心电数据接收队列如图5所示。队列使用链表实现,Head指向队列头部节点,Tail指向队列尾部节点。为了区分等待生产者线程生产数据的节点和等待消费者线程消费数据的节点,在队列数据结构中保持Divider指向这样的节点:从该节点到Tail节点之间的节点为等待消费的节点,该节点前以及Tail节点后的节点为等待生产的节点。Head节点只有生产者访问,而Divider和Tail则为生产者和消费者共享访问,对这两个指针设定为原子操作变量。另一方面,为了减少频繁的内存申请和释放,队列使用固定节点数目的循环链表,在初始化时即申请完成整个队列所需的存储空间。生产者向队列尾部插入数据的操作:

消费者从队列头部取出数据的操作:

在生产者线程中,每次数据入队后,都会更新队头指针位置,保证Head和Divider之间的节点没有未出队的节点存在;在消费者线程中,每次取回的数据为Divider下一个节点的数据,这样保证了即使此时生产者插入节点也不影响消费者获取当前的队头元素。利用Divider来分开生产者和消费者操作的节点,以此来保证队列操作的线程安全。

2.1.3 心电数据的读取驱动

本文设计的软件针对两种心电数据采集模块连接方式:专用心电手机的串口通信和普通智能手机的蓝牙通信。在Android SDK中,并没有提供可以直接操作串口的API,因此我们需要使用Android NDK,调用Linux串口驱动完成串口的配置、打开和关闭,然后通过JNI来向上层Framework开发操作接口,最后通过Java API的文件描述符类FileDescriptor来操作串口设备文件。蓝牙通信则可直接使用Android SDK的蓝牙API,蓝牙通信实现流程为打开本机蓝牙,搜索周围设备并与心电数据采集模块的设备蓝牙进行配对,配对成功后双方使用RFCOMM建立连接和数据通信[6],API中针对每个步骤的操作都有十分详尽的接口供开发者调用。移动监护软件根据用户设置,在不同采集模式下启用不同的数据读取驱动来读取数据并存储到缓冲队列。

2.1.4 心电数据的数据库存储

在Android智能手机上,使用SQLite3数据库来存储心电数据。从心电采集模块接收到数据后,及时的将数据分发到数据库存储线程进行存储,存储的方式为按照缓冲队列的数据块大小 (50ms)存储,并保证在数据库中可查询某一次连续测量得到的全部数据集已经数据是否已经送达远程监护中心服务器。根据需求,数据库的设计包含两张表:records和ecgs,records表和ecgs表是一对一的关系,在records表中存储一个心电数据块的元信息,ecgs表存储的是实际各导联心电数据,两表的数据项如表2所示。

移动心电监护软件中,数据库管理模块提供数据库查询、创建、更新和删除功能。由于在移动设备上的存储空间有限,长时间连续采集的心电数据量非常大,因此只保存最近48小时的数据供本地查看,其它时间段的数据则在本地需要查看时再从监护中心服务器下载。每次数据库管理模块启动后,在后台执行如下操作来清理历史数据:根据set_timestamp查询48小时以前的数据集合数据块,执行删除。实时数据的存储在移动监护软件接收到数据后同步执行更新操作。数据库管理模块的另一个重要功能是,从数据库中取出send列为0的数据块,这部分数据为用户在离线状态下测得的数据,在不进行实时采集的时段,将这部分数据发送回监护中心服务器。

图5 无锁队列结构

表2 心电数据表设计

2.2 心电数据的网络传输

Android平台心电监护软件作为与采集设备直接相连的数据接收前端,完成数据采集后,需要实时和完整的将心电数据发送到监护中心服务器。在理想的网络环境中,通过使用TCP协议,数据发送的实时性和完整性可以很容易得到保证,但在移动网络中,由于无线信号衰落、误码率高等原因造成频繁丢包,触发不必要的拥塞控制,导致TCP协议性能下降[7]。针对TCP在无线网络性能优化相关研究工作实现多在拥塞控制算法优化上,实际心电监护设备都多种多样,为了保证心电监护软件的移植和扩展。我们选择在应用层上设计一种心电数据传输机制来保证数据完整性;同时,心电数据的实时传输需求是一种TCP长连接的应用,如何准确确认连接状态也是设计中需要考虑的问题。

2.2.1 心电数据传输机制

心电数据在网络中以报文形式传输,Android端的心电监护软件与监护中心服务器建立连接后,将心电数据按照指定格式打包,采用TCP/IP的传输层与网络层协议,通过Socket套接字发送到服务器指定端口。虽然使用的是可靠传输协议,但在网络拥塞、随机丢包、Android客户端断线等情况时,部分数据包被丢弃。为了应对这种情况,我们选择在应用层实现一个类似TCP协议的 “发送-确认-请求重传-补发”机制:Android端为每个数据包添加包头信息,加入序列号信息;监护中心对成功收到的数据包,发送给Android端一个接收确认数据包;监护中心服务器收到数据包后,检查当前数据包序列号是否与上一数据包连续,不连续则认为有丢包出现,立即向Android端监护软件发送请求重传数据包;Android端接收到服务器数据包,进行包分析,取出心电数据包序号,若是确认数据包,则删除发送缓冲区对应的数据包,若是请求数据包,则重传相应的心电数据包。双方通信数据包描述见图6。

图6 通信数据包

图6中的注册包是用于Android端心电监护软件开始一次心电采集时,向监护中心服务器发起连接请求注册,注册包中包含的 “开始时间”字段对应上文数据库表records中的set_timestamp,使用该字段注册后,服务器接收到的心电数据包采样时间可以从包序号计算得出,每次发送心电数据就不再需要发送采样时间。发送数据包类型包括注册包,实时心电数据包,重传心电数据包,服务器根据不同的数据包类型进行解析。接收数据包类型包括确认数据包和重传请求包。

2.2.2 连接状态保持

心电数据传输采用异步双工的Server/Client通信方式,需要Android前端与监护中心服务器端保持长连接状态,在网络状况不佳时,网络连接超时、断线等时有发生,导致数据发送阻塞,发送缓冲区满后数据丢失的问题。我们需要设置一个超时阈值,当监护软件在阈值时间内接收不到数据,则可认为连接出现异常,启动断线重连功能,并将超时期间没能收到反馈的数据包加入重传列表等待重传。此外,利用KeepAlive原理来实现一个具有定时查看连接状态,探测网络状况的网络观察器,并根据观察器的网络连接信息来适当调整数据包发送速度。

2.2.3 网络模块实现

图7 心电分析流程

利用Android SDK网络编程API的标准套接字来进行TCP连接,在心电监护软件的网络模块使用4个线程来管理心电数据的传输,包括实时发送线程,接收线程,重传线程,网络状态管理线程。考虑到重传时需要快速检索到需要重传的数据包,使用队列结构无法满足需求,我们使用HashMap的并发版本ConcurrentHashMap来管理心电数据包,使用队列来保存请求重传数据包的序号。实时发送线程的心电数据来源于实时采集模块,按照上文设定的格式打包发送的同时,将数据包保存到ConcurrentHash-Map中;接收线程则删除完成确认的数据包,将重传请求序列号存入重传队列;重传线程则从重传队列中取出序列号,在ConcurrentHashMap获取数据包进行网络发送。网络状态管理线程则观察网络连接状态,发现断线情况则进行重连并及时发布系统消息。

2.3 心电数据的分析

Android平台心电监护软件的一个重要功能是对采集得到的心电信号进行实时QRS波检测,并以此为基础计算实时心率,并对心律失常做到及时报警。QRS波的检测方法根据算法原理的不同,可分为滤波方法、小波分析方法、模板匹配方法、形态学方法、神经网络方法等,文献 [8]对各类方法进行了对比分析。针对智能手机的存储和CPU运算能力,以及实时数据分析需要快速完成的需求,综合比较后,本文选取易于在嵌入式平台实现的滤波器方法来进行QRS波的快速实时检测,心电数据分析整体流程如图7所示。智能手机上的分析结果包括QRS波群宽度、RR间歇、心率和心律是否正常。

2.3.1 滤波器方法

滤波器方法检测QRS波的一般流程为:先使用一个带通滤波器对原始心电信号波形滤波,通带频率选择取为5~15Hz,可包含QRS波的主要成分;为了突出频率响应曲线中的QRS斜率对信号进行微分和平方;然后使用一个移动窗口对信号进行积分,积分所得的信号中包含了QRS的斜率信息和波群宽度信息;最后进行峰值位置检测,并根据QRS波判定规则,在滤波所得信号上检出QRS波。滤波器选取计算快速的差分滤波,滤波器的参数选择基于文献 [9]中的实时快速算法实现,并对嵌入式处理器进行优化,选取为2的n次方,同时调节移动窗口宽度,并在编程实现上较少内存消耗。实时检测算法包含频繁的CPU调用,较少的动态内存分配与释放,在Android平台实现QRS波检测算法,使用NDK和C语言开发实现可得到更高的运行效率[10]。

2.3.2 心律分类

完成QRS波检测后,可以得到几个重要的心电特征参数:RR间歇、QRS宽度、心率。利用这些特征参数,我们可以完成简单的心律分类,在Android智能手机的实时分析中,我们只将心律分为正常,室早和其它类型心律失常并对失常心律及时报警,更加复杂的心律失常判别则放在监护中心完成。比较多种分类方法后,我们选择使用文献 [11]中描述的算法并对其进行简化,简化之后为:心率小于100且QRS波宽小于100ms为正常心律;QRS波宽大于100ms且心率大于100判定为室性早搏。

3 实验与结果分析

心电监护软件系统充分利用Android与设备无关的通用框架开发平台,可以运行于使用Android操作系统的智能手机上,通过蓝牙和串口获取心电采集模块的数据,实现Android平台的心电QRS实时检测、心率计算和显示功能,满足移动心电实时分析的要求。在Android平台进行心律分类并显示效果见图8。

图8 Android心电分析结果

通过无线网络,利用本文设计的心电数据传输机制,可以完整的将数据发送到监护中心服务器,图9是一个服务器接收数据和请求重传的日志片段,可以看到,监护中心对成功接收的数据包进行应答,并对未收到的数据包向Android平台心电监护软件发送补发请求,心电监护软件进行了及时重传。

图9 心电传输结果

4 结束语

本文设计了一个基于Android平台的心电监护软件系统,并对系统各个功能实现进行了详细的设计和讨论,系统利用无锁循环链表存储结构提高心电实时存储效率,提出类似TCP协议的 “发送-确认-请求重传-补发”机制来确保了心电数据传输的完整性,并针对嵌入式处理器选取了一种计算快速的QRS波实时检测算法。与现有移动监护仪比较,本文方案利用Android智能手机等移动设备完成心电监护,监护成本低,具有普适的应用前景。在今后的工作中,将进一步整合血压、血氧、呼吸等参数,形成多生理参数的综合监护软件系统。

[1]Shanthi Mendis,Pekka Puska,Bo Norrving.Global atlas on cardiovascular disease prevention and control[R].The World Health Organization in collaboration with the World Heart Federation and the World Stroke Organization,2011:8-13.

[2]ZHANG Hejun,ZHANG Yue,ZHOU Bingkun.Design and implementation of software system for remote electrocardiographic monitoring [J].Computer Engineering and Applications,2006,42 (15):219-224 (in Chinese).[张和君,张跃,周炳坤.远程心电监护软件系统的设计与实现 [J].计算机工程与应用,2006,42 (15):219-224.]

[3]Gavalas D,Economou D.Development platforms for mobile applications:Status and trends[J].IEEE Software,2011,28(1):77-86.

[4]CHENG Zhuanpeng,ZHANG Yue.Design and implementation of real-time telecardiology monitor terminal[J].Computer Engineering,2007,33 (11):264-266 (in Chinese).[成转鹏,张跃.远程心电实时监护终端的设计与实现 [J].计算机工程,2007,33 (11):264-266.]

[5]Keir Fraser,Tim Harris.Concurrent programming without locks[J].ACM Transactions on Computer Systems,2007,25(2):1-59.

[6]Frank Ableson W.Android in action[M].3rd ed.USA:Manning Publications Co,2011:386-393.

[7]HU Yu,CHEN Yuanyan.Enhanced TCP-Veno algorithm based on packet loss statistic[J].Computer Engineering and Design,2011,32 (9):2980-2983 (in Chinese).[胡愚,陈元琰.基于丢包事件统计的TCP-Veno改进算法 [J].计算机工程与设计,2011,32 (9):2980-2983.]

[8]LI Yanjun,YAN Hong.Comparison of familiar QRS detection approaches[J].Progress in Biomedical Engineering,2008,29 (2):101-107 (in Chinese).[李延军,严宏.QRS波群检测常用算法的比较 [J].生物医学工程学进展,2008,29 (2):101-107.]

[9]ZHANG Longfei,ZHANG Yue.Real-time detection algorithm of multi-lead QRS wave [J].Computer Engineering,2011(16):282-284 (in Chinese). [张龙飞,张跃.一种多导联QRS波实 时 检 测 算 法 [J].计 算 机 工 程,2011 (16):282-284.]

[10]Cheng Min Lin,Jyh Horng Lin,Chyi Ren Dow,et al.Benchmark dalvik and native code for android system [C]//Second International Conference on Innovations in Bio-inspired Computing and Applications,2011:320-323.

[11]Kristoforus Hermawan.Development of ECG signal interpretation software on android 2.2[C]//2nd International Conference on Instrumentation,Communications,Information Technology,and Biomedical Engineering,2011,259-264.

猜你喜欢

重传心电监护心电
适应于WSN 的具有差错重传的轮询服务性能研究
多参数心电监护仪日常故障分析与维护
基于TDMA的wireless HART网络多路径重传算法
心电向量图诊断高血压病左心室异常的临床应用
基于非接触式电极的心电监测系统
穿戴式心电:发展历程、核心技术与未来挑战
无线网络中基于网络编码与Hash查找的广播重传研究
更正启事
面向异构网络的多路径数据重传研究∗
心电监护仪电压测量不确定度的评估