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

MATLAB中WFDB库的安装与简单使用 MATLAB中WFDB库的安装与简单使用wfdb库的下载wfdb库的安装wfdb库的使用 wfdb库的下载 wfdb库的安装 wfdb库的使用 阅读详情
AI摘要

本文介绍如何使用WFDB-python工具读取MIT-BIH心电数据集,涵盖心电信号数据读取、注释解析及波形绘制,深入分析record和annotation数据结构。

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

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


0 安装WFDB

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

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

 pip install wfdb

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

import wfdb


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

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

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 读取annotation

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

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条记录的annotation,前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))

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

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")

# 读取annotations
signal_annotation = wfdb.rdann("data/MIT-BIH/100", "atr", sampfrom=0, sampto=1000)
# 将读取到的annotations的心拍绘制到心电图上
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 数据集详细分析

要详细了解每条记录的详细信息的话,直接在官网上有的,地址是:MIT-BIH Arrhythmia Database Directory

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


参考文献

[1] physioNet PhysioNet


附录

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

5分钟搞定MIT-BIH心电数据预处理:用Python和wfdb库快速提取ECG信号 本文详细介绍了如何使用Python和wfdb库快速处理MIT-BIH心电数据,完成从原始ECG信号读取、小波去噪到心拍分割的完整预处理流程。文章还探讨了如何利用PyTorch构建RNN等深度学习网络进行心拍分类,为构建心电信号智能识别系统提供了实战指南。 阅读详情

相关推荐

3种 MIT-BIH 数据集加载方案对比:PhysioNet ATM、WFDB 库与 Kaggle CSV

本文深度对比了MIT-BIH心律失常数据集的三种加载方案:PhysioNet ATM官方工具、WFDB Python库和Kaggle预处理CSV文件。针对医疗AI和心电分析领域,详细解析了各方案的优劣、适用场景及工程实践技巧,帮助开发者根据项目需求选择最优数据加载策略,提升工作效率。

weixin_33910460的博客 339

使用Python+TensorFlow2构建基于卷积神经网络(CNN)的ECG心电信号识别分类(二)

