imc/imc_stable.py
changeset 0 0efde00f9229
equal deleted inserted replaced
-1:000000000000 0:0efde00f9229
       
     1 #!/usr/bin/python
       
     2 # 10.9
       
     3 import os, sys
       
     4 sys.path += [os.getcwdu() + os.sep + ".." + os.sep + "python"]
       
     5 
       
     6 import scipy as sp
       
     7 from imcsplit import imcsplit
       
     8 from polyfuncs import poladd
       
     9 from zpowk import zpowk
       
    10 
       
    11 def imc_stable(B, A, k, alpha):
       
    12     """ Designs Discrete Internal Model Controller
       
    13     for transfer function z^{-k}B(z^{-1})/A(z^{-1})
       
    14     Numerator and Denominator of IMC HQ are outputs
       
    15     Controller is also given in R,S form. """
       
    16     Kp, d, Bg, Bnmp, Bm = imcsplit(B, 1)
       
    17     Bg = Kp * Bg
       
    18     Bnmpr = Bnmp[::-1]
       
    19     Bms = sum(Bm)
       
    20     HiN = A
       
    21     HiD = Bms * sp.convolve(Bg, Bnmpr)
       
    22     k = k+d
       
    23 
       
    24     zk, dzk = zpowk(k)
       
    25     zk = sp.squeeze(zk)
       
    26     Bf = 1-alpha
       
    27     Af = sp.array([1, -alpha])
       
    28     S = sp.convolve(Bf, A)
       
    29     R1 = sp.convolve(Af, sp.convolve(Bnmpr, Bms))
       
    30     R2 = sp.convolve(zk, sp.convolve(Bf, sp.convolve(Bnmp, Bm)))
       
    31 
       
    32     R, dR = poladd(R1, len(R1)-1, -R2, len(R2)-1)
       
    33     R = sp.squeeze(R)
       
    34     R = sp.convolve(Bg, R)
       
    35 
       
    36     return k, HiN, HiD, R, S