summaryrefslogtreecommitdiff
path: root/macros/sos2tf.sci
blob: f674c853a8bcaebb83f3bbac476cb10f46c551af (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
function [A,B] = sos2tf(sos, g)
//This function converts series second-order sections to direct H(z) = B(z)/A(z) form.
//Calling Sequence
//[B] = sos2tf(sos)
//[B] = sos2tf(sos, g)
//[B,A] = sos2tf(...)
//Parameters 
//sos: matrix of real or complex numbers
//g: real or complex value, default value is 1
//Description
//This function converts series second-order sections to direct H(z) = B(z)/A(z) form.
//The input is the sos matrix and the second parameter is the overall gain, default value of which is 1. 
//The output is a vector.
//Examples
//sos = [1  1  1  1  0 -1; -2  3  1  1 10  1];
////[b,a] = sos2tf(sos)
//a =
//  -2   1  2  4  1
//b =
//   1 10  0 -10 -1
if(argn(2)<1 | argn(2)>2)
error("Wrong number of input arguments.")
end

if argn(2)==1 then
    g=1;
end

  [N,M] = size(sos);

  if M~=6
    error('sos matrix must be N by 6');
  end

  A = 1;
  B = 1;

  for i=1:N
    A = conv(A, sos(i,1:3));
    B = conv(B, sos(i,4:6));
  end

  nB = length(A);
  
  while nB & A(nB)==0
    A=A(1:nB-1);
    nB=length(A);
  end

  nA = length(B);
  while nA & B(nA)==0
    B=B(1:nA-1);
    nA=length(B);
  end
  A = A * g;

endfunction