ECG心电信号处理:使用WFDB对MIT

您所在的位置:网站首页 怎么画心电图的教程 ECG心电信号处理:使用WFDB对MIT

ECG心电信号处理:使用WFDB对MIT

2024-07-03 17:53:40| 来源: 网络整理| 查看: 265

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

声明:本博客的内容来源于各大论文和互联网,其正确性有待考究。目的仅仅为了记录一下本人的学习过程,如果正好也能对你有一点帮助或者发现文中的错误所在,非常欢迎留言交流呀。 

0 安装WFDB

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

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

 pip install wfdb

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

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

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

1 读取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 wfdb import matplotlib.pyplot as plt # 读取本地的100号记录,从0到25000,通道0 record = 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()

效果如下所示:

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

2 读取annatation

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

wfdb.show_ann_labels()

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

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

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

# 读取第100条记录的annatation,前1000个点 signal_annotation = wfdb.rdann("data/MIT-BIH/100", "atr", sampfrom=0, sampto=1000) # 打印标注信息 print("chan: " + str(signal_annotation.chan)) print("sample: " + str(signal_annotation.sample)) print("symbol: " + str(signal_annotation.symbol)) print("aux_note: " + str(signal_annotation.aux_note))

将annatation常用的一些属性打印出来,其中:

chan:是chanel的意思,保存的是当前标注的是哪一个通道,为一个ndarray或者是list

sample:这里记录的是每个心拍中R波的位置信息,为一个ndarray或者是list

symbol:记录的是每个心拍的标注信息,记录的是每个心拍的类型,是一个字符型的ndarray或者是list,其内容为wfdb.show_ann_labels()的symbol类型;

aux_note:记录的是心率变换点的标注类型,是辅助信息,其内容为:

(来自官网)

下面我们来详细的看一看rdann()函数,其申明为:

def rdann(record_name, extension, sampfrom=0, sampto=None, shift_samps=False, pb_dir=None, return_label_elements=['symbol'], summarize_labels=False): ... ... """ 使用示例: -------- >>> ann = wfdb.rdann('sample-data/100', 'atr', sampto=300000) """

对于其中重要一点的参数:

record_name:标注文件的地址,比如说文件是“100.atr”,则该参数为record_name=“100”;

extension:标注文件的格式类型

然后其余参数可以参看rdrecord函数中的相关参数即可。

下面简单的将心拍绘制到心电图上:

import wfdb import matplotlib.pyplot as plt # 读取本地的100号记录,从0到25000,通道0 record = 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") # 读取annatations signal_annotation = wfdb.rdann("data/MIT-BIH/100", "atr", sampfrom=0, sampto=1000) # 将读取到的annatations的心拍绘制到心电图上 for index in signal_annotation.sample plt.scatter(index, ventricular_signal[0][index], marker="*") plt.show()

当然绘制波形也可以使用wfdb的库函数,可以使用wfdb.plot_wfdb()函数即可,其申明如下:

def plot_wfdb(record=None, annotation=None, plot_sym=False, time_units='samples', title=None, sig_style=[''], ann_style=['r*'], ecg_grids=[], figsize=None, return_fig=False):

详细使用请直接参看源码中的注释即可。

3 数据集详细分析

要详细了解每条记录的详细信息的话,直接在官网上有的,地址是:https://www.physionet.org/physiobank/database/html/mitdbdir/mitdbdir.htm

里面详细的记录了每条记录主要心率类型,以及每条记录中各种类型心率的时长,使用的导联等,一般想要的数据集的信息都可以中在这里面找到。

参考文献

[1] physioNet https://www.physionet.org/

附录

在使用physionet时,导航菜单在左上角,其中主要用到的是Physiobank和PhysioToolkit两项,前一项包含数据库等,后一项是关于WFDB工具库的。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