本篇主要介绍使用 WFDB工具包 对 ECG数据 进行操作,能够直接读取心电信号数据。
WFDB包可以直接获取ECG心拍类型,读取心电记录,读取R峰等等以及利用matplotlib绘制心电信号波形。
WFDB 包 是目前处理生理信号数据最常用的包之一。
如果你已经安装了Anaconda 和 Pycharm,可以直接在终端下,执行如下命令:
pip install wfdb
安装完成后,使用以下命令检查是否安装成功。
import wfdb
print(wfdb.__version__)
import wfdb
#显示心跳类型
wfdb.show_ann_labels()
打印结果:
label_store symbol description
0 0 Not an actual annotation
1 1 N Normal beat
2 2 L Left bundle branch block beat
3 3 R Right bundle branch block beat
4 4 a Aberrated atrial premature beat
5 5 V Premature ventricular contraction
6 6 F Fusion of ventricular and normal beat
7 7 J Nodal (junctional) premature beat
8 8 A Atrial premature contraction
9 9 S Premature or ectopic supraventricular beat
10 10 E Ventricular escape beat
11 11 j Nodal (junctional) escape beat
12 12 / Paced beat
13 13 Q Unclassifiable beat
14 14 ~ Signal quality change
16 16 | Isolated QRS-like artifact
18 18 s ST change
19 19 T T-wave change
20 20 * Systole
21 21 D Diastole
22 22 " Comment annotation
23 23 = Measurement annotation
24 24 p P-wave peak
25 25 B Left or right bundle branch block
26 26 ^ Non-conducted pacer spike
27 27 t T-wave peak
28 28 + Rhythm change
29 29 u U-wave peak
30 30 ? Learning
31 31 ! Ventricular flutter wave
32 32 [ Start of ventricular flutter/fibrillation
33 33 ] End of ventricular flutter/fibrillation
34 34 e Atrial escape beat
35 35 n Supraventricular escape beat
36 36 @ Link to external data (aux_note contains URL)
37 37 x Non-conducted P-wave (blocked APB)
38 38 f Fusion of paced and normal beat
39 39 ( Waveform onset
40 40 ) Waveform end
41 41 r R-on-T premature ventricular contraction
这边我们使用的是 MITBIH数据库中 采样率为 360Hz 的 ECG数据,链接:https://physionet.org/content/mitdb/1.0.0/
参数介绍:
首先,先看下其中编号为100的头文件:
第一行:100 表示编号,2 表示是双导联的,360 表示采样率为360Hz, 650000 表示该记录下的点数;
第二行和第三行:表示的是两个导联的数据说明;因为是双导联的,两个导联分别是MLII导联 和 V5导联。
Q:这里稍微解释下:650000个点是怎么算的?
A:因为360Hz的数据记录时间是30分钟,采样率是360Hz,意思就是说1s采样360个点,那就是648000个点;但可能前后会有噪声,官方就采取了650000个点;这也是没问题的,采样率不变。
相关参数的解释已经在代码中标注了;其中,因为650000个数据点实在太多了,这里我们只取前1000个点作为演示。
import wfdb
import matplotlib.pyplot as plt
record = wfdb.rdrecord('D:/ECG-Data/MIT-BIH-360/100', # 文件所在路径
sampfrom=0, # 读取100这个记录的起点,从第0个点开始读
sampto=1000, # 读取记录的终点,到1000个点结束
physical=False, # 若为True则读取原始信号p_signal,如果为False则读取数字信号d_signal,默认为False
channels=[0, 1]) # 读取那个通道,也可以用channel_names指定某个通道;如channel_names=['MLII']
# 转为数字信号
signal = record.d_signal[0:1000]
# 绘制波形
plt.plot(signal)
plt.title("ECG Signal")
plt.show()
绘制的图形:
大家可以看到,绘制的图片有蓝色和黄色两种颜色,说明把两通道的数据都画出来了;如果大家只需要一个通道的,可以用channel_names参数指定通道数即可。
例如,指定MLII通道;
import wfdb
import matplotlib.pyplot as plt
record = wfdb.rdrecord('D:/ECG-Data/MIT-BIH-360/100', # 文件所在路径
sampfrom=0, # 读取100这个记录的起点,从第0个点开始读
sampto=1000, # 读取记录的终点,到1000个点结束
physical=False, # 若为True则读取原始信号p_signal,如果为False则读取数字信号d_signal,默认为False
channel_names=['MLII']) # 读取那个通道,也可以用channel_names指定某个通道;如channel_names=['MLII']
# 转为数字信号
signal = record.d_signal[0:1000]
# 绘制波形
plt.plot(signal)
plt.title("ECG Signal")
plt.show()
每个心拍记录中的 annotation 是有标注R峰位置的。目前,截取各个心拍的方法主要是根据 R峰 的位置分别向前、向后取一段距离为一个心拍;本节主要是 wfdb的使用,下一节介绍心拍截取、小波去噪等预处理方式。
import wfdb
import matplotlib.pyplot as plt
record = wfdb.rdrecord('D:/ECG-Data/MIT-BIH-360/100', # 文件所在路径
sampfrom=0, # 读取100这个记录的起点,从第0个点开始读
sampto=1000, # 读取记录的终点,到1000个点结束
physical=False, # 若为True则读取原始信号p_signal,如果为False则读取数字信号d_signal,默认为False
channel_names=['MLII']) # 读取那个通道,也可以用channel_names指定某个通道;如channel_names=['MLII']
# 转为数字信号
signal = record.d_signal[0:1000]
# 绘制波形
plt.plot(signal)
plt.title("ECG Signal")
# 读取annatations
signal_ann = wfdb.rdann("D:/ECG-Data/MIT-BIH-360/100", "atr", sampfrom=0, sampto=1000)
# 将读取到的annatations的心拍绘制到心电图上
for index in signal_ann.sample:
plt.scatter(index, signal[index][0], marker="*")
# 并打印出改心拍标注的类型
print(signal_ann.symbol)
plt.show()