var gain=[0,0];          // complex gain
var denom=[1,0];         // complex denominator for divide
var npoles;              // number of poles
var poles = new Array(); // complex values for poles
var nzeros;              // number of zeroes
var zeros = new Array(); // complex values for zeroes
var s=[0,0];             // complex frequency, s
var vs=[0,0];            // s minus pole or s minus zero
var temp=0;
var k=1;                 // Gain multiplier for transfer function

function getgain(s){     // returns complex gain for complex s 
  gain= [k,0];           // Initialise numerator
  for(i=0;i<nzeros; i++){
    csub(vs,s,zeros[i]); // ds = s - zero[]
    cmul(gain,vs);       // multiply vectors for numerator
  }
  denom= [1,0];          // initialise denominator
  for(i=0;i<npoles; i++){
    csub(vs,s,poles[i]); 
    cmul(denom,vs);      // multiply vectors from poles
  }
  cdiv(gain,denom);      // divide numerator by denominator
}

function copy(a,b){      // complex b = a
  b[0]=a[0];
  b[1]=a[1];
}

function csub(a,b,c){    // a = b - c
  a[0]=b[0]-c[0];
  a[1]=b[1]-c[1];
}

function cmul(a,b){      // a = a * b
  temp=a[0]*b[0]-a[1]*b[1];
  a[1]=a[0]*b[1]+a[1]*b[0];
  a[0]=temp;
}

function cdiv(a,b){       // a = a / b
  temp=a[0]*b[0]+a[1]*b[1];
  a[1]=a[1]*b[0]-a[0]*b[1];
  a[0]=temp;
  temp=b[0]*b[0]+b[1]*b[1];
  a[0]=a[0]/temp;
  a[1]=a[1]/temp;
}

function clog(a){         // a = complex log(a)
  temp=a[0]*a[0]+a[1]*a[1];
  temp=Math.log(temp)/2;
  a[1]=Math.atan2(a[1],a[0]);
  a[0]=temp;
}

