MIT-BIH Polysomnographic
找了一圈都是針對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