summaryrefslogtreecommitdiff
path: root/macros/cell2sos.sci
blob: 39402b3ac367c962408cbb9744c945d4004c7e20 (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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
function [s,g] = cell2sos(c)
//Converts a cell array to a second order section matrix 
//Calling Sequences
//s=cell2sos(c)
//[s,g]=cell2sos(c)
//Parameters
//c
//A cell array
//g
//The scalar gain
//Description
//s=cell2sos(c) converts a a cell array c = { {B1},{A1}, {B2},{A2}, ... {BL},{AL}}
//to an L-by-6 second-order-section matrix s given by:
//       s =   [B1 A1
//               B2 A2
//                ...
//               BL AL]
//numerator vector Bi and denominator vector Ai contains the coefficients of a 
//linear or quadratic polynomial. If the polynomial is linear, the coefficients
//zero-padded on the right.
//[s,g]=cell2sos(c) estimates the gain from the leading term of the cell array
//c={ {[g1,g2]},{B1},{A1}, {B2},{A2}, ... {BL},{AL}} to give g=g1/g2 as the gain
//Example
//c=cell(1,5);
// 
//c(1,1).entries=[2, 1];
// 
//c(1,2).entries=rand(1,3);
// 
//c(1,3).entries=rand(1,3);
// 
//c(1,4).entries=rand(1,3);
// 
//c(1,5).entries=rand(1,3);
//
// c  =
//         column 1 to 3
// 
//![2,1]  [0.2113249,0.7560439,0.0002211]  [0.3303271,0.6653811,0.6283918]  !
// 
//         column 4 to 5
// 
//![0.8497452,0.6857310,0.8782165]  [0.0683740,0.5608486,0.6623569]  !
//[s,g]=cell2sos(c);
//s  =
// 
//         column 1 to 5
// 
//    0.2113249    0.7560439    0.0002211    0.3303271    0.6653811  
//    0.8497452    0.6857310    0.8782165    0.0683740    0.5608486  
// 
//         column 6
// 
//    0.6283918  
//    0.6623569  
// 
//g  =
// 
//    2.  
//Author
//Ankur Mallick
    if(argn(2)~=1) then
        error("Wrong number of input arguments");
    end
    
    L=prod(size(c));
    for i=1:L
        if(type(c(i))~=17)
            error('Cell contents must themselves be cell objects');
        end
    end
    if (argn(1)==2)
        d=c(1).entries;
        if(length(d)==2)
            g1=d(1);
            g2=d(2);
            g=g1/g2;
            c=c(2:L);
        else
            g=1;
        end
    end
    L=prod(size(c));
    s=zeros(L/2,6);
    for i=1:2:L-1
        j=ceil(i/2)
        b=c(i).entries;
        a=c(i+1).entries;
        b=b(:).';
        a=a(:).';
        b=[b,zeros(1,3-length(b))];
        a=[a,zeros(1,3-length(b))];
        s(j,:)=[b,a];
    end
endfunction