Waveform Database Software Package (WFDB) for MATLAB and Octave 0.10.0
(5,699 bytes)
function varargout=msentropy(varargin)
%
% [y,scale,info]=msentropy(x,dn,dm,dr,N,N0,minM,maxM,maxScale,minR,maxR)
%
% Wrapper to the Multiscale Entropy C code written by Madalena Costa (mcosta@fas.harvard.edu):
% http://physionet.org/physiotools/mse/mse-1.htm
%
% Calculates the multi scale entropy of a signal 'x'. A tutorial on Mulsticale
% entropy is available at:
% http://www.physionet.org/physiotools/mse/tutorial/
%
%
% Please cite these publications when referencing this material:
% Costa M., Goldberger A.L., Peng C.-K. Multiscale entropy analysis of biological signals. Phys Rev E 2005;71:021906.
% Costa M., Goldberger A.L., Peng C.-K. Multiscale entropy analysis of physiologic time series. Phys Rev Lett 2002; 89:062102.
%
% Also include the standard citation for PhysioNet:
% Goldberger AL, Amaral LAN, Glass L, Hausdorff JM, Ivanov PCh, Mark RG,
% Mietus JE, Moody GB, Peng C-K, Stanley HE. PhysioBank, PhysioToolkit, and PhysioNet: components of a new research resource for complex physiologic signals. Circulation 101(23):e215-e220 [Circulation Electronic Pages; http://circ.ahajournals.org/cgi/content/full/101/23/e215]; 2000 (June 13)
%
% Readers of may also wish to read:
% Costa M, Peng C-K, Goldberger AL, Hausdorff JM. Multiscale entropy analysis of human gait dynamics. Physica A 2003;330:53-60.
%
% Required Parameters:
%
% x
% Nx1 vector of doubles in which to caculate the multiscale entropy.
%
% Optional Parameters are:
% dn
% 1x1 double. Sets the scale increment to dn (1-40; default: 1).
% dm
% 1x1 double. Sets the m increment to dm (1-10; default: 1).
% dr
% 1x1 double. Sets the scale increment to dr (>0; default: 0.05).
% N
% 1x1 integer. Stop the analysis with row N.
% By default, analysis ends at row 39999, or at the end of the data set if there are fewer rows.
% N0
% 1x1 integer. Begin the analysis with row N0.
% By default, analysis begins with row 1.
% minM
% 1x1 integer betwee 1-10. Set the minimum pattern length for SampEn to minN (1-10; default: 2).
% maxM
% 1x1 integer betwee 1-10. Set the maximum m to maxM (1-10; default: 2).
% maxScale
% 1x1 integer betwee 1-40. Set the maximum scale for coarse-graining to maxScale (1-40; default: 20).
% minR
% 1x1 double >0. Set the minimum similarity criterion for SampEn to minR (>0; default: 0.15).
% maxR
% 1x1 double > 0. Set the maximum m to maxR (>0; default: 0.15).
%
%
% Outputs:
% y
% A 1xM vector of doubles corresponding to estimated sample entropies at each scale.
% scale
% A 1xM vector of integers specifying the scales in which 'y' was
% estimated.
%
% info
% An optional 3x1 cell array of strings providing loggin and verbose information from
% the calculation.
%
% Wrapper written by Ikaro Silva, 2013
% Last Modified: March 20, 2014
% Version 0.0.1
%
% Since 0.9.5
%
% %Example
% N=30000;
% noise=randn(N,1);
% maxScale=10;
%[entropyNoise,scale1]=msentropy(noise,[],[],[],[],[],[],[],maxScale);
% %Simulate determistic system with noise-like 2nd order statistics
% nlinear=zeros(N,1);nlinear(1)=0.2;u=4;
% for n=2:N;nlinear(n)=u*nlinear(n-1)*(1-nlinear(n-1));end
%[entropyDeterm,scale2]=msentropy(nlinear,[],[],[],[],[],[],[],maxScale);
%subplot(2,1,1);
%plot(noise(1:1000));hold on;grid on;plot(nlinear(1:1000),'r');legend('Stochastic','Deterministic')
%subplot(2,1,2);
%plot(scale1,entropyNoise);hold on;grid on;plot(scale2,entropyDeterm,'r');legend('Stochastic','Deterministic')
%
%
% See also SURROGATE, DFA, WFDBDESC, PHYSIONETDB, RDANN, ANN2RR, MAPRECORD
%endOfHelp
persistent javaWfdbExec config
if(isempty(javaWfdbExec))
[javaWfdbExec,config]=getWfdbClass('mse');
end
%Set default pararamter values
inputs={'x','dn','dm','dr','N','N0','minM','maxM','maxScale','minR','maxR'};
outputs={'y','scale','info'};
dn=[];
dm=[];
dr=[];
N=[];
N0=[];
minM=[];
maxM=[];
maxScale=[];
minR=[];
maxR=[];
wfdb_argument={};
info=[];
scale=[];
y=[];
x=[];
for n=1:nargin
if(~isempty(varargin{n}))
eval([inputs{n} '=varargin{n};']);
end
end
if(~isempty(dn))
wfdb_argument{end+1}='-a';
wfdb_argument{end+1}=[num2str(dn)];
end
if(~isempty(dm))
wfdb_argument{end+1}='-b';
wfdb_argument{end+1}=[num2str(dm)];
end
if(~isempty(dr))
wfdb_argument{end+1}='-c';
wfdb_argument{end+1}=[num2str(dr)];
end
if(~isempty(N0))
wfdb_argument{end+1}='-i';
wfdb_argument{end+1}=[num2str(N0-1)];
end
if(~isempty(N))
wfdb_argument{end+1}='-I';
wfdb_argument{end+1}=[num2str(N-1)];
end
if(~isempty(minM))
wfdb_argument{end+1}='-m';
wfdb_argument{end+1}=[num2str(minM)];
end
if(~isempty(maxM))
wfdb_argument{end+1}='-M';
wfdb_argument{end+1}=[num2str(maxM)];
end
if(~isempty(maxScale))
wfdb_argument{end+1}='-n';
wfdb_argument{end+1}=[num2str(maxScale)];
end
if(~isempty(minR))
wfdb_argument{end+1}='-r';
wfdb_argument{end+1}=[num2str(minR)];
end
if(~isempty(maxR))
wfdb_argument{end+1}='-R';
wfdb_argument{end+1}=[num2str(maxR)];
end
javaWfdbExec.setArguments(wfdb_argument);
if(config.inOctave)
x=cellstr(num2str(x));
x=java2mat(javaWfdbExec.execWithStandardInput(x));
Nx=x.size;
out=cell(Nx,1);
for n=1:Nx
out{n}=x.get(n-1);
end
else
out=cell(javaWfdbExec.execWithStandardInput(x).toArray);
end
M=length(out);
if(M<4)
error(['Error calculating MSE:' out{:}]);
end
info=out(1:3);
out(1:4)=[];
M=M-4;
scale=zeros(M,1)+NaN;
y=zeros(M,1)+NaN;
for m=1:M
str=out{m};
sep=regexp(str,'\s');
scale(m)=str2num(str(1:sep));
y(m)=str2num(str(sep(1):sep(2)));
end
for n=1:nargout
eval(['varargout{n}=' outputs{n} ';']);
end