0001 function varargout = ltpda_ss_ss2iir(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 ALGONAME = mfilename;
0032 VERSION = '$Id: ltpda_ss_ss2iir.m,v 1.4 2008/03/11 16:52:56 adrien Exp $';
0033 CATEGORY = 'STATESPACE';
0034 display(['starting ' ALGONAME]);
0035
0036 if not(isempty(varargin))
0037 if isequal( varargin{1}, 'Version')
0038 varargout = VERSION;
0039 return;
0040 elseif isequal(varargin{1}, 'Params')
0041 varargout = plist('INPUTS', 'U_1', 'INPUTCOLUMNS', 1 ,'OUTPUTROW',1);
0042 return;
0043 elseif isequal(varargin{1}, 'Category')
0044 varargout = CATEGORY;
0045 return;
0046 end
0047 end
0048 iirs = miir();
0049
0050
0051 systs = varargin{1};
0052 Params = varargin{2};
0053 INPUTS = find(Params, 'INPUTS');
0054 INPUTCOLUMNS = find(Params, 'INPUTCOLUMNS');
0055 if not(length(INPUTS)==length(INPUTCOLUMNS))
0056 msg ='error because differnent number of inputs and input columns specified';
0057 error(msg);
0058 end
0059 OUTPUTS = find(Params, 'OUTPUTROWS');
0060 for i_syst=1:length(systs)
0061 syst = systs(i_syst);
0062 AMAT = find(syst,'AMAT');
0063 CMAT = find(syst,'CMAT');
0064 BMATS = find(syst,'BMATS');
0065 DMATS = find(syst,'DMATS');
0066 Ninputs = find(syst,'NBINPUTS');
0067 NAME = find(syst,'NAME');
0068 INPUTSIZES = find(syst,'INPUTSIZES');
0069 INPUTNAMES = find(syst,'INPUTNAMES');
0070 STEPSIZE = find(syst,'TIMESTEP');
0071 for i_inputs=1:length(INPUTS)
0072 j_inputs =0;
0073 for i=1:length(INPUTNAMES)
0074 if isequal(INPUTNAMES{i}, INPUTS{i_inputs})
0075 j_inputs = i;
0076 end
0077 end
0078 if j_inputs == 0
0079 error(['error : Input name ', INPUTS{i_inputs} ,' not found in system ', NAME])
0080
0081 elseif INPUTCOLUMNS(i_inputs) > INPUTSIZES(j_inputs)
0082 error(['error: Input name ', INPUTS{i_inputs} ,' in system ', NAME, ' was given with a row indice ', num2str(INPUTCOLUMNS(i_inputs)), ' bigger than possible ', num2str(INPUTSIZES(j_inputs)) ])
0083 end
0084 for i_outputs=1:length(OUTPUTS)
0085
0086 if STEPSIZE == 0
0087
0088 display('Error because timestep must be nonzero to make a time discrete filter');
0089 STEPSIZE = 1;
0090 end
0091 if size(BMATS{j_inputs},2)==0 ||size(CMAT{1},1)==0
0092 iirs(i_outputs,i_inputs,i_syst) = {};
0093 elseif size(AMAT{1},1)==0
0094 D = DMATS{j_inputs};
0095 a = D(OUTPUTS(i_outputs),INPUTCOLUMNS(i_inputs));
0096 b = 1;
0097 iirs(i_outputs,i_inputs,i_syst) = miir(plist('a', a, 'b', b, 'gain', 1, 'ntaps', 1, 'name', [NAME,'_',INPUTNAMES{i}], 'fs', 1/STEPSIZE));
0098 else
0099 C = CMAT{1};
0100 B = BMATS{j_inputs};
0101 D = DMATS{j_inputs};
0102 [a,b] = ss2tf(AMAT{1}, B(:,INPUTCOLUMNS(i_inputs)), C(OUTPUTS(i_outputs),:), D(OUTPUTS(i_outputs),INPUTCOLUMNS(i_inputs)));
0103 Gain=1;
0104 m = miir();
0105 m.a = a;
0106 m.b = b;
0107 m.fs = 1/STEPSIZE;
0108 m.name = [NAME,'_',INPUTNAMES{i}];
0109 m.gain = Gain;
0110 iirs(i_outputs,i_inputs,i_syst) = m;
0111 end
0112 end
0113 end
0114 end
0115 varargout = {iirs};
0116 end
0117