热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本文的主要内容是详细介绍MIT-BIH心电数据集的读取,主要使用WFDB-python工具进行操作,能够读取心电信号数据到array中,读

本文的主要内容是详细介绍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.sampleplt.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工具库的。


推荐阅读
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • PHP-Casbin v3.20.0 已经发布,这是一个使用 PHP 语言开发的轻量级开源访问控制框架,支持多种访问控制模型,包括 ACL、RBAC 和 ABAC。新版本在性能上有了显著的提升。 ... [详细]
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • Visual Studio Code (VSCode) 是一款功能强大的源代码编辑器,支持多种编程语言,具备丰富的扩展生态。本文将详细介绍如何在 macOS 上安装、配置并使用 VSCode。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文探讨了利用Python实现高效语音识别技术的方法。通过使用先进的语音处理库和算法,本文详细介绍了如何构建一个准确且高效的语音识别系统。提供的代码示例和实验结果展示了该方法在实际应用中的优越性能。相关文件可从以下链接下载:链接:https://pan.baidu.com/s/1RWNVHuXMQleOrEi5vig_bQ,提取码:p57s。 ... [详细]
author-avatar
卢军好2602912493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有