MIT-BIH-AF 数据集开发库

news2024/11/18 15:25:11

目录

  • 1 介绍数据集
  • 2 本博客函数库代码地址以及介绍
    • 读取dat,qrc,atr文件,获得 ECG_rpeaks,ann_aux_note,ann_sample,ECG0
    • 寻找时间点函数----signal_time_sample
    • 寻找R_R峰信号以及其位置----find_R_R_peak
    • 寻找 nR 峰信号以及位置----find_nR_peak
    • 找到指定范围内的所有 nR 峰----find_nR_peaks
    • 为信号建立伴随标注信号----AFDB_create_mate_ann
    • 重采样信号长度----resample_signal_length
    • 利用小波变换去噪滤波----wavelet_denoise
    • 利用小波变换去趋势----wavelet_detrend

1 介绍数据集

MIT-BIH-AF 是一个心电图信号房颤数据集。本篇博客介绍针对该数据集开发的快捷使用的自开发函数。基础了解是MIT-BIH-AF 数据集采集有 23 人的两导联数据。总长十个小时。单个病人约920万个数据点长度。

数据集下载地址:https://www.physionet.org/content/afdb/1.0.0/
数据集可视化地址:https://www.physionet.org/lightwave/?db=afdb/1.0.0

信号例子如图:

2 本博客函数库代码地址以及介绍

如下介绍的库函数功能,都是平时用得最为频繁的基础功能,为了避免重复编写代码因此自己编写成库。
使用代码import MIT_BIH_AF_function as MIT_BIH_AF将本文件夹代码库加载。
库地址:https://github.com/liuqi34584/ECG_processing/tree/main/MIT_BIH_AF

读取dat,qrc,atr文件,获得 ECG_rpeaks,ann_aux_note,ann_sample,ECG0

使用数据集主要通过读取文件,其中dat后缀是记录心电实际信号的文件,atr后缀是心电实际信号对应的标注文件,qrs后缀是心电实际信号的每个R峰的标注文件。数据集所有的信息都在这三大文件中。

import wfdb

# 设置患者04015的路径
mit_bih_af_path = 'C:/mycode/dataset/mit-bih-atrial-fibrillation-database-1.0.0/files/04015'

# 读取患者文件
record = wfdb.rdrecord(mit_bih_af_path, physical=True)
signal_annotation = wfdb.rdann(mit_bih_af_path, "atr")
r_peak_annotation = wfdb.rdann(mit_bih_af_path, "qrs")

# 获取关键信息
ECG_rpeaks = r_peak_annotation.sample
ann_aux_note = signal_annotation.aux_note
ann_sample = signal_annotation.sample
ECG0 = record.p_signal[:, 0]

# 展示信号
import matplotlib.pyplot as plt
plt.plot(ECG0[0:2000])  # 打印输出 ECG0 信号0-2000的值
plt.show()

寻找时间点函数----signal_time_sample

本函数用于在代码中找到我们看到的感兴趣段落的位置。 如可视化界面我们的时间点为 “00:06:50.316”。

import MIT_BIH_AF_function as MIT_BIH_AF 

# 输入时间点,获取该处时间点的索引值
index = MIT_BIH_AF.signal_time_sample("00:06:50.316","10:13:43",len(ECG0))

# 展示该索引值左右500的信号
import matplotlib.pyplot as plt
plt.plot(ECG0[index-500:index+500])  # 打印输出 ECG0 信号
plt.show()
原采样点采样出的时间范围

寻找R_R峰信号以及其位置----find_R_R_peak

日常使用时经常遇到提取单个R峰的情况,本函数具备此功能。

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取该处时间点的索引值
index = MIT_BIH_AF.signal_time_sample("00:06:48.817","10:13:43",len(ECG0))

# 根据索引值找到 R 峰信号,起点s, 终点e
signal, s, e = MIT_BIH_AF.find_R_R_peak(index, ECG0, ECG_rpeaks)

# 展示信号
import matplotlib.pyplot as plt
plt.plot(signal)  # 打印输出 signal 信号
plt.show()
原采样点采样出的R峰

寻找 nR 峰信号以及位置----find_nR_peak

