


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


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