熊 艾,趙征鵬,楊宏波,潘家華,孫 柯,王威廉+
(1.云南大學 信息學院,云南 昆明 650500;2.云南省阜外心血管病醫(yī)院 結構性心臟病中心,云南 昆明 650102)
先天性心臟病(congenital heart disease,CHD)是屬于心血管疾病中常見的一種心臟器質類疾病(以下簡稱:先心病)。目前,心臟聽診依然是篩查和診斷心臟健康狀態(tài)的一種有效方法[1]。在聽診過程中,由于一些異常心音比正常心音頻率低、強度弱,很難通過聽診做出判斷。因此,通過采集心音信號,分析其震動幅值與時間序列的關系組成心音圖(phonocardiogram,PCG)[2],能很好克服這些缺點。
目前已有多種設備用于心音數據的采集,例如文獻[3,4]采用低功耗芯片作為主控,在該硬件平臺上實現心音的采集儲存、顯示。文獻[5]使用嵌入式設計與Android平臺相結合,實現心音的采集、保存、回放。文獻[6]使用PSOC4芯片結合計算機實現心音的采集顯示存儲以及離線分析。但是,文獻[3-6]中所設計的采集系統(tǒng),缺少心音遠程聽診、心音實時分析的功能,并且便攜性也有待提高。本文針對上述問題,以及遠程輔助診斷的需求,設計了一套以Android平臺和嵌入式技術為基礎的便攜、可靠的遠程心音信號采集顯示存儲系統(tǒng)。在此基礎上,添加實時心率計算功能,系統(tǒng)可根據使用需求動態(tài)變更采集參數,利用心率分析功能智能輔助采集人員判斷心音傳感器采集位置放置是否正確。為實現遠程聽診的功能,本文使用云服務器進行心音數據的儲存,利于遠程智能醫(yī)療中心的接入,為先心病的遠程輔助診斷提供了用戶端的技術支撐。
心音的頻率范圍在5 Hz~600 Hz,屬于微弱低頻信號。市面上大部分手機內置音頻采樣電路對低于50 Hz音頻有抑制,且由于不同型號手機音頻電路存在差異,直接使用手機mic口進行心音信號采集將會導致音頻質量參差不齊,無法滿足研究需求。針對此類情形,本文設計了一套通用的無線心音記錄系統(tǒng),可以在不同的平臺,如Android,IOS,Windows等通用的上位機系統(tǒng)上無損地記錄心音信號。
采集系統(tǒng)設計主要分為3個部分,下位機心音采集部分、上位機顯示部分以及云端儲存部分,系統(tǒng)整體框架如圖1所示。
系統(tǒng)采用的心音傳感器為美國的Thinklabs One有源心音傳感器,其硬件本身具有低頻濾波電路,傳感器采集數據不會被過多處理,保證了心音數據的完整性與原始性。模數轉換芯片采用美國ADI公司的AD7606,分辨率16 bit,采樣率可達200 Kbps。中央處理單元使用TI公司的STM32F103C8T6低功耗芯片,支持多串口傳輸。藍牙模塊采用BK3231S型芯片,最高支持16 Kbps的無損傳輸。下位機采集參數設定為采樣率5 KHz,量化精度16 bit,下位機到上位機的數據傳輸方式采用藍牙傳輸。
根據便攜式設備設計的要求,下位機采集盒使用兩節(jié)18 650鋰電池進行供電,在重度使用的情況下,可以保持4天以上的續(xù)航,同時可為心音傳感器充電。本文設計制作的無線心音采集盒已經獲得中國實用新型專利(專利號CN201921929240.4)[7]。
1.1.1 心音傳感器的選擇
根據此前章節(jié)的分析,心音為一種微弱低頻信號,在選擇心音傳感器時應考慮其頻率響應范圍以及放大系數。本設計選用Thinklabs One心音傳感器,該傳感器頻率響應范圍為20 Hz~2000 Hz,且支持最高100x的放大倍數。使用此傳感器能較好地保留心音信號的頻率特征,使本系統(tǒng)所采集的心音信號能進一步用于心音特征提取以及心音分類等后續(xù)研究。
1.1.2 采樣電路的設計
AD7606為16位模數轉換芯片,支持±10 V或±5 V的雙極性輸入。該AD采樣電路所有通道均支持最高200 Kbps的采樣速率,并使用5 V單電源供電。有SPI串行方式與8080并行方式兩種控制器通信模式。本文設計選用SPI通信方式,在滿足數據傳輸需求的前提下,節(jié)約了IO口資源。AD7606模塊電路設計如圖2所示。

