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
+
+
+