将 MIT-BIH 心律失常心电图数据库加载到 MATLAB

     2023-03-12     161

关键词:

【中文标题】将 MIT-BIH 心律失常心电图数据库加载到 MATLAB【英文标题】:Load MIT-BIH Arrhythmia ECG database onto MATLAB 【发布时间】:2011-09-11 03:40:46 【问题描述】:

我正在使用涉及模式识别的神经网络进行心电图信号处理。 由于我需要从 Matlab 收集所有数据以将其用作测试信号,因此我发现很难将其加载到 Matlab 中。 我正在使用 MIT Arrhythmia 数据库here。

信号需要被索引并存储为 Matlab 兼容格式的数据结构。 目前信号为.atr.dat格式。

如何将 MIT-BIH 心律失常数据库加载到 Matlab 中?

【问题讨论】:

我删除了你的电子邮件地址。最好将此类信息放在您的个人资料页面中,而不是作为纯文本放在您的帖子中,即使 Gmail 垃圾邮件过滤做得很好。 我不知道您到底想在 ECG 信号上检测什么,但我认为 MIT-BIH 数据库的质量很差,我可能会建议您找一个不同的数据库。由于历史原因,这是某种学术标准,但如果您不需要将您的结果与以前的出版物进行比较,我会使用不同的。例如 PTB 是一个很好的(2 分钟 500 名不同患者的条带,12 导联心电图) @Polda 您如何描述 PTB 的质量?你能确认它是 AAMI 标准吗? MIT-BIH 是门诊环境中的 AAMI 标准。 【参考方案1】:

您可以使用 physionet ATM 获取更易于使用的 .mat 文件。

输入部分选择所需的导联、长度、数据库和样本。

工具箱中选择export as .mat:

然后下载“.mat”文件,

为了在 MATLAB 中打开文件,这里有一个示例代码:

load ('100m.mat')          % the signal will be loaded to "val" matrix
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,1:1000); % select the lead (Lead I)
Fs = 360;                  % sampling frequecy
t = (0:length(ECGsignal)-1)/Fs;  % time
plot(t,ECGsignal)

你会得到,

但是,如果您要阅读 心律失常QRS 复合波注释 文件,那将是另一个问题。

编辑

basegain 来自 info 文件(第二张图片)。 该文件为您提供有关 ECG 信号的各种信息。

在最后一句话中说:要将原始单位转换为上面显示的物理单位,请减去“base”并除以“gain”。

【讨论】:

