-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathmodelBasedFeedforward.m
122 lines (102 loc) · 3.99 KB
/
modelBasedFeedforward.m
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
function [feedforwardController,forwardOrder] = modelBasedFeedforward(G,ffMethod)
[~,~,Ts] = tfdata(G,'v');
ffMethod = lower(ffMethod);
switch ffMethod
case 'zpetc'
feedforwardController = ZPETC(G);
case 'zmetc'
feedforwardController = ZMETC(G);
case 'ignore'
feedforwardController = nonminimumIgnore(G);
case 'seriestruncation'
otherwise
end
forwardOrder = numel(zero(feedforwardController)) - numel(pole(feedforwardController));
function F = ZPETC(G)
%%
G = tf(G);
G = minreal(G);
G.Variable = 'z^-1';
[z,p,k,Ts] = zpkdata(G,'v');
% relativeDegree = numel(p) - numel(z);
bound = 1;
index = abs(z) >= bound;
nonminimumZero = z( index );
minimumZero = z( ~index );
F = zpk(p,minimumZero,1/k,Ts,'Variable','z^-1');
% F = zpk(p,minimumZero,1,Ts,'Variable','z^-1');
%%
% for i = 1:numel(nonminimumZero)
% temp = tf( [-1 * nonminimumZero(i),1] ,1 ,Ts,'variable','z^-1');
% F = F * temp * (1 / (abs(1 - nonminimumZero(i))).^2 );
% end
i = 1;
z = tf('z',Ts);
while i <= numel(nonminimumZero)
if(isreal(nonminimumZero(i)))
% temp = tf( [-1 * nonminimumZero(i),1] ,1 ,Ts,'variable','z^-1');
temp = 1 - nonminimumZero(i) * z;
F = F * temp * (1 / (abs(1 - nonminimumZero(i))).^2 );
i = i + 1;
else
% temp = tf( [ ( abs(nonminimumZero(i)) ).^2 ,-2 * real(nonminimumZero(i)) ,1] ,1 ,Ts,'variable','z^-1');
temp = 1 - 2 * real(nonminimumZero(i)) * z + ( abs(nonminimumZero(i)) ).^2 * z^2;
F = F * temp * (1 / ( 1 + ( abs(nonminimumZero(i)) ).^2 -2 * real(nonminimumZero(i))).^2);
i = i + 2;
end
end
% [b,a,T] = tfdata(F,'v');
% F = tf(b,a,T,'variable',F.Variable);
F = minreal(F * z^(-1*numel(nonminimumZero)));
end
function F = ZMETC(G)
%%
G = tf(G);
G.Variable = 'z^-1';
[z,p,k,Ts] = zpkdata(G,'v');
% relativeDegree = numel(p) - numel(z);
bound = 1;
index = abs(z) >= bound;
nonminimumZero = z( index );
minimumZero = z( ~index );
z = tf('z',Ts);
F = zpk(p,minimumZero,1/k,Ts,'Variable','z^-1');
i = 1;
while i <= numel(nonminimumZero)
if(isreal(nonminimumZero(i)))
% temp = tf( 1 ,[-1 * nonminimumZero(i),1] ,Ts,'variable','z^-1');
temp = 1 / ( 1- nonminimumZero(i)* z);
F = F * temp;
i = i + 1;
else
% temp = tf( 1 ,[ ( abs(nonminimumZero(i)) ).^2 ,-2 * real(nonminimumZero(i)) ,1] ,Ts,'variable','z^-1');
temp = 1 / ( 1 - 2 * real(nonminimumZero(i)) * z + ( abs(nonminimumZero(i)) ).^2 * z^2 );
F = F * temp ;
i = i + 2;
end
end
F = minreal(F * z^(-1*numel(nonminimumZero)));
% [b,a,T] = tfdata(F,'v');
% F = tf(b,a,T,'variable',F.Variable);
end
function F = nonminimumIgnore(G)
%%
G = tf(G);
G.Variable = 'z^-1';
[z,p,k,Ts] = zpkdata(G,'v');
% relativeDegree = numel(p) - numel(z);
bound = 1;
index = abs(z) > bound;
nonminimumZero = z( index );
minimumZero = z( ~index );
z = tf('z',Ts);
F = zpk(p,minimumZero,1/k,Ts,'Variable','z^-1');
for i = 1:numel(nonminimumZero)
% temp = tf( [-1 * nonminimumZero(i),1] ,1 ,Ts,'variable','z^-1');
F = F * (1 / (abs(1 - nonminimumZero(i))) );
end
F = minreal(F * z^(-1*numel(nonminimumZero)));
end
function F = seriesTruncation(G)
end
end