孟欢欢,张 跃
(清华大学 深圳研究生院 嵌入式系统与技术实验室,广东 深圳518055)
传统的心电信息管理系统客户端运行在电脑上,医师查询和修改心电信息需要在电脑上进行,医师在查房等场合无法查询和修改心电信息。手机等手持移动设备的迅猛发展使这个问题的解决成为可能。现有的手持移动设备的屏幕分辨率和处理器性能均可以满足查询和修改心电信息的要求,Wifi无线网络的覆盖范围和通信带宽也满足心电信息的传输要求。本文介绍一种基于移动平台的心电信息管理系统,主要功能包括基本信息查询、报警信息查询、诊断报告的查询与修改以及心电信号的查询与分析。
目前市场上主要的手持移动设备平台有Android、iOS和Windows phone。Android系统以开源的优势自诞生之日起就发展迅猛,得到众多设备厂商的支持,在嵌入式系统领域中的应用日趋广泛,在远程医疗领域中的应用[1]也日渐成熟。因此本文将选择Android平台设计并实现基于移动平台的心电信息管理系统。
基于Android的心电信息管理系统是远程无线监护系统的重要组成部分,参考现有的心电监护软件系统、心电信息管理系统和用户实际需求,系统需要实现基本信息查询、报警信息查询、诊断报告的查询与修改以及心电信号的查询与分析。基本信息包括患者信息、医师信息、科室信息和设备信息;报警信息包含报警时间、级别、原因和心电信号;诊断报告内容较多、较复杂,包括病人信息、总体状况、最大最小心率、最大最小RR 间期、心律统计、ST 段统计、HRV 指标、小时报告、时间丢失记录和心率失常统计;心电信号包括心电页扫描、心电放大显示、心电异常类型的修改和心电信号回放。现有系统软件表明以上这些信息均已由心电分析软件和心电信息管理系统存储在中心数据库中。基于Android平台的客户端的主要功能是从数据库中获取信息并处理和显示。客户端直接访问数据库的模式会带来数据库管理难度随客户端的增长而爆炸式增长的问题,客户机/服务器模式不存在这些问题。客户机/服务器模式由服务器统一提供各种服务,数据库访问服务也由服务器统一提供。当大量客户机访问服务器时,使用负载均衡系统将访问分流到不同的服务器,减轻单个服务器的服务压力。客户机/服务器模型可以给系统的扩张带来便利。在客户机/服务器模型的基础上同时使用MVC 框架去设计系统,实现数据和视图的分离,简化系统设计的复杂度。客户机和服务器间的通信采用现在广泛使用的http协议,减少设计通信协议的麻烦,也可以减少服务器端通信协议实现的麻烦。综上选择,可以更专注于系统业务逻辑的设计。http服务器有很多框架可供使用,此处使用可以提供无状态服务的restlet+spring+hibernate框架。系统的总体架构如图1所示。
图1 系统框架
客户端实现根据要求从服务器获取资源,同时将这些资源进行处理并显示。客户端框架如图2所示。客户端在Android平台上运行,其主要使用java编写。
图2 客户端框架
心电信息管理系统中信息较多且构成复杂,而客户端需要显示所有的信息并兼顾界面友好性,手持设备屏幕尺寸存在固有限制。这些需求和限制给界面设计带来困难。系统使用Android4.x[2]的新特性fragment、actionbar以及viewpager去实现界面的切换,同时也使用fragment嵌套技术和listview 去选择显示不同资源。客户端的基本界面如图3所示。界面的切换可以通过左右滑动实现也可以通过选定标签实现。当选中资源类型,查询资源信息时,使用intent启动新的activity去展示资源信息。
图3 基本界面
心电波形的显示可以分为静态显示和动态显示,静态显示使用canvas类绘制心电波形,动态显示使用surface类绘制心电波形并使用定时器TimerTask类以50 HZ的频率局部更新心电波形。其图形如图4所示。静态显示使用在诊断报告中展示异常心电信号、在报警信息中展示报警心电信号,在心电分析中显示放大后的心电信号。动态显示用于心电分析中心电信号的动态回放。
图4 心电回放
诊断报告中统计图的显示借鉴了Android的开源图形库AChartEngine,实现了适用于心电统计信息显示的模块。可以方便绘制心电信息的直方图和趋势图。
资源的传输采用了http协议,在客户端使用apache的http库,通过get和post发起数据请求,使用put去更新数据。不同类型的资源可以从不同的url中获取。一般情况下每次获取的信息不多,只需要一次传输即可。在心电分析部分,心电信号的数据量较大,但是系统也不可能一次性显示全部心电信号,可以在多导联的心电数据中选取一个导联并对其进行抽样,然后显示出来,此时可以将大量的心电信息在一页中简略的显示出来,这可以称之为页扫描。系统心电信号的显示使用了页扫描技术,那么心电数据的获取也可以采用对应的分页技术,每次获取一段心电数据,满足心电信号的页扫描显示。为减少用户查看心电信号的等待时间,根据用户的使用习惯,采用数据预取技术,预先读取下一页数据,实现用户查看心电信号和心电信号获取的并行运行。同时也保留上一页数据,便于用户回看。其缓冲队列设计如图5所示。使用3个循环缓冲区,当前缓冲区存储当前显示的数据。预取数据放入下一个缓冲区,已显示数据在上一个缓冲区中。
图5 缓冲队列
心电数据的获取采用service服务在后台运行,心电数据的使用在页扫描和心电回放进程中。数据的获取和使用分布在不同的进程中,可以将其看作一个是生产者/消费者模型。解决此类同步问题的常用方法是使用互斥锁或读写锁,但是使用锁策略会加重系统负担,降低效率。使用无锁缓冲队列也可以解决这个问题,在缓冲队列中同时加入缓冲区的数据标识去识别数据能否被更新和数据是否可读。
将已经获取到的数据写入设备自身的存储器中,同时使用Android的SQLite3 数据库记录数据信息可以减少对网络的使用,提高系统效率。每次获取数据时先查询本地数据库查看数据是否已存储在本地,如果数据已经存储在本地,则可以直接从存储器中读取数据,否则可以从服务器获取数据。
在数据库中仅保存了心电数据而没有心电信号R 波的位置信息,心电分析中为实现心电信号类别的修改首先需要确定心电信号的R 波位置。R 波检测的方法已有很多[3,4],既有适用于单导联的,也有适用于多导联的。常用的有差分阈值法、自适应差分阈值法、小波变换法、神经网络的方法和形态学方法。其中差分阈值法简单易用,计算量小。自适应差分阈值法是在差分阈值法基础上通过阈值自适应改变而来,其计算量较大,小波变换法也有计算量大的缺陷,神经网络的方法和形态学方法应用比较困难。移动设备处理器计算性能有限,计算量小的差分阈值法成为首选。虽然差分阈值法的R 波检测准确率不如后面的几种方法,但是其计算量小,而且准确率在可以接受的范围之内。综上所述,系统中的R 波检测采用差分阈值法。
差分阈值法是采用一阶或二阶差分方法去增强心电信号中的R 波,同时抑制其它波形,如P 波、T 波,然后根据经验选取一个阈值,当差分的值大于这个阈值时认定其是R 波。此方法对高频噪声比较敏感,因此可以先使用10Hz~25Hz的带通滤波器去增强主要成分,以提高检测的正确率。它的计算量小,适合在移动平台上使用。
常见的心律失常依据起因可以分为两大类:激动起源异常和激动传导异常。每类又可以划分为若干小类,共有几十种心律失常。从上世纪50年代开始引入计算机辅助心电信号分析以来发展出多种心律失常自动分类算法,可以归类为有监督判别和无监督判别两类。常见的心律失常分类算法有逻辑分支判别、聚类分析、隐式马尔科夫模型、专家系统、模糊推理、支持向量机、人工神经网络等,这些方法中用到的心电信号特征可以使用心电图的一般特征如RR 间 期、QRS 波 宽、QT 间 期、PR 间 期、ST 段 偏 移等,也可以使用如PCA、LDA、ICA 等方法[5,6]自动提取心电特征。随着计算能力的提高,近年来新设计的心电分类算法经常会综合两种或两种以上的识别方法以达到提高算法准确率的目的,如综合FCM、PCA 和NN 的心律失常判别算法[7]。在移动平台上基于处理器运算速度限制的考虑可以采用简单的基于心电信号一般特征的逻辑分支判别算法实现心拍的分类。
在R 波检测完成后以R 波为基础向两边搜索,可以快速检测到Q 波和S波,以QRS波的特征为基础可以进行简单的心律失常判别。提取QRS波的特征如R 波幅值、QRS波宽、QRS波面积、RR 间期、相邻心拍的RR 间期变化等特征进行心律失常分类,采用文献 [8]的方法进行快速心律失常判别分类。
诊断报告一般使用pdf格式存储和显示。在Android平台上直接生成pdf文档存在困难,因此将诊断报告的生成放在服务器端实现。其流程如图6所示,在客户端组织诊断报告需要显示的条目和类别,将其发送到服务器端,服务器端根据其条目和类别信息从数据库中读取相应的数据生成诊断报告然后将诊断报告发回到客户端显示。用户在客户端查看诊断报告无误后可以加入签名然后存储到数据库中备案供以后查询。
图6 诊断报告生成流程
服务器端使用restlet+spring+hibernate框架。Restlet[9]是一个轻量级的REST[10]框架,它模糊了Web站点和Web服务之间的界限。Sping[11]是一个轻量级的控制反转和面向切面的容器框架,它方便编写可管理和易于测试的代码。Hibernate[12]是一个开源的对象关系映射框架,便于使用者以面向对象的思想来使用数据库。使用restlet+spring+hibernate框架可以便利的实现Web 服务。使用restlet将对不同资源的访问映射到不同的url中,解除资源之间的耦合。使用spring实现业务逻辑,处理数据的变换和封装业务。使用hibernate访问数据库,可以将关系数据库中的表映射为不同的类,便于使用面向对象的方式操作数据库。
客户端和服务器端一般运行在不同的平台上,其数据格式可能会存在不同;同时考虑数据传输的兼容性,需要将数据进行封装。网络传输中常用的数据封装格式有json[13]和xml。json具有封装简便、读写简单易用的优点,它读写消耗的资源也较少,满足绝大部分数据类型的封装需求,本系统主要采用json格式将数据封装后传输。心电数据使用json封装不方便,但是本系统可以完全控制其读写的格式,因此可以在心电数据中添加包头后直接将其序列化,然后就可以使用网络传输了。
当大量客户端同时访问服务器时可以采用负载均衡的方法使每个服务器的负载在一定范围内波动,提高资源利用率和服务效率。本系统服务器提供的服务可以划分为信息查询、报警信息编辑、心电信号分析和心电信号诊断报告4个部分,这4个部分不存在耦合,因此各个部分可以运行在不同的服务器上,这为实现负载均衡,提高资源利用率提供了便利。在服务器前端使用apache做负载均衡,同时将不同的服务放入不同的服务器运行可以提高系统的服务效率,同时提高系统的资源利用率。
本系统客户端在Android4.1 版本的SDK 上实现,服务器端在restlet2.1.2、spring3.2.3和hibernate4.2.3的框架上实现。测试环境包括一部Android智能手机和一台电脑。在电脑上,将服务器端放在tomcat6.0容器中。在 [服务器端软件名称]-servlet.xml文件中配置数据库地址后,运行带有本服务端的tomcat6.0 容器。在智能手机上运行本系统客户端软件后,客户端可以在登陆界面配置服务器地址,登陆界面如图7所示。登陆后可以使用本系统提供的各种功能。
图7 登陆界面
诊断报告生成部分按照诊断报告生成顺序操作,可以获得需要的诊断报告文件。诊断报告界面如图8所示。在获取诊断报告文件时,诊断报告是由服务器生成并传输到客户端的,因此会有部分延时,但是延时在可以接受的范围之内。经测试诊断报告生成部分功能和性能均满足预期要求。
图8 诊断报告界面
心电分析部分完成心电信号的显示工作、心电信号分类的修改工作。经测试心电信号获取的延时基本感受不到,同时R 波检测准确率以可以满足要求,心电回放速率正常,无明显的卡顿现象。心电分析部分的功能和性能均满足设计预期。
本系统其它功能需求的实现较诊断报告和心电分析容易,经测试其功能和性能也满足设计的预期要求。
综上所述,本系统的设计和实现达到了预期的功能和性能要求。
本文设计了一种基于Android 的心电信息管理系统,并对系统的主要功能的实现进行了详细的讨论和设计。利用无锁缓冲队列和数据预取技术提高心电数据的获取效率,选取了一种快速R 波检测算法来检测R 波,同时设计了一种合理的可实现的诊断报告生成流程。下一步的工作方向是将血压、血氧、体温等参数整合入系统,形成多生理参数的管理系统,同时需要在服务器端进行负载均衡的研究,扩展服务器的服务能力。
[1]LAN Kun,ZHANG Yue.Application of Android in remote medical information system [J].Journal of Computer Applications,2013,33 (6):1790-1792 (in Chinese). [蓝 坤,张跃.Android在远程医疗信息系统中的应用 [J].计算机应用,2013,33 (6):1790-1792.]
[2]SUN Hongming.Android 4.X phone/tablet program design entry,application to the master[M].Beijing:China Water &Power Press,2012 (in Chinese).[孙宏明.Android 4.X 手机/平板电脑程序设计入门、应用到精通 [M].北京:中国水利水电出版社,2012.]
[3]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.]
[4]ZHANG Longfei,ZHANG Yue.Real-time detection algorithm of multi-lead QRS wave [J].Computer Engineering,2011,37 (16):282-284 (in Chinese). [张龙飞,张跃.一种多导联QRS波实时检测算法 [J].计算机工程,2011,37 (16):282-284.]
[5]Martis RJ,Rajendra Acharya U,Min LC.ECG beat classification using PCA,LDA,ICA and discrete wavelet transform[J].Biomedical Signal Processing and Control,2013,8 (5):437-448.
[6]Giri D,Acharaya R,Martis RY,et al.Automated diagnosis of coronary artery disease affected patients using LDA,PCA,ICA and discrete wavelet transform [J].Knowledge-Based Systems,2013,37:274-282.
[7]Patra D,Kumar Das M,Pradhan S.Integration of FCM,PCA and neural networks for classification of ECG arrhythmias[J].IAENG International Journal of Computer Science,2009,36 (3).
[8]Kristoforus Hermawan.Development of ECG signal interpretation software on Android 2.2 [C]//2nd International Conference Instrumentation,Communications,Information Technology,and Biomedical Engineering,2011:259-264.
[9]Jerome Louvel,Thierry Boileau.Restlet in action [M].Manning Publications,2012.
[10]Thomas Erl,Benjamin Carlyle,Cesare Pautasso,et al.SOA with REST:Principles,patterns &constraints for building enterprise solutions with REST [M].Beijing:Science Press,2013.
[11]DING Zhenfan.Spring 3.x programming technology and application [M].Beijing:Beijing University of Posts and Telecommunications Press,2013 (in Chinese).[丁振凡.Spring 3.x编程技术与应用 [M].北京:北京邮电大学出版社,2013.]
[12]SUN Weiqin.Mastering Hibernate easily [M]//Beijing:Publishing House of Electronics Industry,2010 (in Chinese).[孙卫琴.Hibernate逍遥游记 [M].北京:电子工业出版社,2010.]
[13]Lennon J.Introduction to JSON [M]//Beginning CouchDB.Apress,2009:87-105.