我正在使用涉及模式识别的神经网络进行ECG信号处理。 由于我需要从Matlab收集所有数据以将其用作测试信号,我发现很难将其加载到Matlab上。 我正在使用麻省理工学院心律失常数据库here。
需要将信号编入索引并以Matlab兼容格式存储为数据结构。
目前,信号为.atr
和.dat
格式。
如何将MIT-BIH心律失常数据库加载到Matlab上?
答案 0 :(得分:5)
您可以使用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'。
答案 1 :(得分:4)
您需要来自this website的程序rddata.m
(MATLab脚本)。该程序可以找到here。 rddata.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
从上面的链接安装“WFDB Toolbox for Matlab”。将工具箱的文件夹添加到matlab中的路径。
下载心电图信号。请务必同时下载'.atr', '.dat' and '.hea'
以获取您要处理的信号。
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 文件,您需要点击箭头
在我将此推向开发人员here之后,我们对第4节中的文档here进行了改进。
如果它们都是[-2 ^ N,2 ^ N-1]或[0,2 ^ N]范围内的整数,则它们可能是数字的。比较这些值,看它们是否在您正在分析的信号的预期生理范围内。例如,如果标题表明信号是存储在密度的ECG(通常具有大约2mV的幅度),则整数信号范围从-32000到32000可能不会给你以毫伏为单位的物理ECG。 ..
如果它们不是整数,那么它们就是物理的。您可以再次快速比较这些值,看它们是否处于您正在分析的信号的预期生理范围内。
我们说信号属于物理单位&#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=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'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])))
你得到了我的方法和他的方法之间的区别