matlab读取西瓜数据集_ECG心电信号处理:使用WFDB对MIT-BIH数据集进行读取(Python)...

234bfade9f1ed5c6f76b0b68f34b48f4.png

本文的主要内容是详细介绍MIT-BIH心电数据集的读取,主要使用WFDB-python工具进行操作,能够读取心电信号数据到array中,读取annatations以及使用matplotlib绘制相应的心电信号波形,并对record和annatation数据结构进行简单的分析。

安装WFDB

github地址为https://github.com/MIT-LCP/wfdb-python

可以直接下载zip包到本地研读一下源码,了解其数据结构。根据其提供的安装教程,直接使用pip安装就行:

pip install wfdb

耐性等待几分钟,很快就能安装成功。之后便可以进行测试:

import wfdb  # 显示所有的标注格式wfdb.show_ann_classes()

运行以上代码后,会打印出annatation的后缀以及标注的类型,安装成功。

7c2b4baab2882f937d9037b90a16dc5d.png

读取record

读取record是使用wfdb的rdrecord函数实现:

# 读取一条记录的心电数据前10000个数据点

record = wfdb.rdrecord('data/MIT-BIH/100', sampfrom=0, sampto=10000, physical=False, channels=[0, 1])

以上示例中,第一个参数是我本地文件的文件地址,整个函数的返回值为一个wfdb中定义的record对象,接下来看一下这个record对象的数据结构。找到刚刚下载的源码,找到record.py文件,该文件中定义的是record类,其申明和初始化如下:

class Record(BaseRecord, _header.HeaderMixin, _signal.SignalMixin): def __init__(self, p_signal=None, d_signal=None, e_p_signal=None, e_d_signal=None, record_name=None, n_sig=None, fs=None, counter_freq=None, base_counter=None, sig_len=None, base_time=None, base_date=None, file_name=None, fmt=None, samps_per_frame=None, skew=None, byte_offset=None, adc_gain=None, baseline=None, units=None, adc_res=None, adc_zero=None, init_value=None, checksum=None, block_size=None, sig_name=None, comments=None): ... ...

这里主要说明几个比较重要经常使用的属性如下(根据我自己的理解,其余的根据自己需要阅读源码即可):

p_signal:模拟信号值,储存形式为ndarray或者是list(在_signal.py中定义的)

d_signal:数字信号值,储存形式为ndarray或者是list(在_signal.py中定义的)

fs:采样频率,int类型的;

这些属性都能直接进行访问,比如需要访问记录的心电信号的数据,直接record.d_signal就能读取到数组或者list中。

现在回到刚刚的rdrecord上来,其申明如下:

def rdrecord(record_name, sampfrom=0, sampto=None, channels=None, physical=True, pb_dir=None, m2s=True, smooth_frames=True, ignore_skew=False, return_res=64, force_channels=True, channel_names=None, warn_empty=False): ...

下面解释一下常用重要参数:

record_name : str,储存心电信号的路径;

sampfrom : int, optional,默认为0;

sampto : int, or 'end', optional;长度;

channels : list, optional;选择读取某个通道的数据,默认读取全部通道;

physical : bool, optional;如果为True则读取p_signal,如果为False则读取d_signal,默认为False;

pb_dir : str, optional;该地址如果填写,则从Physiobank网站上下载数据,例如:pb_dir='mitdb'.

下面我们可以尝试绘制一下心电图的波形:

import wfdbimport matplotlib.pyplot as plt # 读取本地的100号记录,从0到25000,通道0record = wfdb.rdrecord('data/MIT-BIH/100', sampfrom=0, sampto=25000, physical=False, channels=[0, ])print("record frequency:" + str(record.fs))# 读取前1000数据ventricular_signal = record.d_signal[0:1000]print('signal shape: ' + str(ventricular_signal.shape))# 绘制波形plt.plot(ventricular_signal)plt.title("ventricular signal")plt.show()

效果如下所示:

c63b7315b0924da44734a08729a1fd81.png

ok,简单的数据读取就差不多了,当然有很多高级的用法,后面可能会用到,可以多看看源码和Physiobank。

读取annatation

这个标注信息我在官网看了一天,开始真的是一头雾水,后面才慢慢的了解其结构。首先我们打印一下标注的符号类型:

wfdb.show_ann_labels()

会打印出各种符号代表的心率类型如下,一共有41种类型的标注:

 label_store symbol description0 0 Not an actual annotation1 1 N Normal beat2 2 L Left bundle branch block beat3 3 R Right bundle branch block beat4 4 a Aberrated atrial premature beat5 5 V Premature ventricular contraction6 6 F Fusion of ventricular and normal beat7 7 J Nodal (junctional) premature beat8 8 A Atrial premature contraction9 9 S Premature or ectopic supraventricular beat10 10 E Ventricular escape beat11 11 j Nodal (junctional) escape beat12 12 / Paced beat13 13 Q Unclassifiable beat14 14 ~ Signal quality change16 16 | Isolated QRS-like artifact18 18 s ST change19 19 T T-wave change20 20 * Systole21 21 D Diastole22 22 " Comment annotation23 23 = Measurement annotation24 24 p P-wave peak25 25 B Left or right bundle branch block26 26 ^ Non-conducted pacer spike27 27 t T-wave peak28 28 + Rhythm change29 29 u U-wave peak30 30 ? Learning31 31 ! Ventricular flutter wave32 32 [ Start of ventricular flutter/fibrillation33 33 ] End of ventricular flutter/fibrillation34 34 e Atrial escape beat35 35 n Supraventricular escape beat36 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 beat39 39 ( Waveform onset40 40 ) Waveform end41 41 r R-on-T premature ventricular contraction

我们试着来读取一条标注:

# 读取第100条记录的annatation,前1000个点signal_annotation = wfdb.rdann("data/MIT-BIH/100
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值