您能否更彻底地解释您的“基础”和“增益”点。我在下面添加了我的答案,我在其中显示了您的方法与您不进行这些转换的方法之间的区别。 嗨@Masi,感谢您的关注,因为您要下载.mat 文件,还有另一个名为.info 的文件,其中指出:要从原始单位转换为上面显示的物理单位,减去'base'并除以'gain'`. 能否请您附上链接、引文和参考资料,其中他们准确地说明了 basegain。通过 ATM 工具,我无法提取任何信息文件。可能有他们已经贬低了这里的信息文件的情况。 我认为这是您回忆的来源physionet.org/physiotools/matlab/rddata.m 它在此代码中执行此基础并获得删除。我找不到这件事的任何其他来源。 @Masi,在我在帖子中的第二张图片上写着:下载这些文件: 有一个 .info 文件,请检查该文件.【参考方案2】:

您需要来自this website 的程序rddata.m(MATLab 脚本)。该程序可以找到here。 rddata.m 可能是您需要读取心电图信号的唯一程序。我记得不久前我自己使用过这个程序和数据库。

【讨论】:

【参考方案3】:

有一个使用matlab读取数据的教程。 tutorial for matlab user

    从上面的链接安装“用于 Matlab 的 WFDB 工具箱”。将工具箱的文件夹添加到matlab中的路径中。

    下载心电图信号。一定要一起下载'.atr', '.dat' and '.hea'来处理你要处理的信号。

    matlab 中的命令如下: [tm,signal,Fs]=rdsamp( filename , 1 ) ; [ann,type]=rdann( filename , 'atr' ) ; 注意:对于信号'101',它的名字是'101'。您可以从教程中查看有关 rdsamp 和 rdann 的详细信息。

【讨论】:

这里是关于如何在本地下载这些文件***.com/a/36706214/54964 所以在运行physionetdb("mitdb", 1); 之前使用physionetdb("mitdb", 1); 以减少网络负载并加速您的系统。我正在研究 dbpath,因为不同的树似乎有变化。我希望很多项目可以使用本地文件来加速系统。在这里,Ikaro 的树上的票github.com/ikarosilva/wfdb-app-toolbox/issues/117。【参考方案4】:

所以我在 3 个月前阅读了这个答案并删除了基础和增益。事实证明,我完全将我的 R 峰向各个方向移动,搞砸了我所有的结果。虽然我不确定在 matlab 中是否需要这样做,但如果您没有在 matlab 中预处理信号,请不要这样做。我在 python 中预处理我的信号,我所做的一切都是为了规范化它是

val = val/2047  % (2047 is the max volt range of signals)

并使用巴特沃斯滤波器去除伪影(范围 0.5hz-45hz)

更正

我选择的截止值是 0.5 到 45 而不是我之前报告的 5-15。此截止值保留了各种心律失常的 QRS,而不会增加太多噪音

# baseline correction and bandpass filter of signals 
lowpass = scipy.signal.butter(1, highfreq/(rate/2.0), 'low') 
highpass = scipy.signal.butter(1, lowfreq/(rate/2.0), 'high') 

# TODO: Could use an actual bandpass filter 
ecg_low = scipy.signal.filtfilt(*lowpass, x=ecg) 
ecg_band = scipy.signal.filtfilt(*highpass, x=ecg_low)

【讨论】:

您能否给出关于butterworth 的命令,以删除[0.5-45 Hz] 范围内的伪像`,拜托。我想研究它,因为实现在应用程序中有所不同。我不相信这里需要过滤。 如果您对信号进行 HRV 分析,是否应该使用归一化 val=val/2047;?我现在正在使用sig=(sig-1024)/200;,真的很担心这是错误的。您的val=val/2047 有意义,因为最大电压为 2^11 -1。我想了解拉希德为何声称另一件事。 我开了一张关于席尔瓦树上的东西的新票,因为我真的需要一个关于混乱的权威答案。 github.com/ikarosilva/wfdb-app-toolbox/issues/119 嗨,对不起,我今天才看到这个问题是,如果您在 HRV 分析中检测到 R 峰,您不想将其除以 200,因为这样每个节拍的 R 峰位置将是转移而不同步。我在 python 中使用了 scipy、signal 库作为 butterworth。我将在下一条评论中粘贴我的函数供您参考【参考方案5】:

随便用吧

A=input('Enter Variable: ','s');
load(A);
a=(val(1,:));
b=fir1(100,[0.1,0.25],'stop');
y2=filter(b,1,a);
figure;
plot(y2);

【讨论】:

在给出答案时,最好对WHY给出一些解释。【参考方案6】:

使用ATM 提取.mat,如Kamtal(现在称为Rashid)所述。 但是请注意,在某些情况下要查看 .info 文件,您需要单击箭头

在我将其推送给开发人员 here 后,我们在第 4 节中的文档 here 中得到了改进。

如果它们都是 [-2^N, 2^N-1 ] 或 [ 0, 2^N ] 范围内的整数,它们可能是数字的。比较这些值以查看它们是否在您正在分析的信号的预期生理范围内。例如,如果标题表明信号是以毫伏为单位存储的心电图,其幅度通常约为 2mV,则从 -32000 到 32000 的整数信号可能不会为您提供以毫伏为单位的物理心电图......

如果它们不是整数,那么它们是物理的。再次,您可以快速比较这些值,看看它们是否在您正在分析的信号的预期生理范围内。

0-9-10 wfdb - 物理单位

我们说信号是“物理单位”,当这些值用于尽可能接近地表示实际的现实生活值时,尽管显然计算机上的所有内容都是数字和离散的,而不是模拟和连续的。这包括我们宝贵的 64 位双精度浮点值,但这是我们所能得到的,并且已经非常接近实际的物理值,因此我们将它们称为“物理”。

-

例如,如果通过捕获设备收集 15 位信号,Physionet 可能会将其存储为 16 位信号。每个 16 位块存储一个介于 -2^15 和 2^15-1 之间的整数值,并使用每个通道的标头中规定的增益和偏移量,可以将原始物理信号映射出来进行处理。

默认单位现在是物理单位,应在每个通道的标题中添加基数和增益,以便可以映射出物理信号进行处理。