圖2 AD7606模塊電路設計
根據Nyquist采樣定理,信號采樣頻率應該為最高頻率的兩倍。心音信號的頻率在1000 Hz以下,采用5000 Hz的采樣率可以滿足要求。在本文中,設定STM32F103C8T6定時器的定時為200 μs,定時器每溢出一次,則對AD7606中的數據通過SPI接口進行一次讀取,以此控制采樣率為5000 Hz。數據采集過程中,通過軟件控制的方式將OS0引腳電平拉高,OS1、OS2引腳電平拉低,進行兩倍過采樣,以減少數據抖動。AD7606數據讀取采用16 bit讀方式,可以防止8 bit讀方式出現的低字節(jié)數據丟失問題。
1.1.3 藍牙數據傳輸
BK3231S芯片支持藍牙3.0SPP協(xié)議(serial port profile),可以在Windows、Linux、Android以及IOS等平臺進行點對點的數據透傳。通信接口支持UART串口模式,其SPP協(xié)議支持的最大吞吐量為16 Kbytes/s。本次系統(tǒng)設計采用的傳輸方式為透明無控制的傳輸,其每次發(fā)送的數據包含1 bit起始信號、8 bit數據以及1 bit停止信號。在傳輸過程中,每傳輸1字節(jié)的額外開銷為20%。根據1.1小節(jié)中設計的采樣標準,可計算出每秒需要傳輸的數據量為:10 Kbytes,滿足傳輸需求。
本設計支持多種上位機系統(tǒng),只需上位機系統(tǒng)支持藍牙SPP協(xié)議且裝有相應配套接收程序,均可使用1.1節(jié)中心音采集盒獲得相同格式的數據。上位機接收到數據將實時顯示波形與當前心率,并通過字節(jié)流的形式將數據寫入文件進行保存,實測20 s的心音數據采集的大小為 200 Kb。在采集完成后,可將數據上傳到云端存儲,在云端實現人員信息與心音數據批量管理功能。上位機與云端之間通過HTTP(hyper text transfer protocol)協(xié)議連接,請求采用POST方式,避免了GET方式中的顯式傳輸,保證數據安全。
系統(tǒng)設計中云端儲存的服務器部分采用了Tomcat小型服務器與上位機程序通信,接收到數據后以壓縮文件的形式存放在數據庫中,每一例數據都將進行完整性校驗,保證數據不被篡改。人員以及數據采樣信息等結構化數據使用開源的MySQL數據庫進行存儲管理。云服務器中數據庫部分與Tomcat應用進行了內網分離,保障數據安全。
下位機程序以Keil uVision5為開發(fā)平臺,應用C語言編寫程序功能代碼。軟件設計流程如圖3所示。

圖3 下位機工作流程
下位機上電后首先會初始化系統(tǒng)時鐘、定時器和AD7606。進入主程序后檢測串口接收數據緩沖區(qū)是否收到來自上位機的數據,讀出數據并判斷數據是否為啟動采集信號。如果為啟動采集信號則啟動定時器(定時間隔200 μs),定時器溢出標志位被觸發(fā)后,對AD7606進行數據讀取并開始下一次轉換,同時將數據通過藍牙串口發(fā)送至上位機。如果為結束采集信號會停止定時器,同時停止數據采集和數據發(fā)送。系統(tǒng)進入循環(huán)監(jiān)聽狀態(tài),等待啟動下一次數據采集與傳輸。
上位機軟件開發(fā)環(huán)境為Android Studio 3.4、jre1.8.0_201(Java運行環(huán)境)、Android9.0(應用運行系統(tǒng))、ndk21.0.6113669(C/C++開發(fā)工具)、CMake3.4.1編譯工具。使用Java語言和C語言編寫應用程序。上位機軟件的硬件承載平臺為華為M6平板。
2.2.1 軟件設計流程
上位機軟件實現包含藍牙數據接收模塊、人員管理模塊、數據上傳模塊、音頻回放模塊、心率計算模塊等模塊,其中藍牙數據接收與心率計算工作在同一界面。圖4展示了上位機接收藍牙數據并顯示心音圖(M聽診點[8])的界面,并在右上角顯示實時心率。上位機軟件部分模塊工作流程如下:

