将MIT-BIH心律失常ECG数据库加载到MATLAB中。

15

我正在使用神经网络进行心电图信号处理,其中包括模式识别。由于我需要从Matlab中收集所有数据以用作测试信号,因此我发现将其加载到Matlab上很困难。 我在这里使用MIT心律失常数据库(链接)

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

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


我已经删除了你的电子邮件地址。最好将这样的信息放在您的个人资料页面中,而不是作为纯文本发布,即使 Gmail 垃圾邮件过滤做得很好。 - chl
2
我不知道您想要在心电图信号上检测什么,但在我看来MIT-BIH数据库质量较差,我建议您寻找另一个数据库。出于历史原因,它是某种学术标准,但如果您不需要将结果与之前的出版物进行比较,我会使用另一个数据库。例如,PTB是一个好选择(500个不同患者的2分钟条带,12导联心电图)。 - Biggles
@Polda 你如何描述PTB的质量?你能确认它符合AAMI标准吗?在门诊设置中,MIT-BIH是符合AAMI标准的。 - Léo Léopold Hertz 준영
6个回答

6
你可以使用PhysioNet ATM获取更易于处理的.mat文件。
在“input”部分中选择所需的导联、长度、数据库和样本。
在“toolbox”中选择“导出为.mat”:

enter image description here

然后下载'.mat'文件,

enter image description here

为了在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)

你将得到,

enter image description here

然而,如果您要阅读关于心律失常或QRS复合物的注释文件,那就是另一个问题。

编辑

基线和增益来自信息文件(第二张图片)。该文件提供有关ECG信号的各种信息。

enter image description here

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

你能否更详细地解释一下你所说的“基准点”和“增益点”。我在下面添加了我的答案,其中我展示了你和不进行这些转换的方法之间的区别。 - Léo Léopold Hertz 준영
嗨 @Masi,谢谢你的关注。你想要下载 .mat 文件,还有另一个名为 .info 的文件,其中指示着:_要将原始单位转换为上述物理单位,请减去 'base' 并除以 'gain'_。 - Rashid
请问您能否包含关于“基数”和“增益”的链接、引用和参考资料?通过ATM工具,我无法提取任何信息文件。可能有一种情况是他们已经在这里废弃了信息文件。 - Léo Léopold Hertz 준영
我认为这是你所回忆的源代码:http://www.physionet.org/physiotools/matlab/rddata.m。它在这段代码中执行基础和增益去除操作。我找不到任何其他关于此事的信息来源。 - Léo Léopold Hertz 준영
@Masi,在我发布的第二张照片上面写着:“下载这些文件:”其中有一个“.info”文件,请检查一下那个文件。 - Rashid
请查看AmidJuneja在下面的回答。也许您不需要删除基础和增益。他的论点很有说服力。Silva的树是工具箱中较新的一个。我在这里关于混淆问题开了一张票 https://github.com/ikarosilva/wfdb-app-toolbox/issues/119 - Léo Léopold Hertz 준영

4
您需要从此网站下载MATLab脚本rddata.m。您可以在这里找到该程序。 rddata.m可能是您读取心电图信号所需的唯一程序。我记得不久前我自己也曾使用过这个程序和数据库。

2

我三个月前读了这篇答案并删除了基础和增益。结果,我完全将我的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]范围内的伪影提供指导?我想研究一下,因为在应用中实现方式有所不同。我不确定这里是否需要进行滤波处理。 - Léo Léopold Hertz 준영
如果您正在对信号进行HRV分析,应该使用归一化val=val/2047;吗?我现在使用的是sig=(sig-1024)/200;,但非常担心这样做是错误的。您的 val=val/2047 是有道理的,因为最大电压是2 ^ 11 -1。我想了解为什么Rashid声称另一件事情。 - Léo Léopold Hertz 준영
我在Silva的树问题上开了一个新的工单,因为我真的需要一个权威的答案来解决这个困惑。https://github.com/ikarosilva/wfdb-app-toolbox/issues/119 - Léo Léopold Hertz 준영
抱歉,我今天才看到这个消息。问题在于,如果你正在进行HRV分析并检测R峰,那么你不想将其除以200,因为这样每个心跳的R峰位置都会发生偏移而无法同步。我在Python中使用了scipy、signal库中的butterworth函数。我将我的函数粘贴在下一个评论中供你参考。 - Amit Juneja

2

有一份使用matlab读取数据的教程。 matlab用户教程

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

  2. 下载ECG信号。确保同时下载'.atr'、'.dat'和'.hea'这三个文件,以便处理所需信号。

  3. 在matlab中输入以下命令: [tm,signal,Fs]=rdsamp( filename , 1 ) ; [ann,type]=rdann( filename , 'atr' ) ; 注意:对于信号“101”,其名称为“101”。您可以查看教程中关于rdsamp和rdann的详细信息。


在这里了解如何将这些文件下载到本地http://stackoverflow.com/a/36706214/54964,因此在运行`rdsamp(...)`之前使用`physionetdb(“mitdb”,1);`以减少网络负载并加快系统速度。我正在研究dbpath,因为不同树中似乎有变化。我希望许多项目都可以使用本地文件来加速系统。在这里,票https://github.com/ikarosilva/wfdb-app-toolbox/issues/117在Ikaro的树中。 - Léo Léopold Hertz 준영

0

只需使用它

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);

在回答问题时,最好给出一些解释,说明为什么你的答案是正确的。 - Stephen Rauch

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

enter image description here

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

如果它们都是范围在[-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=1rawUnits=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

<0-9-9 wfdb - 模拟/数字单位默认使用基本增益;现在仅适用于rawUnits=3,4的模拟单位

选择ATM后,您应该能够看到列表,在导出后,可以按照Kamtal的答案描述选择.info文件。 .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])))

而你会得到我的方法和他的方法之间的差异

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接