0001 function f = mfir(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 ALGONAME = mfilename;
0052 VERSION = '$Id: mfir.m,v 1.14 2007/12/12 18:45:08 ingo Exp $';
0053
0054
0055 if nargin == 2 && isa(varargin{1}, 'mfir') && ischar(varargin{2})
0056 if strcmp(varargin{2}, 'Params')
0057 f = getDefaultPlist();
0058 return
0059 elseif strcmp(varargin{2}, 'Version')
0060 f = VERSION;
0061 return
0062 end
0063 end
0064
0065 switch nargin
0066
0067
0068
0069 case 0
0070 f = init(VERSION);
0071
0072
0073 case 1
0074
0075
0076 if isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl')
0077 f = fromxml(varargin{1});
0078
0079 elseif ischar(varargin{1})
0080
0081 filename = varargin{1};
0082 [path, name, ext, vers] = fileparts(filename);
0083 switch ext
0084 case '.mat'
0085 f = load(filename);
0086 f = f.a;
0087 case '.xml'
0088 f = xmlparse(mfir, filename);
0089 otherwise
0090 error('### Unknown file type.');
0091 end
0092
0093 elseif isa(varargin{1}, 'mfir')
0094 f = varargin{1};
0095 f.version = VERSION;
0096
0097
0098 elseif isa(varargin{1}, 'ao')
0099 pl = getDefaultPlist();
0100 f = mfirFromAO(ALGONAME, VERSION, varargin{1}, pl);
0101
0102
0103 elseif isstruct(varargin{1})
0104
0105 f = init(VERSION);
0106
0107 fields = fieldnames(varargin{1});
0108 for ii = 1:length(fields)
0109 field = fields{ii};
0110
0111
0112 if strcmp(field, 'plist')
0113 if isstruct(varargin{1}.(field))
0114 f.(field) = plist(varargin{1}.(field));
0115 else
0116 f.(field) = varargin{1}.(field);
0117 end
0118
0119 elseif strcmp(field, 'created')
0120 created = varargin{1}.created;
0121 if isstruct(created)
0122 created = time(created);
0123 end
0124 f.created = created;
0125
0126 else
0127 try
0128 f.(field) = varargin{1}.(field);
0129 catch
0130 error('### The field ''%s'' in the struct is not a mfir property.', field)
0131 end
0132 end
0133 end
0134
0135
0136
0137 elseif isa(varargin{1}, 'plist')
0138
0139 pl = varargin{1};
0140 type = find(pl, 'type');
0141 pzm = find(pl, 'pzmodel');
0142
0143 f = init(VERSION);
0144
0145
0146 if isempty(type) && isempty(pzm)
0147 type = 'lowpass';
0148 end
0149
0150 if ~isempty(type)
0151
0152 plo = parseFilterParams(pl);
0153 switch type
0154 case 'lowpass'
0155 f = mklowpass(f, plo);
0156 case 'highpass'
0157 f = mkhighpass(f, plo);
0158 case 'bandpass'
0159 f = mkbandpass(f, plo);
0160 case 'bandreject'
0161 f = mkbandreject(f, plo);
0162 otherwise
0163 error('### unknown standard filter type in miir constructor.');
0164 end
0165 f.infile = '';
0166 f.plist = plo;
0167 f.created = time;
0168 f.version = VERSION;
0169 elseif ~isempty(pzm)
0170
0171 fs = find(pl, 'fs');
0172 if isempty(fs)
0173
0174 fs = 8*getupperFreq(pzm);
0175 warning([sprintf('!!! no sample rate specified. Designing for fs=%2.2fHz.', fs)...
0176 sprintf('\nThe filter will be redesigned later when used.')]);
0177
0178 end
0179
0180 f = tomfir(pzm, plist('fs', fs));
0181 f = set(f, 'name', get(pzm, 'name'));
0182 f = set(f, 'plist', pl);
0183
0184 else
0185 error('### unknown constructor type for mfir.');
0186 end
0187 else
0188 error('### unknown constructor type for mfir.');
0189 end
0190
0191 case 2
0192
0193
0194
0195 if isa(varargin{1}, 'database')
0196 f = retrieve(varargin{1}, varargin{2:end});
0197
0198 elseif isa(varargin{1}, 'pzmodel')
0199 pzm = varargin{1};
0200 if ~isa(pzm, 'pzmodel')
0201 error('### unknown constructor type for mfir.');
0202 end
0203 pl = varargin{2};
0204 if ~isa(pl, 'plist')
0205 error('### unknown constructor type for mfir.');
0206 end
0207
0208 pl = append(pl, param('pzmodel', pzm));
0209
0210 f = mfir(pl);
0211
0212
0213 elseif isa(varargin{1}, 'ao')
0214
0215 if isa(varargin{2}, 'plist')
0216 pl = combine(varargin{2}, getDefaultPlist());
0217 else
0218 pl = getDefaultPlist();
0219 end
0220 f = mfirFromAO(ALGONAME, VERSION, varargin{1}, pl);
0221
0222 else
0223 error('### Unknown constructor method.');
0224 end
0225 otherwise
0226 error('### incorrect input arguments for miir constructor.');
0227 end
0228
0229 end
0230
0231
0232
0233 function filt = mfirFromAO(ALGONAME, VERSION, a, pl)
0234
0235
0236 if ~isa(a.data, 'fsdata')
0237 error('### Please use an analysis object with a fsdata data object to create a mfir object.');
0238 end
0239
0240 N = find(pl, 'N');
0241 win = find(pl, 'Win');
0242 method = find(pl, 'method');
0243
0244 fs = a.data.fs;
0245 f = a.data.x;
0246 xx = abs(a.data.y);
0247 g = 1;
0248
0249 ffm = f/(fs/2);
0250 switch method
0251 case 'frequency-sampling'
0252
0253 if length(win.win) ~= N+1
0254 warning('!!! resizing window function to match desired filter order.');
0255 if strcmp(win.name, 'Kaiser') || strcmp(win.name, 'Flattop')
0256 win = specwin(win.name, N+1, win.psll);
0257 else
0258 win = specwin(win.name, N+1);
0259 end
0260 end
0261 disp('** designing filter using frequency-sampling method [help fir2]');
0262 mtaps = fir2(N, ffm, xx, win.win);
0263 case 'least-squares'
0264 error('### this design method is not working properly yet.');
0265 if mod(length(ffm),2)
0266 ffm = ffm(1:end-1);
0267 xx = xx(1:end-1);
0268 end
0269 disp('** designing filter using least-squares method [help firls]');
0270 mtaps = firls(N, ffm, xx);
0271 case 'Parks-McClellan'
0272 error('### this design method is not working properly yet.');
0273 disp('** designing filter using Parks-McClellan method [help firpm]');
0274 mtaps = firpm(N, ffm, xx);
0275 otherwise
0276 error('### unknown filter design method.');
0277 end
0278
0279
0280 filt = init(VERSION);
0281 filt.name = sprintf('fir(%s)', a.name);
0282 filt.fs = fs;
0283 filt.ntaps = length(mtaps);
0284 filt.a = mtaps;
0285 filt.gd = (filt.ntaps+1)/2;
0286 filt.gain = g;
0287 filt.histout = zeros(1,filt.ntaps-1);
0288 filt.infile = '';
0289 filt.plist = plist();
0290 filt.created = time;
0291 filt.version = VERSION;
0292 end
0293
0294
0295
0296 function pl = getDefaultPlist()
0297
0298 N = 512;
0299 pl = plist(param('N', N));
0300 pl = append(pl, param('method', 'frequency-sampling'));
0301 pl = append(pl, param('Win', specwin('Hanning', N+1)));
0302
0303 end
0304
0305
0306
0307 function f = init(VERSION)
0308 f.name = 'None';
0309 f.fs = 0;
0310 f.ntaps = 0;
0311 f.a = [];
0312 f.gd = 0;
0313 f.gain = 0;
0314 f.histout = [];
0315 f.infile = '';
0316 f.plist = plist();
0317 f.created = time;
0318 f.version = VERSION;
0319 f = class(f, 'mfir');
0320 end
0321
0322