圖4 APP實時接收顯示心音(M聽診點)圖界面
數據接收顯示模塊界面工作流程:
(1)在軟件采集界面選擇需要連接的藍牙設備,連接成功后返回藍牙對象的BluetoothSocket;
(2)點擊預覽按鈕啟動數據接收線程并發(fā)送開始采集信號;
(3)數據接收線程以40 ms為周期從接收緩沖區(qū)讀取數據,以保證繪圖顯示的幀率大于24 Fps,防止繪圖顯示卡頓;
(4)每個周期內接收到的數據都將轉化為int16類型的數據進行繪圖以及心率計算;
(5)在選擇開始記錄后,直接將接收到的原數據通過二進制流的方式寫入文件中,便于后續(xù)分析;
(6)在數據接收線程接收到數據后,開啟心率計算線程,計算實時心率。
數據上傳模塊工作流程:
(1)當心臟的5個聽診點(M、P、A、E、T)[8]采集完數據后,利用移動網絡將信號上傳至云服務器進行存儲,用于機器輔助診斷或遠程聽診;
(2)新建一個用于數據傳輸的HttpURLConnection連接。設置傳輸頭為“multipart/form-data”,即可以上傳json數據和數據文件;
(3)將5個位置的數據信息打包成zip壓縮包文件,并新建DataOutputStream類,將數據采樣信息(json數據)和心音數據(zip文件)寫入到傳輸流中;
(4)數據上傳成功后云服務器會將采樣信息存放至MySQL數據庫中,數據文件存放至云服務器,同時向APP返回接收成功的消息。
心音回放模塊工作流程:
(1)新建繼承于Thread的子類,重寫run方法,在run方法中新建FileInputStream文件輸入流,讀取二進制心音數據;并將二進制數據轉化為浮點型(float)數據;
(2)讀取完成后使用SurfaceView類對心音數據進行繪制顯示;
(3)通過AudioTrack音頻播放類獲取音頻播放緩沖區(qū),并新建一個AudioTrack類寫入音頻格式,本系統(tǒng)采樣率為5000 Hz,單通道,16 bit;
(4)新建ByteArrayInputStream類對音頻緩沖區(qū)同步寫入心音數據,實現心音播放。
在心率計算階段,本文采用了軟件包絡檢波法與峰值定位法相結合的方法計算心率。計算流程為:將經過歸一化的心音數據進行低通濾波,使用軟件包絡檢波提取心音信號的包絡信息,并對心音數據的S1和S2進行峰值定位得到峰值在心音數據中的索引,通過計算奇偶位置峰值的平均間隔得到心率。
圖5顯示了實時心率計算的流程圖。心率計算線程每隔0.5 s運行一次,每次計算數據量為5 s內的心音數據。保證計算的實時性,心率計算的程序均由C語言進行編寫,Android應用與NDK中C實現的心率計算組件之間通過Java本地接口(Java native interface,JNI)進行通信與調用。

