diff m-toolbox/classes/@tsdata/tsdata.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/@tsdata/tsdata.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,350 @@
+% TSDATA time-series object class constructor.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: TSDATA time-series object class constructor.
+%              Create a time-series data object. If the time-series object
+%              is determined to be evenly sampled, no x vector is stored.
+%
+% SUPER CLASSES: data2D < ltpda_data < ltpda_nuo < ltpda_obj
+%
+% CONSTRUCTORS:
+%
+%       ts = tsdata()        - creates a blank time-series object
+%       ts = tsdata(y)       - creates a time-series object with the given
+%                              y-data.
+%       ts = tsdata(x,y)     - creates a time-series object with the given
+%                              (x,y)-data. The sample rate is then set using
+%                              the private method fitfs(). This computes the
+%                              best sample rate that fits the data. If the
+%                              data is evenly sampled, the sample rate is set
+%                              as 1/median(diff(x)) and the x data is then
+%                              not stored (empty vector).
+%       ts = tsdata(y,fs)    - creates a time-series object with the given
+%                              y-data. The data is assumed to be evenly sampled
+%                              at the given sample rate with the first sample
+%                              assigned time 0. No x vector is created.
+%       ts = tsdata(y,t0)    - creates a time-series object with the given
+%                              y-data. The data are assumed to be evenly
+%                              sampled at 1Hz. The first sample is assumed to
+%                              be at 0s offset from t0 and t0 is set to the
+%                              user specified value.
+%       ts = tsdata(x,y,fs)  - creates a time-series object with the given
+%                              x/y data vectors. The sample rate is set to
+%                              fs.
+%       ts = tsdata(x,y,t0)  - creates a time-series object with the given
+%                              x/y data vectors. The t0 property is set to
+%                              the supplied t0 and the sample rate is
+%                              computed from the x vector using fitfs(). If
+%                              the data is found to be evenly sampled, the
+%                              x vector is discarded.
+%       ts = tsdata(y,fs,t0) - creates a time-series object with the given
+%                              y-data. The data are assumed to be evenly
+%                              sampled at fs and the first sample is
+%                              assumed to be taken at time t0. No x vector
+%                              is generated.
+%       ts = tsdata(x,y,fs,t0)-creates a time-series object with the given
+%                              x-data, y-data, fs and t0.
+%
+% VERSION:  $Id: tsdata.m,v 1.86 2011/11/04 21:11:48 mauro Exp $
+%
+% SEE ALSO: tsdata, fsdata, xydata, cdata, data2D, data3D, xyzdata
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+classdef (Hidden = true) tsdata < data2D
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Property definition                            %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  %---------- Public (read/write) Properties  ----------
+  properties
+  end
+  
+  %---------- Protected read-only Properties ----------
+  properties (GetAccess = public, SetAccess = protected)
+    t0      = time(0); % time-stamp of the first data sample in UTC format
+    toffset = 0;       % time offset from t0 to the first data sample in milliseconds
+    fs      = NaN;     % sample rate of data
+    nsecs   = 0;       % the length of this time-series in seconds
+  end
+  
+  %---------- Private Properties ----------
+  properties (GetAccess = protected, SetAccess = protected)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                          Check property setting                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function set.t0(obj, val)
+      if (~isa(val, 'time') && ~ischar(val) && ~isnumeric(val))|| isempty(val)
+        error('### The value for the property ''t0'' must be a string, a number or a time object');
+      end
+      if ischar(val) || isnumeric(val)
+        obj.t0 = time(val);
+      else
+        obj.t0 = val;
+      end
+    end
+    function set.fs(obj, val)
+      if ~isnumeric(val) || isempty(val) || ~isreal(val) || val < 0
+        error('### The value for the property ''fs'' must be a real positive number');
+      end
+      obj.fs = val;
+    end
+    function set.nsecs(obj, val)
+      if ~isnumeric(val) || isempty(val) || ~isreal(val) || val < 0
+        error('### The value for the property ''nsecs'' must be a real positive number');
+      end
+      obj.nsecs = val;
+    end
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                                Constructor                                %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods
+    function obj = tsdata(varargin)
+      
+      switch nargin
+        case 0
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   no inputs   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+        case 1
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   one input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if isa(varargin{1}, 'tsdata')
+            %%%%%%%%%%   data = tsdata(tsdata-object)   %%%%%%%%%%
+            %----------- Copy tsdata Object   %%%%%%%%%%
+            obj = copy(varargin{1}, 1);
+            
+          elseif isstruct(varargin{1})
+            %%%%%%%%%%   data = tsdata(struct)   %%%%%%%%%%
+            obj = fromStruct(obj, varargin{1});
+            
+          elseif isnumeric(varargin{1})
+            %%%%%%%%%%   data = tsdata(y-vector)   %%%%%%%%%%
+            %----------- y vector
+            obj.setY(varargin{1});
+            obj.fs = 1;
+            
+          else
+            error('### Unknown single argument constructor.');
+          end
+          
+        case 2
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%   two input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if numel(varargin{1}) > numel(varargin{2}) && numel(varargin{2}) == 1 && ~isa(varargin{2}, 'time')
+            %%%%%%%%%%   data = tsdata(y-vector, fs)   %%%%%%%%%%
+            % tsdata(y,fs)
+            obj.y  = varargin{1};
+            obj.fs = varargin{2};
+            
+          elseif isa(varargin{1}, 'org.apache.xerces.dom.DeferredElementImpl') && ...
+              isa(varargin{2}, 'history')
+            %%%%%%%%%%   obj = tsdata(DOM node, history-objects)   %%%%%%%%%%
+            obj = fromDom(obj, varargin{1}, varargin{2});
+            
+          elseif numel(varargin{1}) == numel(varargin{2})
+            %%%%%%%%%%   data = tsdata(x-vector, y-vector)   %%%%%%%%%%
+            % tsdata(x,y)
+            if numel(varargin{1}) > 1
+              [fs_fitfs,t0_fitfs,fitted] = tsdata.fitfs(varargin{1});
+              obj.fs = fs_fitfs;
+              if fitted
+                obj.setXY(varargin{1} - varargin{1}(1), varargin{2});
+              else
+                obj.setY(varargin{2});
+              end
+                obj.toffset = varargin{1}(1) * 1000;
+            else
+              obj.setXY(varargin{1} - varargin{1}(1), varargin{2});
+              obj.fs = 1;
+              t0_fitfs = 0;
+              obj.toffset = varargin{1}(1) * 1000;
+            end
+            obj.t0 = time(t0_fitfs);
+            
+          elseif isa(varargin{2}, 'time')
+            %%%%%%%%%%   data = tsdata(y-vector, t0)   %%%%%%%%%%
+            % tsdata(y,t0)
+            obj.setY(varargin{1});
+            obj.fs = 1;
+            obj.t0 = varargin{2};
+            
+          else
+            error('### Unknown two argument constructor.');
+          end
+        case 3
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%   three input   %%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if numel(varargin{1}) == numel(varargin{2}) && numel(varargin{3}) == 1 && ~isa(varargin{3}, 'time')
+            %%%%%%%%%%   data = tsdata(x-vector, y-vector, fs)   %%%%%%%%%%
+            % tsdata(x,y,fs)
+            obj.fs = varargin{3};
+            
+            [fs_fitfs,t0_fitfs,fitted] = tsdata.fitfs(varargin{1});
+            obj.t0 = t0_fitfs;
+            if fitted
+              obj.setXY(varargin{1} - varargin{1}(1), varargin{2});
+            else
+              if abs(fs_fitfs - obj.fs) > 2*eps(obj.fs)
+                error('The requested sample rate (%g) does not match the sample rate computed from the input x values (%g)', obj.fs, fs_fitfs);
+              end
+              obj.setY(varargin{2});
+            end
+            obj.toffset = varargin{1}(1) * 1000;
+            
+          elseif numel(varargin{1}) == numel(varargin{2}) && isa(varargin{3}, 'time')
+            %%%%%%%%%%   data = tsdata(x-vector, y-vector, t0)   %%%%%%%%%%
+            % tsdata(x,y,t0)
+            [fs_fitfs,t0_fitfs,fitted] = tsdata.fitfs(varargin{1});
+            obj.fs = fs_fitfs;
+            obj.t0 = varargin{3} + t0_fitfs;
+            if fitted
+              obj.setXY(varargin{1} - varargin{1}(1), varargin{2});
+            else
+              obj.setY(varargin{2});
+            end
+            obj.toffset = varargin{1}(1) * 1000;
+            
+          elseif numel(varargin{1}) > numel(varargin{2}) && isa(varargin{3}, 'time')
+            %%%%%%%%%%   data = tsdata(y-vector, fs, t0)   %%%%%%%%%%
+            % tsdata(y,fs,t0)
+            obj.setY(varargin{1});
+            obj.fs = varargin{2};
+            obj.t0 = varargin{3};
+          else
+            error('### Unknown three argument constructor.');
+          end
+        case 4
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%   four input   %%%%%%%%%%%%%%%%%%%%%%%%%%%
+          %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+          
+          if numel(varargin{1}) == numel(varargin{2}) && numel(varargin{3}) == 1 && isa(varargin{4}, 'time')
+            %%%%%%%%%%   data = tsdata(x-vector, y-vector, fs, t0)   %%%%%%%%%%
+            obj.fs = varargin{3};
+            
+            [fs_fitfs,t0_fitfs,fitted] = tsdata.fitfs(varargin{1});
+            if fitted
+              obj.setXY(varargin{1} - varargin{1}(1), varargin{2});
+            else
+              if abs(fs_fitfs - obj.fs) > 2*eps(obj.fs)
+                error('The requested sample rate (%g) does not match the sample rate computed from the input x values (%g)', obj.fs, fs_fitfs);
+              end
+              obj.setY(varargin{2});
+            end
+            obj.toffset = varargin{1}(1) * 1000;
+            obj.fs = fs_fitfs;
+            obj.t0 = varargin{4}+t0_fitfs;
+          else
+            error('### Unknown four argument constructor.');
+          end
+        otherwise
+          error('### Unknown number of constructor arguments.');
+      end
+      
+      % Now we can set nsecs
+      if ~isempty(obj.x)
+        % Then we have unevenly sampled data and the data duration
+        % is taken as x(end) - x(1);
+        obj.setNsecs(obj.x(end)-obj.x(1) + 1/obj.fs);
+      else
+        if ~isempty(obj.y)
+          % Then the data is evenly sampled and the
+          % duration of the data is easily computed.
+          Ndata = length(obj.y);
+          obj.setNsecs(Ndata / obj.fs);
+        end
+      end
+      
+    end % End constructor
+  end % End public methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods  (Public, hidden)                    %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Hidden = true)
+    varargout = attachToDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                              Methods (protected)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = protected)
+    varargout = fromStruct(varargin)
+    varargout = fromDom(varargin)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                               Methods (private)                           %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Access = private)
+  end
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                            Methods (static)                               %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  methods (Static)
+    varargout = fitfs(varargin)
+    
+    function out = VEROUT()
+      out = '$Id: tsdata.m,v 1.86 2011/11/04 21:11:48 mauro Exp $';
+    end
+    
+    function ii = getInfo(varargin)
+      ii = utils.helper.generic_getInfo(varargin{:}, 'tsdata');
+    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)
+      obj = tsdata.newarray([n m]);
+    end
+    
+  end % End static methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, private)                         %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static, Access = private)
+  end % End static, private methods
+  
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  %                         Methods (static, hidden)                          %
+  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+  
+  methods (Static = true, Hidden = true)
+    varargout = loadobj(varargin)
+    varargout = update_struct(varargin);
+  end
+  
+end % End classdef