diff m-toolbox/classes/+utils/@bin/fil.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/+utils/@bin/fil.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,226 @@
+% FIL a wrapper for the LISO fil executable.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: FIL a wrapper for the LISO fil executable.
+%
+% CALL:        utils.bin.fil('foo.fil')
+%              utils.bin.fil('foo.fil', 'foo2.fil', 'foo3.fil', ...)
+%              utils.bin.fil('foo.fil', 'foo2.fil', 'foo3.fil', '-c', ...)
+%
+%              >> a = utils.bin.fil('foo.fil') % get result as AO
+%              >> f = utils.bin.fil('foo_iir.fil') % get result as MIIR 
+% 
+%              >> utils.bin.fil % get fil help
+% 
+% INPUTS:
+%          'filename'  - one or more .fil filenames
+%          'option'    - pass options to fil
+% 
+% VERSION:     $Id: fil.m,v 1.6 2011/03/24 19:57:39 ingo Exp $
+%
+% HISTORY:     07-10-08 M Hewitson
+%                 Creation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function varargout = fil(varargin)
+
+  % Get my location
+  p = mfilename('fullpath');
+  p = p(1:end-length(mfilename));
+  
+  switch computer
+    case 'MACI'
+      LISO = fullfile(p, 'liso/maci');
+      % Point to fil binary
+      FIL = ['LISO_DIR="' LISO '" ' fullfile(LISO, 'fil')];
+    case 'PCWIN'
+      LISO = fullfile(p, 'liso/win32');
+      % Point to fil binary
+      FIL = ['LISO_DIR="' LISO '" ' fullfile(LISO, 'fil.exe')];
+    otherwise
+      error('### I do not have a binary for LISO on %s', computer)
+  end
+  
+  if nargin == 0
+    system(FIL);
+    return
+  end
+  
+  % Loop for any options first
+  opts = '';
+  for jj=1:nargin
+    if ischar(varargin{jj})
+      if varargin{jj}(1) == '-'
+        opts = [opts ' -n ' varargin{jj}];
+      end
+    end
+  end
+  
+  % Now loop over input files
+  outs = {};
+  for jj=1:nargin
+    if ischar(varargin{jj})
+      % is this a filename or an option?
+      if varargin{jj}(1) ~= '-'
+        % Check the file
+        filename = varargin{jj};        
+        [path, name, ext] = fileparts(filename);
+        if ~strcmp(ext, '.fil')
+          error('### The input filename does not appear to be a fil file. [%s]', filename);
+        end
+        
+        % run FIL
+        cmd = [FIL ' ' opts ' ' filename];
+        disp(['*** running: ' cmd]);
+        [status, result] = system(cmd);
+        disp(result)
+      
+        if status
+        else
+          % try to load the output file
+          outfile = fullfile('.', path, [name '.out']);
+          if exist(outfile, 'file')
+            % What type of LISO output do we get here?
+            
+            min = textread(filename,'%s');
+            
+            % look for keywords in file
+            tfoutput = false;
+            iir = false;
+            fit = false;
+            if any(strcmp('tfoutput', min)), tfoutput = true; end
+            if any(strcmp('iir', min)), iir = true; end
+            if any(strcmp('fit', min)), fit = true; end
+
+            if iir
+              % we have an IIR filter so we load that instead of the .out
+              % file
+              filt = miir(filename);
+              if ~isempty(filt.a)
+                if nargout == 0
+                  iplot(resp(filt));
+                else
+                  outs = [outs {filt}];
+                end
+              end
+            elseif fit || tfoutput
+              % load data
+              fid = fopen(outfile, 'r');
+              
+              % Look for the first line of data
+              comment_char = '#';
+              while ~feof(fid)
+                f = strtrim(fgetl(fid));
+                if ~isempty(f)
+                  if f(1) ~= comment_char
+                    break;
+                  end
+                end
+              end
+
+              % Scan it to find how many columns we have in the file
+              c = regexp(f, ' +', 'split');
+              nc = numel(c);
+              scanformat = repmat('%f ', 1, nc);
+
+              % rewind file
+              fseek(fid, 0, 'bof');
+              % Read all data
+              din = textscan(fid, scanformat, 'CommentStyle', comment_char, 'CollectOutput', 1);
+              % close file
+              fclose(fid);
+              % did we get data?
+              if ~isempty(din{1})
+                din = din{1};
+                if tfoutput
+                  % what kind of columns do we have?
+                  dbdeg  = false;
+                  reim   = false;
+                  absdeg = false;
+                  if any(strcmp('db:deg', min)), dbdeg = true; end
+                  if any(strcmp('re:im', min)), reim = true; end
+                  if any(strcmp('abs:deg', min)), absdeg = true; end
+                  if dbdeg
+                    disp('-- TF is in db:deg');
+                    amp = 10.^(din(:,2)/20) .* exp(1i*din(:,3)*pi/180);
+                  elseif reim
+                    disp('-- TF is in re:im');
+                    amp = complex(din(:,2), din(:,3));
+                  elseif absdeg
+                    disp('-- TF is in abs:deg');
+                    amp = din(:,2) .* exp(1i*din(:,3)*pi/180);
+                  else
+                    error('### unknown data format. I only understand: abs:deg, db:deg, re:im, at the moment');
+                  end
+                else
+                  % we need to look for nout:
+                  dbdeg  = false;
+                  reim   = false;
+                  absdeg = false;
+                  abs    = false;
+                  db     = false;
+                  re     = false;
+                  im     = false;
+                  if any(strcmp('nout:db:deg', min)), dbdeg = true; end
+                  if any(strcmp('nout:re:im', min)), reim = true; end
+                  if any(strcmp('nout:abs:deg', min)), absdeg = true; end
+                  if any(strcmp('db', min)), db = true; end
+                  if any(strcmp('re', min)), re = true; end
+                  if any(strcmp('im', min)), im = true; end
+                  if any(strcmp('abs', min)), abs = true; end
+                  if dbdeg
+                    amp = 10.^(din(:,2)./20) .* exp(1i*din(:,3)*pi/180);
+                    disp('-- Fit is in db:deg');
+                  elseif reim
+                    amp = complex(din(:,2), din(:,3));
+                    disp('-- Fit is in re:im');
+                  elseif absdeg
+                    amp = din(:,2) .* exp(1i*din(:,3)*pi/180);
+                    disp('-- Fit is in abs:deg');
+                  elseif abs || re || im
+                    amp = din(:,2);
+                  elseif db
+                    amp = 10.^(din(:,2)/20);
+                  else
+                    error('### unknown data format. I only understand: abs:deg, db:deg, re:im, at the moment');
+                  end
+                  
+                end
+                % build output AO
+                a = ao(din(:,1), amp);
+                a.setName(name);
+                a.setXunits('Hz');
+                outs = [outs {a}];
+              end
+            else
+              warning('### unknown output type');
+            end % End switch over output type
+          end % If output file exists
+        end % If command suceeded
+      end % If is a fil file
+    end % char argument
+  end % loop over args  
+  
+  if nargout == 0
+    % do nothing
+  elseif nargout == numel(outs)
+    varargout{:} = outs{:};
+  elseif nargout == 1
+    allSame = true;
+    for jj=2:numel(outs)
+      if ~strcmp(class(outs{1}), class(outs{jj}))
+        allSame = false;
+      end
+    end
+    if allSame
+      varargout{1} = [outs{:}];
+    else
+      varargout{1} = outs;
+    end
+  else
+    error('### Unknown outputs');
+  end
+  
+end
+