开源数据网站PhysioNet(https://archive.physionet.org/)提供了诸如MIMIC、MIT-BIH等丰富的生理信号数据库,这些数据库对于人体生理信号的分析、数据挖掘有着非常大的作用。MIT-BIH是由美国麻省理工学院提供用于研究心率失常的数据库,是目前国际上公认的可作为标准的心电数据库之一,近年来MIT-BIH数据库应用比较广泛。下面以MIT-BIH数据库为例,介绍在PhysioNet下载生理数据的方法:

一、      手动下载

使用提供的PhysioBank ATM (https://archive.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为了节省文件长度和存储空间,使用了自定义的格式。一个心电记录由三个部分组成:

1)头文件[.hea],存储方式ASCII字符

2)数据文件[.dat],按二进制存储,每三个字节存储两个数,一个数12bit

3)注释文件[.atr],按二进制存储。

参考网上读取ECG心电数据的Matlab程序rddata.m(下载地址http://download.csdn.net/source/3383369

完整的rddata.m 可在https://archive.physionet.org/physiotools/matlab/rddata.m 下载

编写心电数据读取,具体代码如下(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 BINARY 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中

对上述代码说明如下:

(1) rddata.m包含头文件、二进制数据文件和注释文件等读取,上述代码只是截取了读取二进制数据文件的代码片段;其他的代码功能请参考原始rddata.m文件

(2) 如(1)所说的,上述代码只是读取二进制数据文件的代码,因此这两行代码: HEADERFILE= '100.hea';%头文件          ATRFILE= '100.atr';%注释文件,可以删除。只需要保留DATAFILE='100.dat';

其他说明

上述代码效率低下,大家可以根据PhysioNet提供的WFDB工具包(Matlab)进行数据读取。WFDB工具包如何安装及使用可以参考PhysioNet提供的说明:

https://archive.physionet.org/physiotools/matlab/wfdb-app-matlab/

https://physionet.org/content/wfdb-matlab/0.10.0/

安装WFDB工具包后只需要简单调用函数即可,例如:

// 注意文件存放路径,下面的055.dat文件是存放在代码运行目录之下的
[tm,data]=rdsamp('055',[],5000);//读取所有列,每列5000个数据,tm为时间
[tm,data]=rdsamp('055',1,5000);//读取第1列,读取长度为5000个数据
[tm,data]=rdsamp('055',[1;2],5000);//读取第1和2列,每列读取长度为5000个数据
[tm,data]=rdsamp('055',[],[]);//读取所有行所有列数据

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