平时使用时,我们除了需要寻找一个 R 峰。我们还需要寻找 2,3,4,5,6,7…等n个连续R峰信号范围以及其信号位置。此函数可以完成此功能。

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 一个时间点的索引值
index = MIT_BIH_AF.signal_time_sample("00:07:54.819","10:13:43",len(ECG0))

# 根据索引值找到 9R 峰信号
signal, s, e = MIT_BIH_AF.find_nR_peak(9, index, ECG0, ECG_rpeaks)

采集出 1R 峰采集出 2R 峰采集出 3R 峰采集出 9R 峰

找到指定范围内的所有 nR 峰----find_nR_peaks

我们除了上面的要提取单独 nR 峰。很多情况下,我们还要在一段心电信号中提取出该段落的所有单个 nR 峰信号。下面代码展示了寻找一段信号中的所有 3R 峰的过程。

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 起点时间点的索引值
start_index = MIT_BIH_AF.signal_time_sample("00:06:48.067","10:13:43",len(ECG0))

# 获取 终点时间点的索引值
end_index = MIT_BIH_AF.signal_time_sample("00:06:51.764","10:13:43",len(ECG0))

# 根据索引值查找 3R 峰
r_peaks_position = MIT_BIH_AF.find_nR_peaks(3, start_index, end_index, ECG0, ECG_rpeaks)

for i in r_peaks_position: 
    r_signal = ECG0[i[0]:i[1]]
    
    # 展示信号
    import matplotlib.pyplot as plt
    plt.plot(r_signal)
    plt.show()

第 1 个 3R 峰第 2 个 3R 峰第 3 个 3R 峰第 4 个 3R 峰

为信号建立伴随标注信号----AFDB_create_mate_ann

建立伴随标注信号在代码中存在很大的好处。使得波形提取对应的标注更加方便。避免麻烦的原信号标注类型寻找。如图下面的波形可视化原信号,根据atr文件的标注可以看到,患者发生了一秒左右的房颤。但数据集并不是对每一个点进行标注,伴随标注信号应运而生。

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 一个起点时间点的索引值
start_index = MIT_BIH_AF.signal_time_sample("00:08:04.772","10:13:43",len(ECG0))

# 获取 一个终点时间点的索引值
end_index = MIT_BIH_AF.signal_time_sample("00:08:11.672","10:13:43",len(ECG0))

# 建立原信号的伴随标注信号
ECG_ann = MIT_BIH_AF.AFDB_create_mate_ann(len(ECG0), ann_sample, ann_aux_note)

# 展示波形
import matplotlib.pyplot as plt
plt.subplot(2,1,1)
plt.plot(ECG0[start_index:end_index])  # 展示原信号
plt.subplot(2,1,2)
plt.plot(ECG_ann[start_index:end_index])  # 展示标注波形
plt.show()

原图像:

标注图像:

重采样信号长度----resample_signal_length

在我们提取信号之后,最终将信号送入模型训练。但多数情况下,模型信号输入长度有要求。而我们采集的信号可能不是固定长度的,于是开发了本函数将一段信号重采样到指定的长度。注意本函数是基于 scipy 库实现的,如果出现缺少 scipy 库缺失相关的报错,请使用 pip install scipy

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 一个起点时间点的索引值
start_index = MIT_BIH_AF.signal_time_sample("00:08:04.772","10:13:43",len(ECG0))

# 寻找一段 R 峰信号
signal, s, e = MIT_BIH_AF.find_R_R_peak(start_index, ECG0, ECG_rpeaks)

# 将信号长度重采样到500
resample_signal = MIT_BIH_AF.resample_signal_length(signal, 500)

运行结果如图,原信号长度 200(蓝色),重采样到了 500 长度(橙色)

利用小波变换去噪滤波----wavelet_denoise

有的时候需要对信号进行去噪。这里简单封装了一个小波去噪的方法,使用的是 小波pyhon库。因此使用时要注意安装软件 pip install PyWavelets

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 一个起点时间点的索引值
start_index = MIT_BIH_AF.signal_time_sample("00:08:04.772","10:13:43",len(ECG0))

# 寻找一段 R 峰信号
signal, s, e = MIT_BIH_AF.find_R_R_peak(start_index, ECG0, ECG_rpeaks)

