summaryrefslogtreecommitdiff
path: root/macros/sos2ss.sci
blob: c13f6882176a514a8fb2d1cd72f3fc91c6f7b81c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//Author: Parthasarathi Panda
//parthasarathipanda314@gmail.com
function [A,B,C,D]=sos2ss(sos,g)
    [nargout,nargin]=argn();
    if nargin==1 then
        g=1;
    end
    if type(sos)~=1 | type(g)~=1 then
        error('check the data type of input'); //to check if the inputs are real/complex arrays
    end
    if size(g)~=[1,1] then
        error('check the data type of input'); //to check that n is single dimensional
    end
    //checking if sos is a 6 column matrix
    [d,j]=size(sos);
    if j~=6 then
        error('sos should be a 6-column matrix');
    end
    
    num=[1];
    den=[1];
    //convolving the numerator and denominator to get the coefficient of the numerator and the denominator at the top and bottom
    for i=[1:d]
        num=convol(num,sos(i,1:3));
        den=convol(den,sos(i,4:6));
    end
    
    if den(t)==0 then
        error('improper transfer function check input');
    end
    
    t=2*d+1; //polynomial degree
    A=zeros(t-1,t-1);
    if t>2 then
        A(2:(t-1),1:(t-2))=eye(t-2,t-2);
    end
    A(1,:)=-1*den(2:t)/den(1); 
    B=zeros(t,1);
    B(1)=1/den(1); //constructing (A,B) in canonical controllable form

    C=g*(num(2:t)-den(2:t)*num(1)/den(1));//appropiate C and D
    D=g*num(1)/den(1);
    
endfunction