[代码复制可用]wfdb查看ECG信号MITBIH数据库

[代码复制可用]wfdb查看ECG信号

wfdb读文件

如果有wfdb包可以直接使用从步骤2开始,否则先更新下载wfdb包

pip install --upgrade wfdb

验证导入是否成功

import wfdb
wfdb.show_ann_classes()

如果导入成功会看到如下界面
在这里插入图片描述

查看不同类型的文件

# 查看不同文件的类型
f1 = open("C:\\data_0_1.atr","rb")
a = f1.read()
print("atr:")
print(a)
f1.close()
f2 = open("C:\\data_0_1.dat","rb")
b = f2.read()
print("dat:")
print(b)
f2.close()
f3 = open("C:\\data_0_1.hea","rb")
c = f3.read()
print("hea:")
print(c)
f3.close()

ECG信号的hea文件是注释文件,包含患者的信息有:编号,导联,采样率,年龄,用药,患病类型等,以二进制形式存储

hea:
b’data_0_1 2 200 27402\ndata_0_1.dat 16 17823.21157810434(1109)/mV 16 0 993 5202 0 I\ndata_0_1.dat 16 9140.353077717731(7227)/mV 16 0 5631 48840 0 II\n# non atrial fibrillation\n’

dat文件是电位的数值,但是通常以二进制的形式存储

dat:
b’\xe1\x03\xff\x15\xad\x04d\x16\xb6\x04\xeb\x15\x03\x05\x9c\x15e\x04\xf7\x14w\x03J\x14\t\x03A\x14g\x03\xd5\x13。。。’

atr文件包含注释信息,如心率变化的记录,R峰的记录等,也是以二进制的形式存储

atr:
b’\x1e\x04\xab\x04\xa3\x04\xac\x04r \xc7\x04\xab\x04k \xcb\x04\xac\x04\xa8\x04\xa4\x04\xa1\x04\xa4\x04\xa5\x04\xa6\x04\xa4\x04\xa5\x04\xa8\。。。

查看文件的长度

print("atr,dat,hea"),len(a),len(b),len(c)
#输出结果
(None, 312, 109608, 172)

注意dat的长度有时候会很长,所以使用jupyter编辑的时候可能会报错,不打印出完成dat内容即可,可以看一下dat长度,便于后续数据处理即可。

注意,这里的长度并不代表采样的数据点
想知道采样点应该使用wfdb包。举例对比一下

ann = wfdb.rdrecord("C:/Users/CL/Desktop/sel/100", sampfrom=0, sampto=None, physical=False, channels=[0, ])
ann.fs,ann.d_signal.shape
#(360, (650000, 1))

数据取自mit数据库,采样率360hz,时间长半个小时,正确反映数据量。
但是采用上述方式(即len(file))

f2 = open("C:/Users/CL/Desktop/sel/100.dat", "rb")
a = f2.read()
print(len(a)) #1950000

显然结果是不同的。
3倍的关系,也就是说三个数字对应一个采样数据

查看文件的采样频率

虽然在hea文件中已经记录了这一个信息,但是使用wfdb也可以查看,注意这里读取的文件格式是hea,所以文件的后缀不用写。

# 读取头文件的采样频率
record = wfdb.rdrecord("C:\\data_0_1", sampfrom=0, sampto=10000, physical=False, channels=[0, ])
print("record frequency:" + str(record.fs))

查看wfdb标准库记录的疾病标志

# 打印各种符号代表的心率类型
wfdb.show_ann_labels()

在这里插入图片描述

查看R波位置,心拍标记,心率表换点等的注释信息

# 读取第1条记录的annatation,前一千个数据
signal_annotation = wfdb.rdann("C:\\data_0_1", "atr", sampfrom=0, sampto=10000)
# 打印标注信息chan:是chanel的意思,保存的是当前标注的是哪一个通道,为一个ndarray或者是list
# sample:这里记录的是每个心拍中R波的位置信息,为一个ndarray或者是list
# symbol:记录的是每个心拍的标注信息,记录的是每个心拍的类型,是一个字符型的ndarray或者是list,其内容为wfdb.show_ann_labels()的symbol类型;
# aux_note:记录的是心率变换点的标注类型,是辅助信息,其内容为:

