MIT-BIH資料的讀取,以及各檔案的作用
WFDB讀取心電資料(針對MIT-BIH)
100.hea檔案樣式
100 2 360 650000
100.dat 212 200 11 1024 995 -22131 0 MLII
100.dat 212 200 11 1024 1011 20052 0 V5
# 69 M 1085 1629 x1
# Aldomet, Inderal
分別表示的意義:
100(檔名) 2(通道數/導聯數 MLII和V5兩路導聯訊號組成) 360(取樣率是360Hz) 650000(每路訊號長度為650000個取樣點) 100.dat(訊號儲存在100.dat檔案中) 212(訊號以212格式儲存,針對兩個訊號的資料庫記錄,每三個位元組(24bit=6個16進位制的數字)儲存兩個資料(兩路訊號分別佔一個)) 200(表示每個訊號的增益都是每200ADC units/mV) 11(ADC的解析度是11位) 1024(ADC的零值為1024) 995/1011(不同訊號的第一取樣點的值) -22131/20052(65萬個取樣點的校驗數) 0(表示輸入和輸出可以以任意尺寸的塊來執行) MLII/V5(訊號描述欄位,表示訊號採自那個導聯)
100.dat檔案是資料檔案,儲存格式有Format8、Format16、Format16、Format80、Format212、Format310等八種資料,心律失常資料庫一般採用212格式進行儲存。
“ 212 ” 格式是針對兩個訊號的資料庫記錄,這兩個訊號的資料交替儲存,每三個位元組儲存兩個資料。這兩個資料分別取樣自訊號 0 和訊號 1 ,訊號 0 的取樣資料取自第一位元組對 (16 位 ) 的最低 12 位,訊號 1 的取樣資料由第一位元組對的剩餘 4 位(作為組成訊號 1 取樣資料的 12 位的高 4 位)和下一位元組的 8 位(作為組成訊號 1 取樣資料的 12 位的低 8 位)共同組成。以 100.dat 為例。
按照 “212 ”的格式,從第一位元組讀起,每三個位元組( 24 位)表示兩個值,第一組為 “E3 33 F 3 ” , 兩個值則分別為 0x3E3 和 0x3F3 轉換為十進位制分別為 995 和 1011 ,代表的訊號幅度分別為 4.975mv ( 995/200 ,值 / 增益)和 5.055mv ,這兩個值分別是兩個訊號的第一取樣點,後面依此類推,分別表示了兩個訊號的取樣值。
100.atr檔案是註釋檔案。記錄了心電專家對相應的心電訊號的診斷資訊,主要有兩種格式: MIT 格式和 AHA 格式。
MIT 格式是一種緊湊型格式,每一註釋的長度佔用偶數個位元組空間,多數情況下是佔用兩個位元組,多用於線上的註釋檔案;
而 AHA 格式的每一註釋佔用 16 個位元組的空間,多用於交換檔案的情況。心律失常資料庫採用的 MIT 格式。
從檔案中的第一位元組不為 0 可以判斷該檔案是以 MIT 格式儲存的。從第一位元組開始按照 MIT 格式進行分析,首先讀出 16 位值 0x7012 ,其高 6 位的值為 0x 1C ( 十進位制 28) ,低 10 位的值為 0x12 ,該型別程式碼為 28 ,代表意義是節律變化,發生時間在 0.05 秒( 18/360Hz );接著讀出後面的 16 位值 0xFC03 ,其高 6 為的值為 0x 3F (十進位制 63 ),低 10 位的值為 0x03 ,該型別程式碼為 63 ,代表的意義是在該 16 位值後附加了 3 個(低 10 位值代表的數)位元組的輔助資訊,若位元組個數為奇數,則再附加一個位元組的空值,在本例中就是 “28 4E 00 00 ” ;然後再從下一位元組讀 16 位值 0x043B ,其高 6 位的值為 1 ,低 10 位的值為 0x3B (十進位制 59 ),該型別碼 1 代表正常心搏,發生時間為 0.213 秒(( 18+59 ) /360Hz );依次類推即可讀出所有的註釋,當讀到的 16 位值為 0 時,就表示到了檔案尾。
另,當高 6 位為十進位制 59 時,讀取之後第 3 個 16 位的高 6 位,作為型別程式碼,讀取之後第二個 16 位 + 第一個 16 位 *2^16 ,作為發生時間;
高 6 位為十進位制 60 , 61 , 62 時,繼續讀下一個 16 位。
採用 WFDB 轉換的 AHA 資料庫 atr 註釋,第一個位元組為 0 ,其讀取方式同 MIT 格式一致,可採用相同的方式讀取
# 讀取心電訊號檔案
# 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/102', sampfrom=0, sampto = 1500) # 讀取所有通道訊號
# record = wfdb.rdrecord('../ecg_data/203', sampfrom=0, sampto = 1500,channel_names=['MLII']) # 僅僅讀取“MLII”訊號
record = wfdb.rdrecord('../ecg_data/101', sampfrom=0, sampto=3500, channels=[0]) # 僅僅讀取第0個訊號(MLII)
print(type(record)) # 檢視record型別
print(dir(record)) # 檢視類中的方法和屬性
print(record.p_signal) # 獲得心電導聯線訊號,本文獲得是MLII和V1訊號資料
print(record.n_sig) # 檢視導聯線條數
print(record.sig_name) # 檢視訊號名稱(列表),本文導聯線名稱['MLII', 'V1']
print(record.fs) # 檢視採用率
# 讀取註解檔案
# sampfrom: 設定讀取心電訊號的 起始位置,sampfrom=0表示從0開始讀取,預設從0開始
# sampto:設定讀取心電訊號的 結束位置,sampto = 1500表示從1500出結束,預設讀到檔案末尾
print(type(annotation)) # 檢視annotation型別
print(dir(annotation))# 檢視類中的方法和屬性
print(annotation.sample) # 標註每一個心拍的R波的尖鋒位置,與心電訊號對應
# annotation.symbol #標註每一個心拍的型別N,L,R等等
print(annotation.ann_len) # 被標註的數量
print(annotation.record_name) # 被標註的檔名
print(wfdb.show_ann_labels()) # 檢視心拍的型別