0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 function [detrended,model] = Detrend(samples,varargin)
0033
0034
0035 window = [];
0036 model = [];
0037 order = 1;
0038 common = 'on';
0039
0040
0041 if nargin < 1,
0042 error('Incorrect number of parameters (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0043 end
0044
0045
0046 if ~isdmatrix(samples),
0047 error('Samples should be a MxN matrix (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0048 end
0049
0050
0051 for i = 1:2:length(varargin),
0052 if ~ischar(varargin{i}),
0053 error(['Parameter ' num2str(i+2) ' is not a property (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).']);
0054 end
0055 switch(lower(varargin{i})),
0056 case 'window',
0057 window = varargin{i+1};
0058 if ~isdscalar(window,'>0'),
0059 error('Incorrect value for property ''window'' (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0060 end
0061 case 'model',
0062 model = varargin{i+1};
0063 if ~isdvector(model),
0064 error('Incorrect value for property ''model'' (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0065 end
0066 case 'order',
0067 order = varargin{i+1};
0068 if ~isiscalar(order,'>0'),
0069 error('Incorrect value for property ''order'' (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0070 end
0071 case 'common',
0072 common = varargin{i+1};
0073 if ~isastring(common,'on','off'),
0074 error('Incorrect value for property ''common'' (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).');
0075 end
0076 otherwise,
0077 error(['Unknown property ''' num2str(varargin{i}) ''' (type ''help <a href="matlab:help Detrend">Detrend</a>'' for details).']);
0078 end
0079 end
0080
0081
0082 x = samples(:,2:end);
0083 [nSamples,nChannels] = size(x);
0084
0085 y = zeros(nSamples,nChannels);
0086
0087 if isempty(window),
0088 windows = [1 nSamples];
0089 nWindows = 1;
0090 else
0091 nWindows = floor(nSamples/window)+1;
0092 windows = repmat([1 window],nWindows,1)+repmat([0:nWindows-1]'*window,1,2);
0093 if nWindows*window > nSamples,
0094 windows(end,2) = nSamples;
0095 end
0096 end
0097
0098
0099 if ~isempty(model),
0100
0101 for j = 1:nWindows,
0102 for i = 1:nChannels,
0103 y(windows(j,1):windows(j,2),i) = Filter0(model,x(windows(j,1):windows(j,2),i));
0104 end
0105 end
0106 elseif strcmp(common,'on'),
0107
0108 model = arburg(x(windows(1,1):windows(1,2),1),order);
0109 for j = 1:nWindows,
0110 for i = 1:nChannels,
0111 y(windows(j,1):windows(j,2),i) = Filter0(model,x(windows(j,1):windows(j,2),i));
0112 end
0113 end
0114 else
0115
0116 for j = 1:nWindows,
0117 for i=1:nChannels,
0118 model = arburg(x(windows(j,1):windows(j,2),i),order);
0119 y(windows(j,1):windows(j,2),i) = Filter0(model,x(windows(j,1):windows(j,2),i));
0120 end
0121 end
0122 end
0123
0124 detrended = [samples(:,1) y];
0125
0126
0127
0128 function y = Filter0(b,x)
0129
0130 if mod(length(b),2) ~= 1,
0131 shift = length(b)/2;
0132 else
0133 shift = (length(b)-1)/2;
0134 end
0135
0136 [y0,z] = filter(b,1,x);
0137
0138 y = [y0(shift+1:end,:) ; z(1:shift,:)];
0139