Home > classes > @miir > miir.m

miir

PURPOSE ^

MIIR IIR filter object class constructor.

SYNOPSIS ^

function f = miir(varargin)

DESCRIPTION ^

 MIIR IIR filter object class constructor.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

 DESCRIPTION: MIIR IIR filter object class constructor.
              Create an miir object.

 CONSTRUCTOR: f = miir()
                  creates an empty miir object.

              f = miir(fi)
                  creates a copy of the input miir object, fi.

              f = miir('foo_iir.fil')
                  create an miir object from a LISO IIR .fil file.

              f = miir(pl)
                  create an miir object from the description
                  given in the parameter list.

 Parameters for standard filters:

              'type'   - 'highpass', 'lowpass',
                         'bandpass', 'bandreject'.
                         <<default: 'lowpass'>>
              'gain'   - gain of filter
                         <<default: 1.0>>
              'fs'     - sample frequency to design for
                         <<default: 1Hz>>
              'order'  - order of filter
                         <<default: 1>>
              'fc'     - corner frequencies.
                         This is a two element vector for bandpass
                         and bandreject filters.
                         <<default: 0.25 or [0.1 0.3]>>
              'ripple' - Specify pass/stop-band ripple for bandpass
                         and bandreject filters
                         <<default: 0.5>>

 EXAMPLE 1:   Create a default lowpass filter.

              >> f = miir(plist())

 EXAMPLE 2:   Create an order 1 highpass filter with high frequency gain 2.
              Filter is designed for 1kHz sampled data and has a cut-off
              frequency of 200Hz.

              >> pl = plist();
              >> pl = append(pl, param('type', 'highpass'))
              >> pl = append(pl, param('gain', 2.0))
              >> pl = append(pl, param('fs', 1000))
              >> pl = append(pl, param('fc', 200))
              >> f = miir(pl)

 VERSION:     $Id: miir.m,v 1.22 2008/01/15 20:31:35 hewitson Exp $

 HISTORY:     09-02-2007 M Hewitson
                 Creation

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SUBFUNCTIONS ^

SOURCE CODE ^

