Mercurial > hg > ltpda
view m-toolbox/classes/@ao/fixfs.m @ 49:0bcdf74587d1 database-connection-manager
Cleanup
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 07 Dec 2011 17:24:36 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
% FIXFS resamples the input time-series to have a fixed sample rate. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FIXFS resamples the input time-series to have a fixed sample rate. % % The new sampling grid is computed from the specified sample rate. If no % sample rate is specified, the target is taken from a fit to the input tsdata % object. The new sampling grid starts at the time returned from the fit % (unless specified) and contains the same number of points or spans the % same time as specified. % % CALL: bs = fixfs(a1,a2,a3,...,pl) % bs = fixfs(as,pl) % bs = as.fixfs(pl) % % INPUTS: aN - input analysis objects % as - input analysis objects array % pl - input parameter list % % OUTPUTS: bs - array of analysis objects, one for each input % % <a href="matlab:utils.helper.displayMethodInfo('ao', 'fixfs')">Parameters Description</a> % % $Id: fixfs.m,v 1.40 2011/08/23 13:48:48 hewitson Exp $ % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function varargout = fixfs(varargin) % Check if this is a call for parameters if utils.helper.isinfocall(varargin{:}) varargout{1} = getInfo(varargin{3}); return end import utils.const.* utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename); % Collect input variable names in_names = cell(size(varargin)); for ii = 1:nargin,in_names{ii} = inputname(ii);end % Collect all AOs and plists [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names); [pl, pl_invars] = utils.helper.collect_objects(varargin(:), 'plist', in_names); % Decide on a deep copy or a modify bs = copy(as, nargout); % combine plists pl = parse(pl, getDefaultPlist()); % Get fs t0s = -1; % Please keep the -1. At the moment we don' use the t0. fss = find(pl, 'fs'); method = find(pl, 'method'); interp = find(pl, 'interpolation'); alias = find(pl, 'filter'); if numel(fss) ~= 1 && numel(fss) < numel(as) error('### Please specify either a no sample rate, a single sample rate, or one for each input time-series.'); end % Get only tsdata AOs for jj = 1:numel(bs) if isa(bs(jj).data, 'tsdata') % record input hist hin = bs(jj).hist; bs(jj).timeshift; utils.helper.msg(msg.PROC1, 'fixing AO: %s', bs(jj).name); %------------- Fit sample rate and t0 [ffs, ft0, unevenly] = tsdata.fitfs(bs(jj).data.getX); %---------------- Get target sample rate if numel(fss) > 1 fs = fss(jj); else fs = fss; end if fs < 0 utils.helper.msg(msg.PROC1, 'using sample rate from fit: %f', ffs); fs = ffs; end %---------------- Get target start time if numel(t0s) > 1 t0 = t0s(jj); else t0 = t0s; end if t0 < 0 utils.helper.msg(msg.PROC1, 'using start time from fit: %f', ft0); t0 = ft0; end if unevenly % then the fitted t0 is empty so we need to get it from the first input datum t0 = bs(jj).x(1); end %-------------- Compute new grid switch lower(method) case 'samples' N = length(bs(jj).data.y); t = linspace(t0, t0+(N-1)/fs, N); case 'time' Nsecs = bs(jj).data.nsecs; t = t0 + [0:1/fs:Nsecs-1/fs].'; otherwise error('### Unknown interpolation method. Do you want to preserve data duration or number of samples?'); end %-------------- Antialiasing filter switch lower(alias) case 'iir' utils.helper.msg(msg.PROC1, 'applying iir antialising filter'); pl = plist('type', 'lowpass',... 'order', 8,... 'fs', bs(jj).data.fs,... 'fc', 0.9*(fs/2)); f = miir(pl); filtfilt(bs(jj),f); case 'fir' utils.helper.msg(msg.PROC1, 'applying fir antialising filter'); pl = plist('type', 'lowpass',... 'order', 64,... 'fs', bs(jj).data.fs,... 'fc', 0.9*(fs/2)); f = mfir(pl); filter(bs(jj),f); case 'off' otherwise error('### Unknown filtering method. Please choose: ''iir'', ''fir'' or ''off'' '); end %-------------- Interpolate bs(jj).interp(plist('vertices', t, 'method', interp)); % Set name bs(jj).name = sprintf('%s(%s)', mfilename, ao_invars{jj}); % Add history bs(jj).addHistory(getInfo, pl, ao_invars(jj), hin); % clear errors bs(jj).clearErrors; else warning('!!! Skipping AO %s - it''s not a time-series AO.', ao_invars{jj}); bs(jj) = []; end end % Set output if nargout == numel(bs) % List of outputs for ii = 1:numel(bs) varargout{ii} = bs(ii); end else % Single output varargout{1} = bs; end end %-------------------------------------------------------------------------- % Get Info Object %-------------------------------------------------------------------------- function ii = getInfo(varargin) if nargin == 1 && strcmpi(varargin{1}, 'None') sets = {}; pl = []; else sets = {'Default'}; pl = getDefaultPlist; end % Build info object ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.sigproc, '$Id: fixfs.m,v 1.40 2011/08/23 13:48:48 hewitson Exp $', sets, pl); end %-------------------------------------------------------------------------- % Get Default Plist %-------------------------------------------------------------------------- function plout = getDefaultPlist() persistent pl; if exist('pl', 'var')==0 || isempty(pl) pl = buildplist(); end plout = pl; end function pl = buildplist() pl = plist(); % Fs p = param({'fs', 'The target sampling frequency.'}, {1, {-1}, paramValue.OPTIONAL}); pl.append(p); % Method p = param({'method','Choose if the new data should span the same time or preserve the number of samples (time/samples)'},... {1, {'time', 'samples'}, paramValue.SINGLE}); pl.append(p); % Filter p = param({'filter','Specify options for the antialiasing filter.'},{3, {'iir', 'fir', 'off'}, paramValue.SINGLE}); pl.append(p); % Interpolation pli = ao.getInfo('interp').plists; p = setKey(pli.params(pli.getIndexForKey('method')), 'interpolation'); pl.append(p); end % Parameter list: % 'fs' - specify the target sample rate. Either a single value % for all input time-series, or a vector of values, one % for each input. To take a fitted value from the data, % specify a sample rate of -1. % e.g.: fs = [1 2 -1 4] to work on 4 input time-series % [default: take from data] % % 'method' - Choose the behaviour % 'Time' - new data span the same time [default] % 'Samples' - new data preserves number of samples % % 'filter' - specify if antialising filter is applied % 'off' - no filter applied [default] % 'iir' - 8th order iir filter at fc = fs/2 % filter is applied forward and backward (filtfilt) % 'fir' - 64th order fir filter at fc = fs/2 % filter is applied only forward % % 'interpolation' - specify interpolation method as for interp method % 'nearest' - % 'linear' - % 'spline' - default % 'cubic' -