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

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/@pz/pz.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,297 @@
+% PZ is the ltpda class that provides a common definition of poles and zeros.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: PZ is the ltpda class that provides a common definition of
+%              poles and zeros.
+%
+% SUPERCLASSES: ltpda_nuo < ltpda_obj
+%
+% CONSTRUCTORS:
+%
+%          p = pz(f)        % specify frequency
+%          p = pz(f,q)      % specify frequency and Q
+%          p = pz(c)        % create with complex representation
+%          p = pz({[f,q]})
+%          p = pz({[f1,q1], f2, [f3, q3]})   -> creates three objects
+%
+% VERSION:  $Id: pz.m,v 1.48 2011/11/02 06:41:17 hewitson Exp $
+%
+% SEE ALSO: ltpda_obj, ltpda_nuo, pzmodel
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+classdef (Hidden = true) pz < ltpda_nuo
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Property definition                            %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  %---------- Public (read/write) Properties  ----------
+  properties
+  end
+  
+  %---------- Protected read-only Properties ----------
+  properties (SetAccess = protected)
+    f       = NaN; % frequency of pole/zero
+    q       = NaN; % quality factor of pole/zero
+    ri      = NaN; % complex representation of pole/zero
+  end
+  
+  %---------- Private Properties ----------
+  properties (GetAccess = protected, SetAccess = protected)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Check property setting                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function set.f(obj, val)
+      if ~isnumeric(val) || isempty(val) || ~isreal(val)
+        error('### The value for the property ''f'' must be a real positive number');
+      end
+      obj.f = val;
+    end
+    function set.q(obj, val)
+      if ~isnumeric(val) || isempty(val) || ~isreal(val)
+        error('### The value for the property ''q'' must be a real positive number');
+      end
+      obj.q = val;
+    end
+    function set.ri(obj, val)
+      if ~isnumeric(val) || isempty(val)
+        error('### The value for the property ''ri'' must be a number');
+      end
+      % Have 'ri' always as a column vector
+      if size(val,2) ~= 1
+        val = val.';
+      end
+      obj.ri = val;
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                                Constructor                                %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function obj = pz(varargin)
+      
+      switch nargin
+        case 0
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   no inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+        case 1
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   one input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if isa(varargin{1}, 'pz')
+            %%%%%%%%%%   Copy ltpda_obj Object           %%%%%%%%%%
+            %%%%%%%%%%   p1 = pz(pz-object)   %%%%%%%%%%
+            obj = copy(varargin{1}, 1);
+            
+          elseif isnumeric(varargin{1})
+            %%%%%%%%%%   real or complex pole/zero   %%%%%%%%%%
+            if isempty(varargin{1})
+              % do nothing
+            elseif length(varargin{1}) == 1
+              if isreal(varargin{1})
+                %%%%%%%%%%   p1 = pz(3)   %%%%%%%%%%
+                obj.setF(varargin{1});
+                obj.setQ(NaN);
+              else
+                %%%%%%%%%%   p1 = pz(1+3i)   %%%%%%%%%%
+                obj.setRI(varargin{1});
+                if (obj.q - 0.5) < 1e-10
+                  % if complex vale is Q = 0.5 return two equal real poles
+                  disp('!!! Q = 0.5! Returning two equal real poles/zeros;')
+                  obj.setQ(NaN);
+                  obj = [obj obj];
+                end
+              end
+            elseif length(varargin{1}) == 2
+              %%%%%%%%%%   p1 = pz([1 2])   %%%%%%%%%%
+              Q = varargin{1}(2);
+              if (Q>0.5)
+                obj.setF(varargin{1}(1));
+                obj.setQ(varargin{1}(2));
+              elseif (Q<=0.5 && Q>=0)
+                % interpret as 2 real poles
+                ffs = pz.fq2ri(varargin{1}(1), varargin{1}(2));
+                obj = [pz(ffs(1)/2/pi) pz(ffs(2)/2/pi)];
+              else
+                error('### Q must be a positive value');
+              end
+              
+            else
+              error('### Unknown constructor for the input %s', mat2str(varargin{1}));
+            end
+            
+          elseif isa(varargin{1}, 'plist')
+            %%%%%%%%%%   p1 = pz(plist-object)   %%%%%%%%%%
+            pl = varargin{1};
+            pl_f  = find(pl, 'f');
+            pl_q  = find(pl, 'q');
+            pl_ri = find(pl, 'ri');
+            if ~isempty(pl_f)
+              obj.setF(pl_f);
+              if ~isempty(pl_q)
+                obj.setQ(pl_q);
+              end
+            elseif ~isempty(pl_ri)
+              obj.setRI(pl_ri);
+            else
+              error('### Unknown plist constructor');
+            end
+            
+          elseif isstruct(varargin{1})
+            %%%%%%%%%%   p1 = pz(structure)   %%%%%%%%%%
+            obj = fromStruct(obj, varargin{1});
+            
+          elseif iscell(varargin{1})
+            %%%%%%%%%%   p1 = pz({[1 2], 1+2i, 3})   %%%%%%%%%%
+            if isempty(varargin{1})
+              return
+            end
+            
+            obj = pz.initObjectWithSize(size(varargin{1}));
+            for kk = 1:numel(varargin{1})
+              obj = [obj pz(varargin{1}{kk})];
+            end
+            
+          elseif ischar(varargin{1})
+            %%%%%%%%%%   p1 = pz('{[1 2], 1+2i, 3}')   %%%%%%%%%%
+            obj = feval('pz', eval(varargin{1}));
+            
+          else
+            error('### Unknown call of the pz constructor.');
+          end
+          
+        case 2
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   two inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if  isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ...
+              isa(varargin{2}, 'history')
+            %%%%%%%%%%   obj = pz(DOM node, history-objects)   %%%%%%%%%%
+            obj = fromDom(obj, varargin{1}, varargin{2});
+            
+          else
+            %%%%%%%%%%   obj = pz(f, q)   %%%%%%%%%%
+            % f,q constructor
+            obj.setF(varargin{1});
+            obj.setQ(varargin{2});
+          end
+        otherwise
+          error('### Unknown number of arguments.');
+      end
+      
+    end
+    
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (public)                             %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    varargout = cp2iir(varargin)
+    varargout = cz2iir(varargin)
+    varargout = rz2iir(varargin)
+    varargout = rp2iir(varargin)
+    varargout = copy(varargin)
+    varargout = string(varargin)
+    [f,r]     = resp(varargin)
+  end
+  
+  methods (Hidden = true)
+    varargout = attachToDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (protected)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = protected)
+    ii = setF(ii, val)
+    ii = setQ(ii, val)
+    ii = setRI(ii, val)
+    
+    varargout = fromStruct(varargin)
+    varargout = fromDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (private)                            %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = private)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (static, protected)                  %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = protected, Static)
+    [f0, q] = ri2fq(c);
+    ri      = fq2ri(f0, Q);
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Methods (Static, Private)                        %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Access = private)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (static)                             %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static)
+    
+    function out = VEROUT()
+      out = '$Id: pz.m,v 1.48 2011/11/02 06:41:17 hewitson Exp $';
+    end
+    
+    function ii = getInfo(varargin)
+      ii = utils.helper.generic_getInfo(varargin{:}, 'pz');
+    end
+    
+    function out = SETS()
+      out = {'Default'};
+    end
+    
+    function out = getDefaultPlist(set)
+      switch lower(set)
+        case 'default'
+          out = plist();
+        otherwise
+          error('### Unknown set [%s]', set);
+      end
+    end
+    
+    function obj = initObjectWithSize(n,m)
+      if numel(n) > 1
+        obj = pz.newarray([n(1) n(2)]);
+      else
+        obj = pz.newarray([n m]);
+      end
+    end
+    
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, hidden)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Hidden = true)
+    varargout = loadobj(varargin)
+    varargout = update_struct(varargin);
+  end
+  
+end % End classdef