MIT-BIH-AF 数据集开发库

news/2024/12/2 18:54:10/

目录

  • 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 pltplt.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.ppmy.cn/news/1174141.html

相关文章

css之Flex弹性布局(子项常见属性)

文章目录 🎀前言:本篇博客介绍弹性布局flex容器中子项的常见用法🪀flex:子项目占得份数 (划分不同子项的比例)🎇align-self 控制单独一个子项在侧轴的排列方式🧸order属性定义子项的排列顺序 &a…

How to install mongodb-7.0 as systemd service with podman

How to install mongodb-7.0 as systemd service with podman 1、安装1.1、创建卷1.2、配置文件1.3、创建容器1.4、服务管理1.5、容器管理 2、客户端管理 1、安装 1.1、创建卷 配置卷 podman volume create --label typemongo-7.0 --label envdev mongo-7.0-conf数据卷 pod…

CAS 机制

CAS 是 Java 中 Unsafe 类里面的方法,它的全称是 CompareAndSwap,比较并交换的意思。它的主要功能是能够保证在多线程环境下,对于共享变量的修改的原子性。 举个例子,比如说有这样一个场景,有一个成员变量 state&#…

Django学习笔记——文件上传(界面还怪好看得嘞)

定义文件上传函数 #文件上页面 def uploadFileIndex(request):return render(request, "uploadFile.html")#文件上传接口 def uploadFile(request):if request.method POST and request.FILES[file]:uploaded_file request.FILES[file]fs FileSystemStorage()# 选…

RHCSA常用命令总结

RHCSA回顾 1.Linux学习环境的安装部署 VMware虚拟机rhel9.x 磁盘容量:20GB cpu:1颗2核心 内存:2G 网卡:NAT 新CD/DVD设置镜像源文件 取消显示器的3d支持 (1)安装RHEL9 (2)组件:带有GUI的服务器 (3)分区…

hive针对带有特殊字符非法json数据解析

一、背景 有的时候前端或者后端进行埋点日志,会把json里面的数据再加上双引号,或者特殊字符,在落日志的时候,组装的格式就不是正常的json数据了,我们就需要将带有特殊字符的json数据解析成正常的json数据。 二、正则…

AD20~PCB的板层设计和布线

1、打开51单片机最小系统的工程文件。 2、完成原理图后续工作:打开原理图文件,双击元件“CH340X”窗口右边弹出元件内部属性设置界面,在窗口下方点击“Footprint ->Add…”按钮进入添加元件类型界面,进入元件封装选择界面&…

CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置

写一个很简单的 c 代码,打印一些“地址”, 也就是变量、函数的“存储位置”:当程序被加载到内存后,它们具体是存在哪里,可以用精确的数值来表示,这就是内存地址。 https://godbolt.org/z/Ghh9ThY5Y #inc…