圖5 實時心率計算流程
本文使用式(1)對數據進行歸一化處理,將其映射到[-1,1]區(qū)間內
(1)
式中:X表示原始心音數據,X′表示歸一化后的心音數據。
采集心音信號過程中不可避免的會引入肺部雜音和環(huán)境噪音,這將會對后續(xù)的軟件包絡檢波與峰值檢測造成干擾,引起偽峰,從而出現心率計算錯誤。因此需對原始的心音數據進行濾波處理以提高后續(xù)的包絡檢測準確度。正常心音的范圍大多處于5 Hz~600 Hz,其中S1和S2的頻率范圍主要集中在50 Hz~110 Hz[9]。雖然有病理性雜音的頻率超過此范圍,但在心率計算部分屬于干擾信號。本文采用一個截止頻率為200 Hz的低通濾波器濾除高頻分量以保留主要的S1和S2成分。
采用的濾波器為二階的低通巴特沃斯濾波器,其標準差分方程如式(2)所示
A(1)*Y(n)=B(1)*X′(n)+B(2)*X′(n-1)+
B(3)*X′(n-2)-A(2)*Y(n-1)-A(3)*Y(n-2)
(2)
其中,B和A為濾波器的系數,Y(n)表示對第n點信號進行濾波后的數據。如果A(1)≠1,將對整個濾波器系數歸一化為A(1)。
如何快速完整地進行包絡提取是本文算法研究的重點,希爾伯特變換(Hilbert Transform)算法可以用于提取信號的包絡,其基本原理是對原始信號X進行希爾伯特變換,其變換公式如式(3)所示
(3)
3.5 完善醫(yī)療保險制度,提供社會支持 隨著我國醫(yī)療衛(wèi)生體制改革的不斷深化,人們開始擁有不同類型的醫(yī)療保險,這為緩解“看病難、看病貴”問題起到了積極的作用。對于部分車禍患者,因其不能享受醫(yī)保,經濟壓力也為患者本人及照顧者帶來深深的困擾。重癥顱腦外傷患者大多帶有程度不等的后遺癥,后期的康復訓練和生活照料還需要投入大量的人力物力。責任護士在患者放棄治療時,可積極調動患者盡可能多的支持系統(tǒng),并聯系當地2級醫(yī)院或社區(qū)衛(wèi)生服務中心,為患者進行后續(xù)治療,并請醫(yī)師告知對方醫(yī)護人員治療護理的重點。
(4)

最后將式(4)中構造的解析信號進行取模得到原始信號X的包絡信息。由于希爾伯特變換存在積分運算與復數運算,在低性能嵌入式設備上運算時間將明顯增加,達不到實時提取包絡的要求。因此,本文借助無線通信系統(tǒng)中對調幅波信號解調的方法原理,通過專用的檢波電路提取調幅波中的低頻信號。文獻[10]給出了檢波電路的硬件實現原理,主要利用二極管的單向導電性和RC電路的充放電特性對信號進行處理。借助此原理,本文將檢波電路的硬件實現方法轉化為軟件方式進行實現,增加了包絡檢波的通用性,并將其用于心音信號的包絡提取,式(5)給出軟件包絡檢波法的差分方程
(5)
式中:rc為時間常數,等同于硬件電路中的RC/Δτ,Yenv為信號包絡。
軟件包絡檢波是一種計算簡單的包絡提取方式,相比較希爾伯特變換算法提取包絡,無需進行復雜運算,對硬件性能需求不高。非常適用于如嵌入式平臺、移動端等這類性能較低設備上的實時計算。
圖6顯示了使用希爾伯特變換與軟件包絡檢波提取同一心音信號包絡的結果。通過對比發(fā)現,兩種方法提取的包絡形狀基本一致,其中希爾伯特變換提取的包絡對于心音S1和S2的幅值還原度更好,利于心音的特征分析。但相較于軟件包絡檢波法,希爾伯特提取的心音包絡含有更多的毛刺,將會導致峰值檢測算法提取出大量的偽峰,不利于心音峰值檢測,從而增加了其心率計算誤差。本文所采用的峰值檢測算法,其準確率依賴于舒張期(S2結束至S1開始)和收縮期(S1結束至S2開始)的光滑程度,因此綜合各方面考慮,本文使用軟件包絡檢波法提取心音包絡。

圖6 兩種方式提取的包絡信息
完整提取出心音信號的包絡信息后,將對心音包絡進行峰值檢測。由于心音信號為準周期信號,在一個完整的心動周期中按S1、收縮期、S2、舒張期循環(huán)出現,從當前心動周期S1至下一個心動周期S1之間的間隔為心動周期的持續(xù)時間(S2同理)。基于此特性,計算得到的奇數位置或偶數位置峰值點之間的間隔即為心動周期持續(xù)時間。為了更加精準地獲得心動周期持續(xù)時間,本文對包絡的奇數峰值點間隔與偶數峰值點間隔取平均值作為平均心動周期時間,如式(6)所示
(6)
式(6)中的Fs為信號采樣頻率,Avrodd和Avreven分別代表奇偶位置的平均間隔,Hr-pcg是通過PCG信號計算出來的心率。圖7顯示了兩類位置間隔,圖中的小圓圈表示被檢測出來的包絡峰值。

