将 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 复合波 的 注释 文件,那将是另一个问题。
编辑
base 和 gain 来自 info 文件(第二张图片)。 该文件为您提供有关 ECG 信号的各种信息。
在最后一句话中说:要将原始单位转换为上面显示的物理单位,请减去“base”并除以“gain”。
【讨论】:
您能否更彻底地解释您的“基础”和“增益”点。我在下面添加了我的答案,我在其中显示了您的方法与您不进行这些转换的方法之间的区别。 嗨@Masi,感谢您的关注,因为您要下载.mat
文件,还有另一个名为.info
的文件,其中指出:要从原始单位转换为上面显示的物理单位,减去'base'并除以'gain'`.
能否请您附上链接、引文和参考资料,其中他们准确地说明了 base 和 gain。通过 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=3
,rawUnits=4
然后再次使用模拟/数字单元,您需要移除基数和增益。
如果你使用rawUnits=1
或rawUnits=2
,你需要调整base = 1024
和gain = 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 文件,您可以在其中获取 base
和 gain
。还有一个单位mV
,表示在基本增益操作之后,值应该接近2
。
rawUnits=3,4 用于模拟单元
选择 ATM 后,您应该能够看到可以在导出后选择 .info 文件的列表,如 Kamtal 的回答中所述。 .info 文件指示在使用前从数据中删除所谓的 base 和 gain
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的主要内容,如果未能解决你的问题,请参考以下文章