申玉靜,王 尋,唐 閩*
(1.中國醫(yī)學科學院阜外醫(yī)院心律失常中心,北京100037;2.中國科學院聲學研究所語言聲學與內(nèi)容理解重點實驗室,北京100190)
心血管疾病是世界范圍內(nèi)導致死亡率較高的疾病之一[1-2]。隨著我國國民經(jīng)濟的發(fā)展和人口老齡化的加快,心血管疾病的發(fā)病率呈現(xiàn)出明顯的上升趨勢。盡早發(fā)現(xiàn)、及時治療心血管疾病是目前醫(yī)學領(lǐng)域的研究熱點。心音是人體一種重要的生理信號,在心臟疾病的癥狀顯現(xiàn)之前,心音往往就會出現(xiàn)異常。因此,對心音信號進行分析有助于較早發(fā)現(xiàn)心臟疾病。正常的心音中可聽音通常包含第一心音(S1)和第二心音(S2)2 個部分,它們統(tǒng)稱為基礎(chǔ)心音[3]。S1 產(chǎn)生于心室收縮的開始階段,是由二尖瓣和三尖瓣的關(guān)閉引起的;S2 產(chǎn)生于心室舒張的開始階段,是由主動脈瓣和肺動脈瓣的關(guān)閉引起的[4]。
心音聽診是一種成本低廉、操作簡單的心臟檢查方法[5]。由于傳統(tǒng)的聽診器體積較大,信號難以被放大,數(shù)據(jù)無法保存,所以人們發(fā)明了功能更加豐富的電子聽診器。如張雷等[6]設(shè)計了一種軍用便攜式一體化遠程檢診箱,其中包括了藍牙電子聽診器,但其全套系統(tǒng)較為復雜,不適合民用。黃彬等[7]考慮到傳統(tǒng)心電和心音采集設(shè)備相對獨立且不便于攜帶,設(shè)計了基于Android 操作系統(tǒng)的心電心音采集設(shè)備,但該設(shè)備軟件端上只能實現(xiàn)心電和心音的波形顯示,不能保存和進一步分析數(shù)據(jù)。廖慶豐等[8]報道了一種便攜式電子聽診器,但該聽診器需要掛接U 盤才能進行心音的存儲,使用較為不便。陳剛等[9]設(shè)計了一種心音檢測裝置,其主要創(chuàng)新在于硬件設(shè)計,但并未設(shè)計移動平臺軟件。樊容[10]設(shè)計了一種低噪聲電子聽診器用于心音和肺音的聽診,該設(shè)備可以將采集到的聲音由揚聲器或耳機輸出,但不能使用上位機分析和保存數(shù)據(jù)。
由于Android 平臺是完全開放的移動設(shè)備平臺,用戶界面友好,資源豐富[11-12],所以本文使用Android Studio 集成開發(fā)工具[13]設(shè)計了基于Android 移動平臺的心音采集軟件。本軟件具有患者姓名輸入、聽診區(qū)選擇的功能,能夠?qū)崟r顯示濾波前和濾波后的心音波形,且波形幅值可以調(diào)節(jié)。此外,本軟件還可以實時顯示心音香農(nóng)能量包絡(luò),使得用戶能夠?qū)崟r監(jiān)測當前聽診位置的心音強度,從而調(diào)整采集位置,較為準確地找到心音最強的聽診部位。
心音數(shù)據(jù)采集系統(tǒng)由3 個部分組成:心音采集傳感器、信號處理采集電路(包括信號放大、數(shù)字化采樣和藍牙發(fā)送)和上位機(平板計算機),如圖1 所示。其中心音采集傳感器用于將傳播至胸壁的心音信號轉(zhuǎn)換為電信號,需要具備抗干擾性強、靈敏度高、頻率響應曲線平坦等特點[14]。故本研究選用HKY-06B[15]作為心音采集傳感器,OPA2340PA 芯片用于將HKY-06B 輸出的信號放大。由于心音有效頻率范圍通常低于1 kHz,本研究設(shè)計二階巴特沃斯低通濾波器濾除1 kHz 以上的信號。此后,使用MAX9867芯片對心音進行采樣,采樣頻率為4 kHz,采樣數(shù)據(jù)寬度為16 bit。考慮到藍牙(Bluetooth)無線通信技術(shù)能夠?qū)崿F(xiàn)點對點的實時數(shù)據(jù)傳輸,且鏈路穩(wěn)定可靠,在醫(yī)療設(shè)備中已經(jīng)得到了廣泛的應用[16],本系統(tǒng)選用具備藍牙功能的RDA5841S芯片作為主控制器。RDA5841S可以設(shè)置MAX9867 采樣時的參數(shù),也可以通過其自帶的藍牙功能將采樣后的數(shù)據(jù)發(fā)送至Android 上位機。上位機可以顯示心音波形及其香農(nóng)能量包絡(luò),并保存心音數(shù)據(jù)(具體過程如圖1 所示)。
圖1 心音數(shù)據(jù)采集系統(tǒng)整體設(shè)計
心音采集軟件包括數(shù)據(jù)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示和數(shù)據(jù)保存4 個部分,其結(jié)構(gòu)如圖2 所示。軟件通過藍牙接收心音數(shù)據(jù)后,對其進行濾波處理。同時,可以選擇顯示濾波前的原始數(shù)據(jù)或濾波后的數(shù)據(jù),濾波前后的數(shù)據(jù)都會被保存,且數(shù)據(jù)顯示與數(shù)據(jù)保存是同步進行的。
在軟件設(shè)計中,定義MainActivity 類用于控制數(shù)據(jù)接收中的藍牙連接,F(xiàn)ilter類用于心音帶通濾波,CalculateS 類用于計算心音的香農(nóng)能量包絡(luò),MyView1 和MyView2 類分別用于控制心音波形和心音香農(nóng)能量包絡(luò)的實時顯示,RTMonitorActivity 類用于控制心音數(shù)據(jù)的接收和存儲,MainActivity_file類用于查看已存儲的心音文件,WabHeader 類包含.wav 文件的頭信息。
圖2 心音采集軟件結(jié)構(gòu)
軟件需要實時接收RDA5841S 芯片通過藍牙發(fā)送的數(shù)據(jù)。首先在Android 工程的Manifest.xml 文件中聲明需要的權(quán)限BLUETOOTH 和BLUETOOTH ADMIN,聲明方式如下:<uses-permission android:name="android.permission.BLUETOOTH"/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
Android 移動平臺藍牙開發(fā)的應用程序接口(application programming interface,API)主要包括[17]:
(1)BluetoothAdapter:本地藍牙適配器對象,通過該類可以發(fā)現(xiàn)藍牙設(shè)備并查詢已配對列表,也可以獲取設(shè)備的藍牙狀態(tài)信息。
(2)BluetoothDevice:遠端藍牙設(shè)備對象,利用該對象可以獲得藍牙設(shè)備相關(guān)信息。
(3)BluetoothSocket:藍牙套接字接口,使用該類可以實現(xiàn)數(shù)據(jù)的輸入和輸出。
(4)BluetoothServerSocket:用于打開服務連接和監(jiān)聽連接的請求。
(5)BluetoothClass:用于描述一個藍牙設(shè)備的屬性,是只讀的屬性集合。
本軟件在RTMonitorActivity 類中定義Bluetooth Socket 的實例mBTSocket 來控制數(shù)據(jù)的發(fā)送和接收。當藍牙連接成功后,定義變量byte[]test={0x01,0x02,0x03,0x04}作為指令,并使用mBTSocket.getOut putStream().write(test)函數(shù)通知下位機開始藍牙數(shù)據(jù)的傳輸,此后使用該實例的getInputStream().read()函數(shù)來讀取緩存中的數(shù)據(jù),并將讀取到的8 bit 數(shù)據(jù)拼接為16 bit 數(shù)據(jù)。藍牙連接和數(shù)據(jù)傳輸?shù)木唧w流程如圖3 所示。軟件中先打開藍牙,然后掃描設(shè)備,連接成功后開始傳輸數(shù)據(jù)。每次接收到數(shù)據(jù)后就對數(shù)據(jù)進行實時處理。
圖3 藍牙連接和數(shù)據(jù)傳輸流程圖
軟件將每次接收到的16 bit 數(shù)據(jù)存放在data 變量中。在每次接收到新數(shù)據(jù)時,軟件對data 中的數(shù)據(jù)進行帶通濾波。使用MATLAB 2014 中的butter 函數(shù)求得巴特沃斯帶通濾波器系統(tǒng)函數(shù)分子、分母多項式的系數(shù)向量B和A,該函數(shù)的使用格式為
其中,N為濾波器階數(shù),本文設(shè)定N=4;Wn為濾波器3 dB 截止頻率的歸一化值。軟件中設(shè)置的通帶頻率為20~1 000 Hz,對應地設(shè)置Wn=[0.01,0.5]。求得的B和A分別為
向量B和A需要預先寫入Filter 類成員變量中。在Filter 類中定義filter 函數(shù)如下:
其中,signal 為待濾波信號,參數(shù)b和a分別表示濾波器系統(tǒng)函數(shù)的分子、分母多項式系數(shù)。當調(diào)用filter函數(shù)時,將B和A的值分別賦給b和a。軟件中filter 函數(shù)利用濾波器的系統(tǒng)函數(shù)與輸入信號卷積實現(xiàn)帶通濾波。
濾波之后的數(shù)據(jù)存儲在filtered_data 數(shù)組中。帶通濾波前和濾波后的心音波形及其時頻圖如圖4 所示。由圖4 可以看出,帶通濾波后心音質(zhì)量得到了明顯改善,通帶外的低頻和高頻雜音都被衰減。為了讓用戶實時了解當前心音的采集質(zhì)量,需要將心音波形畫在Android 上位機的顯示屏上。
為了實時顯示當前采集的心音波形,軟件自定義View1 控件,在控件中設(shè)置坐標軸的寬度和高度分別為680 和340 個像素。由于16 bit 有符號數(shù)的數(shù)據(jù)范圍為-32 768~32 767,遠遠超過控件的像素值,需要將采集到的數(shù)據(jù)除以一個常數(shù)C以更好地顯示在此控件中。在本軟件中,使用一個SeekBar 控件控制常數(shù)C的值。將SeekBar 控件的progress 變量設(shè)置為12 擋,數(shù)值為0~11 范圍內(nèi)的整數(shù)。SeekBar中progress 的數(shù)值與C的對應關(guān)系詳見表1。
同時,軟件中還定義了一個Switch 控件,用于控制View1 控件顯示濾波前或濾波后的心音波形。當濾波開關(guān)關(guān)閉時,每隔0.1 s 將當前data 數(shù)組中的數(shù)據(jù)顯示在View1 上。當濾波開關(guān)打開時,則顯示filtered_data 數(shù)組中的數(shù)據(jù)。波形顯示的主要代碼如下:
圖4 心音信號帶通濾波前后的波形及其時頻圖
表1 SeekBar 中progress 數(shù)值與常數(shù)C 的對應關(guān)系
其中,data.size()用于判斷data 數(shù)組中是否有數(shù)據(jù),如果有數(shù)據(jù)則顯示??紤]到依據(jù)心音進行診斷的準確程度與采集到心音質(zhì)量的關(guān)系很大,軟件界面需要實時顯示基礎(chǔ)心音包絡(luò),以便于用戶及時掌握當前采集位置的心音強度,從而進行位置調(diào)整。而S1 和S2 的頻率范圍通常不超過100 Hz[18],故這里采用2.2節(jié)描述的方式進行帶通濾波,但此時將濾波器的通帶調(diào)整為30~100 Hz,從而計算出的巴特沃斯濾波器的系數(shù)B和A分別為
心音經(jīng)過30~100 Hz 的帶通濾波后,其包含的大部分雜音能量已經(jīng)被濾除了。此后,軟件需要計算上述經(jīng)過帶通濾波的心音的香農(nóng)能量包絡(luò)。香農(nóng)能量計算公式為[19]
其中,x為時域心音信號。則平均香農(nóng)能量可以表示為
其中,xnorm為歸一化后的心音信號;MS為信號長度,本軟件中設(shè)置MS=40。對ES求均值和方差即可得到香農(nóng)能量包絡(luò),計算公式如下[20]:
其中,M(ES(t))為香農(nóng)能量的均值,S(ES(t))為香農(nóng)能量的方差。軟件中使用Pt 數(shù)組來存儲香農(nóng)能量包絡(luò),另一個自定義控件View2 用于顯示香農(nóng)能量包絡(luò)。設(shè)定View2 控件每隔0.1 s 讀取一次Pt 數(shù)組中的數(shù)據(jù)并顯示,顯示原理與心音波形圖一致。
軟件采集到的心音信號需要被完好無損地保存下來,以便于回放或進一步分析。軟件以16 bit 有符號數(shù)保存帶通濾波前和帶通濾波后的數(shù)據(jù),保存的數(shù)據(jù)格式有.pcm、.wav 和.txt 3 種。其中,.pcm 格式存儲最原始的波形數(shù)據(jù);.wav 格式為微軟發(fā)布的一種聲音文件格式,用戶可以隨時在平板設(shè)備上播放此格式的音頻文件,但保存時需要添加的文件頭應在WabHeader 類中預先寫好;純文本.txt 格式是為了便于用戶直接查看保存的心音數(shù)據(jù)。常用的心音聽診區(qū)有5 個,包括主動脈瓣聽診區(qū)、肺動脈瓣聽診區(qū)、主動脈瓣第二聽診區(qū)、三尖瓣聽診區(qū)和二尖瓣聽診區(qū)[21],這些聽診區(qū)采集到的心音差異很大。遺憾的是,現(xiàn)有的心音聽診軟件采集數(shù)據(jù)時往往不分聽診區(qū),這導致了難以對特定瓣膜的疾病進行準確判斷。本軟件定義了RadioButton 控件以供用戶在這5 個聽診區(qū)中選擇,用戶也可以在文本框中自行輸入聽診位置,聽診區(qū)的名字會加入到保存音頻的文件名中。以.pcm 格式文件保存為例,實現(xiàn)步驟如下:
(1)定義File 對象file_name,具體如下:
(2)獲取系統(tǒng)時間:
該系統(tǒng)時間被加入到保存心音文件的文件名中,以避免相同名字的錄音文件互相覆蓋。
(3)在剛才創(chuàng)建的文件夾中新建.pcm 格式文件:
(4)文件創(chuàng)建完成后,定義流fos:
(5)每次接收到新的數(shù)據(jù)后,使用fos.write(tmp,0,len)將數(shù)據(jù)寫入到文件中。當數(shù)據(jù)傳輸完成后,使用fos.close()關(guān)閉流。如此便完成了文件中數(shù)據(jù)的寫入操作。
軟件界面主要包括藍牙連接、心音采集和文件查看3 個界面。打開軟件首先進入藍牙連接界面,如圖5 所示,選擇nbbsw 將平板計算機與聽診器通過藍牙連接。連接完成后,軟件會自動跳到心音采集界面,如圖6 所示,此時可以輸入患者姓名并選擇聽診區(qū)。
圖5 藍牙連接界面
圖6 心音采集界面
患者信息輸入完成后,點擊“開始錄音”按鈕即可開始心音采集。此時姓名文本框和聽診區(qū)選擇框變?yōu)椴豢删庉嫚顟B(tài),以防止被誤修改。采集時,界面左下方顯示的是心音波形,右下方顯示的是心音的香農(nóng)能量包絡(luò)。軟件設(shè)置濾波開關(guān)android:checked=“true”時,濾波默認開啟。如果關(guān)閉濾波,其心音波形如圖7(a)所示。此時可以看出心音基線不穩(wěn)定,即有低頻干擾。在同一個聽診位置連續(xù)采集心音,同時左右拖動“放大”滑塊(該滑塊的位置與2.3 節(jié)中SeekBar:progress的數(shù)值一一對應)。當SeekBar 中progress 取值為3時,其心音如圖7(b)所示。對比縮小后[SeekBar 中progress 取值為0,如圖7(c)所示]和放大后[SeekBar中progress 取值為5,如圖7(d)所示]的心音波形,容易看出,拖動“放大”滑塊可以有效調(diào)節(jié)心音信號的幅度,便于用戶查看心音的概貌或細節(jié)。
圖7 心音波形
當采集完成后,點擊“停止錄音”按鈕可立即停止心音的采集。此后,點擊“查看文件”按鈕跳轉(zhuǎn)到文件查看界面,可以查看保存的心音文件,如圖8(a)所示。每一次采集都會產(chǎn)生2 個文件夾,分別保存濾波前[如圖8(a)中062600021]和濾波后[如圖8(a)中062600021filtered]的心音?!安∪?”文件夾保存了每一次采集的3 種格式(.pcm、.txt 和.wav)的數(shù)據(jù),其文件名包括了患者姓名、聽診區(qū)和采集時間的信息,如圖8(b)所示。
圖8 保存的心音文件
基于Android 移動平臺的心音采集軟件界面直觀、頁面跳轉(zhuǎn)少、使用過程流暢、可以實時濾波和保存數(shù)據(jù)、有利于數(shù)據(jù)的后續(xù)處理,具有較高的實用價值和進一步開發(fā)潛力。
本文設(shè)計了一個基于Android 移動平臺的心音采集軟件,可以手動輸入患者姓名、選擇聽診區(qū),便于進行多人多聽診區(qū)的心音采集。同時,本軟件還具有心音波形實時顯示和放大功能。此外,軟件實時計算了香農(nóng)能量包絡(luò)并顯示在界面上,有利于用戶尋找心音信號較強的部位,提高心音采集質(zhì)量。這彌補了目前我國研究人員設(shè)計的電子聽診器軟件功能較為單一的缺點。然而,本軟件仍然存在一定的不足之處,如沒有自動診斷功能、降噪算法較為單一等。未來將進一步豐富軟件功能,如增加小波降噪、基于深度學習的自動診斷功能等。