我正在使用神经网络进行心电图信号处理,其中包括模式识别。由于我需要从Matlab中收集所有数据以用作测试信号,因此我发现将其加载到Matlab上很困难。 我在这里使用MIT心律失常数据库(链接)。
该信号需要被索引并以Matlab兼容格式存储为数据结构。
目前,该信号以.atr
和.dat
格式存在。
如何将MIT-BIH心律失常数据库加载到Matlab上?
我正在使用神经网络进行心电图信号处理,其中包括模式识别。由于我需要从Matlab中收集所有数据以用作测试信号,因此我发现将其加载到Matlab上很困难。 我在这里使用MIT心律失常数据库(链接)。
该信号需要被索引并以Matlab兼容格式存储为数据结构。
目前,该信号以.atr
和.dat
格式存在。
如何将MIT-BIH心律失常数据库加载到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复合物的注释文件,那就是另一个问题。
编辑
基线和增益来自信息文件(第二张图片)。该文件提供有关ECG信号的各种信息。
.mat
文件,还有另一个名为 .info
的文件,其中指示着:_要将原始单位转换为上述物理单位,请减去 'base' 并除以 'gain'_。 - Rashid我三个月前读了这篇答案并删除了基础和增益。结果,我完全将我的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 준영val=val/2047;
吗?我现在使用的是sig=(sig-1024)/200;
,但非常担心这样做是错误的。您的 val=val/2047
是有道理的,因为最大电压是2 ^ 11 -1。我想了解为什么Rashid声称另一件事情。 - Léo Léopold Hertz 준영有一份使用matlab读取数据的教程。 matlab用户教程
从上述链接中安装“Matlab WFDB工具箱”。将工具箱的文件夹添加到matlab的路径中。
下载ECG信号。确保同时下载'.atr'、'.dat'和'.hea'
这三个文件,以便处理所需信号。
在matlab中输入以下命令:
[tm,signal,Fs]=rdsamp( filename , 1 ) ;
[ann,type]=rdann( filename , 'atr' ) ;
注意:对于信号“101”,其名称为“101”。您可以查看教程中关于rdsamp和rdann的详细信息。
只需使用它
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);
在我将此推送给开发人员这里后,我们在第4节的文档这里中得到了改进。
如果它们都是范围在[-2^N,2^N-1]或[0,2^N]内的整数,则它们可能是数字的。比较值以查看它们是否处于您正在分析的信号的预期生理范围内。例如,如果标题说明信号是以毫伏存储的心电图,通常具有约2mV的幅度,则范围从-32000到32000的整数信号可能不会为您提供物理心电图(以毫伏为单位)...
如果它们不是整数,则它们是物理的。再次,您可以快速比较值以查看它们是否处于您正在分析的信号的预期生理范围内。
-
例如,如果通过捕获设备收集了一个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后,您应该能够看到列表,在导出后,可以按照Kamtal的答案描述选择.info文件。 .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])))
而你会得到我的方法和他的方法之间的差异