0001 function f = miir(varargin)
0002 % MIIR IIR filter object class constructor.
0003 %
0004 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0005 %
0006 % DESCRIPTION: MIIR IIR filter object class constructor.
0007 %              Create an miir object.
0008 %
0009 % CONSTRUCTOR: f = miir()
0010 %                  creates an empty miir object.
0011 %
0012 %              f = miir(fi)
0013 %                  creates a copy of the input miir object, fi.
0014 %
0015 %              f = miir('foo_iir.fil')
0016 %                  create an miir object from a LISO IIR .fil file.
0017 %
0018 %              f = miir(pl)
0019 %                  create an miir object from the description
0020 %                  given in the parameter list.
0021 %
0022 % Parameters for standard filters:
0023 %
0024 %              'type'   - 'highpass', 'lowpass',
0025 %                         'bandpass', 'bandreject'.
0026 %                         <<default: 'lowpass'>>
0027 %              'gain'   - gain of filter
0028 %                         <<default: 1.0>>
0029 %              'fs'     - sample frequency to design for
0030 %                         <<default: 1Hz>>
0031 %              'order'  - order of filter
0032 %                         <<default: 1>>
0033 %              'fc'     - corner frequencies.
0034 %                         This is a two element vector for bandpass
0035 %                         and bandreject filters.
0036 %                         <<default: 0.25 or [0.1 0.3]>>
0037 %              'ripple' - Specify pass/stop-band ripple for bandpass
0038 %                         and bandreject filters
0039 %                         <<default: 0.5>>
0040 %
0041 % EXAMPLE 1:   Create a default lowpass filter.
0042 %
0043 %              >> f = miir(plist())
0044 %
0045 % EXAMPLE 2:   Create an order 1 highpass filter with high frequency gain 2.
0046 %              Filter is designed for 1kHz sampled data and has a cut-off
0047 %              frequency of 200Hz.
0048 %
0049 %              >> pl = plist();
0050 %              >> pl = append(pl, param('type', 'highpass'))
0051 %              >> pl = append(pl, param('gain', 2.0))
0052 %              >> pl = append(pl, param('fs', 1000))
0053 %              >> pl = append(pl, param('fc', 200))
0054 %              >> f = miir(pl)
0055 %
0056 % VERSION:     $Id: miir.m,v 1.22 2008/01/15 20:31:35 hewitson Exp $
0057 %
0058 % HISTORY:     09-02-2007 M Hewitson
0059 %                 Creation
0060 %
0061 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0062 
0063 VERSION  = '$Id: miir.m,v 1.22 2008/01/15 20:31:35 hewitson Exp $';
0064 
0065 %%%%%   Is this a 'Params' call?     %%%%%
0066 if  nargin == 2 && isa(varargin{1}, 'miir') && ischar(varargin{2})
0067   if strcmp(varargin{2}, 'Params')
0068     f = plist;
0069     return
0070   elseif strcmp(varargin{2}, 'Version')
0071     f = VERSION;
0072     return
0073   end
0074 end
0075 
0076 %%%%%%%%%%%%%%%%%%%%%%%%   define miir properties   %%%%%%%%%%%%%%%%%%%%%%%%%
0077 
0078   function f = init()
0079     f.name    = 'None';
0080     f.fs      = 0;
0081     f.ntaps   = 0;
0082     f.a       = [];
0083     f.b       = [];
0084     f.gain    = 0;
0085     f.histin  = [];
0086     f.histout = [];
0087     f.infile  = '';
0088     f.plist   = plist();
0089     f.created = time;
0090     f.version = VERSION;
0091     f = class(f, 'miir');
0092   end
0093 
0094 %%%%%%%%%%%%%%%%%%%%%%%%%%   Create miir object   %%%%%%%%%%%%%%%%%%%%%%%%%%%
0095 
0096 switch nargin
0097 
0098   %%%%%%%%%%  h = miir()   %%%%%%%%%%
0099   % create default miir object
0100   case 0
0101     f = init();
0102 
0103   % Copy, LISO, filt, standard
0104   case 1
0105 
0106     %%%%%%%%%% Create from XML fragment %%%%%%%%%%%
0107     if isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl')
0108       f = fromxml(varargin{1});
0109     %%%%%%%%%%%% From File %%%%%%%%%%%%%
0110     elseif ischar(varargin{1})
0111 
0112       f = init();
0113       filename = varargin{1};
0114       [path, name, ext, vers] = fileparts(filename);
0115       switch ext
0116         case '.mat'
0117           f = load(filename);
0118           f = f.a;
0119         case '.xml'
0120           f = xmlparse(miir, filename);
0121         case '.filt'
0122           error('### .filt files are no longer supported.');
0123           % filt      = mfiltload(filename);
0124           % f.name    = filt.name;
0125           % f.fs      = filt.fs;
0126           % f.ntaps   = filt.ntaps;
0127           % f.a       = filt.a;
0128           % f.b       = filt.b;
0129           % f.gain    = filt.gain;
0130           % f.histin  = filt.histin;
0131           % f.histout = filt.histout;
0132           % f.infile  = filename;
0133         case '.fil'
0134           filt       = filload(filename);
0135           f.name     = filt.name;
0136           f.fs       = filt.fs;
0137           f.ntaps    = filt.ntaps;
0138           f.a        = filt.a;
0139           f.b        = filt.b;
0140           f.gain     = filt.gain;
0141           f.histin   = filt.histin;
0142           f.histout  = filt.histout;
0143           f.infile   = filename;
0144         otherwise
0145           error('### Unknown file type.');
0146       end
0147 
0148     %%%%%%%%%%  h = miir(miir)   %%%%%%%%%%
0149     % copy
0150     elseif isa(varargin{1}, 'miir')
0151       f = varargin{1};
0152       f.version = VERSION;
0153 
0154     %%%%%%%%%%  h = miir(struct)   %%%%%%%%%%
0155     % Struct
0156     elseif isstruct(varargin{1})
0157 
0158       f = init();
0159 
0160       fields = fieldnames(varargin{1});
0161       for ii = 1:length(fields)
0162         field = fields{ii};
0163 
0164         %%% plist -> plist-object
0165         if strcmp(field, 'plist')
0166           if isstruct(varargin{1}.(field))
0167             f.(field) = plist(varargin{1}.(field));
0168           else
0169             f.(field) = varargin{1}.(field);
0170           end
0171         %%% created -> time-object
0172         elseif strcmp(field, 'created')
0173           created = varargin{1}.created;
0174           if isstruct(created)
0175             created = time(created);
0176           end
0177           f.created     = created;
0178         %%% All other
0179         else
0180           try
0181             f.(field) = varargin{1}.(field);
0182           catch
0183             error('### The field ''%s'' in the struct is not a mfir property.', field)
0184           end
0185         end
0186       end
0187 
0188 
0189     %%%%%%%%%%  h = miir(plist)   %%%%%%%%%%
0190     % Parameter list
0191     elseif isa(varargin{1}, 'plist')
0192 
0193       pl   = varargin{1};
0194       type = find(pl, 'type');
0195       pzm  = find(pl, 'pzmodel');
0196 
0197       f = init();
0198 
0199       % deal with empty plist
0200       if isempty(type) && isempty(pzm)
0201         type = 'lowpass';
0202       end
0203 
0204       if ~isempty(type)
0205         % check and fill parameter list
0206         plo = parseFilterParams(pl);
0207         switch type
0208           case 'lowpass'
0209             f = mklowpass(f, plo);
0210           case 'highpass'
0211             f = mkhighpass(f, plo);
0212           case 'bandpass'
0213             f = mkbandpass(f, plo);
0214           case 'bandreject'
0215             f = mkbandreject(f, plo);
0216           otherwise
0217             error('### unknown standard filter type in miir constructor.');
0218         end
0219         f.infile  = '';
0220         f.plist   = plo;
0221 
0222       elseif ~isempty(pzm)
0223 
0224         f = init();
0225 
0226         fs = find(pl, 'fs');
0227         if isempty(fs)
0228           % get max freq in pzmodel
0229           fs = 8*getupperFreq(pzm);
0230           warning([sprintf('!!! no sample rate specified. Designing for fs=%2.2fHz.', fs)...
0231                    sprintf('\nThe filter will be redesigned later when used.')]);
0232 
0233         end
0234         % make MIIR filter
0235         f = tomiir(pzm, fs);
0236         f = set(f, 'name', get(pzm, 'name'));
0237         f = set(f, 'plist', pl);
0238 
0239       else
0240         error('### unknown constructor type for miir.');
0241       end
0242     else
0243       error('### unknown constructor type for miir.');
0244     end
0245 
0246   %%%%%%%%%%  h = miir(pzmodel, plist)   %%%%%%%%%%
0247   case 2 % pzmodel followed by plist
0248 
0249   %%%%%%%%%%% From DATABASE
0250   if isa(varargin{1}, 'database')
0251     f = retrieve(varargin{1}, varargin{2:end});
0252   else
0253     pzm = varargin{1};
0254     if ~isa(pzm, 'pzmodel')
0255       error('### unknown constructor type for miir.');
0256     end
0257     pl = varargin{2};
0258     if ~isa(pl, 'plist')
0259       error('### unknown constructor type for miir.');
0260     end
0261 
0262     pl = append(pl, param('pzmodel', pzm));
0263 
0264     f = miir(pl);
0265   end
0266 
0267   %%%%%%%%%%  h = miir(a, b, fs)   %%%%%%%%%%
0268   case 3
0269 
0270     % then we have 3 numeric inputs for a and b coefficients and fs
0271     a  = varargin{1};
0272     b  = varargin{2};
0273     fs = varargin{3};
0274     if ~isnumeric(a) || ~isnumeric(b) || ~isnumeric(fs)
0275       error('### unknown constructor type for miir.');
0276     end
0277 
0278     f         = init();
0279     f.name    = 'AB';
0280     f.fs      = fs;
0281     f.ntaps   = length(a);
0282     f.a       = a;
0283     f.b       = b;
0284     f.gain    = 1;
0285     f.histin  = zeros(1,f.ntaps-1);       % initialise input history
0286     f.histout = zeros(1,f.ntaps-1);       % initialise output history
0287 
0288   otherwise
0289     error('### incorrect input arguments for miir constructor.');
0290 end
0291 
0292 end % function f = miir(varargin)
0293

Generated on Tue 22-Jan-2008 10:39:13 by m2html © 2003