MIT BIH資料的讀取,以及各檔案的作用

2021-10-11 15:28:26 字數 3884 閱讀 3471

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 格式。

而 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())

# 檢視心拍的型別

讀取zip檔案中的 upg檔案以及 bin檔案

這次收到乙個任務跟之前一樣,但是這次的複雜在於兩個檔案不一樣!所以倒騰了很久,最後發現因為字元的編碼的原因,每行的大小都是不一樣的,所以讀取的內容是不能計算在哪一行的。所以不能用file函式,因為這個函式是讀取一行內容作為陣列的乙個元素存在的。所以這裡使用file get contents函式,因為...

colab讀取google drive的檔案

使用colab訓練深度學習模型的時候,需要讀入本地採集好的資料集。這時候可以將資料集先上傳到google drive雲端硬碟,再在colab的notebook讀取google drive的資料集 文字 資料表等 colab類似一台linux伺服器,要使用google drive就需要把drive掛在...

R讀取xlsx資料以及讀取所得資料框資料的轉化

最近r讀取xlsx格式資料檔案為dataframe之後轉化成矩陣資料進行處理得到dataframe,之後將dataframe資料轉化為矩陣資料時多次錯誤,原因在與dataframe中資料是factor還是character,解決問題如下 假設下表為沒有表頭的 text.xlsx 資料 a1.00 1...