圖7 峰值點間隔表示
峰值檢測算法首先通過對心音包絡中存在的極大值點進行遍歷查找,找到包絡中每一個極大值點,并記錄該極大值的索引。然后將包絡分割為固定大小的幀,并找到每一幀中的最大值及其索引。本文中的分幀大小是根據S1與S2的持續(xù)時間得到的,文獻[11]中總結了S1與S2的持續(xù)時間為40 ms~160 ms。因此本文中分幀大小取其持續(xù)時間的最大值160 ms。圖8展示了峰值檢測的具體過程。

圖8 峰值檢測工作流程
臨床聽診的主要內容包括心率、心音以及心雜音等,其中成年人的心率范圍大概在60 bpm~100 bpm,典型值為80 bpm。而心音中存在的病理性雜音是用來診斷心臟是否正常的重要指標,例如二尖瓣狹窄的患者的病理性雜音主要出現在舒張期,動脈導管未閉的患者存在持續(xù)性的雜音等[13]。這些聽診內容均可以用于衡量心臟健康狀態(tài)。
利用本文設計的遠程心音采集系統(tǒng)(下面簡稱本系統(tǒng)),項目組成員每周3次至課題合作單位云南省阜外心血管病醫(yī)院對3歲~18歲的先心病患者進行心音信號采集。采集環(huán)境為醫(yī)院病房,采集期間房間內保持安靜,被采集人員保持平穩(wěn)呼吸狀態(tài)。為驗證該系統(tǒng)采集心音質量,邀請云南省阜外心血管病醫(yī)院的心內科專家對126名志愿者進行現場聽診與遠程聽診測試。聽診測試數據見表1。

表1 心音采集-聽診測試
通過對表1的測試數據分析得到,在對126名志愿者的聽診測試中,124例的聽診結果保持一致。通過分析其余2例心音發(fā)現,其中1例是由于志愿者感冒造成呼吸音過重,另外1例為采集方式不標準。因為醫(yī)生在現場聽診中通常要求志愿者進行憋氣等操作,而采集心音一般保持平穩(wěn)呼吸狀態(tài),因此可能出現聽診結果不一致的情況。依據表1測試數據,可以得出通過本系統(tǒng)所采集心音信號質量滿足聽診要求,可用于遠程診斷場景。圖9展示了利用本系統(tǒng)進行心音采集與遠程結果返回的效果圖。

圖9 心音采集(左)與遠程聽診結果展示(右)
為進一步驗證本系統(tǒng)的采集效果,實驗對比了本系統(tǒng)與課題組上一代心音心電采集系統(tǒng)[13]的采集效果。使用控制變量法盡可能保證其采集條件。在同一采集環(huán)境下,使用兩套系統(tǒng)對同一個體相同位置的心音信號進行采集。分別導出音頻信號并繪制心音圖,由心內科專家進行回聽及PCG波形分析。圖10展示了兩代設備采集同一個體1 s的PCG信號。

