diff m-toolbox/classes/@pzmodel/fromLISO.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/@pzmodel/fromLISO.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,264 @@
+% FROMLISO Construct a pzmodel from a LISO file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% FUNCTION:    fromLISO
+%
+% DESCRIPTION: Construct a pzmodel from a LISO file
+%
+% CALL:        pzm = fromLISO(pzm, pli)
+%
+% PARAMETER:   pzm: Empty pole/zero model
+%              pli: input plist (must contain the filename)
+%
+% VERSION:     $Id: fromLISO.m,v 1.19 2011/08/15 12:02:46 hewitson Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function pzm = fromLISO(pzm, pli)
+  
+  import utils.const.*
+  
+  VERSION = '$Id: fromLISO.m,v 1.19 2011/08/15 12:02:46 hewitson Exp $';
+  
+  ii = pzm.getInfo(class(pzm), 'From LISO File');
+  
+  % Set the method version string in the minfo object
+  ii.setMversion([VERSION '-->' ii.mversion]);
+  
+  pl = applyDefaults(ii.plists, pli);
+  
+  filename = find(pl, 'filename');
+  
+  poles = [];
+  zeros = [];
+  gain  = [];
+  plow  = [];
+  pup   = [];
+  zlow  = [];
+  zup   = [];
+  delay = 0;
+  
+  % Open the file for reading
+  [fd,ms] = fopen(filename, 'r');
+  if (fd < 0)
+    error ('### can not open file: %s \n### error msg: %s',filename, ms);
+  end
+  
+  utils.helper.msg(msg.OPROC2, ['reading ' filename]);
+  while ~feof(fd)
+    line = fgetl(fd);
+    % get current pointer position
+    pos = ftell(fd);
+    % get first token
+    [s,r] = strtok(line);
+    if strcmp(s, 'pole')
+      % get next token as frequency
+      [s,r] = strtok(r);
+      pf    = lisoStr2Num(s);
+      % does this pole have a Q?
+      pq = NaN;
+      if ~isempty(r)
+        [s,r] = strtok(r);
+        if isnumeric(lisoStr2Num(s))
+          pq = lisoStr2Num(s);
+        end
+      end
+      % make pole
+      if isnan(pq)
+        p = pz(pf);
+        utils.helper.msg(msg.OPROC2, 'found pole: %g', pf);
+        % are there errors for this value?
+        line = fgetl(fd);
+        [s,r] = strtok(line);
+        if strcmp(s, 'param')
+          pscan = sscanf(r,'%*s %f %f');
+          pl = pz(pscan(1));
+          pu = pz(pscan(2));
+          plow = [plow pl];
+          pup = [pup pu];
+        else
+          % we did not read an error, rewind
+          fseek(fd,pos,'bof');
+        end
+      else
+        p = pz(pf, pq);
+        utils.helper.msg(msg.OPROC2, 'found pole: %g, %g', pf, pq);
+        % are there errors for this value?
+        line = fgetl(fd);
+        [s,r] = strtok(line);
+        if strcmp(s, 'param')
+          % we need to get a new line for the errors of q
+          line2 = fgetl(fd);
+          [s2,r2] = strtok(line2);
+          pf = sscanf(r,'%*s %f %f');
+          pq = sscanf(r2,'%*s %f %f');
+          pl = pz(pf(1),pq(1));
+          pu = pz(pf(2),pq(2));
+          plow = [plow pl];
+          pup = [pup pu];
+        else
+          % we did not read an error, rewind
+          fseek(fd,pos,'bof');
+        end
+      end
+      poles = [poles p];
+    elseif strcmp(s, 'zero')
+      % get next token as frequency
+      [s,r] = strtok(r);
+      zf    = lisoStr2Num(s);
+      % does this zero have a Q?
+      zq = NaN;
+      if ~isempty(r)
+        [s,r] = strtok(r);
+        if isnumeric(lisoStr2Num(s))
+          zq = lisoStr2Num(s);
+        end
+      end
+      % make zero
+      if isnan(zq)
+        z = pz(zf);
+        utils.helper.msg(msg.OPROC2, 'found zero: %g', zf);
+        % are there errors for this value?
+        line = fgetl(fd);
+        [s,r] = strtok(line);
+        if strcmp(s, 'param')
+          zscan = sscanf(r,'%*s %f %f');
+          zl = pz(zscan(1));
+          zu = pz(zscan(2));
+          zlow = [zlow zl];
+          zup = [zup zu];
+        else
+          % we did not read an error, rewind
+          fseek(fd,pos,'bof');
+        end
+      else
+        z = pz(zf, zq);
+        utils.helper.msg(msg.OPROC2, 'found zero: %g, %g', zf, zq);
+        % are there errors for this value?
+        line = fgetl(fd);
+        [s,r] = strtok(line);
+        if strcmp(s, 'param')
+          % we need to get a new line for the errors of q
+          line2 = fgetl(fd);
+          [s2,r2] = strtok(line2);
+          zf = sscanf(r,'%*s %f %f');
+          zq = sscanf(r2,'%*s %f %f');
+          zl = pz(zf(1),zq(1));
+          zu = pz(zf(2),zq(2));
+          zlow = [zlow zl];
+          zup = [zup zu];
+        else
+          % we did not read an error, rewind
+          fseek(fd,pos,'bof');
+        end
+      end
+      zeros = [zeros z];
+    elseif strcmp(s, 'factor')
+      % get next token as gain
+      [s, r] = strtok(r);
+      gain   = lisoStr2Num(s);
+      utils.helper.msg(msg.OPROC2, 'found factor: %g', gain);
+      % are there errors for this value?
+      line = fgetl(fd);
+      [s,r] = strtok(line);
+      if strcmp(s, 'param')
+        p = sscanf(r,'%*s %f %f');
+        gl = p(1);
+        gu = p(2);
+      else
+        % we did not read an error, rewind
+        fseek(fd,pos,'bof');
+      end
+    elseif strcmp(s, 'delay')
+      % get next token as delay
+      [s, r] = strtok(r);
+      delay   = lisoStr2Num(s);
+      utils.helper.msg(msg.OPROC2, 'found delay: %g', delay);
+      % are there errors for this value?
+      line = fgetl(fd);
+      [s,r] = strtok(line);
+      if strcmp(s, 'param')
+        p = sscanf(r,'%*s %f %f');
+        dl = p(1);
+        du = p(2);
+      end
+    end
+  end
+  % Close file
+  fclose(fd);
+  % get model name
+  [path, name, ext] = fileparts(filename);
+  % set object
+  
+  
+  if exist('gl')
+    pl1 = copy(pl, 1);
+    pzm(1).gain  = gain;
+    pzm(1).poles = poles;
+    pzm(1).zeros = zeros;
+    pzm(1).delay = delay;
+    pzm(1).name  = name;
+    if c(pl1.find('name'))
+      pl1.pset('name', name);
+    end
+    % Set properties from the plist
+    pzm(1).setObjectProperties(pl1);
+    pzm(1).addHistory(ii, pl1, [], []);
+    
+    pl2 = copy(pl, 1);
+    pzm(2).gain  = gl;
+    pzm(2).poles = plow;
+    pzm(2).zeros = zlow;
+    pzm(2).delay = dl;
+    if isempty(pl2.find('name'))
+      pl2.pset('name', strcat(name,'_lower'));
+    end
+    % Set properties from the plist
+    pzm(2).setObjectProperties(pl2);
+    pzm(2).addHistory(ii, pl2, [], []);
+    
+    pl3 = copy(pl, 1);
+    pzm(3).gain  = gu;
+    pzm(3).poles = pup;
+    pzm(3).zeros = zup;
+    pzm(3).delay = du;
+    if isempty(pl3.find('name'))
+      pl3.pset('name', strcat(name,'_upper'));
+    end
+    % Set properties from the plist
+    pzm(3).setObjectProperties(pl3);
+    pzm(3).addHistory(ii, pl3, [], []);
+    
+  else
+    pzm.gain  = gain;
+    pzm.poles = poles;
+    pzm.zeros = zeros;
+    pzm.delay = delay;
+    if isempty(pl.find('name'))
+      pl.pset('name', name);
+    end
+    % Set properties from the plist
+    pzm.setObjectProperties(pl);
+    pzm.addHistory(ii, pl, [], []);
+  end
+  
+  
+  
+end
+
+%%%%%%%%%%% A function to convert LISO number strings to doubles %%%%%%%%%%
+
+function d = lisoStr2Num(s)
+  
+  s = strrep(s, 'm', 'e-3');
+  s = strrep(s, 'u', 'e-6');
+  s = strrep(s, 'n', 'e-9');
+  s = strrep(s, 'p', 'e-12');
+  s = strrep(s, 'f', 'e-15');
+  s = strrep(s, 'k', 'e3');
+  s = strrep(s, 'M', 'e6');
+  s = strrep(s, 'G', 'e9');
+  
+  d = str2double(s);
+  
+end % function d = lisoStr2Num(s)