Diff of /SegBeat.m [000000] .. [e6b7a4]

Switch to unified view

a b/SegBeat.m
1
%% 截取全数据库目标心拍
2
clc; clear all;
3
Name_whole=[100,101,102,103,104,105,106,107,108,109,111,112,113,114,115,...
4
    116,117,118,119,121,122,123,124,200,201,202,203,205,207,208,209,...
5
    210,212,213,214,215,217,219,220,221,222,223,228,230,231,232,233,234];
6
INFO=[];
7
Nb=[];Lb=[];Rb=[];Vb=[];Ab=[];Sb=[];
8
Pl=100;Pr=150;
9
for na=1:48
10
    
11
%------ SPECIFY DATA ------------------------------------------------------
12
%------ 指定数据文件 -------------------------------------------------------
13
14
Name=num2str(Name_whole(na));
15
PATH= 'F:\MATLAB\MIT-BIH'; % 指定数据的储存路径  
16
HEADERFILE=strcat(Name, '.hea');% .hea 格式,头文件,可用记事本打开        
17
ATRFILE=strcat(Name, '.atr'); % .atr 格式,属性文件,数据格式为二进制数    
18
DATAFILE=strcat(Name, '.dat');% .dat ¸ñʽ£¬ECG Êý¾Ý
19
SAMPLES2READ=650000;          % 指定需要读入的样本数
20
                            % 若.dat文件中存储有两个通道的信号:
21
                            % 则读入 2*SAMPLES2READ 个数据 
22
23
%------ LOAD HEADER DATA --------------------------------------------------
24
%------ 读入头文件数据 -----------------------------------------------------
25
%
26
% 示例:用记事本打开的117.hea 文件的数据
27
%
28
%      117 2 360 650000
29
%      117.dat 212 200 11 1024 839 31170 0 MLII
30
%      117.dat 212 200 11 1024 930 28083 0 V2
31
%      # 69 M 950 654 x2
32
%      # None
33
%
34
%-------------------------------------------------------------------------
35
fprintf(1,'\\n$> WORKING ON %s ...\n', HEADERFILE); % 在Matlab命令行窗口提示当前工作状态
36
% 
37
% 【注】函数 fprintf 的功能将格式化的数据写入到指定文件中。
38
% ±í´ïʽ£ºcount = fprintf(fid,format,A,...)
39
% 在字符串'format'的控制下,将矩阵A的实数数据进行格式化,并写入到文件对象fid中。该函数返回所写入数据的字节数 count。
40
% fid 是通过函数 fopen 获得的整型文件标识符。fid=1,表示标准输出(即输出到屏幕显示);fid=2,表示标准偏差。
41
%
42
signalh= fullfile(PATH, HEADERFILE);    % 通过函数 fullfile 获得头文件的完整路径
43
fid1=fopen(signalh,'r');    % 打开头文件,其标识符为 fid1 ,属性为'r'--“只读”
44
z= fgetl(fid1);             % 读取头文件的第一行数据,字符串格式
45
A= sscanf(z, '%*s %d %d %d',[1,3]); % 按照格式 '%*s %d %d %d' 转换数据并存入矩阵 A 中
46
nosig= A(1);    % 信号通道数目
47
sfreq=A(2);     % 数据采样频率
48
clear A;        % 清空矩阵 A ,准备获取下一行数据
49
for k=1:nosig           % 读取每个通道信号的数据信息
50
    z= fgetl(fid1);
51
    A= sscanf(z, '%*s %d %d %d %d %d',[1,5]);
52
    dformat(k)= A(1);           % 信号格式; 这里只允许为 212 格式
53
    gain(k)= A(2);              % 每 mV 包含的整数个数
54
    bitres(k)= A(3);            % 采样精度(位分辨率)
55
    zerovalue(k)= A(4);         % ECG 信号零点相应的整数值
56
    firstvalue(k)= A(5);        % 信号的第一个整数值 (用于偏差测试)
