www.gusucode.com > signal 工具箱matlab源码程序 > signal/+fdesign/@abstracttype/superdesign.m
function varargout = superdesign(this, method, varargin) %SUPERDESIGN Design the filter. % This method is used to enable subclasses that overwrite design method to % call design method of the super class. % Copyright 2009-2011 The MathWorks, Inc. % This should be a private method. if nargin > 1 && strcmpi(method,'systemobject') method = 'default'; varargin = [{'SystemObject'} varargin]; end sysObjArgs = {}; sysObjArgsDesign = {}; if nargin < 2 method = 'default'; else [varargin sysObjFlag] = parsesysobj(this,'design',varargin{:}); if sysObjFlag % Need sysObjArgs since methods might not take SystemObject as an % argument depending on the license. sysObjArgs = {'SystemObject',sysObjFlag}; if ~isempty(varargin) && isstruct(varargin{1}) % Cannot pass a structure and pv-pairs to the design method. So % just add the SystemObject field if options are in structure form % and leave sysObjArgsDesign empty. varargin{1}.SystemObject = true; else sysObjArgsDesign = {'SystemObject',sysObjFlag}; end end validflags = {'all', 'allfir', 'alliir', 'default', 'fir', 'iir'}; if ~isdesignmethod(this, method) && ~any(strcmpi(method, validflags)) varargin = [{method}, varargin]; method = 'default'; end end method = lower(method); switch method case 'all' d = designmethods(this,sysObjArgs{:}); Hd = {}; for indx = 1:length(d) try Hd{end+1} = feval(d{indx}, this, sysObjArgs{:}); %#ok<AGROW> catch me %#ok<NASGU> warning(message('signal:fdesign:abstracttype:superdesign:FailedDesign', d{ indx })); end end if ~sysObjFlag Hd = [Hd{:}]; end varargout = {Hd}; case {'alliir', 'allfir'} d = designmethods(this, method(4:end),sysObjArgs{:}); if isempty(d) error(message('signal:fdesign:abstracttype:superdesign:invalidMethod', upper( method( 4:end ) ), this.SpecificationType)); end Hd = {}; for indx = 1:length(d) try Hd{end+1} = feval(d{indx}, this,sysObjArgs{:}); %#ok<AGROW> catch me %#ok<NASGU> warning(message('signal:fdesign:abstracttype:superdesign:FailedDesign', d{ indx })); end end if ~sysObjFlag Hd = [Hd{:}]; end varargout = {Hd}; case 'default' d = defaultmethod(this); if nargin > 1 && ~isempty(varargin) && ~isstruct(varargin{1}) && ~isnumeric(varargin{1}) && ... ~any(strcmpi(fieldnames(designopts(this,d)),varargin{1})), % An invalid method was specified error(message('signal:fdesign:abstracttype:superdesign:invalidDesignMethod', varargin{ 1 })); end if nargin > 1 && ~isempty(varargin) && rem(length(varargin),2) && ~isstruct(varargin{1}) ... && ~isnumeric(varargin{1}), error(message('signal:fdesign:abstracttype:superdesign:invalidPVpairs')); end Hd = feval(d, this, varargin{:},sysObjArgsDesign{:}); varargout = {Hd}; case {'fir', 'iir'} d = designmethods(this, method,sysObjArgs{:}); if isempty(d) error(message('signal:fdesign:abstracttype:superdesign:invalidMethod', upper( method ), this.SpecificationType)); end if strcmpi(method, 'fir') && any(strcmpi(d, 'equiripple')) d = 'equiripple'; elseif strcmpi(method, 'iir') && any(strcmpi(d, 'ellip')) d = 'ellip'; else d = d{1}; end Hd = feval(d, this,sysObjArgs{:}); varargout = {Hd}; otherwise % hiddenmethods is there for backwards compatibility (for example % butter needs to work for 'N,Fc' (lowpass) although it is no % longer a valid designmethod (we changed it to 'N,F3dB')) if any(strcmpi(method, designmethods(this))) || ... any(strcmpi(method, hiddenmethods(this))) % Check for valid p-v pairs, but first remove any possible % options structure if nargin > 2, args = varargin; for k = 1:length(args), if isstruct(args{k}), args(k) = []; end end if rem(length(args),2) && ~isnumeric(args{1}), error(message('signal:fdesign:abstracttype:superdesign:invalidPVpairs')); end end Hd = feval(method, this, varargin{:},sysObjArgsDesign{:}); varargout = {Hd}; if any(strcmpi(method, hiddenmethods(this))), warning(message('signal:fdesign:abstracttype:superdesign:Obsolete', 'butter', 'butter', 'Fc', 'F3dB')); end else error(message('signal:fdesign:abstracttype:superdesign:invalidDesign', upper( method ), this.Specification)); end end if ~nargout Hd = varargout{1}; varargout = {}; if this.NormalizedFrequency, inputs = {'NormalizedFrequency', 'On'}; else inputs = {'Fs', this.Fs}; end inputs = [inputs, {'DesignMask', 'on'}]; h = fvtool(Hd, inputs{:}); switch method case 'all' strs = designmethods(this, 'all', 'full'); case {'allfir', 'alliir'} strs = designmethods(this, method(4:end), 'full'); otherwise strs = {}; end if ~isempty(strs), legend(h, strs{:}); end end % [EOF]