开源数据网站PhysioNet(https://physionet.org/)提供了诸如MIMIC、MIT-BIH等丰富的生理信号数据库,这些数据库对于人体生理信号的分析、数据挖掘有着非常大的作用。MIT-BIH是由美国麻省理工学院提供用于研究心率失常的数据库,是目前国际上公认的可作为标准的心电数据库之一,近年来MIT-BIH数据库应用比较广泛。下面以MIT-BIH数据库为例,介绍在PhysioNet下载生理数据的方法:
一、 手动下载
使用提供的PhysioBank ATM (https://physionet.org/cgi-bin/atm/ATM),可以在线地显示选定的数据,并将数据保存为txt或其他的形式。在Database下拉框中选择MIT-BIH Arrhythmia Database:
默认的数据显示长度为10s,用户也可以选择1min、1hour显示。在Toolbox中选择plot waveforms:
在显示的过程中可以点击下面的进度条,选择显示的区间。10s的心电数据显示如下:
在Toolbox中选择Show samples as test可以将显示的波形数据显示为txt格式,最后下载该txt文档即可。注意下面的提醒:如果显示数据过长(大于100000个点),浏览器可能会出现错误。
二、 使用Matlab读取整个数据文件
首先利用Toolbox中将选择的Record打包,并下载:
下载的压缩包有四个文件,分别是.atr、.dat、.hea、.xws格式,主要用到前三个。
MIT-BIH为了节省文件长度和存储空间,使用了自定义的格式。一个心电记录由三个部分组成:
(2)数据文件[.dat],按二进制存储,每三个字节存储两个数,一个数12bit。
(3)注释文件[.atr],按二进制存储。
参考网上读取ECG心电数据的Matlab程序rddata.m(下载地址http://download.csdn.net/source/3383369)
编写心电数据读取和分割matlab程序,一个记录通常有30分钟,心电采样率为360Hz,为了后续分析方便,程序中将读取出来的数据,以1min为间隔,将数据分段保存在30个txt文档中,具体代码如下(Matlab2009编译通过):
clc;
close all;
%------ SPECIFY DATA ------------------------------------------------------
PATH= 'D:\MATLAB仿真\MIT-BIH原始数据'; % path, where data are saved
HEADERFILE= '100.hea'; % header-file in text format
ATRFILE= '100.atr'; % attributes-file in binary format
DATAFILE='100.dat'; % data-file
SAMPLES2READ=660000; % number of samples to be read
% in case of more than one signal:
% 2*SAMPLES2READ samples are read
%------ LOAD HEADER DATA --------------------------------------------------
signald= fullfile(PATH, DATAFILE); % data in format 212
fid2=fopen(signald,'r');
A= fread(fid2, [3, SAMPLES2READ], 'uint8')'; % matrix with 3 rows, each 8 bits long, = 2*12bit
fclose(fid2);
%=----------------------------我的方法-----------------------------------
M2H= bitshift(A(:,2), -4); %字节向右移四位,即取字节的高四位
M1H= bitand(A(:,2), 15); %取字节的低四位
M( : , 1)= bitshift(M1H,8)+ A(:,1); %低四位向左移八位
M( : , 2)= bitshift(M2H,8)+ A(:,3); %高四位向左移八位
M = (M-1024)/200;
%至此两个通道的数据保存在数组中M中
%----------------------------将数据分割成30份,一分钟一份---------------------------------
for t=1:9
str=num2str(t);
name=['D:\MATLAB仿真\MIT-BTH txt格式\',str,'.txt'];
fid=fopen(name,'wt');
m1=21600*(t-1)+1;
m2=21600*t;
n=2;
for i=m1:1:m2
for j=1:1:n
if j==n
fprintf(fid,'%5.3f\n',M(i,j));
else
fprintf(fid,'%5.3f \t',M(i,j));
end
end
end
fclose(fid);
end
%----------分割最后一段
t=10;
str=num2str(t);
name=['D:\MATLAB仿真\MIT-BTH txt格式\',str,'.txt'];
fid=fopen(name,'wt');
m1=21600*(t-1)+1;
m2=length(M);
n=2;
for i=m1:1:m2
for j=1:1:n
if j==n
fprintf(fid,'%5.3f\n',M(i,j));
else
fprintf(fid,'%5.3f \t',M(i,j));
end
end
end
fclose(fid);
fprintf('完成\n');