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

时间:2011-06-08 19:12:13

标签: database matlab signal-processing signals data-mining

我正在使用涉及模式识别的神经网络进行ECG信号处理。 由于我需要从Matlab收集所有数据以将其用作测试信号,我发现很难将其加载到Matlab上。 我正在使用麻省理工学院心律失常数据库here

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

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

6 个答案:

答案 0 :(得分:5)

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

输入部分中,选择所需的潜在客户,长度,数据库和样本。

工具箱中选择export as .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复合词注释文件,这将是另一个问题。

修改

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

enter image description here

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

所以我在3个月前阅读了这个答案并删除了基数并获得了收益。事实证明,我完全将R-peak向各个方向移动,搞砸了我的所有结果。虽然我不确定在matlab中是否需要这样做,但如果您没有在matlab中预处理信号,请不要这样做。我在python中预处理我的信号,而我所做的一切都是正常的

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

并使用butterworth过滤器去除伪影(范围0.5hz-45hz)

<强> CORRECTION

我选择的截止值 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)

答案 3 :(得分:1)

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

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

  2. 下载心电图信号。请务必同时下载'.atr', '.dat' and '.hea'以获取您要处理的信号。

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

答案 4 :(得分: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);

答案 5 :(得分:-1)

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

enter image description here

在我将此推向开发人员here之后,我们对第4节中的文档here进行了改进。

  

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

     

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

0-9-10 wfdb - 物理单位

  

我们说信号属于物理单位&#39;当这些值用于尽可能接近地表示实际的实际值时,尽管显然计算机上的所有内容都是数字和离散的,而不是模拟和连续的。这包括我们宝贵的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

&lt; 0-9-9 wfdb - 模拟/数字单位默认为基数和增益;现在只有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])))

你得到了我的方法和他的方法之间的区别

enter image description here