0001 function smoothed = Smooth(data,smooth,varargin)
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
0033
0034
0035 maxSize = 10001;
0036
0037 if nargin < 2,
0038 error('Incorrect number of parameters (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0039 end
0040
0041 vector = isvector(data);
0042 matrix = (~vector & length(size(data)) == 2);
0043 if ~vector & ~matrix,
0044 error('Smoothing applies only to vectors or matrices (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0045 end
0046
0047
0048 if size(data,1) == 1,
0049 data = data';
0050 end
0051
0052
0053 kernel = 'gaussian';
0054 if vector, type = 'l'; else type = 'll'; end
0055
0056
0057 if all(smooth==0),
0058 smoothed = data;
0059 return
0060 end
0061
0062
0063 for i = 1:2:length(varargin),
0064 if ~ischar(varargin{i}),
0065 error(['Parameter ' num2str(i+2) ' is not a property (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).']);
0066 end
0067 switch(lower(varargin{i})),
0068 case 'type',
0069 type = lower(varargin{i+1});
0070 if (vector && ~isastring(type,'c','l')) || (~vector && ~isastring(type,'cc','cl','lc','ll')),
0071 error('Incorrect value for property ''type'' (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0072 end
0073 case 'kernel',
0074 kernel = lower(varargin{i+1});
0075 if ~isastring(kernel,'gaussian','rectangular','triangular'),
0076 error('Incorrect value for property ''kernel'' (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0077 end
0078 otherwise,
0079 error(['Unknown property ''' num2str(varargin{i}) ''' (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).']);
0080
0081 end
0082 end
0083
0084
0085 if matrix && length(smooth) == 1,
0086
0087 smooth = [smooth smooth];
0088 end
0089 if strcmp(kernel,'gaussian'),
0090 if ~isdvector(smooth,'>=0') | (vector & ~ismember(length(smooth),[1 2])) | (matrix & ~ismember(length(smooth),[2 4])),
0091 error('Incorrect value for property ''smooth'' (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0092 end
0093 else
0094 if ~isdvector(smooth,'>=0') | (vector & length(smooth) ~= 1) | (matrix & length(smooth) ~= 2),
0095 error('Incorrect value for property ''smooth'' (type ''help <a href="matlab:help Smooth">Smooth</a>'' for details).');
0096 end
0097 end
0098
0099 [vSize,hSize] = size(data);
0100
0101
0102 if strcmp(kernel,'rectangular'),
0103
0104
0105
0106 vKernelSize = 2*smooth(1)+1;
0107 vKernel = ones(vKernelSize,1);
0108 vKernel = vKernel/sum(vKernel);
0109
0110 if ~vector,
0111 hKernelSize = 2*smooth(2)+1;
0112 hKernel = ones(hKernelSize,1);
0113 hKernel = hKernel/sum(hKernel);
0114 end
0115
0116 elseif strcmp(kernel,'triangular'),
0117
0118
0119
0120 vKernelSize = 2*smooth(1)+1;
0121 vKernel = triang(vKernelSize);
0122 vKernel = vKernel/sum(vKernel);
0123
0124 if ~vector,
0125 hKernelSize = 2*smooth(2)+1;
0126 hKernel = ones(hKernelSize,1);
0127 hKernel = hKernel/sum(hKernel);
0128 end
0129
0130 else
0131
0132
0133
0134 if vector && length(smooth) == 2,
0135 vKernelSize = smooth(2);
0136 elseif matrix && length(smooth) == 4,
0137 vKernelSize = smooth(3);
0138 else
0139 if vSize > maxSize, warning(['Default kernel too large; using ' int2str(maxSize) ' points.']); end
0140 vKernelSize = min([vSize maxSize]);
0141 end
0142 r = (-vKernelSize:vKernelSize)'/vKernelSize;
0143 vKernelStdev = smooth(1)/vKernelSize;
0144 vKernel = exp(-r.^2/(vKernelStdev+eps)^2/2);
0145 vKernel = vKernel/sum(vKernel);
0146
0147 if ~vector,
0148 if length(smooth) == 4,
0149 hKernelSize = smooth(4);
0150 else
0151 if hSize > maxSize, warning(['Default kernel too large; using ' int2str(maxSize) ' points.']); end
0152 hKernelSize = min([hSize maxSize]);
0153 end
0154 r = (-hKernelSize:hKernelSize)/hKernelSize;
0155 hKernelStdev = smooth(2)/hKernelSize;
0156 hKernel = exp(-r.^2/(hKernelStdev+eps)^2/2);
0157 hKernel = hKernel/sum(hKernel);
0158 end
0159
0160 end
0161
0162 if vector,
0163
0164
0165 if strcmp(type,'l'),
0166
0167
0168
0169 top = flipud(data(1:vKernelSize));
0170 bottom = flipud(data(end-vKernelSize+1:end));
0171 else
0172
0173 top = data(end-vKernelSize+1:end);
0174 bottom = data(1:vKernelSize);
0175 end
0176 data = [top;data;bottom];
0177
0178 tmp = conv(vKernel,data);
0179 n = size(tmp,1);
0180 d = n - vSize;
0181 start = d/2+1;
0182 stop = start + vSize - 1;
0183 smoothed = tmp(start:stop,:);
0184 else
0185
0186
0187 if smooth(1) == 0,
0188
0189
0190 if strcmp(type(1),'l'),
0191
0192
0193
0194 left = fliplr(data(:,1:hKernelSize));
0195 right = fliplr(data(:,end-hKernelSize+1:end));
0196 else
0197
0198 left = data(:,end-hKernelSize+1:end);
0199 right = data(:,1:hKernelSize);
0200 end
0201 data = [left data right];
0202 for i = 1:size(data,1),
0203 tmp = conv(hKernel,data(i,:));
0204 n = size(tmp,2);
0205 d = n - hSize;
0206 start = d/2+1;
0207 stop = start + hSize - 1;
0208 smoothed(i,:) = tmp(:,start:stop);
0209 end
0210 elseif smooth(2) == 0,
0211
0212
0213 if strcmp(type(2),'l'),
0214
0215
0216
0217 top = flipud(data(1:vKernelSize,:));
0218 bottom = flipud(data(end-vKernelSize+1:end,:));
0219 else
0220
0221 bottom = data(1:vKernelSize,:);
0222 top = data(end-vKernelSize+1:end,:);
0223 end
0224 data = [top;data;bottom];
0225 for i = 1:size(data,2),
0226 tmp = conv(vKernel,data(:,i));
0227 n = size(tmp,1);
0228 d = n - vSize;
0229 start = d/2+1;
0230 stop = start + vSize - 1;
0231 smoothed(:,i) = tmp(start:stop);
0232 end
0233 else
0234
0235
0236 if strcmp(type(2),'l'),
0237
0238
0239
0240 top = flipud(data(1:vKernelSize,:));
0241 bottom = flipud(data(end-vKernelSize+1:end,:));
0242 else
0243
0244 bottom = data(1:vKernelSize,:);
0245 top = data(end-vKernelSize+1:end,:);
0246 end
0247 data = [top;data;bottom];
0248 if strcmp(type(1),'l'),
0249
0250
0251
0252 left = fliplr(data(:,1:hKernelSize));
0253 right = fliplr(data(:,end-hKernelSize+1:end));
0254 else
0255
0256 left = data(:,end-hKernelSize+1:end);
0257 right = data(:,1:hKernelSize);
0258 end
0259 data = [left data right];
0260 tmp = conv2(vKernel,hKernel,data,'same');
0261 n = size(tmp,1);
0262 d = n - vSize;
0263 vStart = d/2+1;
0264 vStop = vStart + vSize - 1;
0265 n = size(tmp,2);
0266 d = n - hSize;
0267 hStart = d/2+1;
0268 hStop = hStart + hSize - 1;
0269 smoothed = tmp(vStart:vStop,hStart:hStop);
0270 end
0271 end