# 对一段信号进行小波去噪
denoise_signal = MIT_BIH_AF.wavelet_denoise(signal)
原信号去噪之后的信号

利用小波变换去趋势----wavelet_detrend

去趋势也叫 ”基线偏移“,”基线漂移“,描述的都是同一个现象,即原波形被一种频率更低的波形干扰,而产生整体波形的移动。本函数封装了一个小波去趋势的方法,使用的是 小波pyhon库。因此使用时要注意安装软件 pip install PyWavelets

import MIT_BIH_AF_function as MIT_BIH_AF

# 获取 一个时间点的索引值
index = MIT_BIH_AF.signal_time_sample("00:06:48.772","10:13:43",len(ECG0))

# 获取一段信号,该时间点左右 800 范围
signal = ECG0[index-800:index+800]

# 将信号进行去趋势处理
detrend_signal = MIT_BIH_AF.wavelet_detrend(signal)
原信号去趋势处理的信号

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot实现邮箱发送(激活码)功能

第一步&#xff1a;现在邮箱里面开启smtp服务 这里用163邮箱举例&#xff0c;配置一下授权密码&#xff0c;这个要提前记住 第二步&#xff1a;引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/P…

大语言模型(LLM)综述(三):大语言模型预训练的进展

A Survey of Large Language Models 前言4. PRE-TRAINING4.1数据收集4.1.1 数据源4.1.2 数据预处理4.1.3 预训练数据对LLM的影响 4.2 模型架构4.2.1 典型架构4.2.2 详细配置 前言 随着人工智能和机器学习领域的迅速发展&#xff0c;语言模型已经从简单的词袋模型&#xff08;B…

Banana Pi 开源社区发布BPI-M6开源硬件开发板,支持6.75TOPs算力

香蕉派BPI-M6 采用深蕾半导体Vs680芯片设计&#xff0c;板载4G LPDDR4和16G eMMC存储 香蕉派BPI-M6是香蕉派社区在2022年推出的新一代单板计算机&#xff0c;它采用深蕾半导体(Synaptics) VS680四核Cortex-A73 (2.1GHz)和一个Cortex-M3处理器&#xff0c;Imagination GE9920 G…

【C++面向对象】6. 指向类的指针

文章目录 【 1. 基本原理 】【 2. 实例 】 【 1. 基本原理 】 一个指向 C 类的指针与指向结构体的指针类似&#xff0c;访问指向类的指针的成员&#xff0c;需要使用 成员访问运算符 ->&#xff0c;就像访问指向结构的指针一样。 【 2. 实例 】 // 使用指向类的指针&…

2.8.C++项目:网络版五子棋对战之对战玩家匹配管理模块的设计

文章目录 一、意义二、功能三、设计四、阻塞队列&#xff08;一&#xff09;功能&#xff08;二&#xff09;框架&#xff08;三&#xff09;代码 五、匹配管理&#xff08;一&#xff09;功能&#xff08;二&#xff09;设计&#xff08;三&#xff09;框架&#xff08;四&…

GoLand设置Go Modules的Environment信息

在golang中&#xff0c;如果没有设置环境信息&#xff0c;就不会自动下载go.mod中设置的包&#xff0c;这时候&#xff0c;我们就需要设置一下环境信息 GOPROXYhttps://goproxy.cn,direct 图片如下&#xff1a;

【机器学习】集成学习Boosting

文章目录 集成学习BoostingAdaBoost梯度提升树GBDTXGBoostxgboost库sklearn APIxgboost库xgboost应用 集成学习 集成学习&#xff08;ensemble learning&#xff09;的算法主要包括三大类&#xff1a;装袋法&#xff08;Bagging&#xff09;&#xff0c;提升法&#xff08;Boo…

Python基础入门例程10-NP10 牛牛最好的朋友们

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 解答&#xff1a; 说明&#xff1a; 描述 牛牛有两个最好的朋友&#xff0c;他们的名字分别用input读入记录在两个字符串中&#xff0c;请使用字符串连接&#xff08;&#xff09;帮助牛牛将两个朋友的名字依…

大灰狼远程管理[SVIP3会员版]易语言源码

大灰狼远程管理[SVIP3会员版]易语言源码 下载地址&#xff1a;https://user.qzone.qq.com/512526231/main https://user.qzone.qq.com/3503787372/main