% rawUnits
%       A 1x1 integer (default: 0). Returns tm and signal as vectors
%       according to the following values:
%               rawUnits=0 - Uses Java Native Interface to directly fetch  data, returning signal in physical units with double precision.
%               rawUnits=1 -returns tm ( millisecond precision only! ) and signal in physical units with 64 bit (double) floating point precision
%               rawUnits=2 -returns tm ( millisecond precision only! ) and signal in physical units with 32 bit (single) floating point  precision
%               rawUnits=3 -returns both tm and signal as 16 bit integers (short). Use Fs to convert tm to seconds.
%               rawUnits=4 -returns both tm and signal as 64 bit integers (long). Use Fs to convert tm to seconds.

rawUnits=1, rawUnits=2 也使用物理单位。 rawUnits=3rawUnits=4 然后再次使用模拟/数字单元,您需要移除基数和增益。 如果你使用rawUnits=1rawUnits=2,你需要调整base = 1024gain = 200的基数和增益

# Kamtal's method in considering base and gain
load('201m.mat');
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,16:950); % select the lead (Lead I)

请参阅下面的 .info 文件,您可以在其中获取 basegain。还有一个单位mV,表示在基本增益操作之后,值应该接近2

rawUnits=3,4 用于模拟单元

选择 ATM 后,您应该能够看到可以在导出后选择 .info 文件的列表,如 Kamtal 的回答中所述。 .info 文件指示在使用前从数据中删除所谓的 basegain

Source: record mitdb/201  Start: [00:02:10.000]
val has 2 rows (signals) and 3600 columns (samples/signal)
Duration:     0:10
Sampling frequency: 360 Hz  Sampling interval: 0.002777777778 sec
Row     Signal  Gain    Base    Units
1       MLII    200     1024    mV
2       V1      200     1024    mV

To convert from raw units to the physical units shown
above, subtract 'base' and divide by 'gain'.

在这里比较错误的答案! [已弃用]

Kamtal(现在称为 Rashid)的答案是关于旧的 wfdb 系统,该系统使用数字单元而不去除基数和增益

# Kamtal's method in considering base and gain
load('201m.mat');
val = (val - 1024)/200;    % you have to remove "base" and "gain"
ECGsignal = val(1,16:950); % select the lead (Lead I)

# Method without considering base and gain
load('201m.mat');
ECGsignal2 = val(1,16:950); 

# http://www.mathworks.com/matlabcentral/fileexchange/10502-image-overlay
imshow(imoverlay(ECGsignal, ECGsignal2, uint8([255,0,0])))

你会明白我的方法和他的方法的区别

【讨论】:

华为哪个手环可以测心电图?

...术C华为手环3Pro高性能心率传感器,随时捕捉稍纵即逝的心律失常,但电子产品测试是没那么准确的。 参考技术D华为b2手环可以测心电图 查看详情

将数据从 plist 加载到另一个类

】将数据从plist加载到另一个类【英文标题】:loadingdatafromplisttoanotherclass【发布时间】:2012-12-1716:53:09【问题描述】:在我的应用中,plist文件被保存到文档目录中,每个文件名都是当前日期+时间。我正在将文档目录中的文件列... 查看详情

SSE 将整数加载到 __m128

】SSE将整数加载到__m128【英文标题】:SSEloadingintsinto__m128【发布时间】:2012-02-2420:30:13【问题描述】:gcc将4个ints加载到__m128并将8个整数加载到__m256(对齐/未对齐)的内在特性是什么?unsignedints呢?【问题讨论】:澄清:您正... 查看详情

SSE 将 unsigned char 加载到短

】SSE将unsignedchar加载到短【英文标题】:SSEloadunsignedchartoshort【发布时间】:2016-04-2701:25:56【问题描述】:有没有更好的方法使用SSE将unsignedchar数组加载到short?喜欢unsignedcharfoo1[16];__m128ifoo2=_mm_loadu_si128((__m128i*)foo1);我希望foo2将... 查看详情

将 mat 文件加载到 matlab 并稍后在 .m 文件中使用变量

】将mat文件加载到matlab并稍后在.m文件中使用变量【英文标题】:loadmatfilesintomatlabandusevariableslaterinthe.mfile【发布时间】:2012-12-0322:43:36【问题描述】:我只想将很多.mat文件(a1.mat,a2.mat.....)中的一些变量加载到.m文件中,并将... 查看详情

wpf实现心电图曲线绘制(代码片段)

...同的方式来实现的,只是两者曲线的数据有所区别。心电图的数据服务器端每秒发送至客户端一个数据包,一个数据包钟心电的数据大概一百个左右,看过心电图的应该知道,心电图的效果是匀速绘制出来的,... 查看详情