57
end;
58
fclose(fid1);
59
clear A;
60
61
%------ LOAD BINARY DATA --------------------------------------------------
62
%------ 读取 ECG 信号二值数据 ----------------------------------------------
63
%
64
if dformat~= [212,212], error('this script does not apply binary formats different to 212.'); end;
65
signald= fullfile(PATH, DATAFILE);            % 读入 212 格式的 ECG 信号数据
66
fid2=fopen(signald,'r');
67
A= fread(fid2, [3, SAMPLES2READ], 'uint8')';  % matrix with 3 rows, each 8 bits long, = 2*12bit
68
fclose(fid2);
69
% 通过一系列的移位(bitshift)、位与(bitand)运算,将信号由二值数据转换为十进制数
70
M2H= bitshift(A(:,2), -4);        %字节向右移四位,即取字节的高四位
71
M1H= bitand(A(:,2), 15);          %取字节的低四位
72
PRL=bitshift(bitand(A(:,2),8),9);     % sign-bit   取出字节低四位中最高位,向右移九位
73
PRR=bitshift(bitand(A(:,2),128),5);   % sign-bit   取出字节高四位中最高位,向右移五位
74
M( : , 1)= bitshift(M1H,8)+ A(:,1)-PRL;
75
M( : , 2)= bitshift(M2H,8)+ A(:,3)-PRR;
76
if M(1,:) ~= firstvalue, error('inconsistency in the first bit values'); end;
77
switch nosig
78
case 2
79
    M( : , 1)= (M( : , 1)- zerovalue(1))/gain(1);
80
    M( : , 2)= (M( : , 2)- zerovalue(2))/gain(2);
81
    TIME=(0:(SAMPLES2READ-1))/sfreq;
82
case 1
83
    M( : , 1)= (M( : , 1)- zerovalue(1));
84
    M( : , 2)= (M( : , 2)- zerovalue(1));
85
    M=M';
86
    M(1)=[];
87
    sM=size(M);
88
    sM=sM(2)+1;
89
    M(sM)=0;
90
    M=M';
91
    M=M/gain(1);
92
    TIME=(0:2*(SAMPLES2READ)-1)/sfreq;
93
otherwise  % this case did not appear up to now!
94
    % here M has to be sorted!!!
95
    disp('Sorting algorithm for more than 2 signals not programmed yet!');
96
end;
97
clear A M1H M2H PRR PRL;
98
fprintf(1,'\\n$> LOADING DATA FINISHED \n');
99
100
%------ LOAD ATTRIBUTES DATA ----------------------------------------------
101
atrd= fullfile(PATH, ATRFILE);      % attribute file with annotation data
102
fid3=fopen(atrd,'r');
103
A= fread(fid3, [2, inf], 'uint8')';
104
fclose(fid3);
105
ATRTIME=[];
106
ANNOT=[];
107
sa=size(A);
108
saa=sa(1);
109
i=1;
110
while i<=saa
111
    annoth=bitshift(A(i,2),-2);
112
    if annoth==59
113
        ANNOT=[ANNOT;bitshift(A(i+3,2),-2)];
114
        ATRTIME=[ATRTIME;A(i+2,1)+bitshift(A(i+2,2),8)+...
115
                bitshift(A(i+1,1),16)+bitshift(A(i+1,2),24)];
116
        i=i+3;
117
    elseif annoth==60
118
        % nothing to do!
119
    elseif annoth==61
120
        % nothing to do!
121
    elseif annoth==62
122
        % nothing to do!
123
    elseif annoth==63
124
        hilfe=bitshift(bitand(A(i,2),3),8)+A(i,1);
125
        hilfe=hilfe+mod(hilfe,2);
126
        i=i+hilfe/2;
127
    else
128
        ATRTIME=[ATRTIME;bitshift(bitand(A(i,2),3),8)+A(i,1)];
129
        ANNOT=[ANNOT;bitshift(A(i,2),-2)];
130
   end;
131
   i=i+1;