实验六:DHCP、DNS、Apache、FTP服务器的安装和配置

1. (其它) 掌握Linux下DHCP、DNS、Apache、FTP服务器的安装和配置&#xff0c;在Linux服务器上部署JavaWeb应用 完成单元八的实训内容。 1、安装 JDK 2、安装 MySQL 3、部署JavaWeb应用 安装jdk 教程连接&#xff1a;linux安装jdk8详细步骤-CSDN博客 Jdk来源&#xff1a;linu…

自动驾驶之—2D到3D升维

前言&#xff1a; 最近在学习自动驾驶方向的东西&#xff0c;简单整理一些学习笔记&#xff0c;学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用&#xff1a;对于2DCNN&#xff0c;我们知道可以很好的处理单张图片中的信息&#xff0c;但是其对于视频这种由多帧图像组成的图…

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测(SE注意力机制)

分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09; 目录 分类预测 | MATLAB实现SSA-CNN-GRU-Attention数据分类预测&#xff08;SE注意力机制&#xff09;分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现…

【软考系统架构设计师】2021年系统架构师综合知识真题及解析

本文主要分享2021年下半年系统架构师综合知识历年真题以及本人在做题时的所思所想。题目序号有点混乱&#xff0c;可忽略 【01】.某计算机系统页面大小为4K&#xff0c;进程P1的页面变换表如下图所示&#xff0c;看P1要访问数据的逻辑地址为十六进制1B1AH,那么该逻辑地址经过变…

2023CPSE安博会倒计时1天!英码科技参展5大亮点抢先看~

第十九届中国国际社会公共安全博览会 暨全球数字城市产业博览会 距离开幕仅剩1天 英码科技将精彩亮相1号馆 展位号为&#xff1a;1A06 展会期间重点展示 创新性的国产AI智能硬件 AI技术服务以及热门的行业解决方案 2023CPSE安博会基本信息 展会时间&#xff1a;10月25-27日&am…

深度学习第四课

第九章 卷积神经网络解读 9.1 计算机视觉 目标分类 目标识别 64x64x312288 1000x1000x33000000 使用传统神经网络处理机器视觉面临的一个挑战是&#xff1a;数据的输入会非常大 一般的神经网络很难处理海量图像数据。解决这一问题的方法就是卷积神经网络 9.2 卷积运算 …

分代ZGC详解

ZGC&#xff08;Z Garbage Collector&#xff09;是Java平台上的一种垃圾收集器&#xff0c;它是由Oracle开发的&#xff0c;旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器&#xff0c;它主要针对具有大内存需求和低停顿时间要求的应用程序 分代ZGC收集器…

Vue的MVVM实现原理

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 MVVM是Model-View-ViewModel的缩写&#xff0c;是一种软件架构设计模式。Vue.js实现了这种设计模式&#xff0c;通过双向数据绑定和虚拟DOM技术&#xff0c;使得数据和视图能够快速响应彼此的变化。了解Vue的…

标准库STM32F1_USART2_DMA接收发送数据源码分享直接复制能用

标准库STM32F1_USART2_DMA接收发送数据源码分享直接复制能用 STM32的DMA通道表&#xff1a; 现有一个小需求&#xff0c;使用STM32F1系列单片机做串口2的收发数据的功能&#xff0c;通过PC上的串口调试助手给单片机发一串数据&#xff0c;单片机收到数据后再给PC的串口调试助手…

selenium安装和python中基本使用

selenium安装和python中基本使用 背景下载和安装浏览器驱动115.xx版本之前驱动下载115.xx及之后的高版本驱动 配置浏览器驱动安装selenium使用selenium点击按钮搜索内容 背景 selenium 出现的初衷就是一个自动化测试工具&#xff0c;她可以打开浏览器&#xff0c;然后像用户一…

软件测试进阶篇----自动化测试脚本开发

自动化测试脚本开发 一、自动化测试用例开发 1、用例设计需要注意的点 2、设计一条测试用例 二、脚本开发过程中的技术 1、线性脚本开发 2、模块化脚本开发&#xff08;封装线性代码到方法或者类中。在需要的地方进行调用&#xff09; 3、关键字驱动开发&#xff1a;selen…