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

Posted

技术标签:

【中文标题】将 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])))

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

【讨论】:

以上是关于将 MIT-BIH 心律失常心电图数据库加载到 MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

基于Python的心电信号检测与处理

移位时间序列从零开始H:M:S:MS(可能在Matlab中)

毕设题目:Matlab心电信号

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

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

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