MIT-BIH数据库综述
MIT-BIH 是由美国麻省理工学院提供的研究心律失常的数据库。目前国际上公认的可作为标准的心电数据库有三个,分别是美国麻省理工学院提供的MIT-BIH 数据库,美国心脏学会的AHA数据库以及欧洲ST-T心电数据库。其中MIT-BIH 数据库近年来应用比较广泛。
MIT-BIH数据库文件
(1)头文件[.hea],存储方式ASCII码字符。包含文件名 、格式 、每帧样本数[可选] 、偏移[可选] 、字节偏移量[可选] 、ADC增益(每个物理单元的ADC单位)[可选]、基线(ADC单位)[可选] 、单位[可选] 、ADC分辨率(位)[可选]、ADC零值[可选] 、初始值[可选] 、块大小[可选] 等。(https://www.physionet.org/physiotools/wag/header-5.htm)
(2)数据文件[.dat],按二进制存储,数据格式共有:Format 8、Format 16、Format 24、Format 32、Format 61、Format 80、Format 160、Format 212、Format 310、Format 311,心律失常数据库的数据格式为Format 212,此格式的读取被很多学者研究,本文中不做详细赘述。(https://www.physionet.org/physiotools/wag/signal-5.htm#toc3)
(3)注释文件[.atr],按二进制存储。记录了心电专家对相应的心电信号的诊断信息,主要有两种格式:MIT格式和AHA格式。
数据读取
数据读取一般按照“头文件”-数据文件-“注释”的顺序进行
头文件读取
我们通过记事本打开头文件,会发现如下内容:
a0001 2 2000 71332
a0001.wav 16+44 1 16 0 0 0 0 PCG
a0001.dat 16 1000 16 0 0 367 0 ECG
#Abnormal
第一行为样本数据的综述,共2个信号,采样频率为2000,样本数为71332;
第二行为第一个数据,为.wav格式,format16,每mV包含的整数为1,采样精度为16,信号第一个整数值为0,为PCG数据
第三行为第二个数据,为.dat格式,format16,每mV包含的整数为1000,采样精度为16,信号第一个整数值为0。为ECG数据。
因为我们只对ECG数据进行读取,故下文均为提取ECG数据。
PATH= 'E:\training_2\training-a'; % 指定数据的储存路径
HEADERFILE= 'a0001.hea'; % .hea 格式,头文件,可用记事本打开
signalh= fullfile(PATH, HEADERFILE); % 通过函数 fullfile 获得头文件的完整路径
for k=1:nosig % 读取每个通道信号的数据信息
z= fgetl(fid1);
A= sscanf(z, '%*s %d %d %d %d %d %d',[1,6]);
dformat= A(1); % 信号格式; 这里只允许为 16 格式
gain= A(2); % 每 mV 包含的整数个数
bitres= A(3); % 采样精度(位分辨率)
zerovalue= 4500; % ECG 信号零点相应的整数值,(此处存疑,因为该文件中并未给定零点的整数值,设为4500,)
firstvalue= A(5); % 信号的第一个整数值 (用于偏差测试)
end;
数据文件读取
数据文件按照位进行读取,然后依据偏差值和增益,调整数据。
PATH= 'E:\training_2\training-a'; % 指定数据的储存路径
DATAFILE='a0007.dat'; % .dat 格式,ECG 数据
if dformat~= [16], error('this script does not apply binary formats different to 16.'); end;
signald= fullfile(PATH, DATAFILE); % 读入 16 格式的 ECG 信号数据
fid2=fopen(signald,'r');
A= fread(fid2, [1, SAMPLES2READ], 'uint16')'; % matrix with 1 rows, each 16 bits long
根据基准值和增益调整数据
M = A;
M( : , 1)= (M( : , 1)- zerovalue(1));
M=M';
M(1)=[];
sM=size(M);
sM=sM(2)+1;
M(sM)=0;
M=M';
M=M/gain(1);
TIME=(0:2*(SAMPLES2READ)-1)/sfreq;
绘制结果
M = M(100:end-100,1); %因为数据前后均有EOF,故删除100个样本点
figure(1); clf, box on, hold on
plot(TIME(1:size(M,1)), M(:,1),'r');