132
end;
133
ANNOT(length(ANNOT))=[];       % last line = EOF (=0)
134
ATRTIME(length(ATRTIME))=[];   % last line = EOF
135
clear A;
136
ATRTIME= (cumsum(ATRTIME))/sfreq;
137
ind= find(ATRTIME <= TIME(end));
138
ATRTIMED= ATRTIME(ind);
139
ANNOT=round(ANNOT);
140
ANNOTD= ANNOT(ind);
141
142
%------ DISPLAY DATA ------------------------------------------------------
143
%{
144
figure(1); clf, box on, hold on
145
plot(TIME, M(:,1),'r');
146
if nosig==2
147
    plot(TIME, M(:,2),'b');
148
end;
149
for k=1:length(ATRTIMED)
150
    text(ATRTIMED(k),0,num2str(ANNOTD(k)));
151
end;
152
xlim([TIME(1), TIME(end)]);
153
xlabel('Time / s'); ylabel('Voltage / mV');
154
string=['ECG signal ',DATAFILE];
155
title(string);
156
fprintf(1,'\\n$> DISPLAYING DATA FINISHED \n');
157
%}
158
% -------------------------------------------------------------------------
159
fprintf(1,'\\n$> ALL FINISHED \n');
160
161
s=M(:,1);
162
s=s';
163
%%
164
[QRS_amp,QRS_ind] = DS_detect(s,0);% µ÷ÓÃQRS¼ì²âËã·¨£»
165
%%
166
Nt=size(QRS_ind,2);
167
R_TIME=ATRTIMED(ANNOTD==1 | ANNOTD ==2 | ANNOTD==3 | ANNOTD==5 | ANNOTD==8 |ANNOTD==9 );
168
169
REF_ind=round(R_TIME'.*360);
170
Nr=size(REF_ind,2);
171
ann=ANNOTD(ANNOTD==1 | ANNOTD ==2 | ANNOTD==3 | ANNOTD==5 | ANNOTD==8 |ANNOTD==9);
172
173
if Nt>Nr
174
    typ=0;
175
else
176
    typ=1;
177
end
178
179
if typ==0
180
    for n=1:Nr
181
        ref=REF_ind(n);
182
        for m=1:Nt
183
            act_ind=QRS_ind(m);
184
            if abs(ref-act_ind)<=54
185
               if act_ind<Pl || (SAMPLES2READ-act_ind)<Pr
186
                    break;
187
               else
188
                    SEG=s((act_ind-Pl+1):(act_ind+Pr));
189
               end
190
               switch ann(n)
191
                    case 1
192
                        Nb=[Nb;SEG];
193
                    case 2
194
                        Lb=[Lb;SEG];
195
                    case 3
196
                        Rb=[Rb;SEG];
197
                    case 5
198
                        Vb=[Vb;SEG];
199
                    case 8
200
                        Ab=[Ab;SEG];
201
                    case 9
202
                        Sb=[Sb;SEG];
203
               end
204
               
205
               break; 
206
            end 
207
        end
208
       
209
    end
210
else
211
    for n=1:Nt
212
        act_ind=QRS_ind(n);
213
        for m=1:Nr
214
            if abs(act_ind-REF_ind(m))<=54
215
                if act_ind<Pl || (SAMPLES2READ-act_ind)<Pr
216
                    break;
217
               else
218
                    SEG=s((act_ind-Pl+1):(act_ind+Pr));
219
               end
220
               switch ann(m)
221
                    case 1
222
                        Nb=[Nb;SEG];
223
                    case 2
224
                        Lb=[Lb;SEG];
225
                    case 3
226
                        Rb=[Rb;SEG];
227
                    case 5
228
                        Vb=[Vb;SEG];
229
                    case 8
230
                        Ab=[Ab;SEG];
231
                    case 9
232
                        Sb=[Sb;SEG];
233
               end
234
               
235
                break;
236
            end
237
        end
238
        
239
    end
240
   
241
end
242
243
244
end