diff m-toolbox/classes/@miir/miir.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children a71a40911c27
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@miir/miir.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,647 @@
+% MIIR IIR filter object class constructor.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: MIIR IIR filter object class constructor.
+%              Create a miir object.
+%
+%
+% CONSTRUCTORS:
+%
+%       f = miir()              - creates an empty miir object.
+%       f = miir(fi)            - creates a copy of the input miir object, fi.
+%       f = miir(pzm)           - creates a miir object from a pole/zero model
+%       f = miir(pf)            - creates a vector of miir objects from a parfrac model
+%       f = miir(a,b,fs)        - creates a miir object from the coefficient
+%                                 vectors 'a' and 'b' **.
+%                                 The sample rate for which the filter is
+%                                 designed should be specified as well.
+%       f = miir('foo_iir.fil') - create a miir object from a
+%                                 LISO IIR .fil file.
+%       f = miir('foo_iir.xml') - create a miir object loading the miir object
+%                                 from disk.
+%       f = miir('foo_iir.mat') - create a miir object loading the miir object
+%                                 from disk.
+%       f = miir(pl)            - create a miir object from the description
+%                                 given in the parameter list.
+%
+%
+% EXAMPLE 1:   Create an order 1 highpass filter with high frequency gain 2.
+%              Filter is designed for 10 Hz sampled data and has a cut-off
+%              frequency of 0.2 Hz.
+%
+%              >> pl = plist('type', 'highpass', ...
+%                            'order', 1,         ...
+%                            'gain',  2.0,       ...
+%                            'fs',    10,        ...
+%                            'fc',    0.2);
+%              >> f = miir(pl)
+%
+% NOTES:    ** The convention used here for naming the filter coefficients is
+%              the opposite to MATLAB's convention. The recursion formula
+%              for this convention is
+%
+%              b(1)*y(n) = a(1)*x(n) + a(2)*x(n-1) + ... + a(na+1)*x(n-na)
+%                           - b(2)*y(n-1) - ... - b(nb+1)*y(n-nb)
+%
+% <a href="matlab:utils.helper.displayMethodInfo('miir', 'miir')">Parameters Description</a>
+%
+%
+% VERSION:     $Id: miir.m,v 1.130 2011/08/15 12:22:57 hewitson Exp $
+%
+% SEE ALSO:    mfir, ltpda_filter, ltpda_uoh, ltpda_uo, ltpda_obj, plist
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+classdef miir < ltpda_filter
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Property definition                            %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  %---------- Public (read/write) Properties  ----------
+  properties
+  end
+  
+  %---------- Protected read-only Properties ----------
+  properties (SetAccess = protected)
+    b       = []; % set of denominator coefficients
+    histin  = []; % input history values to filter
+  end
+  
+  %---------- Protected read-only Properties ----------
+  properties (SetAccess = protected, Dependent = true)
+    ntaps % number of coefficients in the filter
+  end
+  
+  %---------- Private Properties ----------
+  properties (GetAccess = protected, SetAccess = protected)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Check property setting                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function set.histin(obj, val)
+      if ~isempty(val)
+        if ~isnumeric(val) || ~isreal(val)
+          error('### The value for the property ''histin'' must be a real number(s)');
+        end
+      end
+      obj.histin = val;
+    end
+    function set.b(obj, val)
+      if ~isempty(val)
+        if ~isnumeric(val)
+          error('### The value for the property ''b'' must be a number(s)');
+        end
+      end
+      obj.b = val;
+    end
+    function set.ntaps(obj, val)
+      error('### Don''t set the property ''ntaps''. It is computed by max(length(a), length(b)).');
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                     Compute the Dependent properties                      %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function val = get.ntaps(obj)
+      val = max(length(obj.a), length(obj.b));
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                                Constructor                                %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function obj = miir(varargin)
+      
+      import utils.const.*
+      utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename);
+      
+      % Collect all miir objects
+      [fs, invars, rest] = utils.helper.collect_objects(varargin(:), 'miir');
+      
+      if isempty(rest) && ~isempty(fs)
+        % Do copy constructor and return
+        utils.helper.msg(msg.OPROC1, 'copy constructor');
+        obj = copy(fs, 1);
+        for kk=1:numel(obj)
+          obj(kk).addHistory(miir.getInfo('miir', 'None'), [], [], obj(kk).hist);
+        end
+        return
+      end
+      
+      if nargin == 0
+        %%%%%%%%%%  f = miir()   %%%%%%%%%%
+        utils.helper.msg(msg.OPROC1, 'empty constructor');
+        obj.addHistory(miir.getInfo('miir', 'None'), plist(), [], []);
+        
+      elseif nargin == 1
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%   one input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        if ischar(varargin{1})
+          %%%%%%%%%%  f = miir('foo.mat')   %%%%%%%%%%
+          %%%%%%%%%%  f = miir('foo.xml')   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from file %s', varargin{1});
+          obj = fromFile(obj, plist('filename', varargin{1}));
+          
+        elseif isstruct(varargin{1})
+          %%%%%%%%%%  f = miir(struct)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from struct');
+          obj = fromStruct(obj, varargin{1});
+          
+        elseif isa(varargin{1}, 'parfrac')
+          %%%%%%%%%%  f = miir(plist-object)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from parfrac');
+          obj = fromParfrac(obj, plist('parfrac', varargin{1}));
+          
+        elseif isa(varargin{1}, 'pzmodel')
+          %%%%%%%%%%  f = miir(pzmodel-object)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from pzmodel %s', varargin{1}.name);
+%           obj = fromPzmodel(obj, plist('pzmodel', varargin{1}));
+          obj = fromPzmodel(obj, varargin{1}, []); 
+          
+        elseif isa(varargin{1}, 'plist')
+          %%%%%%%%%%  f = miir(plist-object)   %%%%%%%%%%
+          pl       = varargin{1};
+          
+          % Selection of construction method
+          if pl.isparam('filename')
+            utils.helper.msg(msg.OPROC1, 'constructing from file %s', pl.find('filename'));
+            obj = fromFile(obj, pl);
+            
+          elseif pl.isparam('hostname') || pl.isparam('conn')
+            utils.helper.msg(msg.OPROC1, 'constructing from repository %s', pl.find('hostname'));
+            obj = obj.fromRepository(pl);
+            
+          elseif pl.isparam('delay')
+            
+            utils.helper.msg(msg.OPROC1, 'constructing allpass');
+            obj = fromAllpass(obj, pl);
+            
+          elseif pl.isparam('type')
+            utils.helper.msg(msg.OPROC1, 'constructing from standard %s', pl.find('type'));
+            obj = fromStandard(obj, pl);
+            
+          elseif pl.isparam('pzmodel')
+            utils.helper.msg(msg.OPROC1, 'constructing from pzmodel');
+            obj = fromPzmodel(obj, [], pl);
+%             obj = fromPzmodel(obj, pl);
+            
+          elseif pl.isparam('a')
+            utils.helper.msg(msg.OPROC1, 'constructing from A/B coefficients');
+            obj = fromAB(obj, pl);
+            
+          elseif pl.isparam('parfrac')
+            utils.helper.msg(msg.OPROC1, 'constructing from parfrac object');
+            obj = fromParfrac(obj, pl);
+            
+          elseif pl.isparam('built-in')
+            utils.helper.msg(msg.OPROC1, 'constructing from built-in model');
+            obj = fromModel(obj, pl);
+            
+          elseif pl.isparam('plist')
+            %--- Construct from plist
+            % if the plist is empty, we return an empty MIIR
+            ipl = find(pl, 'plist');
+            if nparams(ipl) == 0
+              obj = miir();
+            else
+              % do plist constructor
+              obj = miir(ipl);
+            end
+            
+          else
+            obj.setObjectProperties(pl);
+            obj.addHistory(miir.getInfo('miir', 'None'), pl, [], []);
+          end
+          
+        else
+          error('### Unknown single argument constructor.');
+        end
+      elseif nargin == 2
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%   two input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        if isa(varargin{1}, 'pzmodel') && isa(varargin{2}, 'plist')
+          %%%%%%%%%%  f = miir(pzmodel-object, plist-object)   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'constructing from pzmodel %s', varargin{1}.name);
+%           obj = fromPzmodel(obj, combine(plist('pzmodel', varargin{1}), varargin{2}));
+          obj = fromPzmodel(obj, varargin{1}, varargin{2});
+          
+        elseif (isa(varargin{1}, 'miir') || isa(varargin{1}, 'parfrac')) && isa(varargin{2}, 'plist') &&  isempty(varargin{2}.params)
+          %%%%%%%%%%  f = miir(miir-object,    <empty plist>)   %%%%%%%%%%
+          %%%%%%%%%%  f = miir(parfrac-object, <empty plist>)   %%%%%%%%%%
+          % pass to copy constructor
+          obj = miir(varargin{1});
+          
+        elseif (isa(varargin{1}, 'parfrac')) && isa(varargin{2}, 'plist') &&  ~isempty(varargin{2}.params)
+          %%%%%%%%%%  f = miir(parfrac-object, plist-object)   %%%%%%%%%%
+          plf = combine(plist('parfrac', varargin{1}),varargin{2});
+          obj =  fromParfrac(obj, plf);
+          
+        elseif (isa(varargin{1}, 'database') || isa(varargin{1}, 'mpipeline.repository.RepositoryConnection')) && isnumeric(varargin{2})
+          %%%%%%%%%%  f = miir(<database-object>, [IDs])   %%%%%%%%%%
+          utils.helper.msg(msg.OPROC1, 'retrieve from repository');
+          obj = obj.fromRepository(plist('conn', varargin{1}, 'id', varargin{2}));
+          
+        elseif isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ...
+            isa(varargin{2}, 'history')
+          %%%%%%%%%%   obj = miir(DOM node, history-objects)   %%%%%%%%%%
+          obj = fromDom(obj, varargin{1}, varargin{2});
+          
+        elseif isa(varargin{1}, 'ltpda_uoh') && isa(varargin{2}, 'plist')
+          %%%%%%%%%%%   miir(<ltpda_uoh>-object, plist-object)   %%%%%%%%%%
+          % always recreate from plist
+          
+          % If we are trying to load from file, and the file exists, do
+          % that. Otherwise, copy the input object.
+          if varargin{2}.isparam('filename')
+            if exist(fullfile('.', find(varargin{2}, 'filename')), 'file')==2
+              obj = miir(varargin{2});
+            else
+              obj = miir(varargin{1});
+            end
+          else
+            obj = miir(varargin{2});
+          end
+        else
+          error('### Unknown 2 argument constructor.');
+        end
+        
+      elseif nargin == 3
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%   three input   %%%%%%%%%%%%%%%%%%%%%%%%%%
+        %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        
+        utils.helper.msg(msg.OPROC1, 'constructing from A/B coefficients');
+        %%%%%%%%%%  f = miir(a, b, fs)   %%%%%%%%%%
+        % a,b,fs constructor
+        obj = fromAB(obj, plist('a', varargin{1}, 'b', varargin{2}, 'fs', varargin{3}));
+      else
+        [iirs, invars, rest] = utils.helper.collect_objects(args, 'miir');
+        
+        %%% Do we have a list of MIIR objects as input
+        if ~isempty(iirs) && isempty(rest)
+          obj = miir(iirs);
+        else
+          error('### Unknown number of constructor arguments.');
+        end
+      end
+    end % End constructor
+    
+  end % End public methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Methods (static)                               %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Static)
+    
+    function mdls = getBuiltInModels(varargin)
+      mdls = ltpda_uo.getBuiltInModels('miir');
+    end
+    
+    function out = VEROUT()
+      out = '$Id: miir.m,v 1.130 2011/08/15 12:22:57 hewitson Exp $';
+    end
+    
+    function ii = getInfo(varargin)
+      ii = utils.helper.generic_getInfo(varargin{:}, 'miir');
+    end
+    
+    function out = SETS()
+      out = [SETS@ltpda_uoh,    ...
+        {'From LISO File'},     ...
+        {'From Standard Type'}, ...
+        {'Allpass'}, ...
+        {'From Parfrac'},       ...
+        {'From Pzmodel'},       ...
+        {'From AB'}];
+    end
+    
+    function plout = getDefaultPlist(set)
+      persistent pl;
+      persistent lastset;
+      if exist('pl', 'var')==0 || isempty(pl) || ~strcmp(lastset, set)
+        pl = miir.buildplist(set);
+        lastset = set;
+      end
+      plout = pl;
+    end
+    
+    function out = buildplist(set)
+      
+      if ~utils.helper.ismember(lower(miir.SETS), lower(set))
+        error('### Unknown set [%s]', set);
+      end
+      
+      out = plist();
+      out = miir.addGlobalKeys(out);
+      out = buildplist@ltpda_uoh(out, set);
+      
+      switch lower(set)
+        case 'allpass'
+          
+          % Delay
+          p = param({'delay','The allpass delay.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % N
+          p = param({'N','The filter order.'}, paramValue.DOUBLE_VALUE(1));
+          out.append(p);
+          
+          % Method
+          p = param({'method','The method for generating the filter.'}, {1, {'thirlen'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % Iunits
+          p = param({'iunits','The input units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Ounits
+          p = param({'ounits','The output units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+        case 'from ab'
+          
+          % A
+          p = param({'a','Set of numerator coefficients.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % B
+          p = param({'b','Set of denominator coefficients.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','The sampling frequency to design for.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Iunits
+          p = param({'iunits','The input units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Ounits
+          p = param({'ounits','The output units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+        case 'from standard type'
+          
+          % Type
+          p = param({'type','Choose the filter type.'}, {2, {'highpass', 'lowpass', 'bandpass', 'bandreject'}, paramValue.SINGLE});
+          out.append(p);
+          
+          % Fc
+          p = param({'fc','The roll-off frequency [Hz].'},  paramValue.DOUBLE_VALUE(0.1));
+          out.append(p);
+          
+          % Gain
+          p = param({'gain','The gain of the filter.'},  paramValue.DOUBLE_VALUE(1));
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','The sampling frequency to design for.'}, paramValue.DOUBLE_VALUE(1));
+          out.append(p);
+          
+          % Order
+          p = param({'order', 'The filter order.'}, paramValue.DOUBLE_VALUE(1));
+          out.append(p);
+          
+          % Ripple
+          p = param({'ripple', 'Pass/stop-band ripple (%) for bandpass and bandreject filters.'}, paramValue.DOUBLE_VALUE(0.5));
+          out.append(p);
+          
+%           % Win
+%           p = param({'win', 'A window to design with.'}, paramValue.WINDOW);
+%           out.append(p);
+%           
+          % Iunits
+          p = param({'iunits','The input units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Ounits
+          p = param({'ounits','The output units of the filter.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+        case 'from parfrac'
+          
+          % Parfrac
+          p = param({'parfrac','Parfrac object to design from.'}, {1, {parfrac}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','The sampling frequency to design for.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Iunits
+          p = param({'iunits','The input units of the transfer function.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Ounits
+          p = param({'ounits','The output units of the transfer function.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+        case 'from pzmodel'
+          
+          % pzmodel
+          p = param({'pzmodel','Pole/zero model object to design from.'}, {1, {pzmodel}, paramValue.OPTIONAL});
+          out.append(p);
+          
+          % Fs
+          p = param({'fs','The sampling frequency to design for.'}, paramValue.EMPTY_DOUBLE);
+          out.append(p);
+          
+          % Iunits
+          p = param({'iunits','The input units of the transfer function.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+          % Ounits
+          p = param({'ounits','The output units of the transfer function.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+          
+        case 'from liso file'
+          
+          % Filename
+          p = param({'filename','LISO filename.'}, paramValue.EMPTY_STRING);
+          out.append(p);
+      end
+    end % function out = getDefaultPlist(varargin)
+    
+    function obj = initObjectWithSize(n,m)
+      obj = miir.newarray([n m]);
+    end
+    
+  end % End static methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, private)                         %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static, Access=private)
+    
+    f   = filload(filename)
+    plo = parseFilterParams(pl)
+    
+  end % End static, private methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, hidden)                          % 
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Hidden = true)
+    varargout = loadobj(varargin)
+    varargout = update_struct(varargin);
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (public)                             %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    varargout = char(varargin);
+    varargout = copy(varargin)
+    varargout = display(varargin);
+    
+    varargout = setHistin(varargin)
+    varargout = setB(varargin)
+    varargout = redesign(varargin)
+  end
+  
+  methods (Hidden = true)
+    varargout = attachToDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (protected)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = protected)
+    varargout = fromLISO(varargin)
+    varargout = fromStruct(varargin)
+    varargout = fromDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                               Methods (private)                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = private)
+    varargout = fromPzmodel(varargin)
+    f = fromParfrac(f, pli)
+    f = fromAB(f, pli)
+    f = fromStandard(f, pli)
+    
+    f = mklowpass(f, pl)
+    f = mkhighpass(f, pl)
+    f = mkbandpass(f, pl)
+    f = mkbandreject(f, pl)
+  end
+  
+end % End classdef
+
+% END
+
+% Parameter sets for plist constructor (in order of priority):
+%
+% From XML File
+% -------------
+%
+%   Construct an MIIR by loading it from an XML file.
+%
+%   'filename' - construct an MIIR from a filename.
+%                Example: plist('filename', 'm1.xml')
+%                [default: empty string]
+%
+% From MAT File
+% -------------
+%
+%   Construct an MIIR by loading it from a MAT file.
+%
+%   'filename' - construct an MIIR from a filename.
+%                Example: plist('filename', 'm1.mat')
+%                [default: empty string]
+%
+% From LISO File
+% --------------
+%
+%   Construct an MIIR by loading it from a LISO file.
+%
+%   'filename' - construct an MIIR from a filename.
+%                Example: plist('filename', 'm1.fil')
+%                [default: empty string]
+%
+% From Repository
+% ---------------
+%
+%   Construct an MIIR by retrieving it from an LTPDA repository.
+%
+%   'Hostname' - the repository hostname. Only those objects which
+%                are MIIRs are returned.
+%                [default: 'localhost'];
+%
+%                Additional parameters:
+%                'Database'   - The database name [default: 'ltpda']
+%                'ID'         - A vector of object IDs. [default: []]
+%                'CID'        - Retrieve all MIIR objects from a particular
+%                               collection.
+%                'Binary'     - Set to 'yes' to retrieve from stored binary
+%                               representation (not always available).
+%
+% From AB
+% -------
+%
+%   Construct an MIIR from the A and B coefficients.
+%
+%   'a'    - vector of A coefficients (see note ** below) [default: empty]
+%   'b'    - vector of B coefficients (see note ** below) [default: empty]
+%   'fs'   - sampling frequency of the filter [default: empty]
+%   'name' - name of filter [default: 'None']
+%
+%
+% From Standard Type
+% ------------------
+%
+%   Construct an MIIR of a standard type.
+%
+%   'type'    - one of the types: 'highpass', 'lowpass',
+%               'bandpass', 'bandreject'            [default: 'lowpass']
+%
+%                You can also specify optional parameters:
+%                   'gain'   - the gain of the filter [default: 1]
+%                   'fc'     - the roll-off frequency    [default: 0.1 Hz]
+%                   'fs'     - the sampling frequency to design for [default: 1 Hz]
+%                   'order'  - the filter order [default: 1]
+%                   'ripple' - pass/stop-band ripple for bandpass
+%                              and bandreject filters [default: 0.5]
+%                   'iunits' - the input unit of the filter
+%                   'ounits' - the output unit of the filter
+%
+% From Parfrac
+% ------------
+%
+%   Construct an MIIR from a parfrac.
+%
+%   'parfrac'    - a parfrac object to construct the filters from [default: empty parfrac]
+%   'fs'         - sample rate for the filter(s)
+%
+% From Pzmodel
+% ------------
+%
+%   Construct an MIIR from a pzmodel.
+%
+%   'pzmodel'    - a pzmodel object to construct the filter from [default: empty pzmodel]
+%   'fs'         - sample rate for the filter
+%
+% From Plist
+% ----------
+%
+%   'Plist'    - construct from a plist. The value passed should be a plist
+%                object.
+%                [default: empty plist]