孟歡歡,張 躍
(清華大學 深圳研究生院 嵌入式系統與技術實驗室,廣東 深圳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.