|
a |
|
b/rdecg.m |
|
|
1 |
function [ M,ANNOTD,ATRTIMED ] = rdecg( PATH, filename,samples2read ) |
|
|
2 |
% 读取ECG信号,返回信号向量,专家标记,专家标记位置 |
|
|
3 |
% |
|
|
4 |
|
|
|
5 |
HEADERFILE= strcat(filename,'.hea'); |
|
|
6 |
ATRFILE= strcat(filename,'.atr'); |
|
|
7 |
DATAFILE=strcat(filename,'.dat'); |
|
|
8 |
SAMPLES2READ=samples2read; |
|
|
9 |
|
|
|
10 |
|
|
|
11 |
|
|
|
12 |
fprintf(1,'\\n$> WORKING ON %s ...\n', HEADERFILE); |
|
|
13 |
signalh= fullfile(PATH, HEADERFILE); |
|
|
14 |
fid1=fopen(signalh,'r'); |
|
|
15 |
z= fgetl(fid1); |
|
|
16 |
A= sscanf(z, '%*s %d %d %d',[1,3]); |
|
|
17 |
nosig= A(1); |
|
|
18 |
sfreq=A(2); |
|
|
19 |
clear A; |
|
|
20 |
for k=1:nosig |
|
|
21 |
z= fgetl(fid1); |
|
|
22 |
A= sscanf(z, '%*s %d %d %d %d %d',[1,5]); |
|
|
23 |
dformat(k)= A(1); |
|
|
24 |
gain(k)= A(2); |
|
|
25 |
bitres(k)= A(3); |
|
|
26 |
zerovalue(k)= A(4); |
|
|
27 |
firstvalue(k)= A(5); |
|
|
28 |
end |
|
|
29 |
fclose(fid1); |
|
|
30 |
clear A; |
|
|
31 |
|
|
|
32 |
if dformat~= [212,212], error('this script does not apply binary formats different to 212.'); end |
|
|
33 |
signald= fullfile(PATH, DATAFILE); |
|
|
34 |
fid2=fopen(signald,'r'); |
|
|
35 |
A= fread(fid2, [3, SAMPLES2READ], 'uint8')'; |
|
|
36 |
fclose(fid2); |
|
|
37 |
M2H= bitshift(A(:,2), -4); |
|
|
38 |
M1H= bitand(A(:,2), 15); |
|
|
39 |
PRL=bitshift(bitand(A(:,2),8),9); |
|
|
40 |
PRR=bitshift(bitand(A(:,2),128),5); |
|
|
41 |
M( : , 1)= bitshift(M1H,8)+ A(:,1)-PRL; |
|
|
42 |
M( : , 2)= bitshift(M2H,8)+ A(:,3)-PRR; |
|
|
43 |
if M(1,:) ~= firstvalue, error('inconsistency in the first bit values'); end |
|
|
44 |
switch nosig |
|
|
45 |
case 2 |
|
|
46 |
M( : , 1)= (M( : , 1)- zerovalue(1))/gain(1); |
|
|
47 |
M( : , 2)= (M( : , 2)- zerovalue(2))/gain(2); |
|
|
48 |
TIME=(0:(SAMPLES2READ-1))/sfreq; |
|
|
49 |
case 1 |
|
|
50 |
M( : , 1)= (M( : , 1)- zerovalue(1)); |
|
|
51 |
M( : , 2)= (M( : , 2)- zerovalue(1)); |
|
|
52 |
M=M'; |
|
|
53 |
M(1)=[]; |
|
|
54 |
sM=size(M); |
|
|
55 |
sM=sM(2)+1; |
|
|
56 |
M(sM)=0; |
|
|
57 |
M=M'; |
|
|
58 |
M=M/gain(1); |
|
|
59 |
TIME=(0:2*(SAMPLES2READ)-1)/sfreq; |
|
|
60 |
otherwise |
|
|
61 |
disp('Sorting algorithm for more than 2 signals not programmed yet!'); |
|
|
62 |
end |
|
|
63 |
clear A M1H M2H PRR PRL; |
|
|
64 |
fprintf(1,'\\n$> LOADING DATA FINISHED \n'); |
|
|
65 |
atrd= fullfile(PATH, ATRFILE); |
|
|
66 |
fid3=fopen(atrd,'r'); |
|
|
67 |
A= fread(fid3, [2, inf], 'uint8')'; |
|
|
68 |
fclose(fid3); |
|
|
69 |
ATRTIME=[]; |
|
|
70 |
ANNOT=[]; |
|
|
71 |
sa=size(A); |
|
|
72 |
saa=sa(1); |
|
|
73 |
i=1; |
|
|
74 |
while i<=saa |
|
|
75 |
annoth=bitshift(A(i,2),-2); |
|
|
76 |
if annoth==59 |
|
|
77 |
ANNOT=[ANNOT;bitshift(A(i+3,2),-2)]; |
|
|
78 |
ATRTIME=[ATRTIME;A(i+2,1)+bitshift(A(i+2,2),8)+... |
|
|
79 |
bitshift(A(i+1,1),16)+bitshift(A(i+1,2),24)]; |
|
|
80 |
i=i+3; |
|
|
81 |
elseif annoth==60 |
|
|
82 |
% nothing to do! |
|
|
83 |
elseif annoth==61 |
|
|
84 |
% nothing to do! |
|
|
85 |
elseif annoth==62 |
|
|
86 |
% nothing to do! |
|
|
87 |
elseif annoth==63 |
|
|
88 |
hilfe=bitshift(bitand(A(i,2),3),8)+A(i,1); |
|
|
89 |
hilfe=hilfe+mod(hilfe,2); |
|
|
90 |
i=i+hilfe/2; |
|
|
91 |
else |
|
|
92 |
ATRTIME=[ATRTIME;bitshift(bitand(A(i,2),3),8)+A(i,1)]; |
|
|
93 |
ANNOT=[ANNOT;bitshift(A(i,2),-2)]; |
|
|
94 |
end |
|
|
95 |
i=i+1; |
|
|
96 |
end |
|
|
97 |
ANNOT(length(ANNOT))=[]; |
|
|
98 |
ATRTIME(length(ATRTIME))=[]; |
|
|
99 |
clear A; |
|
|
100 |
ATRTIME= (cumsum(ATRTIME))/sfreq; |
|
|
101 |
ind= find(ATRTIME <= TIME(end)); |
|
|
102 |
ATRTIMED= ATRTIME(ind); |
|
|
103 |
ANNOT=round(ANNOT); |
|
|
104 |
ANNOTD= ANNOT(ind); |
|
|
105 |
|
|
|
106 |
% ------------------------------------------------------------------------- |
|
|
107 |
fprintf(1,'\\n$> ALL FINISHED \n'); |
|
|
108 |
end |
|
|
109 |
|