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 function varargout = smoother(varargin)
0029
0030
0031 if utils.helper.isinfocall(varargin{:})
0032 varargout{1} = getInfo(varargin{3});
0033 return
0034 end
0035
0036 import utils.const.*
0037 utils.helper.msg(msg.MNAME, 'running %s/%s', mfilename('class'), mfilename);
0038
0039
0040 in_names = cell(size(varargin));
0041 for ii = 1:nargin,in_names{ii} = inputname(ii);end
0042
0043
0044 [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names);
0045 [pl, pl_invars] = utils.helper.collect_objects(varargin(:), 'plist', in_names);
0046
0047
0048 bs = copy(as, nargout);
0049
0050
0051 pl = combine(pl, getDefaultPlist());
0052
0053
0054 bw = find(pl, 'width');
0055 hc = find(pl, 'hc');
0056 method = find(pl, 'method');
0057
0058
0059 if ~strcmp(method, 'median') && ...
0060 ~strcmp(method, 'mean') && ...
0061 ~strcmp(method, 'min') && ...
0062 ~strcmp(method, 'max') && ...
0063 ~strcmp(method, 'mode')
0064 help(mfilename)
0065 error('### Unknown smoothing method');
0066 end
0067
0068
0069 for j=1:length(bs)
0070 utils.helper.msg(msg.PROC1, 'smoothing %s', bs(j).name);
0071 if strcmp(method, 'median')
0072 bs(j).data.setY(ltpda_smoother(bs(j).data.getY, bw, hc, method), 'internal');
0073 else
0074 bs(j).data.setY(smooth(bs(j).data.getY, bw, hc, method), 'internal');
0075 end
0076
0077 bs(j).addHistory(getInfo, pl, ao_invars(j), bs(j).hist);
0078
0079 bs(j).setName(sprintf('smoother(%s)', ao_invars{j}), 'internal');
0080 end
0081
0082 if nargout > 0
0083 varargout{1} = bs;
0084 end
0085 end
0086
0087
0088
0089
0090 function ii = getInfo(varargin)
0091 if nargin == 1 && strcmpi(varargin{1}, 'None')
0092 sets = {};
0093 pl = [];
0094 else
0095 sets = {'Default'};
0096 pl = getDefaultPlist;
0097 end
0098
0099 ii = minfo(mfilename, 'ao', '', utils.const.categories.sigproc, '$Id: smoother.m,v 1.12 2008/09/05 11:05:29 ingo Exp $', sets, pl);
0100 end
0101
0102
0103
0104
0105 function pl = getDefaultPlist()
0106 pl = plist('width', 20, 'hc', 0.8, 'method', 'median');
0107 end
0108
0109
0110
0111 function ys = smooth(y, bw, hc, method)
0112 N = length(y);
0113 ys = zeros(size(y));
0114 for kk=1:N
0115 if mod(kk, 1000)==0
0116 disp(sprintf(' -- smoothed %06d samples', kk));
0117 end
0118
0119 interval = kk-bw/2:kk+bw/2;
0120 interval(interval<=0)=1;
0121 interval(interval>N)=N;
0122
0123
0124 trial = sort(y(interval));
0125 b = round(hc*length(trial));
0126 eval(sprintf('ys(kk) = %s(trial(1:b));', method));
0127 end
0128 end
0129
0130