-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathecgpuwave.m
156 lines (145 loc) · 6.2 KB
/
ecgpuwave.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
function ecgpuwave(varargin)
%
% ecgpuwave(recordName,annFileName,startTime,stopTime,qrsAnn,pflag,signalList)
%
% Wrapper to the ECGPUWAVE binary written by Pablo Laguna ([email protected]), Raimon Jan[�e], Eudald Bogatell, and David Vigo Anglada:
% http://www.physionet.org/physiotools/wag/ecgpuw-1.htm
%
% ECGPUWAVE analyses an ECG signal from the specified record 'recordName', detecting the QRS complexes
% and locating the beginning, peak, and end of the P, QRS, and ST-T waveforms. The output of ecgpuwave
% is written as a standard WFDB-format annotation file associated
% with the specified annotator 'outputAnnFileName'.
%
% The QRS detector is based on the algorithm of Pan and Tompkins (reference 1) with some improvements that
% make use of slope information (reference 2). Optionally, QRS annotations can be provided as input (see option 'qrsAnn'),
% permitting the use of external QRS detectors such as sqrs(1) or manually-edited annotations
% (which can be created using wave(1) ). The waveform limit locator is based on the algorithm
% described in reference 3 and evaluated in references 3 and 4.
%
% The output annotation file contains PWAVE ("p") and TWAVE ("t") annotations
% that indicate the P- and T-wave peaks, as well as QRS annotations (NORMAL ("N") if generated
% by the built-in QRS detector, or copies of the input QRS annotations if these were supplied).
% ECGPUWAVE classifies each T wave as type 0 (normal), 1 (inverted), 2 (positive monophasic),
% 3 (negative monophasic), 4 (biphasic negative-positive), or 5 (biphasic positive-negative);
% this numeric classification is written into the num field of each TWAVE annotation.
% The P, QRS, and T waveform onsets and ends are marked in the output annotation file using
% WFON ("(") and WFOFF (")") annotations. The num field of each WFON and WFOFF annotation designates
% the type of waveform with which it is associated: 0 for a P wave, 1 for a QRS complex, or 2 for a T wave.
%
% WARNING:
% If ECGPUWAVE is used without providing an annotator file for the R peaks it relies on a Pan-Tompkins detector.
% This detector may not be optimized for your particular signal, and thus may need to be tuned, yielding anempty annotation
% file. In this case, you may want to first run a QRS detector to generate an appropriate QRS annotation file,
% which you can then check manually prior to calling ECGPUWAVE with the
% 'qrsAnn' option described below.
%
% IMPORTANT NOTE:
% A patch to the original Fortran source files was provided by Roberto Sassi in
% order to compile ECGPUWAVE in 64-bit arch. This patch requires
% compiling the source code with gfortran (g77 is not supported in gcc 4.x), which can
% yield slighly different results. For more information please see:
% http://www.dti.unimi.it/~sassi/software/wfdb64HowTo.htm
%
%
%
% References:
%1. Pan J and Tompkins WJ. A Real-Time QRS Detection Algorithm. IEEE Transactions on Biomedical Engineering 32(3):230-236, 1985.
%2. Laguna P. New Electrocardiographic Signal Processing Techniques: Application to Long-term Records. Ph. D. dissertation, Science Faculty, University of Zaragoza, 1990.
%3. Laguna P, Jan[�e] R, Caminal P. Automatic Detection of Wave Boundaries in Multilead ECG Signals: Validation with the CSE Database. Computers and Biomedical Research 27(1):45-60, 1994.
%4. Jan[�e] R, Blasi A, Garc[�i]a J, and Laguna P. Evaluation of an automatic threshold based detector of waveform limits in Holter ECG with the QT database. Computers in Cardiology 24:295-298 (1997; available at http://www.physionet.org/physiobank/database/qtdb/eval/ )
%
% Required Parameters:
%
% recordName
% String specifying the name of the record to annotate with ECGPUWAVE.
%
% annFileName
% String specifying the output file name that ECPUWAVE will store its
% output.
%
% ecgpuwave(recordName,outputAnnFileName,startTime,stopTime,qrsAnn,pflag,signalList)
%
% Optional Parameters are:
%
% startTime
% Either WFDB Time String or 1x1 integer specifying the sample number
% specifying the starting location.
%
% stopTime
% Either WFDB Time String or 1x1 integer specifying the sample number
% specifying the ending location.
%
% qrsAnn
% A String represengint the QRS annotation file that ECGPUWAVE should
% use (must be in the WFDP PATH or within the current directory).
%
% pflag
% A boolean (default = 0), if true all beats are processed, if false,
% only normal beats are used.
%
% signalList
% A Nx1 vector of integers specifying which signals in 'recordName' are
% to be analyzed (default = [0].
%
% Wrapper written by Ikaro Silva, 2013
% Last Modified: May 29 , 2014
% Version 0.0.1
%
%
% %Example - Will go into the WFDB directory of examples to load data
%curdir=pwd;
%[~,config]=wfdbloadlib;eval(['cd ' config.WFDB_JAVA_HOME filesep 'example'])
%ecgpuwave('100s','test');
%[signal,Fs,tm]=rdsamp('100s');
%pwaves=rdann('100s','test',[],[],[],'p');
%plot(tm,signal(:,1));hold on;grid on
%plot(tm(pwaves),signal(pwaves),'or')
%cd(curdir) %CD back to current directory
%
%
% Since 0.9.5
%
%
% See also WFDBDESC, PHYSIONETDB, RDANN, WRANN, SQRS, WQRS, WFDBEXEC
%endOfHelp
persistent javaWfdbExec
if(isempty(javaWfdbExec))
javaWfdbExec=getWfdbClass('ecgpuwave');
end
%Set default pararamter values
inputs={'recordName','annFileName','startTime','stopTime','qrsAnn','pflag','signalList'};
startTime=[];
stopTime=[];
qrsAnn=[];
pflag=[];
signalList=[];
for n=1:nargin
if(~isempty(varargin{n}))
eval([inputs{n} '=varargin{n};'])
end
end
wfdb_argument={'-r',recordName,'-a',annFileName};
if(~isempty(startTime))
wfdb_argument{end+1}='-f';
wfdb_argument{end+1}=num2str(startTime-1);
end
if(~isempty(stopTime))
wfdb_argument{end+1}='-t';
wfdb_argument{end+1}=num2str(stopTime-1);
end
if(~isempty(signalList))
wfdb_argument{end+1}='-s ';
%-1 is necessary because WFDB is 0 based indexed.
for sInd=1:length(signalList)
wfdb_argument{end+1}=[num2str(signalList(sInd)-1)];
end
end
if(~isempty(qrsAnn))
wfdb_argument{end+1}='-i';
wfdb_argument{end+1}=qrsAnn;
if(~isempty(pflag))
wfdb_argument{end+1}='-n';
wfdb_argument{end+1}=[num2str(pflag)];
end
end
javaWfdbExec.execToStringList(wfdb_argument);