print("chan: " + str(signal_annotation.chan))
print("R_sample: " + str(signal_annotation.sample))
print("symbol: " + str(signal_annotation.symbol))
print("aux_note: " + str(signal_annotation.aux_note))

在这里插入图片描述

查看数字信号与模拟信号

#  physical=False,默认是False,读取的数字信号,True,读取的则是模拟信号
 record = wfdb.rdrecord("C:\\training\\training\\data_10_10", sampfrom=0, sampto=1000, physical=False, channels=[0, ])
 print(record.d_signal)

注意physical要与d_signal或者p_signal对应。
得出的数据,估计需要一个转换率,变成自己需要的数据
暂时没有遇到需要数字信号与模拟信号的情况

查看原数据data

# 查看原数据
data = wfdb.rdsamp("C:\\training\\training\\data_10_10", sampfrom=0, sampto=1000)
print(data)
print(type(data))
print(type(data[0]))
print(len(data[0]))

得到结果是:

(array([[4.99007752, 5.00511628],
       [4.96511628, 4.9820155 ],
       [4.98713178, 5.02      ],
       ...,
       [4.85007752, 4.79007752],
       [4.79503876, 4.74713178],
       [4.79209302, 4.71007752]]), {
    
    'fs': 200, 'sig_len': 1000, 'n_sig': 2, 'base_date': None, 'base_time': None, 'units': ['mV', 'mV'], 'sig_name': ['I', 'II'], 'comments': ['paroxysmal atrial fibrillation']})
<class 'tuple'>
<class 'numpy.ndarray'>
1000

这种方法非常方便的就可以得到采样率,数据长度,数据单位,导联信息,(paroxysmal atrial fibrillation表示阵发性房颤,非常nice!)
数据类型是一个元祖,数字类型是:ndarray

matplotlib绘图

  • 首先导入包
import matplotlib.pyplot as plt
  • 读取上述record的对应的信号值
# 读取数据
ventricular_signal = record.d_signal[0:109608]
print('signal shape: ' + str(ventricular_signal.shape))
  • 显示波形
plt.plot(ventricular_signal)
plt.title("ventricular signal")
plt.show()
  • 将R波位置以星号“*”标记在图上
ventricular_signal = record.d_signal[0:500]
print('signal shape: ' + str(ventricular_signal.shape))
# 绘制波形
plt.plot(ventricular_signal)
plt.title("ventricular signal")

# 读取annatations,sample:这里记录的是每个心拍中R波的位置信息,为一个ndarray或者是list
signal_annotation = wfdb.rdann("C:\\data_0_1", "atr", sampfrom=0, sampto=500) 

print("R_sample: " + str(signal_annotation.sample))
# 查看列表形状,这里指list的长度
print("列表长度"+str(signal_annotation.sample.shape))
# 将读取到的annatations的心拍绘制到心电图上
for index in signal_annotation.sample:
    plt.scatter(index,ventricular_signal[index][0:109608], marker="*") 
plt.show()

在这里插入图片描述

将绘制好的图形保存在本地

                nor_ventricular_signal = record.d_signal[0:1000]
                
                plt.plot(nor_ventricular_signal)  
                plt.title("nor_ventricular signal"+ str(k))                
                
                plt.savefig('D:\\nor\\' + str(m) + '_' + str(k) + '.png') #注意保存写在show函数前面,否则会被释放
                plt.show()

补充其他医学标注

(AFIB atrial fibrillation 心房颤动
(ASYS asystole
(B ventricular bigeminy 室心体内膜
(BI first degree heart block 第一学位心脏块
(HGEA high grade ventricular ectopic activity 高级心室异位活性
(N or (NSR normal sinus rhythm
(NOD nodal ("AV junctional”) rhythm
(NOISE noise
(PM pacemaker (paced rhythm) 起搏器
(SBR sinus bradycardia 窦性计准备
(SVTA supraventricular tachyarrhythmia
(VER ventricular escape rhythm 心事逃逸节奏
(VE or (VFIB ventricular fibrillation 室性纤维化
(VFL ventricular flutter 室扑
(VT vantricular tachycardia 心动过速

暂时这些,持续更新

有帮助的话点个赞~谢

おすすめ

転載: blog.csdn.net/HJ33_/article/details/115328166