圖10 新設備(a)與舊設備(b)采集的心音信號
圖10(a)與圖10(b)分別展示了兩代設備采集的心音波形。比較發(fā)現,圖10(b)中基線附近的噪聲更強。這是因為采集過程中舊設備由電路引入的噪聲更加明顯,從而降低了心音分析的效果。將兩類心音轉換為wav格式的音頻文件進行播放,發(fā)現舊設備采集心音帶有很低沉的電流音,新設備對應的音頻更加清晰且無電流音。在采集的便攜性、采集參數動態(tài)調整性以及心音信號云端存儲等功能上,本系統(tǒng)較上一代設備都有較大改進,適用于對貧困山區(qū)先心病兒童進行遠程篩查的場景。
心電圖(electrocardiogram,ECG)在評估心血管疾病的初始診斷篩選中起著至關重要的作用,它同時也是心率檢測的金標準之一。在本節(jié)中,本文對2.2.2小節(jié)中提出的軟件包絡檢波法和Hilbert變換算法計算出來的心率進行實驗對比。從心率計算誤差與算法運行時間兩個維度對算法進行考量。
心音數據來源于研究團隊采集構建的心音樣本庫,所有數據均同步記錄心音心電信號。隨機從數據庫中抽取133例心音信號,其中正常信號87例,異常信號46例。為了評估算法對于心音心率的準確計算能力,使用ECG-PCG評估算法在測試數據中計算心率的誤差。測試具體實現方法為:從每一例同步采集的信號中,單獨提取出心電信號,使用R波探測器[14]得到所有R波的位置,心率則由所有R波之間的平均長度計算給出。
實驗過程中將使用以下公式進行數值計算與分析。從ECG中提取標準心率方式如式(7)所示
(7)
式中:Hr-ecg表示通過ECG信號計算出來的標準心率,NR表示一段ECG信號中有效R波段的數量,LR-R表示相鄰兩個R波之間的距離,單位為秒(s)。
誤差均值的計算標準由式(8)給出
(8)
式中:μe為誤差均值,N表示總的心音數量。
誤差均值的離散程度用誤差均值的樣本標準差表示,式(9)展示了其計算方式
(9)
式(9)中的計算結果Se即為誤差均值的離散程度。
實驗步驟如下:
(1)分離信號中的心音心電數據,通過R波探測器獲取心電數據的R波之間的平均長度,并根據式(7)計算出標準心率;
(2)通過步驟(1)中分離得到的心音數據,使用式(1)~式(6)進行預處理、包絡提取、峰值檢測以及心率計算;
(3)對步驟(1)和步驟(2)中得到的結果,使用式(8)和式(9)進行誤差均值計算以及誤差均值的離散程度分析,最終結果由表2~表4給出;
(4)在步驟(2)的計算過程中分別對希爾伯特算法提取包絡和軟件包絡檢波法提取包絡的運算時間進行統(tǒng)計。
表2~表4分別列出了ECG測出心率與PCG計算心率結果的誤差均值和誤差均值離散程度的對比結果,其絕對值越小,說明PCG計算心率越接近ECG計算出來的心率。表2和表3分別展示了正常心音和異常心音的心率計算比較結果,表4是綜合了133例心音的一個統(tǒng)計分析結果,實驗數據中軟件包絡檢波法的最佳時間常數rc取值為800。

表2 87例正常心音的軟件包絡檢波和Hilbert包絡計算心率

表3 46例異常心音的軟件包絡檢波和Hilbert包絡計算心率

表4 133例心音的軟件包絡檢波和Hilbert包絡計算心率
根據表4結果分析得出,使用軟件包絡檢波法計算得出的心率與Hilbert包絡計算得出心率相比,其誤差更小。本文通過實驗記錄了提取10 s心音信號的包絡所用時間,發(fā)現Hilbert變換提取的包絡是軟件包絡檢波提取包絡所用時間的3.6倍。以上實驗結果表明軟件包絡檢波法相比Hilbert變換法在提取光滑心音包絡上更有優(yōu)勢,且計算復雜度更低,適合用于低性能嵌入式設備和Android設備的實時運算。
經過臨床實驗測試,本系統(tǒng)各項性能均達到設計目標,所采集心音信號能夠滿足醫(yī)生聽診以及后續(xù)的信號分析工作。系統(tǒng)基于Android平臺與嵌入式技術,實現了心音的實時采集、顯示存儲、遠程聽診以及實時心率分析等功能,同時數據采集盒具有兼容多平臺、易擴展、易攜帶等特點。文中提出的軟件包絡檢波法與峰值定位結合的算法可以在低性能設備上快速的利用PCG計算心率。該算法可以為后續(xù)的嵌入式研究提供參考,本文已將算法移植到Android設備,下一步將考慮將其移植至IOS平臺以滿足更多樣化的使用場景。后續(xù)研究工作中,也將進一步增強心率計算算法在不同心音樣本上的精度與實時性,擴大算法適用范圍。