目前,國際上公認的標準數據庫包含四個,分別爲美國麻省理工學院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel Hospital Database, MIT-BIH)數據庫、美國心臟學會提供的AHA( American heart association,AHA)數據庫、歐共體CSE( Common Standards for Quantitative Electrocardiograph,CSE)數據庫、歐洲ST-T數據庫。html
當前使用最普遍且被學術界廣泛承認的據庫爲MIT-BIH心律失常數據庫。此數據庫中囊括了全部類型的心電信號而且數量豐富,爲本文關於心電信號的自動分類研究提供了實驗數據。下面對該數據庫做詳細的說明。
MT-BIH心律失常數據庫擁有48條心電記錄,且每一個記錄的時長是30分鐘。這些記錄來自於47名研究對象。這些研究對象包括25名男性和22名女性,其年齡介於23到89歲(其中記錄201與202來自於同一我的)。信號的採樣率爲360赫茲,AD分辨率爲11比特。對於每條記錄來講,均包含兩個通道的信號。第一個通道通常爲MLⅡ導聯(記錄102和104爲V5導聯);第二個通道通常爲V1導聯(有些爲V2導聯或V5導聯,其中記錄124號爲Ⅴ4導聯)。爲了保持導聯的一致性,每每在研究中採用MLⅡ導聯。本文選取MLⅡ導聯心電信號進行研究分析。python
數據庫中的每條記錄均包括三個文件,即:頭文件、數據文件和註釋文件。
(1)頭文件頭文件[.hea] 經過ASCII碼存儲方式記錄信號的採樣頻率、採樣頻率、數據格式使用的導聯信息、採樣頻率、研究者的性別、年齡以及疾病種類等
(2)數據文件數據文件[.dat] 經過二進制的方式存儲信號,每三個字節存儲兩個數值(兩導聯數據交替存儲),每一個數值大小是12bit
(3)註釋文件註釋文件[.atr] 是由專家對信號進行人工標註,而且根據二進制格式進行數據的存儲shell
MIT-BIH數據庫的官方網站:https://ecg.mit.edu/數據庫
MIT-BIH數據庫下載:https://www.physionet.org/content/mitdb/1.0.0/api
ZIP包下載連接:Download the ZIP file (73.5 MB)數組
官網上關於該數據庫的詳細介紹網址:https://archive.physionet.org/physiobank/database/html/mitdbdir/intro.htm#symbols。函數
百度百科上的介紹也較爲詳細,須要對其格式作深刻了解的讀者能夠參考:https://baike.baidu.com/item/MIT-BIH。工具
每條信號的基礎信息能夠查詢https://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm學習
數據庫中每條心電信號中的心拍類型表:https://archive.physionet.org/physiobank/database/html/mitdbdir/tables.htm#allbeats網站
MIT-BIH心電數據可視化網站:https://www.physionet.org/lightwave/?db=mitdb/1.0.0
官方網站的可視化工具讀取展現MIT-BIH數據:https://archive.physionet.org/cgi-bin/atm/ATM
官方網站提供的可視化工具中有許多數據庫,請選擇mitdb數據庫。
相比之下更推薦使用倒數第二個網站進行查看。
我在閱讀心電相關論文的時候,經常因爲不一樣文章之間對同一事物的稱呼不一樣而感到困擾。爲避免在本文中出現相似狀況,現將術語稱呼統一以下。
下載數據庫到本地後打開,你會發現.dat文件中所有都是亂碼,這是因爲MIT-BIH數據庫採用了自定義的format212格式進行編碼。因此在讀取心電數據的時候,咱們須要用到Python中的一個工具包:wfdb。
在Pycharm中新建工程,並將下載好的心電數據集按如圖所示的目錄結構進行放置。其中ecg_data爲心電數據集的文件夾。
在該工程配置的Python環境中安裝wfdb包。
pip install wfdb
關於wfdb包的詳細使用請參考其官方文檔,這裏用代碼的形式給出一些經常使用操做。
# 讀取編號爲data的一條心電數據 def read_ecg_data(data): ''' 讀取心電信號文件 sampfrom: 設置讀取心電信號的起始位置,sampfrom=0表示從0開始讀取,默認從0開始 sampto:設置讀取心電信號的結束位置,sampto = 1500表示從1500出結束,默認讀到文件末尾 channel_names:設置設置讀取心電信號名字,必須是列表,channel_names=['MLII']表示讀取MLII導聯線 channels:設置讀取第幾個心電信號,必須是列表,channels=[0, 3]表示讀取第0和第3個信號,注意信號數不肯定 ''' # 讀取全部導聯的信號 record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500) # 僅僅讀取「MLII」導聯的信號 # record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500, channel_names=['MLII']) # 僅僅讀取第0個信號(MLII) # record = wfdb.rdrecord('../ecg_data/' + data, sampfrom=0, sampto=1500, channels=[0]) # 查看record類型 print(type(record)) # 查看類中的方法和屬性 print(dir(record)) # 得到心電導聯線信號,本文得到是MLII和V1信號數據 print(record.p_signal) print(np.shape(record.p_signal)) # 查看導聯線信號長度,本文信號長度1500 print(record.sig_len) # 查看文件名 print(record.record_name) # 查看導聯線條數,本文爲導聯線條數2 print(record.n_sig) # 查看信號名稱(列表),本文導聯線名稱['MLII', 'V1'] print(record.sig_name) # 查看採樣率 print(record.fs) ''' 讀取註解文件 sampfrom: 設置讀取心電信號的起始位置,sampfrom=0表示從0開始讀取,默認從0開始 sampto:設置讀取心電信號的結束位置,sampto=1500表示從1500出結束,默認讀到文件末尾 ''' annotation = wfdb.rdann('../ecg_data/' + data, 'atr') # 查看annotation類型 print(type(annotation)) # 查看類中的方法和屬性 print(dir(annotation)) # 標註每個心拍的R波的尖鋒位置的信號點,與心電信號對應 print(annotation.sample) # 標註每個心拍的類型N,L,R等等 print(annotation.symbol) # 被標註的數量 print(annotation.ann_len) # 被標註的文件名 print(annotation.record_name) # 查看心拍的類型 print(wfdb.show_ann_labels()) # 畫出數據 draw_ecg(record.p_signal) # 返回一個numpy二維數組類型的心電信號,shape=(65000,1) return record.p_signal
在這些函數中,使用最多的是經過record=wfdb.rdrecord來獲取心電數據信息,以及經過annotation=wfdb.rdann來獲取心拍類型信息。須要注意的是record的類型是一個(65000,1)的二維數組,須要先將其轉換成一維數組才能夠對其進行預處理,關於預處理的這部份內容將在下篇文章中進行敘述。