找了一圈都是针对MIT-BIH ECG数据库的,写一下另一个数据库(含脑电的PSG)
简介:
数据库由 18 个记录组成,
导联数有四个、六个和七个三种,信号采样率是 250Hz,A/D 分辨率是 12Bit,
每个记录由四个文件组成,分为头文件、数据文件和注释文件。
其中注释文件包括两个,扩展名为.ecg 的注释文件和扩展名为.st 的注释文件。
其中扩展名为.ecg 的文件主要是对心电和呼吸信号做注释,
而扩展名为.st 的文件主要对脑电导联做注释。
附(18记录对应导联,其他为(四)):
C4-A1:slp01a、slp01b、slp32(七)、slp37(七)、slp41(七)
O2-A1:slp02a、slp02b
C3-O1:slp03、slp04、slp14、slp16、slp45(七)、slp48(七)、slp59(七)、slp60(七)、slp61(六)、slp66(七)、slp67x(七)
用txt打开头文件 ↓
slp01a 4 250/0.033333333(94) 1800000 23:07:00 19/1/1989
%4通道、采样率250Hz,180万个采样点
slp01a.dat 212 -200/mV 12 0 -17 59911 0 ECG
slp01a.dat 212 4.77778(-477)/mmHg 12 0 -248 19332 0 BP
slp01a.dat 【1】212 【2】-6430/mV 【3】12 【4】0 【5】252 【6】49594 【7】0 【8】EEG (C4-A1)
【1】即每行用三个字节表示两个数m1、m2,每个数 12 bits,故又称为 212 格式
【2】信号的增益,ADC units/mv
【3】ADC 的分辨率为 12 位
【4】ADC 零值为 0
【5】采样点的值为252
【6】校验数 【7】输入输出可以以任何尺寸的块来执行 【8】导联
slp01a.dat 212 690/l 12 0 -180 912 0 Resp (sum)
# 44 M 89 32-01-89
signald = 'D:\mit-bih\data\slp01a.dat';
fid2=fopen(signald,'r');
SAMPLES2READ=2500; %2500行,采样率250Hz,即读取5s数据
A= fread(fid2, [3, SAMPLES2READ], 'uint8')'; %212格式 3字节;'uint8'用1个字节表示
fclose(fid2);
.dat文件的数据格式读取为每行三个字节,即三个八位的二进制数字,其内容含义为
0000 0000 || 0000 0000 || 0000 0000
sign1(L)低八位信息||左四位sign2(R)信息,右四位sign1(L)信息||sign2(R)低八位信息
将第二字节的信息处理后,后四位移至第一字节最左位即得到完整的sign1
将第二字节的信息处理后,前四位移至第一字节最左位即得到完整的sign2.
M2H= bitshift(A(:,2), -4); % 取A得第二列,-4表示字节向右移四位,即取信号2的高4位
M1H= bitand(A(:,2), 15); % bitand返回A和B的按位‘与’,即取信号1的高4位(15表示‘0000 1111’)
PRL=bitshift(bitand(A(:,2),8),9); % 取出字节低四位中最高位,向左移九位(8表示‘0000 1000’)
PRR=bitshift(bitand(A(:,2),128),5); % 取出字节高四位中最高位,向左移五位(128表示‘1000 0000’)
M( : , 1)= bitshift(M1H,8)+ A(:,1)-PRL; % 将M1H、M2H分别左移8位,即乘以2^8,再分别加上A(:,1),A(:,2),
M( : , 2)= bitshift(M2H,8)+ A(:,3)-PRR; % 由于左移时把符号位也移动了,要减去符号位的值
当信号四通道时:
前两通道212三字节,后两通道212三字节,经上述解析得 ↓
ECG |
BP |
EEG |
Resp |
ECG |
BP |
EEG |
Resp |
还要将读取的ECG、BP、EEG、Resp数据分别从M提取并放置于data的1234行
for i=1:SAMPLES2READ
if mod(i,2)==1
data(1,(i+1)/2) = M(i,1); % row1:ECG
else
data(3,i/2) = M(i,1); % row3:EEG
end
end
for i=1:SAMPLES2READ
if mod(i,2)==1
data(2,(i+1)/2) = M(i,2); % row2:BP
else
data(4,i/2) = M(i,2); % row4:Resp
end
end
当信号七通道时:
M1 = [];
for i=1:SAMPLES2READ
M1 = [M1;M(i,1)];
M1 = [M1;M(i,2)];
end
for i=1:2*SAMPLES2READ
switch mod(i,7)
case 1
data(1,(ceil(i/7))) = M1(i); % row1:ECG
case 2
data(2,(ceil(i/7))) = M1(i); % row2:BP
case 3
data(3,(ceil(i/7))) = M1(i); % row3:EEG
case 4
data(4,(ceil(i/7))) = M1(i); % row4:Resp (nasal)
case 5
data(5,(ceil(i/7))) = M1(i); % row5:Resp (chest)
case 6
data(6,(ceil(i/7))) = M1(i); % row6:EOG
otherwise
data(7,(ceil(i/7))) = M1(i); % row7:EMG
end
end