0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 function ssmout = ssmFromPzmodel(pzmodelsin)
0020 utils.helper.msg(utils.const.msg.MNAME, ['running ', mfilename]);
0021
0022 ssmout(1,length(pzmodelsin))=ssm;
0023 for i_pzms=1:length(pzmodelsin)
0024 a = 1;
0025 b = 1;
0026 for i=1:length(pzmodelsin(i_pzms).poles)
0027 if isnan(pzmodelsin(i_pzms).poles(i).q)
0028 w0 = pzmodelsin(i_pzms).poles(i).f*2*pi ;
0029 a = conv(a,[1 -w0]);
0030 else
0031 q = pzmodelsin(i_pzms).poles(i).q;
0032 w0 = 2*pi*pzmodelsin(i_pzms).poles(i).f;
0033 p = [1, -1/q*w0 w0^2];
0034 a = conv(a,p);
0035 end
0036 end
0037 for i=1:length(pzmodelsin(i_pzms).zeros)
0038 if isnan(pzmodelsin(i_pzms).zeros(i).q)
0039 w0 = pzmodelsin(i_pzms).zeros(i).f*2*pi ;
0040 b = conv(b,[1 -w0]);
0041 else
0042 q = pzmodelsin(i_pzms).zeros(i).q;
0043 w0 = 2*pi*pzmodelsin(i_pzms).zeros(i).f;
0044 p = [1, -1/q*w0 w0^2];
0045 b = conv(b,p);
0046 end
0047 end
0048 ssmout = ssm();
0049
0050 num = b*pzmodelsin(i_pzms).gain;
0051 den = a;
0052 Nss = length(den)-1;
0053 if length(num)<Nss+1
0054 num = [zeros(1,Nss+1-length(num)) num];
0055 end
0056 [q,r] = deconv(num,den);
0057 if ~length(q)==1
0058 error('system may be non caussal');
0059 end
0060
0061 ssmout(i_pzms).dmats = {q};
0062 ssmout(i_pzms).amats = {[zeros(Nss-1,1) eye(Nss-1); fliplr(-den(2:(Nss+1)))]};
0063 ssmout(i_pzms).bmats = {[zeros(Nss-1,1) ;1]};
0064 ssmout(i_pzms).cmats = {r(2:(Nss+1))};
0065
0066 ssmout(i_pzms).name = pzmodelsin(i_pzms).name;
0067 ssmout(i_pzms).timestep = 0;
0068 ssmout(i_pzms).inputnames = {'U'};
0069 ssmout(i_pzms).outputnames = {'Y'};
0070 ssmout(i_pzms).addHistory(ssm.getInfo('ssm', 'From Pzmodel'), plist(), {''}, pzmodelsin(i_pzms).hist);
0071 end
0072
0073
0074 end