SIMD (AVX2) - 将 uint8_t 值加载到多个浮点 __m256 寄存器

】SIMD(AVX2)-将uint8_t值加载到多个浮点__m256寄存器【英文标题】:SIMD(AVX2)-loaduint8_tvaluestomultiplefloat__m256registers【发布时间】:2021-03-1909:46:35【问题描述】:我有来自uint8_t值的灰度图像。我想将数据加载到SIMD。我加载了16个值并将... 查看详情

如何将 16 字节的内存加载到 Rust __m128i 中?

】如何将16字节的内存加载到Rust__m128i中?【英文标题】:Howtoload16bytesofmemoryintoaRust__m128i?【发布时间】:2021-06-0819:34:22【问题描述】:我正在尝试从std::arch模块将16字节的内存加载到__m128i类型中:#[cfg(all(target_arch="x86_64",target_feat... 查看详情

静态心电设备的数据采集(aecg)

...2 静态心电介绍 2.1.12导联介绍图212导联的概念      心电图1 查看详情

静态心电设备的数据采集(aecg)

    这篇文章主要是针对,如何将静态心电设备接入到PACS系统的方法,作了点笔记。对没有入门的朋友会有帮助。本文有很多都是其他人的文档里边截取出来的,这里会吧这些链接放到文章最后,方便后续参考... 查看详情

使用最少的指令将 4 个单精度浮点数加载并复制到打包的 __m256 变量中

】使用最少的指令将4个单精度浮点数加载并复制到打包的__m256变量中【英文标题】:Loadandduplicate4singleprecisionfloatnumbersintoapacked__m256variablewithfewestinstructions【发布时间】:2021-06-1619:20:16【问题描述】:我有一个包含A、B、C、D4个... 查看详情

快速性心律失常消融手术的增强现实导航系统

摘要为了提高传统快速性心律失常消融手术成功率、缩短手术时间以及加强临床培训,设计一种新型的数据传输方案和三维跟踪方案,利用HoloLens2、MRTKAPI、ZeroMQ以及磁定位和Vuforia的混合跟踪技术,开发快速性心律失常消融手术... 查看详情

无法在表格视图中加载核心数据?

】无法在表格视图中加载核心数据?【英文标题】:Cannotloadcoredatainatableview?【发布时间】:2013-10-0514:47:02【问题描述】:我正在做一个卡拉OK项目。我想使用NSManagedObjectModel将我的数据加载到表视图中,但它不起作用首先,我将... 查看详情

正确使用 _mm256_maskload_ps 将少于 8 个浮点数加载到 __m256

】正确使用_mm256_maskload_ps将少于8个浮点数加载到__m256【英文标题】:Properuseof_mm256_maskload_psforloadinglessthan8floatsinto__m256【发布时间】:2021-08-2901:55:47【问题描述】:我无法确定需要使用_mm256_maskload_ps设置哪些位进行屏蔽。documentat... 查看详情

将数据加载到 redshift 数据库中

】将数据加载到redshift数据库中【英文标题】:Loadingdataintoredshftdatabase【发布时间】:2018-10-0804:01:51【问题描述】:我在amazons3的一个文件夹中有五个JSON文件。我正在尝试使用复制命令将所有五个文件从s3加载到redshift中。将一个... 查看详情

将 pytorch 数据加载器加载到 GPU 中

】将pytorch数据加载器加载到GPU中【英文标题】:loadpytorchdataloaderintoGPU【发布时间】:2021-03-2708:22:48【问题描述】:有没有办法将pytorchDataLoader(torch.utils.data.Dataloader)完全加载到我的GPU中?现在,我将每个批次分别加载到我的GPU中... 查看详情

通过消除重复将数据从文本文件加载到mysql数据库

】通过消除重复将数据从文本文件加载到mysql数据库【英文标题】:Loadingdatafromtextfiletomysqldatabasebyeliminatingduplicates【发布时间】:2011-12-1405:56:49【问题描述】:我想将数据从文本文件加载到数据库,如果数据已经存在,我需要在... 查看详情

将数据加载到 Hadoop

...发的材料和案例研究的一部分。第一个问题是:您的OLPT数据库中有用户配置文件记录,您希望将这些记录与您已经摄取到Hadoop文件系统中的Web日志一起加入。您将如何获 查看详情