心律失常数据库 目前,国际上公认的标准数据库包含四个,分别为美国麻省理工学院提供的MIT-BIH(Massachusetts Institute of Technology-Beth Israel Hospital Database, MIT-BIH)数据库、美国心脏学会提供的AHA( American heart association,AHA)数据库、欧共体CSE( Common Standa...

qq_43750573的博客 1万+

用Python搞定PhysioNet ECG睡眠数据:从WFDB库读取到R点标注的完整实战教程

本文提供了一份完整的Python实战教程,教你如何使用WFDB库处理PhysioNet ECG睡眠数据,从数据读取到R点标注解析。涵盖环境配置、数据集选择、信号处理、标注质量验证及可视化分析,适合心电信号研究和睡眠分期分析的开发者与研究者。

weixin_30296405的博客 195

wfdb使用说明

rdrecord的使用: import matplotlib.pyplot as plt import wfdb record = wfdb.rdrecord('sample-data/a103l') plt.plot(record.p_signal[0: 500, 0]) plt.plot(record.p_signal[500: 1000, 1]) plt.plot(record.p_sig...

变化匿名的博客 1万+

从MIT-BIH心律失常数据库获取数据的Python方法

MIT-BIH心律失常数据库是一个广泛使用的心电图数据库,包含了来自不同患者的心电图记录,用于研究和分析心律失常。首先,我们需要安装wfdb库,它是一个用于读取MIT-BIH数据库的Python包。在上面的示例中,我们读取了名为"100"的心电图记录的第一个通道数据。除了心电图数据外,MIT-BIH数据库还提供了注释信息,用于标记心律失常事件的发生时间和类型。一旦数据库记录被下载和解压缩,我们可以使用wfdb库中的函数来读取心电图数据。一旦数据库记录被读取,我们可以使用matplotlib库来绘制心电图。

HackNebulaZ的博客 1349

ECG心电信号处理:使用WFDB读取MIT-BIH数据集

在心电信号处理领域,MIT-BIH数据集是一个广泛使用的标准数据集,它包含了来自不同心脏状况下的多个心电图记录。通过以上的代码示例,我们可以使用WFDB库轻松地读取MIT-BIH数据集中的心电图记录。首先,确保你已经下载了MIT-BIH数据集的文件,并将它们保存在本地的指定目录下。在函数中,我们指定了要读取的记录名称和数据集的路径。我们通过提供记录名称的列表来指定要读取的记录。在上面的代码中,我们首先设置了MIT-BIH数据集的路径。列表中,每个记录对应一个二维数组,其中包含了该记录的物理信号数据。

KxobDebugging的博客 1235

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

本文的主要内容是详细介绍MIT-BIH心电数据集的读取,主要使用WFDB-python工具进行操作,能够读取心电信号数据到array中,读取annatations以及使用matplotlib绘制相应的心电信号波形,并对record和annatation数据结构进行简单的分析。声明:本博客的内容来源于各大论文和互联网,其正确性有待考究。目的仅仅为了记录一下本人的学习过程,如果正好也能对你有一点帮助或...

weixin_39645041的博客 4706

wfdb.tar.gz_ecg:心电信号分析的Linux开箱即用工作台

心电信号(ECG)是高精度时序生理数据,其解析依赖符合PhysioNet标准的WFDB工具链;WFDB作为开源的POSIX兼容C库,提供rdsamp、sqrs等命令行工具,实现无损读取.dat/.hea/.atr文件、QRS波检测与标注解析;在Linux环境下原生支持mmap与管道化处理,性能远超Windows模拟层;wfdb.tar.gz_ecg封装预编译二进制、环境配置与ECG专用参数,默认禁用EEG/EMG模块,解决GCC版本冲突、依赖混乱与路径污染问题;适用于医疗设备合规验证、生物医学教学及国产Li

weixin_28721917的博客 335

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

本文的主要内容是详细介绍MIT-BIH心电数据集的读取,主要使用WFDB-python工具进行操作,能够读取心电信号数据到array中,读取annatations以及使用matplotlib绘制相应的心电信号波形,并对record和annatation数据结构进行简单的分析。安装WFDB github地址为https://github.com/MIT-LCP/wfdb-python可以直接下载zi...

weixin_39784460的博客 917

MIT-BIH心电数据库解析:Python读取与预处理实战

在生物医学信号处理中,心电图(ECG)分析是数字信号处理与机器学习的重要应用领域。而MIT-BIH心律失常数据库作为全球公认的基准数据集,承载了专家逐拍标注的心电波形与类型信息,是验证算法性能的标准测试平台。理解其头文件、二进制信号与注释文件的三件套结构,掌握基于Python的wfdb工具库进行数据解析、滤波与R峰提取,不仅是复现论文的基础,更是工业级可穿戴心率监测、心律失常分类等工程落地的前提。从数据格式原理到一套可复用的预处理流程,本文面向信号处理初学者和算法工程师,提供一套围绕MIT-BIH的完整实操

weixin_29056145的博客 293

WFDB源码编译与心电信号解析实战指南

WFDB(Waveform Database)是MIT开发的生理信号处理核心C库,专为高精度、临床级心电(ECG)数据读取与分析设计。其原理基于头文件(.hea)驱动的元数据-信号耦合机制,通过采样率、增益、基线等参数实现ADC值到电压的无损标定。技术价值在于提供经30年AHA/ACC验证的命令行工具链(如rdsamp、xqrs)和可嵌入的动态库接口,支撑从科研分析到嵌入式医疗设备的全场景需求。典型应用场景包括MIT-BIH数据库解析、Holter高采样率数据处理、Linux下实时QRS检测及Python/

weixin_29611239的博客 267

cocos creator本地储存数据_ECG心电信号处理:使用WFDB对MIT-BIH数据集进行读取(Python)...

本文的主要内容是详细介绍MIT-BIH心电数据集的读取,主要使用WFDB-python工具进行操作,能够读取心电信号数据到array中,读取annatations以及使用matplotlib绘制相应的心电信号波形,并对record和annatation数据结构进行简单的分析。安装WFDB github地址为https://github.com/MIT-LCP/wfdb-python可以直接下载zi...

weixin_33217004的博客 640

wfdb-python:原生Python WFDB软件包

wfdb-python 介绍 原生Python波形数据库(WFDB)软件包。 一个用于读取,写入和处理WFDB信号和注释的工具库。 该软件包的核心组件基于原始WFDB规范。 此程序包不包含与原始WFDB程序包完全相同的功能。 它旨在通过用户友好的API来实现其尽可能多的核心功能。 随着时间的推移,还会添加其他有用的生理信号处理工具。 文档和用法 有关公共API,请参见。 有关更多示例用例,请参见笔记本文件。 安装 该发行版托管在pypi上,为: ://pypi.python.org/pypi/wfdb/。 要直接从pypi安装软件包而不需要显式下载内容,请从终端运行: $ pip install wfdb 开发版本托管在: : 。 该存储库还包含演示脚本和示例数据。 要安装开发版本,请克隆或下载存储库,导航至基本目录,然后运行: $ pip install . 发展 开发资料

python MIT-BIH 数据集心拍分类 从R点提取到19类R点心拍分类到AAMI标准5分类的数据集打包实现 良心详解版 全网唯一

python MIT-BIH 心拍分类实现 前言 这可能是我自认为写的最难的一篇文章,对于所有做心电信号分类的同学来说这都是一大关一下所有的代码都是自己手敲的,这整个过程很复杂,按照我一贯的思路,我会写的很详细一是日后方便复习,二是自己看论文也好看文章也罢,好多都是囫囵半片,看了跟没看似的,所以自己一定要写的很详细,一是自己对理论的一种梳理和理解,二是给相关的研究者提供清晰的思路,三是希望能给学弟学妹们做个榜样接下来进入正题 一.本文的主要内容和研究思路 首先不管对于机器学习还是深度学习,不管你最后要做的是

一个学长的博客 1万+

Star CCM+中的物性参数(定值、多项式、查表)

仿真过程中我们一定会遇到设置物性参数的问题,对于固定的物性参数还好说,直接输入一个固定的值即可。但是对于冷却液、气体、两相流等,物性参数是随着温度或温度和压力变化的。此时就涉及到多项式和查表。首先创建物理连续体,选择计算模型。

2201_75375391的博客 2958

【Windows】 解决联想为主的所有自带摄像头(integrate camera)打不开的毛病(特别点名小新、thinkbook、thinkpad、y7000...)

解决联想系列电脑打不开自带摄像头的问题

Iamruzi的csdn博客 3万+

Python中的WFDB库使用

Python中的WFDB库使用Demo1:使用'rdsamp'函数读取数据并画图 读取的库的内容主要是MITDB和NSTDB(噪音压力测试库) Physionet ATM:https://physionet.org/cgi-bin/atm/ATM Demo1:使用’rdsamp’函数读取数据并画图 import wfdb import matplotlib.pyplot as plt signa...

weixin_44191286的博客 2万+

C++利用spdlog生成日志

C++利用spdlog生成日志下载编译spdlog配置并使用 环境:Win10-x64+VS2015 spdlog是一个快速的C++日志库,能够兼容C++11,具备快速、无需依赖第三方库、支持多线程、多平台的优良特性! 下载编译spdlog 1.第一步,下载spdlog 下载spdlog,下载地址:https://github.com/gabime/spdlog#header-only-version,从Github上下载zip压缩包。下载完成后会获取一个名为spdlog-1.x.zip的压缩包 2.第二步

weixin_42975610的博客 3222

【ECG信号的储存及读取方式详解】数据集MIT-BIH,212格式存储

MIT-BIH公开数据集下载地址如下: MIT-BIH Arrhythmia Database v1.0.0 (physionet.org)https://www.physionet.org/content/mitdb/1.0.0/可以知道,心电数据的储存通常通过三个类型的文件,

qq_32793161的博客 5694

基于STM32控制直流电机加减速正反转仿真设计

*单片机设计介绍,基于STM32控制直流电机加减速正反转仿真设计。

2201_75940997的博客 1603

ESXI 8.0虚拟机安装OpenWRT软路由详细教程

OpenWrt 是嵌入式的 Linux 路由器固件,OpenWrt在稳定运行的同时提供了强大的扩展能力,用户可以完全的定制属于自己的路由系统,满足不一样的个性化需求,本文讲解如何使用ESXI安装OpenWRT,打造属于自己的软路由。本次安装使用的是版本。默认登录信息:用户:root密码:password下载固件:https://github.com/haiibo/OpenWrt/releases/tag/X86_64【CPU配置】:4核心。

qq_27121281的博客 3915

wfdb-python与MIT-BIH数据库:下载、解析与应用指南

**wfdb-python** 是一个强大的Python工具包,专门用于处理生理信号数据,特别是**MIT-BIH数据库**中的心电图记录。本文将为您详细介绍如何使用这个工具包下载、解析和应用这些宝贵的医疗数据资源。 ## 📊 什么是wfdb-python? wfdb-python是一个原生的Python波形数据库包,它实现了WFDB(Waveform Database)标准的完整功能。WF

gitblog_00799的博客 514

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2085

使用VS2022WFDB读取ECG信号(Python)

使用wfdb库读取ecg信号的utf-8报错解决方法

qq_67328524的博客 814

【AIZ智能体】Codex 全能AI助手从部署到使用实战操作详解

Codex 全能AI助手从部署到使用实战操作详解

congge 2987

SAP 生产订单工序删除状态撤回简介

2、我们在前台对于生产订单的状态一个是在生产订单抬头中的状态,另外一个是针对上面一直在测试的是工序的状态,这个两个状态是前台可见的状态,实际生产订单还有一个组件物料的状态,这个状态是不可见的一个状态。生产订单中的0010工序中对应的组件的栏位被标识,表示有物料分配到了0010的工序中,正常情况下0010的工序被分配了工序是不应该被删除的。将已领料的工序删除掉,导致异常的发生。当物料已领料会,用户仍然把已分配的物料的工序删除掉,导致后续业务操作过程中产生异常,如下图中所示,0010的工序被打上了删除标识。

我小时候很黑的博客 1943
上一篇: ECG心电信号处理:初识ECG
下一篇: RS法计算Hurst指数
juicetech
博客等级 码龄8年 66粉丝 5原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值