|
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 |