Mercurial > hg > ltpda
diff m-toolbox/classes/@ao/fftfilt.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@ao/fftfilt.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,200 @@ +% FFTFILT overrides the fft filter function for analysis objects. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: FFTFILT overrides the fft filter function for analysis objects. +% Applies the input filter to the input analysis +% object in the frequency domain. +% +% +% CALL: >> b = fftfilt(a,smodel); b = fftfilt(a,plist('filter',smodel)) +% >> b = fftfilt(a,mfir); b = fftfilt(a,plist('filter',mfir)) +% >> b = fftfilt(a,miir); b = fftfilt(a,plist('filter',miir)) +% >> b = fftfilt(a,ltpda_tf); b = fftfilt(a,plist('filter',ltpda_tf)) +% >> b = fftfilt(a,plist('filter',c)) % c is an AO used as a +% filter +% +% INPUTS: +% a - input analysis object +% one of +% smodel - a model to filter with. The x-dependency must +% be on frequency ('f'). +% mfir - an FIR filter +% miir - an IIR filter +% tf - an ltpda_tf object +% including: +% - pzmodel +% - rational +% - parfrac +% ao - a frequency-series AO. This must have the +% correct frequency base to match the FFT'd input +% data. You must input it in a plist +% +% OUTPUTS: +% b - output analysis object containing the filtered data. +% +% <a href="matlab:utils.helper.displayMethodInfo('ao', 'fftfilt')">Parameters Description</a> +% +% VERSION: $Id: fftfilt.m,v 1.35 2011/05/28 05:42:15 mauro Exp $ +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = fftfilt(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); + [filt, f_invars] = utils.helper.collect_objects(varargin(:), 'ltpda_filter', in_names); + [mobjs, md_invars] = utils.helper.collect_objects(varargin(:), 'smodel', in_names); + [tfobjs, tf_invars] = utils.helper.collect_objects(varargin(:), 'ltpda_tf', in_names); + + % Make copies or handles to inputs + bs = copy(as, nargout); + + % Apply defaults to plist + pl = applyDefaults(getDefaultPlist, varargin{:}); + + % Filter with a smodel object + if ~isempty(mobjs) + filt = mobjs; + elseif ~isempty(tfobjs) + filt = tfobjs; + end + + if isempty(filt) + filt = find(pl, 'filter'); + end + + if isempty(filt) + error('### A filter must be provided ###') + end + + % get number of Bins for zero padding + Npad = find(pl,'Npad'); + + % get initial conditions + inConds = find(pl,'Initial Conditions'); + + % check initial conditions + if ~isempty(inConds) + if iscell(inConds) && numel(inConds) ~= numel(bs) + error('### Please give the proper number of initial conditions') + end + if ~iscell(inConds) && numel(bs)>1 + error('### Please give the initial conditions in a cell-array') + else + inConds = {inConds}; + end + end + + inCondsMdl = repmat(smodel(), numel(bs), 1); + for ii = 1:numel(bs) + if ~isempty(inConds) + N = numel(inConds{ii}); + expr = ''; + ix = 1; + for jj = N-1:-1:0 + expr = [expr,sprintf('+(2*pi*i*f).^%i*%g',jj,inConds{ii}(ix))]; + ix = ix+1; + end + inCondsMdl(ii) = smodel(plist('expression', expr, 'xvar', 'f')); + end + end + + for ii = 1:numel(bs) + % keep the history to suppress the history of the intermediate steps + inhist = bs(ii).hist; + + % make sure we operate on physical frequencies + switch class(filt) + case 'smodel' + switch filt.xvar{1} + case 'f' + % Nothing to do + case 's' + % I need to map from 's' to 'f' + filt.setTrans('2*pi*i'); + otherwise + error('### The filter smodel must have xvar = ''s'' or ''f'''); + end + otherwise + end + + % call core method of the fftfilt + bs(ii).fftfilt_core(filt, Npad, inCondsMdl(ii)); + + % Set name + bs(ii).setName(sprintf('fftfilt(%s)', ao_invars{ii})); + % Add history + bs(ii).addHistory(getInfo('None'), pl, ao_invars(ii), [inhist filt(:).hist]); + + end + + % Set output + varargout = utils.helper.setoutputs(nargout, bs); +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: fftfilt.m,v 1.35 2011/05/28 05:42:15 mauro Exp $', sets, pl); +end + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist() + persistent pl; + if ~exist('pl', 'var') || isempty(pl) + pl = buildplist(); + end + plout = pl; +end + +function pl = buildplist() + + pl = plist(); + + % Filter + p = param({'filter', 'The filter to apply to the data.'}, paramValue.EMPTY_STRING); + pl.append(p); + + % Number of bins for zero padding + p = param({'Npad', 'Number of bins for zero padding.'}, paramValue.EMPTY_DOUBLE); + pl.append(p); + + % Initial conditions + p = param({'Initial Conditions', ['A cell containing the arrays of initial conditions, one '... + 'for each system being solved, '... + 'starting from the lower order to the maximum allowed. '... + 'It assumed that the underlying system follows a linear differential equation with constant coefficients. '... + 'For example, if the system is the Newton '... + '2nd-order equation of motion, than the array contains the initial position and the '... + 'initial velocity.']}, paramValue.EMPTY_CELL); + pl.append(p); + +end + + +