diff --git a/matlab/dehaeze21_desig_compl_filte_matlab.html b/matlab/dehaeze21_desig_compl_filte_matlab.html new file mode 100644 index 0000000..5916be9 --- /dev/null +++ b/matlab/dehaeze21_desig_compl_filte_matlab.html @@ -0,0 +1,1109 @@ + + + + + + +A new method of designing complementary filters for sensor fusion using the $\mathcal{H}_\infty$ synthesis - Matlab Computation + + + + + + + + +
+ UP + | + HOME +
+

A new method of designing complementary filters for sensor fusion using the \(\mathcal{H}_\infty\) synthesis - Matlab Computation

+
+

Table of Contents

+ +
+ +

+This file is the Matlab file for the paper (Dehaeze, Vermat, and Collette 2021). +

+ +

+This document is divided into several sections: +

+ + +
+

1. H-Infinity synthesis of complementary filters

+
+
+

+The Matlab file corresponding to this section is accessible here. +

+ +
+
+ +
+

1.1. Synthesis Architecture

+
+

+We here synthesize two complementary filters using the \(\mathcal{H}_\infty\) synthesis. +The goal is to specify upper bounds on the norms of the two complementary filters \(H_1(s)\) and \(H_2(s)\) while ensuring their complementary property (\(H_1(s) + H_2(s) = 1\)). +

+ +

+In order to do so, we use the generalized plant shown on figure 1 where \(W_1(s)\) and \(W_2(s)\) are weighting transfer functions that will be used to shape \(H_1(s)\) and \(H_2(s)\) respectively. +

+ + +
+

h_infinity_robust_fusion_plant.png +

+

Figure 1: \(\mathcal{H}_\infty\) synthesis of the complementary filters

+
+ +

+The \(\mathcal{H}_\infty\) synthesis applied on this generalized plant will give a transfer function \(H_2\) (figure 1) such that the \(\mathcal{H}_\infty\) norm of the transfer function from \(w\) to \([z_1,\ z_2]\) is less than one: +\[ \left\| \begin{array}{c} (1 - H_2(s)) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \] +

+ +

+Thus, if the above condition is verified, we can define \(H_1(s) = 1 - H_2(s)\) and we have that: +\[ \left\| \begin{array}{c} H_1(s) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \] +Which is almost (with an maximum error of \(\sqrt{2}\)) equivalent to: +

+\begin{align*} + |H_1(j\omega)| &< \frac{1}{|W_1(j\omega)|}, \quad \forall \omega \\ + |H_2(j\omega)| &< \frac{1}{|W_2(j\omega)|}, \quad \forall \omega +\end{align*} + +

+We then see that \(W_1(s)\) and \(W_2(s)\) can be used to shape both \(H_1(s)\) and \(H_2(s)\) while ensuring their complementary property by the definition of \(H_1(s) = 1 - H_2(s)\). +

+
+
+ +
+

1.2. Design of Weighting Function

+
+

+A formula is proposed to help the design of the weighting functions: +

+\begin{equation} + W(s) = \left( \frac{ + \frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}} + }{ + \left(\frac{1}{G_\infty}\right)^{\frac{1}{n}} \frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{1}{G_c}\right)^{\frac{1}{n}} + }\right)^n +\end{equation} + +

+The parameters permits to specify: +

+
    +
  • the low frequency gain: \(G_0 = lim_{\omega \to 0} |W(j\omega)|\)
  • +
  • the high frequency gain: \(G_\infty = lim_{\omega \to \infty} |W(j\omega)|\)
  • +
  • the absolute gain at \(\omega_0\): \(G_c = |W(j\omega_0)|\)
  • +
  • the absolute slope between high and low frequency: \(n\)
  • +
+ +

+The general shape of a weighting function generated using the formula is shown in figure 2. +

+ + +
+

weight_formula.png +

+

Figure 2: Gain of the Weighting Function formula

+
+
+
+ +
+

1.3. Example

+
+
+
%% Design of the Weighting Functions
+W1 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.45);
+W2 = generateWF('n', 2, 'w0', 2*pi*10, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.45);
+
+
+ + +
+

weights_W1_W2.png +

+

Figure 3: Weights on the complementary filters \(W_1\) and \(W_2\) and the associated performance weights

+
+
+
+ +
+

1.4. H-Infinity Synthesis

+
+

+We define the generalized plant \(P\) on matlab. +

+
+
%% Generalized Plant
+P = [W1 -W1;
+     0   W2;
+     1   0];
+
+
+ +

+And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. +

+
+
%% H-Infinity Synthesis
+[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+
+
+ +
+[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+
+  Test bounds:  0.3223 <=  gamma  <=  1000
+
+    gamma        X>=0        Y>=0       rho(XY)<1    p/f
+  1.795e+01     1.4e-07     0.0e+00     1.481e-16     p
+  2.406e+00     1.4e-07     0.0e+00     3.604e-15     p
+  8.806e-01    -3.1e+02 #  -1.4e-16     7.370e-19     f
+  1.456e+00     1.4e-07     0.0e+00     1.499e-18     p
+  1.132e+00     1.4e-07     0.0e+00     8.587e-15     p
+  9.985e-01     1.4e-07     0.0e+00     2.331e-13     p
+  9.377e-01    -7.7e+02 #  -6.6e-17     3.744e-14     f
+  9.676e-01    -2.0e+03 #  -5.7e-17     1.046e-13     f
+  9.829e-01    -6.6e+03 #  -1.1e-16     2.949e-13     f
+  9.907e-01     1.4e-07     0.0e+00     2.374e-19     p
+  9.868e-01    -1.6e+04 #  -6.4e-17     5.331e-14     f
+  9.887e-01    -5.1e+04 #  -1.5e-17     2.703e-19     f
+  9.897e-01     1.4e-07     0.0e+00     1.583e-11     p
+  Limiting gains...
+  9.897e-01     1.5e-07     0.0e+00     1.183e-12     p
+  9.897e-01     6.9e-07     0.0e+00     1.365e-12     p
+
+  Best performance (actual): 0.9897
+
+ +

+We then define the high pass filter \(H_1 = 1 - H_2\). The bode plot of both \(H_1\) and \(H_2\) is shown on figure 4. +

+ +
+
%% Define H1 to be the complementary of H2
+H1 = 1 - H2;
+
+
+ +

+Or one can just used to generateCF Matlab function: +

+
+
[H1, H2] = generateCF(W1, W2);
+
+
+
+
+ +
+

1.5. Obtained Complementary Filters

+
+

+The obtained complementary filters are shown on figure 4. +

+ +
+zpk(H1)
+ans =
+
+            (s+1.289e05) (s+153.6) (s+3.842)^3
+  -------------------------------------------------------
+  (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
+
+zpk(H2)
+ans =
+
+         125.61 (s+3358)^2 (s^2 + 46.61s + 813.8)
+  -------------------------------------------------------
+  (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
+
+ + +
+

hinf_filters_results.png +

+

Figure 4: Obtained complementary filters using \(\mathcal{H}_\infty\) synthesis

+
+
+
+
+ +
+

2. Design of complementary filters used in the Active Vibration Isolation System at the LIGO

+
+
+

+The Matlab file corresponding to this section is accessible here. +

+ +
+ +

+Let’s try to design complementary filters that are corresponding to the complementary filters design for the LIGO and described in (Hua 2005). +

+ +

+The FIR complementary filters designed in (Hua 2005) are of order 512. +

+
+ +
+

2.1. Specifications

+
+

+The specifications for the filters are: +

+
    +
  1. From \(0\) to \(0.008\text{ Hz}\),the magnitude of the filter’s transfer function should be less than or equal to \(8 \times 10^{-3}\)
  2. +
  3. From \(0.008\text{ Hz}\) to \(0.04\text{ Hz}\), it attenuates the input signal proportional to frequency cubed
  4. +
  5. Between \(0.04\text{ Hz}\) and \(0.1\text{ Hz}\), the magnitude of the transfer function should be less than 3
  6. +
  7. Above \(0.1\text{ Hz}\), the maximum of the magnitude of the complement filter should be as close to zero as possible. In our system, we would like to have the magnitude of the complementary filter to be less than \(0.1\). As the filters obtained in (Hua 2005) have a magnitude of \(0.045\), we will set that as our requirement
  8. +
+ +

+The specifications are translated in upper bounds of the complementary filters are shown on figure 5. +

+ + +
+

ligo_specifications.png +

+

Figure 5: Specification for the LIGO complementary filters

+
+
+
+ +
+

2.2. FIR Filter

+
+

+We here try to implement the FIR complementary filter synthesis as explained in (Hua 2005). +For that, we use the CVX matlab Toolbox. +

+ +

+We setup the CVX toolbox and use the SeDuMi solver. +

+
+
%% Initialized CVX
+cvx_startup;
+cvx_solver sedumi;
+
+
+ +

+We define the frequency vectors on which we will constrain the norm of the FIR filter. +

+
+
%% Frequency vectors
+w1 = 0:4.06e-4:0.008;
+w2 = 0.008:4.06e-4:0.04;
+w3 = 0.04:8.12e-4:0.1;
+w4 = 0.1:8.12e-4:0.83;
+
+
+ +

+We then define the order of the FIR filter. +

+
+
%% Filter order
+n = 512;
+
+
+ +
+
%% Initialization of filter responses
+A1 = [ones(length(w1),1),  cos(kron(w1'.*(2*pi),[1:n-1]))];
+A2 = [ones(length(w2),1),  cos(kron(w2'.*(2*pi),[1:n-1]))];
+A3 = [ones(length(w3),1),  cos(kron(w3'.*(2*pi),[1:n-1]))];
+A4 = [ones(length(w4),1),  cos(kron(w4'.*(2*pi),[1:n-1]))];
+
+B1 = [zeros(length(w1),1), sin(kron(w1'.*(2*pi),[1:n-1]))];
+B2 = [zeros(length(w2),1), sin(kron(w2'.*(2*pi),[1:n-1]))];
+B3 = [zeros(length(w3),1), sin(kron(w3'.*(2*pi),[1:n-1]))];
+B4 = [zeros(length(w4),1), sin(kron(w4'.*(2*pi),[1:n-1]))];
+
+
+ +

+We run the convex optimization. +

+
+
%% Convex optimization
+cvx_begin
+
+variable y(n+1,1)
+
+% t
+maximize(-y(1))
+
+for i = 1:length(w1)
+    norm([0 A1(i,:); 0 B1(i,:)]*y) <= 8e-3;
+end
+
+for  i = 1:length(w2)
+    norm([0 A2(i,:); 0 B2(i,:)]*y) <= 8e-3*(2*pi*w2(i)/(0.008*2*pi))^3;
+end
+
+for i = 1:length(w3)
+    norm([0 A3(i,:); 0 B3(i,:)]*y) <= 3;
+end
+
+for i = 1:length(w4)
+    norm([[1 0]'- [0 A4(i,:); 0 B4(i,:)]*y]) <= y(1);
+end
+
+cvx_end
+
+h = y(2:end);
+
+
+ +
+cvx_begin
+variable y(n+1,1)
+% t
+maximize(-y(1))
+for i = 1:length(w1)
+    norm([0 A1(i,:); 0 B1(i,:)]*y) <= 8e-3;
+end
+for  i = 1:length(w2)
+    norm([0 A2(i,:); 0 B2(i,:)]*y) <= 8e-3*(2*pi*w2(i)/(0.008*2*pi))^3;
+end
+for i = 1:length(w3)
+    norm([0 A3(i,:); 0 B3(i,:)]*y) <= 3;
+end
+for i = 1:length(w4)
+    norm([[1 0]'- [0 A4(i,:); 0 B4(i,:)]*y]) <= y(1);
+end
+cvx_end
+
+Calling SeDuMi 1.34: 4291 variables, 1586 equality constraints
+   For improved efficiency, SeDuMi is solving the dual problem.
+------------------------------------------------------------
+SeDuMi 1.34 (beta) by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
+Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
+eqs m = 1586, order n = 3220, dim = 4292, blocks = 1073
+nnz(A) = 1100727 + 0, nnz(ADA) = 1364794, nnz(L) = 683190
+ it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
+  0 :            4.11E+02 0.000
+  1 :  -2.58E+00 1.25E+02 0.000 0.3049 0.9000 0.9000   4.87  1  1  3.0E+02
+  2 :  -2.36E+00 3.90E+01 0.000 0.3118 0.9000 0.9000   1.83  1  1  6.6E+01
+  3 :  -1.69E+00 1.31E+01 0.000 0.3354 0.9000 0.9000   1.76  1  1  1.5E+01
+  4 :  -8.60E-01 7.10E+00 0.000 0.5424 0.9000 0.9000   2.48  1  1  4.8E+00
+  5 :  -4.91E-01 5.44E+00 0.000 0.7661 0.9000 0.9000   3.12  1  1  2.5E+00
+  6 :  -2.96E-01 3.88E+00 0.000 0.7140 0.9000 0.9000   2.62  1  1  1.4E+00
+  7 :  -1.98E-01 2.82E+00 0.000 0.7271 0.9000 0.9000   2.14  1  1  8.5E-01
+  8 :  -1.39E-01 2.00E+00 0.000 0.7092 0.9000 0.9000   1.78  1  1  5.4E-01
+  9 :  -9.99E-02 1.30E+00 0.000 0.6494 0.9000 0.9000   1.51  1  1  3.3E-01
+ 10 :  -7.57E-02 8.03E-01 0.000 0.6175 0.9000 0.9000   1.31  1  1  2.0E-01
+ 11 :  -5.99E-02 4.22E-01 0.000 0.5257 0.9000 0.9000   1.17  1  1  1.0E-01
+ 12 :  -5.28E-02 2.45E-01 0.000 0.5808 0.9000 0.9000   1.08  1  1  5.9E-02
+ 13 :  -4.82E-02 1.28E-01 0.000 0.5218 0.9000 0.9000   1.05  1  1  3.1E-02
+ 14 :  -4.56E-02 5.65E-02 0.000 0.4417 0.9045 0.9000   1.02  1  1  1.4E-02
+ 15 :  -4.43E-02 2.41E-02 0.000 0.4265 0.9004 0.9000   1.01  1  1  6.0E-03
+ 16 :  -4.37E-02 8.90E-03 0.000 0.3690 0.9070 0.9000   1.00  1  1  2.3E-03
+ 17 :  -4.35E-02 3.24E-03 0.000 0.3641 0.9164 0.9000   1.00  1  1  9.5E-04
+ 18 :  -4.34E-02 1.55E-03 0.000 0.4788 0.9086 0.9000   1.00  1  1  4.7E-04
+ 19 :  -4.34E-02 8.77E-04 0.000 0.5653 0.9169 0.9000   1.00  1  1  2.8E-04
+ 20 :  -4.34E-02 5.05E-04 0.000 0.5754 0.9034 0.9000   1.00  1  1  1.6E-04
+ 21 :  -4.34E-02 2.94E-04 0.000 0.5829 0.9136 0.9000   1.00  1  1  9.9E-05
+ 22 :  -4.34E-02 1.63E-04 0.015 0.5548 0.9000 0.0000   1.00  1  1  6.6E-05
+ 23 :  -4.33E-02 9.42E-05 0.000 0.5774 0.9053 0.9000   1.00  1  1  3.9E-05
+ 24 :  -4.33E-02 6.27E-05 0.000 0.6658 0.9148 0.9000   1.00  1  1  2.6E-05
+ 25 :  -4.33E-02 3.75E-05 0.000 0.5972 0.9187 0.9000   1.00  1  1  1.6E-05
+ 26 :  -4.33E-02 1.89E-05 0.000 0.5041 0.9117 0.9000   1.00  1  1  8.6E-06
+ 27 :  -4.33E-02 9.72E-06 0.000 0.5149 0.9050 0.9000   1.00  1  1  4.5E-06
+ 28 :  -4.33E-02 2.94E-06 0.000 0.3021 0.9194 0.9000   1.00  1  1  1.5E-06
+ 29 :  -4.33E-02 9.73E-07 0.000 0.3312 0.9189 0.9000   1.00  2  2  5.3E-07
+ 30 :  -4.33E-02 2.82E-07 0.000 0.2895 0.9063 0.9000   1.00  2  2  1.6E-07
+ 31 :  -4.33E-02 8.05E-08 0.000 0.2859 0.9049 0.9000   1.00  2  2  4.7E-08
+ 32 :  -4.33E-02 1.43E-08 0.000 0.1772 0.9059 0.9000   1.00  2  2  8.8E-09
+
+iter seconds digits       c*x               b*y
+ 32     49.4   6.8 -4.3334083581e-02 -4.3334090214e-02
+|Ax-b| =   3.7e-09, [Ay-c]_+ =   1.1E-10, |x|=  1.0e+00, |y|=  2.6e+00
+
+Detailed timing (sec)
+   Pre          IPM          Post
+3.902E+00    4.576E+01    1.035E-02
+Max-norms: ||b||=1, ||c|| = 3,
+Cholesky |add|=0, |skip| = 0, ||L.L|| = 4.26267.
+------------------------------------------------------------
+Status: Solved
+Optimal value (cvx_optval): -0.0433341
+h = y(2:end);
+
+ +

+Finally, we compute the filter response over the frequency vector defined and the result is shown on figure 6 which is very close to the filters obtain in (Hua 2005). +

+ +
+
%% Combine the frequency vectors to form the obtained filter
+w = [w1 w2 w3 w4];
+H = [exp(-j*kron(w'.*2*pi,[0:n-1]))]*h;
+
+
+ + +
+

fir_filter_ligo.png +

+

Figure 6: FIR Complementary filters obtain after convex optimization

+
+
+
+ +
+

2.3. Weights

+
+

+We design weights that will be used for the \(\mathcal{H}_\infty\) synthesis of the complementary filters. +These weights will determine the order of the obtained filters. +Here are the requirements on the filters: +

+
    +
  • reasonable order
  • +
  • to be as close as possible to the specified upper bounds
  • +
  • stable minimum phase
  • +
+ +

+The bode plot of the weights is shown on figure 7. +

+ + +
+

ligo_weights.png +

+

Figure 7: Weights for the \(\mathcal{H}_\infty\) synthesis

+
+
+
+ +
+

2.4. H-Infinity Synthesis

+
+

+We define the generalized plant as shown on figure 1. +

+
+
%% Generalized plant for the H-infinity Synthesis
+P = [0   wL;
+     wH -wH;
+     1   0];
+
+
+ +

+And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. +

+
+
%% Standard H-Infinity synthesis
+[Hl, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+
+
+ +
+[Hl, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+Resetting value of Gamma min based on D_11, D_12, D_21 terms
+
+Test bounds:      0.3276 <  gamma  <=      1.8063
+
+  gamma    hamx_eig  xinf_eig  hamy_eig   yinf_eig   nrho_xy   p/f
+    1.806   1.4e-02 -1.7e-16   3.6e-03   -4.8e-12    0.0000    p
+    1.067   1.3e-02 -4.2e-14   3.6e-03   -1.9e-12    0.0000    p
+    0.697   1.3e-02 -3.0e-01#  3.6e-03   -3.5e-11    0.0000    f
+    0.882   1.3e-02 -9.5e-01#  3.6e-03   -1.2e-34    0.0000    f
+    0.975   1.3e-02 -2.7e+00#  3.6e-03   -1.6e-12    0.0000    f
+    1.021   1.3e-02 -8.7e+00#  3.6e-03   -4.5e-16    0.0000    f
+    1.044   1.3e-02 -6.5e-14   3.6e-03   -3.0e-15    0.0000    p
+    1.032   1.3e-02 -1.8e+01#  3.6e-03    0.0e+00    0.0000    f
+    1.038   1.3e-02 -3.8e+01#  3.6e-03    0.0e+00    0.0000    f
+    1.041   1.3e-02 -8.3e+01#  3.6e-03   -2.9e-33    0.0000    f
+    1.042   1.3e-02 -1.9e+02#  3.6e-03   -3.4e-11    0.0000    f
+    1.043   1.3e-02 -5.3e+02#  3.6e-03   -7.5e-13    0.0000    f
+
+ Gamma value achieved:     1.0439
+
+ +

+The high pass filter is defined as \(H_H = 1 - H_L\). +

+
+
%% High pass filter as the complementary of the low pass filter
+Hh = 1 - Hl;
+
+
+ +

+The size of the filters is shown below. +

+ +
+size(Hh), size(Hl)
+State-space model with 1 outputs, 1 inputs, and 27 states.
+State-space model with 1 outputs, 1 inputs, and 27 states.
+
+ +

+The bode plot of the obtained filters as shown on figure 8. +

+ + +
+

hinf_synthesis_ligo_results.png +

+

Figure 8: Obtained complementary filters using the \(\mathcal{H}_\infty\) synthesis

+
+
+
+ +
+

2.5. Compare FIR and H-Infinity Filters

+
+

+Let’s now compare the FIR filters designed in (Hua 2005) and the one obtained with the \(\mathcal{H}_\infty\) synthesis on figure 9. +

+ + +
+

comp_fir_ligo_hinf.png +

+

Figure 9: Comparison between the FIR filters developped for LIGO and the \(\mathcal{H}_\infty\) complementary filters

+
+
+
+
+ +
+

3. “Closed-Loop” complementary filters

+
+
+

+The Matlab file corresponding to this section is accessible here. +

+ +
+
+ +
+

3.1. Using Feedback architecture

+
+
+
%% Design of the Weighting Functions
+W1 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.45);
+W2 = generateWF('n', 2, 'w0', 2*pi*10, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.45);
+
+
+ +

+Let’s first synthesize \(H_1(s)\): +

+
+
%% Generalized plant for "closed-loop" complementary filter synthesis
+P = [ W1 0   1;
+     -W1 W2 -1];
+
+
+ +
+
%% Standard H-Infinity Synthesis
+[L, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+
+
+ + +
+
%% Complementary filters
+H1 = inv(1 + L);
+H2 = 1 - H1;
+
+
+ +
+zpk(H1) =
+            (s+3.842)^3 (s+153.6) (s+1.289e05)
+  -------------------------------------------------------
+  (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
+
+zpk(H2) =
+         125.61 (s+3358)^2 (s^2 + 46.61s + 813.8)
+  -------------------------------------------------------
+  (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
+
+ + +
+

hinf_filters_results_mixed_sensitivity.png +

+
+
+
+
+ +
+

4. Synthesis of three complementary filters

+
+
+

+The Matlab file corresponding to this section is accessible here. +

+ +
+
+ +
+

4.1. Theory

+
+

+We want: +

+\begin{align*} + & |H_1(j\omega)| < 1/|W_1(j\omega)|, \quad \forall\omega\\ + & |H_2(j\omega)| < 1/|W_2(j\omega)|, \quad \forall\omega\\ + & |H_3(j\omega)| < 1/|W_3(j\omega)|, \quad \forall\omega\\ + & H_1(s) + H_2(s) + H_3(s) = 1 +\end{align*} + +

+For that, we use the \(\mathcal{H}_\infty\) synthesis with the architecture shown on figure 11. +

+ + +
+

comp_filter_three_hinf_fb.png +

+

Figure 11: Generalized architecture for generating 3 complementary filters

+
+ +

+The \(\mathcal{H}_\infty\) objective is: +

+\begin{align*} + & |(1 - H_2(j\omega) - H_3(j\omega)) W_1(j\omega)| < 1, \quad \forall\omega\\ + & |H_2(j\omega) W_2(j\omega)| < 1, \quad \forall\omega\\ + & |H_3(j\omega) W_3(j\omega)| < 1, \quad \forall\omega\\ +\end{align*} + +

+And thus if we choose \(H_1 = 1 - H_2 - H_3\) we have solved the problem. +

+
+
+ +
+

4.2. Weights

+
+

+First we define the weights. +

+
+
%% Design of the Weighting Functions
+W1 = generateWF('n', 2, 'w0', 2*pi*1, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.5);
+W2 = 0.22*(1 + s/2/pi/1)^2/(sqrt(1e-4) + s/2/pi/1)^2*(1 + s/2/pi/10)^2/(1 + s/2/pi/1000)^2;
+W3 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.5);
+
+
+ + +
+

three_weighting_functions.png +

+

Figure 12: Three weighting functions used for the \(\mathcal{H}_\infty\) synthesis of the complementary filters

+
+
+
+ +
+

4.3. H-Infinity Synthesis

+
+

+Then we create the generalized plant P. +

+
+
%% Generalized plant for the synthesis of 3 complementary filters
+P = [W1 -W1 -W1;
+     0   W2  0 ;
+     0   0   W3;
+     1   0   0];
+
+
+ +

+And we do the \(\mathcal{H}_\infty\) synthesis. +

+
+
%% Standard H-Infinity Synthesis
+[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+
+
+ +
+[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
+Resetting value of Gamma min based on D_11, D_12, D_21 terms
+
+Test bounds:      0.1000 <  gamma  <=   1050.0000
+
+  gamma    hamx_eig  xinf_eig  hamy_eig   yinf_eig   nrho_xy   p/f
+1.050e+03   3.2e+00   4.5e-13   6.3e-02   -1.2e-11    0.0000    p
+  525.050   3.2e+00   1.3e-13   6.3e-02    0.0e+00    0.0000    p
+  262.575   3.2e+00   2.1e-12   6.3e-02   -1.5e-13    0.0000    p
+  131.337   3.2e+00   1.1e-12   6.3e-02   -7.2e-29    0.0000    p
+   65.719   3.2e+00   2.0e-12   6.3e-02    0.0e+00    0.0000    p
+   32.909   3.2e+00   7.4e-13   6.3e-02   -5.9e-13    0.0000    p
+   16.505   3.2e+00   1.4e-12   6.3e-02    0.0e+00    0.0000    p
+    8.302   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
+    4.201   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
+    2.151   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
+    1.125   3.2e+00   2.8e-12   6.3e-02    0.0e+00    0.0000    p
+    0.613   3.0e+00 -2.5e+03#  6.3e-02    0.0e+00    0.0000    f
+    0.869   3.1e+00 -2.9e+01#  6.3e-02    0.0e+00    0.0000    f
+    0.997   3.2e+00   1.9e-12   6.3e-02    0.0e+00    0.0000    p
+    0.933   3.1e+00 -6.9e+02#  6.3e-02    0.0e+00    0.0000    f
+    0.965   3.1e+00 -3.0e+03#  6.3e-02    0.0e+00    0.0000    f
+    0.981   3.1e+00 -8.6e+03#  6.3e-02    0.0e+00    0.0000    f
+    0.989   3.2e+00 -2.7e+04#  6.3e-02    0.0e+00    0.0000    f
+    0.993   3.2e+00 -5.7e+05#  6.3e-02    0.0e+00    0.0000    f
+    0.995   3.2e+00   2.2e-12   6.3e-02    0.0e+00    0.0000    p
+    0.994   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
+    0.994   3.2e+00   1.0e-12   6.3e-02    0.0e+00    0.0000    p
+
+ Gamma value achieved:     0.9936
+
+
+
+ +
+

4.4. Obtained Complementary Filters

+
+

+The obtained filters are: +

+
+
%%
+H2 = tf(H(1));
+H3 = tf(H(2));
+H1 = 1 - H2 - H3;
+
+
+ + +
+

three_complementary_filters_results.png +

+

Figure 13: The three complementary filters obtained after \(\mathcal{H}_\infty\) synthesis

+
+
+
+
+ +

+ +

+ +

Bibliography

+
+
Dehaeze, Thomas, Mohit Vermat, and Christophe Collette. 2021. “A New Method of Designing Complementary Filters for Sensor Fusion Using the $H_\Infty$ Synthesis.” Mechanical Systems and Signal Processing, November.
+
Hua, Wensheng. 2005. “Low Frequency Vibration Isolation and Alignment System for Advanced LIGO.” stanford university.
+
+ + +
+

5. Functions

+
+
+ +
+

5.1. generateWF: Generate Weighting Functions

+
+

+ +

+ +

+This Matlab function is accessible here. +

+
+ +
+

Function description

+
+
+
function [W] = generateWF(args)
+% createWeight -
+%
+% Syntax: [W] = generateWeight(args)
+%
+% Inputs:
+%    - n  - Weight Order (integer)
+%    - G0 - Low frequency Gain
+%    - G1 - High frequency Gain
+%    - Gc - Gain of the weight at frequency w0
+%    - w0 - Frequency at which |W(j w0)| = Gc [rad/s]
+%
+% Outputs:
+%    - W - Generated Weighting Function
+
+
+
+
+ +
+

Optional Parameters

+
+
+
%% Argument validation
+arguments
+    args.n    (1,1) double {mustBeInteger, mustBePositive} = 1
+    args.G0   (1,1) double {mustBeNumeric, mustBePositive} = 0.1
+    args.Ginf (1,1) double {mustBeNumeric, mustBePositive} = 10
+    args.Gc   (1,1) double {mustBeNumeric, mustBePositive} = 1
+    args.w0   (1,1) double {mustBeNumeric, mustBePositive} = 1
+end
+
+
+ +

+Verification that the parameters \(G_0\), \(G_c\) and \(G_\infty\) are satisfy condition \eqref{eq:cond_formula_1} or \eqref{eq:cond_formula_2}. +

+\begin{equation} + G_0 < 1 < G_\infty \text{ and } G_0 < G_c < G_\infty \label{eq:cond_formula_1} +\end{equation} +\begin{equation} + G_\infty < 1 < G_0 \text{ and } G_\infty < G_c < G_0 \label{eq:cond_formula_2} +\end{equation} + +
+
% Verification of correct relation between G0, Gc and Ginf
+mustBeBetween(args.G0, args.Gc, args.Ginf);
+
+
+
+
+ +
+

Generate the Weighting function

+
+
+
%% Initialize the Laplace variable
+s = zpk('s');
+
+
+ +

+The weighting function formula use is: +

+\begin{equation} +\label{orge02c446} + W(s) = \left( \frac{ + \frac{1}{\omega_c} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}} + }{ + \left(\frac{1}{G_\infty}\right)^{\frac{1}{n}} \frac{1}{\omega_c} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{1}{G_c}\right)^{\frac{1}{n}} + }\right)^n +\end{equation} + +
+
%% Create the weighting function according to formula
+W = (((1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.Ginf)^(2/args.n)))*s + ...
+      (args.G0/args.Gc)^(1/args.n))/...
+     ((1/args.Ginf)^(1/args.n)*(1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.Ginf)^(2/args.n)))*s + ...
+      (1/args.Gc)^(1/args.n)))^args.n;
+
+
+
+
+ + +
+

Verification of the \(G_0\), \(G_c\) and \(G_\infty\) gains

+
+
+
%% Custom validation function
+function mustBeBetween(a,b,c)
+    if ~((a > b && b > c) || (c > b && b > a))
+        eid = 'createWeight:inputError';
+        msg = 'Gc should be between G0 and Ginf.';
+        throwAsCaller(MException(eid,msg))
+    end
+
+
+
+
+
+ +
+

5.2. generateCF: Generate Complementary Filters

+
+

+ +

+ +

+This Matlab function is accessible here. +

+
+ +
+

Function description

+
+
+
function [H1, H2] = generateCF(W1, W2, args)
+% createWeight -
+%
+% Syntax: [H1, H2] = generateCF(W1, W2, args)
+%
+% Inputs:
+%    - W1 - Weighting Function for H1
+%    - W2 - Weighting Function for H2
+%    - args:
+%      - method  - H-Infinity solver ('lmi' or 'ric')
+%      - display - Display synthesis results ('on' or 'off')
+%
+% Outputs:
+%    - H1 - Generated H1 Filter
+%    - H2 - Generated H2 Filter
+
+
+
+
+ +
+

Optional Parameters

+
+
+
%% Argument validation
+arguments
+    W1
+    W2
+    args.method  char {mustBeMember(args.method,{'lmi', 'ric'})} = 'ric'
+    args.display char {mustBeMember(args.display,{'on', 'off'})} = 'on'
+end
+
+
+
+
+ +
+

H-Infinity Synthesis

+
+
+
%% The generalized plant is defined
+P = [W1 -W1;
+     0   W2;
+     1   0];
+
+
+ +
+
%% The standard H-infinity synthesis is performed
+[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', args.method, 'DISPLAY', args.display);
+
+
+ +
+
%% H1 is defined as the complementary of H2
+H1 = 1 - H2;
+
+
+
+
+
+
+
+
+

Author: Thomas Dehaeze

+

Created: 2021-09-01 mer. 11:26

+
+ + diff --git a/matlab/dehaeze21_desig_compl_filte_matlab.org b/matlab/dehaeze21_desig_compl_filte_matlab.org index a5e5bde..6316ea0 100644 --- a/matlab/dehaeze21_desig_compl_filte_matlab.org +++ b/matlab/dehaeze21_desig_compl_filte_matlab.org @@ -10,46 +10,34 @@ #+LaTeX_HEADER_EXTRA: \input{/home/thomas/Cloud/org-theme/preamble.tex} #+PROPERTY: header-args:matlab :session *MATLAB* -#+PROPERTY: header-args:matlab+ :tangle matlab/comp_filters_design.m -#+PROPERTY: header-args:matlab+ :comments org +#+PROPERTY: header-args:matlab+ :comments none #+PROPERTY: header-args:matlab+ :exports both #+PROPERTY: header-args:matlab+ :results none #+PROPERTY: header-args:matlab+ :eval no-export #+PROPERTY: header-args:matlab+ :noweb yes #+PROPERTY: header-args:matlab+ :mkdirp yes #+PROPERTY: header-args:matlab+ :output-dir figs - -#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}") -#+PROPERTY: header-args:latex+ :imagemagick t :fit yes -#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150 -#+PROPERTY: header-args:latex+ :imoutoptions -quality 100 -#+PROPERTY: header-args:latex+ :results file raw replace -#+PROPERTY: header-args:latex+ :buffer no -#+PROPERTY: header-args:latex+ :tangle no -#+PROPERTY: header-args:latex+ :eval no-export -#+PROPERTY: header-args:latex+ :exports results -#+PROPERTY: header-args:latex+ :mkdirp yes -#+PROPERTY: header-args:latex+ :output-dir figs -#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png") :END: * Introduction :ignore: +This file is the Matlab file for the paper cite:dehaeze21_new_method_desig_compl_filter. + This document is divided into several sections: - in section [[#sec:h_inf_synthesis_complementary_filters]], the $\mathcal{H}_\infty$ synthesis is used for generating two complementary filters -- in section [[sec:three_comp_filters]], a method using the $\mathcal{H}_\infty$ synthesis is proposed to shape three of more complementary filters -- in section [[sec:comp_filters_ligo]], the $\mathcal{H}_\infty$ synthesis is used and compared with FIR complementary filters used for LIGO +- in section [[#sec:three_comp_filters]], a method using the $\mathcal{H}_\infty$ synthesis is proposed to shape three of more complementary filters +- in section [[#sec:comp_filters_ligo]], the $\mathcal{H}_\infty$ synthesis is used and compared with FIR complementary filters used for LIGO +- in section [[#sec:closed_loop_complementary_filters]] * H-Infinity synthesis of complementary filters :PROPERTIES: -:header-args:matlab+: :tangle matlab/h_inf_synthesis_complementary_filters.m -:header-args:matlab+: :comments org :mkdirp yes +:header-args:matlab+: :tangle matlab/1_synthesis_complementary_filters.m :CUSTOM_ID: sec:h_inf_synthesis_complementary_filters :END: ** Introduction :ignore: #+begin_note - The Matlab file corresponding to this section is accessible [[file:matlab/h_inf_synthesis_complementary_filters.m][here]]. + The Matlab file corresponding to this section is accessible [[file:matlab/1_synthesis_complementary_filters.m][here]]. #+end_note ** Matlab Init :noexport:ignore: @@ -62,6 +50,7 @@ This document is divided into several sections: #+end_src #+begin_src matlab +%% Initialize Frequency Vector freqs = logspace(-1, 3, 1000); #+end_src @@ -70,7 +59,8 @@ addpath('./matlab'); addpath('./matlab/src'); #+end_src -#+begin_src matlab :exec no +#+begin_src matlab :eval no +%% Add functions to path addpath('./src'); #+end_src @@ -82,7 +72,7 @@ In order to do so, we use the generalized plant shown on figure [[fig:h_infinity #+name: fig:h_infinity_robst_fusion #+caption: $\mathcal{H}_\infty$ synthesis of the complementary filters -[[file:figs/h_infinity_robust_fusion.png]] +[[file:figs-journal/h_infinity_robust_fusion_plant.png]] The $\mathcal{H}_\infty$ synthesis applied on this generalized plant will give a transfer function $H_2$ (figure [[fig:h_infinity_robst_fusion]]) such that the $\mathcal{H}_\infty$ norm of the transfer function from $w$ to $[z_1,\ z_2]$ is less than one: \[ \left\| \begin{array}{c} (1 - H_2(s)) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \] @@ -116,10 +106,16 @@ The parameters permits to specify: The general shape of a weighting function generated using the formula is shown in figure [[fig:weight_formula]]. #+begin_src matlab :exports none +%% Weighting Function Design +% Parameters n = 3; w0 = 2*pi*10; G0 = 1e-3; G1 = 1e1; Gc = 2; +% Formulas W = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; +#+end_src +#+begin_src matlab :exports none +%% Magnitude of the weighting function with parameters figure; hold on; plot(freqs, abs(squeeze(freqresp(W, freqs, 'Hz'))), 'k-'); @@ -147,6 +143,10 @@ ylim([5e-4, 20]); yticks([1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1]); #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/weight_formula.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace exportFig('figs/weight_formula.pdf', 'width', 'wide', 'height', 'normal'); #+end_src @@ -156,15 +156,16 @@ exportFig('figs/weight_formula.pdf', 'width', 'wide', 'height', 'normal'); #+RESULTS: [[file:figs/weight_formula.png]] -#+begin_src matlab -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; +** Example -n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; +#+begin_src matlab +%% Design of the Weighting Functions +W1 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.45); +W2 = generateWF('n', 2, 'w0', 2*pi*10, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.45); #+end_src #+begin_src matlab :exports none +%% Plot of the Weighting function magnitude figure; tiledlayout(1, 1, 'TileSpacing', 'None', 'Padding', 'None'); ax1 = nexttile(); @@ -186,8 +187,12 @@ leg = legend('location', 'south', 'FontSize', 8); leg.ItemTokenSize(1) = 18; #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/weights_W1_W2.pdf', 'width', 'half', 'height', 350); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/weights_W1_W2.pdf', 'width', 'half', 'height', 350); +exportFig('figs/weights_W1_W2.pdf', 'width', 'wide', 'height', 'normal'); #+end_src #+name: fig:weights_W1_W2 @@ -198,6 +203,7 @@ exportFig('figs/weights_W1_W2.pdf', 'width', 'half', 'height', 350); ** H-Infinity Synthesis We define the generalized plant $P$ on matlab. #+begin_src matlab +%% Generalized Plant P = [W1 -W1; 0 W2; 1 0]; @@ -205,6 +211,7 @@ P = [W1 -W1; And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. #+begin_src matlab :results output replace :exports both +%% H-Infinity Synthesis [H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); #+end_src @@ -238,9 +245,15 @@ And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. We then define the high pass filter $H_1 = 1 - H_2$. The bode plot of both $H_1$ and $H_2$ is shown on figure [[fig:hinf_filters_results]]. #+begin_src matlab +%% Define H1 to be the complementary of H2 H1 = 1 - H2; #+end_src +Or one can just used to =generateCF= Matlab function: +#+begin_src matlab :tangle no :eval no +[H1, H2] = generateCF(W1, W2); +#+end_src + ** Obtained Complementary Filters The obtained complementary filters are shown on figure [[fig:hinf_filters_results]]. @@ -267,6 +280,7 @@ ans = #+end_example #+begin_src matlab :exports none +%% Bode plot of the complementary filters figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -309,8 +323,12 @@ linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/hinf_filters_results.pdf', 'width', 700, 'height', 450); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/hinf_filters_results.pdf', 'width', 700, 'height', 450); +exportFig('figs/hinf_filters_results.pdf', 'width', 'wide', 'height', 'tall'); #+end_src #+name: fig:hinf_filters_results @@ -318,223 +336,15 @@ exportFig('figs/hinf_filters_results.pdf', 'width', 700, 'height', 450); #+RESULTS: [[file:figs/hinf_filters_results.png]] -* Generating 3 complementary filters +* Design of complementary filters used in the Active Vibration Isolation System at the LIGO :PROPERTIES: -:header-args:matlab+: :tangle matlab/three_comp_filters.m -:header-args:matlab+: :comments org :mkdirp yes +:header-args:matlab+: :tangle matlab/2_ligo_complementary_filters.m +:CUSTOM_ID: sec:comp_filters_ligo :END: -<> ** Introduction :ignore: #+begin_note - The Matlab file corresponding to this section is accessible [[file:matlab/three_comp_filters.m][here]]. -#+end_note - -** Matlab Init :noexport:ignore: -#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) -<> -#+end_src - -#+begin_src matlab :exports none :results silent :noweb yes -<> -#+end_src - -#+begin_src matlab -freqs = logspace(-2, 3, 1000); -#+end_src - -#+begin_src matlab :tangle no -addpath('./matlab'); -addpath('./matlab/src'); -#+end_src - -#+begin_src matlab :exec no -addpath('./src'); -#+end_src - -** Theory -We want: -\begin{align*} - & |H_1(j\omega)| < 1/|W_1(j\omega)|, \quad \forall\omega\\ - & |H_2(j\omega)| < 1/|W_2(j\omega)|, \quad \forall\omega\\ - & |H_3(j\omega)| < 1/|W_3(j\omega)|, \quad \forall\omega\\ - & H_1(s) + H_2(s) + H_3(s) = 1 -\end{align*} - -For that, we use the $\mathcal{H}_\infty$ synthesis with the architecture shown on figure [[fig:comp_filter_three_hinf]]. - -#+name: fig:comp_filter_three_hinf -#+caption: Generalized architecture for generating 3 complementary filters -[[file:figs/comp_filter_three_hinf.png]] - -The $\mathcal{H}_\infty$ objective is: -\begin{align*} - & |(1 - H_2(j\omega) - H_3(j\omega)) W_1(j\omega)| < 1, \quad \forall\omega\\ - & |H_2(j\omega) W_2(j\omega)| < 1, \quad \forall\omega\\ - & |H_3(j\omega) W_3(j\omega)| < 1, \quad \forall\omega\\ -\end{align*} - -And thus if we choose $H_1 = 1 - H_2 - H_3$ we have solved the problem. - -** Weights -First we define the weights. -#+begin_src matlab -n = 2; w0 = 2*pi*1; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -W2 = 0.22*(1 + s/2/pi/1)^2/(sqrt(1e-4) + s/2/pi/1)^2*(1 + s/2/pi/10)^2/(1 + s/2/pi/1000)^2; - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W3 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -set(gca,'ColorOrderIndex',3) -plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'DisplayName', '$|W_3|^{-1}$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -hold off; -xlim([freqs(1), freqs(end)]); ylim([2e-4, 1.3e1]) -leg = legend('location', 'northeast', 'FontSize', 8); -leg.ItemTokenSize(1) = 18; -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/three_weighting_functions.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:three_weighting_functions -#+caption: Three weighting functions used for the $\mathcal{H}_\infty$ synthesis of the complementary filters -#+RESULTS: -[[file:figs/three_weighting_functions.png]] - -** H-Infinity Synthesis -Then we create the generalized plant =P=. -#+begin_src matlab -P = [W1 -W1 -W1; - 0 W2 0 ; - 0 0 W3; - 1 0 0]; -#+end_src - -And we do the $\mathcal{H}_\infty$ synthesis. -#+begin_src matlab :results output replace :exports both -[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+RESULTS: -#+begin_example -[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -Resetting value of Gamma min based on D_11, D_12, D_21 terms - -Test bounds: 0.1000 < gamma <= 1050.0000 - - gamma hamx_eig xinf_eig hamy_eig yinf_eig nrho_xy p/f -1.050e+03 3.2e+00 4.5e-13 6.3e-02 -1.2e-11 0.0000 p - 525.050 3.2e+00 1.3e-13 6.3e-02 0.0e+00 0.0000 p - 262.575 3.2e+00 2.1e-12 6.3e-02 -1.5e-13 0.0000 p - 131.337 3.2e+00 1.1e-12 6.3e-02 -7.2e-29 0.0000 p - 65.719 3.2e+00 2.0e-12 6.3e-02 0.0e+00 0.0000 p - 32.909 3.2e+00 7.4e-13 6.3e-02 -5.9e-13 0.0000 p - 16.505 3.2e+00 1.4e-12 6.3e-02 0.0e+00 0.0000 p - 8.302 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p - 4.201 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p - 2.151 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p - 1.125 3.2e+00 2.8e-12 6.3e-02 0.0e+00 0.0000 p - 0.613 3.0e+00 -2.5e+03# 6.3e-02 0.0e+00 0.0000 f - 0.869 3.1e+00 -2.9e+01# 6.3e-02 0.0e+00 0.0000 f - 0.997 3.2e+00 1.9e-12 6.3e-02 0.0e+00 0.0000 p - 0.933 3.1e+00 -6.9e+02# 6.3e-02 0.0e+00 0.0000 f - 0.965 3.1e+00 -3.0e+03# 6.3e-02 0.0e+00 0.0000 f - 0.981 3.1e+00 -8.6e+03# 6.3e-02 0.0e+00 0.0000 f - 0.989 3.2e+00 -2.7e+04# 6.3e-02 0.0e+00 0.0000 f - 0.993 3.2e+00 -5.7e+05# 6.3e-02 0.0e+00 0.0000 f - 0.995 3.2e+00 2.2e-12 6.3e-02 0.0e+00 0.0000 p - 0.994 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p - 0.994 3.2e+00 1.0e-12 6.3e-02 0.0e+00 0.0000 p - - Gamma value achieved: 0.9936 -#+end_example - -** Obtained Complementary Filters -The obtained filters are: -#+begin_src matlab -H2 = tf(H(1)); -H3 = tf(H(2)); -H1 = 1 - H2 - H3; -#+end_src - -#+begin_src matlab :exports none -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -set(gca,'ColorOrderIndex',3) -plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'DisplayName', '$|W_3|^{-1}$'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca,'ColorOrderIndex',3) -plot(freqs, abs(squeeze(freqresp(H3, freqs, 'Hz'))), '-', 'DisplayName', '$H_3$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([1e-4, 20]); -leg = legend('location', 'northeast', 'FontSize', 8); -leg.ItemTokenSize(1) = 18; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz')))); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz')))); -set(gca,'ColorOrderIndex',3) -plot(freqs, 180/pi*phase(squeeze(freqresp(H3, freqs, 'Hz')))); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); ylim([-220, 220]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/three_complementary_filters_results.pdf', 'width', 'wide', 'height', 600); -#+end_src - -#+name: fig:three_complementary_filters_results -#+caption: The three complementary filters obtained after $\mathcal{H}_\infty$ synthesis -#+RESULTS: -[[file:figs/three_complementary_filters_results.png]] - -* Implement complementary filters for LIGO -:PROPERTIES: -:header-args:matlab+: :tangle matlab/comp_filters_ligo.m -:header-args:matlab+: :comments org :mkdirp yes -:END: -<> - -** Introduction :ignore: -#+begin_note - The Matlab file corresponding to this section is accessible [[file:matlab/comp_filters_ligo.m][here]]. + The Matlab file corresponding to this section is accessible [[file:matlab/2_ligo_complementary_filters.m][here]]. #+end_note Let's try to design complementary filters that are corresponding to the complementary filters design for the LIGO and described in cite:hua05_low_ligo. @@ -551,6 +361,7 @@ The FIR complementary filters designed in cite:hua05_low_ligo are of order 512. #+end_src #+begin_src matlab +%% Initialize Frequency Vector freqs = logspace(-3, 0, 1000); #+end_src @@ -559,7 +370,8 @@ addpath('./matlab'); addpath('./matlab/src'); #+end_src -#+begin_src matlab :exec no +#+begin_src matlab :eval no +%% Add functions to path addpath('./src'); #+end_src @@ -573,6 +385,7 @@ The specifications for the filters are: The specifications are translated in upper bounds of the complementary filters are shown on figure [[fig:ligo_specifications]]. #+begin_src matlab :exports none +%% Upper bounds for the complementary filters figure; hold on; set(gca,'ColorOrderIndex',1) @@ -607,12 +420,14 @@ For that, we use the [[http://cvxr.com/cvx/][CVX matlab Toolbox]]. We setup the CVX toolbox and use the =SeDuMi= solver. #+begin_src matlab +%% Initialized CVX cvx_startup; cvx_solver sedumi; #+end_src We define the frequency vectors on which we will constrain the norm of the FIR filter. #+begin_src matlab +%% Frequency vectors w1 = 0:4.06e-4:0.008; w2 = 0.008:4.06e-4:0.04; w3 = 0.04:8.12e-4:0.1; @@ -621,10 +436,12 @@ w4 = 0.1:8.12e-4:0.83; We then define the order of the FIR filter. #+begin_src matlab +%% Filter order n = 512; #+end_src #+begin_src matlab +%% Initialization of filter responses A1 = [ones(length(w1),1), cos(kron(w1'.*(2*pi),[1:n-1]))]; A2 = [ones(length(w2),1), cos(kron(w2'.*(2*pi),[1:n-1]))]; A3 = [ones(length(w3),1), cos(kron(w3'.*(2*pi),[1:n-1]))]; @@ -638,6 +455,7 @@ B4 = [zeros(length(w4),1), sin(kron(w4'.*(2*pi),[1:n-1]))]; We run the convex optimization. #+begin_src matlab :results output replace :wrap example +%% Convex optimization cvx_begin variable y(n+1,1) @@ -746,11 +564,13 @@ h = y(2:end); Finally, we compute the filter response over the frequency vector defined and the result is shown on figure [[fig:fir_filter_ligo]] which is very close to the filters obtain in cite:hua05_low_ligo. #+begin_src matlab +%% Combine the frequency vectors to form the obtained filter w = [w1 w2 w3 w4]; H = [exp(-j*kron(w'.*2*pi,[0:n-1]))]*h; #+end_src #+begin_src matlab :exports none +%% Bode plot of the obtained complementary filters figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -788,8 +608,12 @@ linkaxes([ax1,ax2],'x'); xlim([1e-3, 1]); #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/fir_filter_ligo.pdf', 'width', 'wide', 'height', 600); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/fir_filter_ligo.pdf', 'width', 'wide', 'height', 600); +exportFig('figs/fir_filter_ligo.pdf', 'width', 'wide', 'height', 'tall'); #+end_src #+name: fig:fir_filter_ligo @@ -808,6 +632,7 @@ Here are the requirements on the filters: The bode plot of the weights is shown on figure [[fig:ligo_weights]]. #+begin_src matlab :exports none +%% Design of the weight for the high pass filter w1 = 2*pi*0.008; x1 = 0.35; w2 = 2*pi*0.04; x2 = 0.5; w3 = 2*pi*0.05; x3 = 0.5; @@ -827,7 +652,12 @@ wH = minreal(ss(wH)); #+end_src #+begin_src matlab :exports none -n = 20; Rp = 1; Wp = 2*pi*0.102; +%% Design of the weight for the low pass filter +n = 20; % Filter order +Rp = 1; % Peak to peak passband ripple +Wp = 2*pi*0.102; % Edge frequency + +% Chebyshev Type I filter design [b,a] = cheby1(n, Rp, Wp, 'high', 's'); wL = 0.04*tf(a, b); @@ -836,6 +666,7 @@ wL = minreal(ss(wL)); #+end_src #+begin_src matlab :exports none +%% Magnitude of the designed Weights and initial specifications figure; hold on; set(gca,'ColorOrderIndex',1); @@ -857,6 +688,10 @@ leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); leg.ItemTokenSize(1) = 16; #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/ligo_weights.pdf', 'width', 'wide', 'height', 'normal'); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace exportFig('figs/ligo_weights.pdf', 'width', 'wide', 'height', 'normal'); #+end_src @@ -869,6 +704,7 @@ exportFig('figs/ligo_weights.pdf', 'width', 'wide', 'height', 'normal'); ** H-Infinity Synthesis We define the generalized plant as shown on figure [[fig:h_infinity_robst_fusion]]. #+begin_src matlab +%% Generalized plant for the H-infinity Synthesis P = [0 wL; wH -wH; 1 0]; @@ -876,6 +712,7 @@ P = [0 wL; And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. #+begin_src matlab :results output replace :exports both :wrap example +%% Standard H-Infinity synthesis [Hl, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); #+end_src @@ -905,17 +742,19 @@ Test bounds: 0.3276 < gamma <= 1.8063 The high pass filter is defined as $H_H = 1 - H_L$. #+begin_src matlab +%% High pass filter as the complementary of the low pass filter Hh = 1 - Hl; #+end_src #+begin_src matlab :exports none +%% Minimum realization of the filters Hh = minreal(Hh); Hl = minreal(Hl); #+end_src The size of the filters is shown below. -#+begin_src matlab :exports results :results output replace :wrap example +#+begin_src matlab :exports results :results output replace :wrap example :tangle no size(Hh), size(Hl) #+end_src @@ -929,6 +768,7 @@ State-space model with 1 outputs, 1 inputs, and 27 states. The bode plot of the obtained filters as shown on figure [[fig:hinf_synthesis_ligo_results]]. #+begin_src matlab :exports none +%% Bode plot of the obtained filters and comparison with the upper bounds figure; hold on; set(gca,'ColorOrderIndex',1); @@ -963,6 +803,7 @@ exportFig('figs/hinf_synthesis_ligo_results.pdf', 'width', 'wide', 'height', 'no Let's now compare the FIR filters designed in cite:hua05_low_ligo and the one obtained with the $\mathcal{H}_\infty$ synthesis on figure [[fig:comp_fir_ligo_hinf]]. #+begin_src matlab :exports none +%% Comparison of the complementary filters obtained with H-infinity and with CVX figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -1011,8 +852,12 @@ linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 600); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 600); +exportFig('figs/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 'tall'); #+end_src #+name: fig:comp_fir_ligo_hinf @@ -1020,8 +865,17 @@ exportFig('figs/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 600); #+RESULTS: [[file:figs/comp_fir_ligo_hinf.png]] -* Alternative Synthesis +* "Closed-Loop" complementary filters +:PROPERTIES: +:header-args:matlab+: :tangle matlab/3_closed_loop_complementary_filters.m +:CUSTOM_ID: sec:closed_loop_complementary_filters +:END: + ** Introduction :ignore: +#+begin_note + The Matlab file corresponding to this section is accessible [[file:matlab/3_closed_loop_complementary_filters.m][here]]. +#+end_note + ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) <> @@ -1031,327 +885,43 @@ exportFig('figs/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 600); <> #+end_src +#+begin_src matlab +%% Initialize Frequency Vector +freqs = logspace(-1, 3, 1000); +#+end_src + #+begin_src matlab :tangle no addpath('./matlab'); addpath('./matlab/src'); #+end_src #+begin_src matlab :eval no +%% Add functions to path addpath('./src'); #+end_src -** Two generalized plants -In order to synthesize the complementary filter using the proposed method, we can use two alternative generalized plant as shown in Figures [[fig:h_infinity_arch_1]] and [[fig:h_infinity_arch_2]]. - -\begin{equation} - P_1 = \begin{bmatrix} W_1 & -W_1 \\ 0 & W_2 \\ 1 & 0 \end{bmatrix} -\end{equation} - - -#+begin_src latex :file h_infinity_arch_1.pdf - \begin{tikzpicture} - \node[block={4.5cm}{3.0cm}, fill=black!20!white, dashed] (P) {}; - \node[above] at (P.north) {$P_1(s)$}; - - \coordinate[] (inputw) at ($(P.south west)!0.75!(P.north west) + (-0.7, 0)$); - \coordinate[] (inputu) at ($(P.south west)!0.35!(P.north west) + (-0.7, 0)$); - - \coordinate[] (output1) at ($(P.south east)!0.75!(P.north east) + ( 0.7, 0)$); - \coordinate[] (output2) at ($(P.south east)!0.35!(P.north east) + ( 0.7, 0)$); - \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + ( 0.7, 0)$); - - \node[block, left=1.4 of output1] (W1){$W_1(s)$}; - \node[block, left=1.4 of output2] (W2){$W_2(s)$}; - \node[addb={+}{}{}{}{-}, left=of W1] (sub) {}; - - \node[block, below=0.3 of P] (H2) {$H_2(s)$}; - - \draw[->] (inputw) node[above right]{$w$} -- (sub.west); - \draw[->] (H2.west) -| ($(inputu)+(0.35, 0)$) node[above]{$u$} -- (W2.west); - \draw[->] (inputu-|sub) node[branch]{} -- (sub.south); - \draw[->] (sub.east) -- (W1.west); - \draw[->] ($(sub.west)+(-0.6, 0)$) node[branch]{} |- ($(outputv)+(-0.35, 0)$) node[above]{$v$} |- (H2.east); - \draw[->] (W1.east) -- (output1)node[above left]{$z_1$}; - \draw[->] (W2.east) -- (output2)node[above left]{$z_2$}; - \end{tikzpicture} -#+end_src - -#+name: fig:h_infinity_arch_1 -#+caption: Complementary Filter Synthesis - Conf 1 -#+RESULTS: -[[file:figs/h_infinity_arch_1.png]] - -\begin{equation} - P_2 = \begin{bmatrix} 0 & W_1 & 1 \\ W_2 & -W_1 & 0 \end{bmatrix} -\end{equation} - -#+begin_src latex :file h_infinity_arch_2.pdf -\begin{tikzpicture} - \node[block={4.5cm}{4.5cm}, fill=black!20!white, dashed] (P) {}; - \node[above] at (P.north) {$P_2(s)$}; - - \coordinate[] (input2) at ($(P.south west)!0.85!(P.north west) + (-0.7, 0)$); - \coordinate[] (input1) at ($(P.south west)!0.55!(P.north west) + (-0.7, 0)$); - \coordinate[] (inputu) at ($(P.south west)!0.3!( P.north west) + (-0.7, 0)$); - - \coordinate[] (outputz) at ($(P.south east)!0.3!(P.north east) + (0.7, 0)$); - \coordinate[] (outputv) at ($(P.south east)!0.1!(P.north east) + (0.7, 0)$); - - \node[block, right=1.4 of input2] (W2){$W_2(s)$}; - \node[block, right=1.4 of input1] (W1){$W_1(s)$}; - \node[addb={+}{-}{}{}{}, right=of W1] (sub) {}; - \node[addb, left=2.5 of outputz] (add) {}; - - \node[block, below=0.3 of P] (H2) {$H_2(s)$}; - - \draw[->] (input2) node[above right]{$w_2$} -- (W2.west); - \draw[->] (input1) node[above right]{$w_1$} -- (W1.west); - \draw[->] (W2.east) -| (sub.north); - \draw[->] (W1.east) -- (sub.west); - \draw[->] (W1-|add)node[branch]{} -- (add.north); - \draw[->] (sub.south) |- (outputv) node[above left]{$v$} |- (H2.east); - \draw[->] (H2.west) -| (inputu) node[above right]{$u$} -- (add.west); - \draw[->] (add.east) -- (outputz) node[above left]{$z$}; -\end{tikzpicture} -#+end_src - -#+name: fig:h_infinity_arch_2 -#+caption: Complementary Filter Synthesis - Conf 2 -#+RESULTS: -[[file:figs/h_infinity_arch_2.png]] - -Let's run the $\mathcal{H}_\infty$ synthesis for both generalized plant using the same weights and see if the obtained filters are the same: -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -#+begin_src matlab -P1 = [W1 -W1; - 0 W2; - 1 0]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[H2, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+RESULTS: -#+begin_example -[H2, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - - Test bounds: 0.3263 <= gamma <= 1000 - - gamma X>=0 Y>=0 rho(XY)<1 p/f - 1.807e+01 1.4e-07 0.0e+00 1.185e-18 p - 2.428e+00 1.5e-07 0.0e+00 1.285e-18 p - 8.902e-01 -2.9e+02 # -7.1e-17 5.168e-19 f - 1.470e+00 1.5e-07 0.0e+00 1.462e-14 p - 1.144e+00 1.5e-07 0.0e+00 1.260e-14 p - 1.009e+00 1.5e-07 0.0e+00 4.120e-13 p - 9.478e-01 -6.8e+02 # -2.4e-17 1.449e-14 f - 9.780e-01 -1.6e+03 # -7.3e-17 6.791e-14 f - 9.934e-01 -4.2e+03 # -1.2e-16 3.524e-14 f - 1.001e+00 -2.0e+04 # -2.3e-17 5.717e-20 f - 1.005e+00 1.5e-07 0.0e+00 8.953e-18 p - 1.003e+00 -2.2e+05 # -1.8e-17 3.225e-12 f - 1.004e+00 1.5e-07 0.0e+00 2.445e-12 p - Limiting gains... - 1.004e+00 1.6e-07 0.0e+00 5.811e-18 p - - Best performance (actual): 1.004 -#+end_example - -#+begin_src matlab -P2 = [0 W1 1; - W2 -W1 0]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+RESULTS: -#+begin_example -[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - - Test bounds: 0.3263 <= gamma <= 1000 - - gamma X>=0 Y>=0 rho(XY)<1 p/f - 1.807e+01 0.0e+00 1.4e-07 2.055e-16 p - 2.428e+00 0.0e+00 1.4e-07 1.894e-18 p - 8.902e-01 -2.1e-16 -2.7e+02 # 1.466e-16 f - 1.470e+00 0.0e+00 1.4e-07 4.118e-16 p - 1.144e+00 0.0e+00 1.5e-07 2.105e-18 p - 1.009e+00 0.0e+00 1.5e-07 2.590e-13 p - 9.478e-01 -9.5e-17 -6.3e+02 # 1.663e-19 f - 9.780e-01 -1.1e-16 -1.5e+03 # 1.546e-14 f - 9.934e-01 -2.8e-17 -4.0e+03 # 3.934e-14 f - 1.001e+00 -3.1e-17 -1.9e+04 # 1.191e-19 f - 1.005e+00 0.0e+00 1.5e-07 1.443e-12 p - 1.003e+00 -8.3e-17 -2.1e+05 # 8.807e-13 f - 1.004e+00 0.0e+00 1.5e-07 1.459e-15 p - Limiting gains... - 1.004e+00 0.0e+00 1.5e-07 9.086e-19 p - - Best performance (actual): 1.004 -#+end_example - -And indeed, we can see that the exact same filters are obtained (Figure [[fig:hinf_comp_P1_P2_syn]]). -#+begin_src matlab :exports none -freqs = logspace(-2, 4, 1000); - -figure; -hold on; -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -plot(freqs, abs(squeeze(freqresp(H2b, freqs, 'Hz'))), '--', 'DisplayName', '$H_{2b}$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'southeast', 'FontSize', 8); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/hinf_comp_P1_P2_syn.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:hinf_comp_P1_P2_syn -#+caption: Comparison of $H_2(s)$ when using $P_1(s)$ or $P_2(s)$ -#+RESULTS: -[[file:figs/hinf_comp_P1_P2_syn.png]] - -** Shaping the Low pass filter or the high pass filter? -Let's see if there is a difference by explicitly shaping $H_1(s)$ or $H_2(s)$. - -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -Let's first synthesize $H_1(s)$: -#+begin_src matlab -P1 = [W2 -W2; - 0 W1; - 1 0]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[H1, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+RESULTS: -#+begin_example -[H1, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - - Test bounds: 0.3263 <= gamma <= 1.712 - - gamma X>=0 Y>=0 rho(XY)<1 p/f - 7.476e-01 -2.5e+01 # -8.3e-18 4.938e-20 f - 1.131e+00 1.9e-07 0.0e+00 1.566e-16 p - 9.197e-01 -1.4e+02 # -7.9e-17 4.241e-17 f - 1.020e+00 1.9e-07 0.0e+00 2.095e-16 p - 9.686e-01 -3.8e+02 # -7.0e-17 1.463e-23 f - 9.940e-01 -1.5e+03 # -1.3e-17 3.168e-19 f - 1.007e+00 1.9e-07 0.0e+00 1.696e-15 p - 1.000e+00 -4.8e+03 # -7.1e-18 7.203e-20 f - 1.004e+00 1.9e-07 0.0e+00 1.491e-14 p - 1.002e+00 -1.1e+04 # -2.6e-16 2.579e-14 f - 1.003e+00 -2.8e+04 # -6.0e-18 8.558e-20 f - Limiting gains... - 1.004e+00 2.0e-07 0.0e+00 5.647e-18 p - 1.004e+00 1.0e-06 0.0e+00 5.648e-18 p - - Best performance (actual): 1.004 -#+end_example - -And now $H_2(s)$: -#+begin_src matlab -P2 = [W1 -W1; - 0 W2; - 1 0]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[H2, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+RESULTS: -#+begin_example -[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - - Test bounds: 0.3263 <= gamma <= 1000 - - gamma X>=0 Y>=0 rho(XY)<1 p/f - 1.807e+01 1.4e-07 0.0e+00 1.185e-18 p - 2.428e+00 1.5e-07 0.0e+00 1.285e-18 p - 8.902e-01 -2.9e+02 # -7.1e-17 5.168e-19 f - 1.470e+00 1.5e-07 0.0e+00 1.462e-14 p - 1.144e+00 1.5e-07 0.0e+00 1.260e-14 p - 1.009e+00 1.5e-07 0.0e+00 4.120e-13 p - 9.478e-01 -6.8e+02 # -2.4e-17 1.449e-14 f - 9.780e-01 -1.6e+03 # -7.3e-17 6.791e-14 f - 9.934e-01 -4.2e+03 # -1.2e-16 3.524e-14 f - 1.001e+00 -2.0e+04 # -2.3e-17 5.717e-20 f - 1.005e+00 1.5e-07 0.0e+00 8.953e-18 p - 1.003e+00 -2.2e+05 # -1.8e-17 3.225e-12 f - 1.004e+00 1.5e-07 0.0e+00 2.445e-12 p - Limiting gains... - 1.004e+00 1.6e-07 0.0e+00 5.811e-18 p - - Best performance (actual): 1.004 -#+end_example - -And compare $H_1(s)$ with $1 - H_2(s)$ and $H_2(s)$ with $1 - H_1(s)$ in Figure [[fig:hinf_comp_H1_H2_syn]]. -#+begin_src matlab :exports none -freqs = logspace(-2, 4, 1000); - -figure; -hold on; -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -plot(freqs, abs(squeeze(freqresp(1-H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -plot(freqs, abs(squeeze(freqresp(1-H2, freqs, 'Hz'))), '--', 'DisplayName', '$H_2$'); -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '--', 'DisplayName', '$H_1$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/hinf_comp_H1_H2_syn.pdf', 'width', 'wide', 'height', 'normal'); -#+end_src - -#+name: fig:hinf_comp_H1_H2_syn -#+caption: Comparison of $H_1(s)$ with $1-H_2(s)$, and $H_2(s)$ with $1-H_1(s)$ -#+RESULTS: -[[file:figs/hinf_comp_H1_H2_syn.png]] - ** Using Feedback architecture #+begin_src matlab -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; +%% Design of the Weighting Functions +W1 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.45); +W2 = generateWF('n', 2, 'w0', 2*pi*10, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.45); #+end_src Let's first synthesize $H_1(s)$: #+begin_src matlab +%% Generalized plant for "closed-loop" complementary filter synthesis P = [ W1 0 1; -W1 W2 -1]; #+end_src #+begin_src matlab :results output replace :exports both +%% Standard H-Infinity Synthesis [L, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); #+end_src + #+begin_src matlab +%% Complementary filters H1 = inv(1 + L); H2 = 1 - H1; #+end_src @@ -1363,27 +933,19 @@ zpk(H2) #+RESULTS: #+begin_example -zpk(H1) - -ans = - +zpk(H1) = (s+3.842)^3 (s+153.6) (s+1.289e05) ------------------------------------------------------- (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272) -Continuous-time zero/pole/gain model. -zpk(H2) - -ans = - +zpk(H2) = 125.61 (s+3358)^2 (s^2 + 46.61s + 813.8) ------------------------------------------------------- (s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272) - -Continuous-time zero/pole/gain model. #+end_example #+begin_src matlab :exports none +%% Bode plot of the obtained Complementary filters with upper-bounds freqs = logspace(-1, 3, 1000); figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -1429,8 +991,12 @@ linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/hinf_filters_results_mixed_sensitivity.pdf', 'width', 700, 'height', 600); +#+end_src + #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/hinf_filters_results_mixed_sensitivity.pdf', 'width', 700 , 'height', 600); +exportFig('figs/hinf_filters_results_mixed_sensitivity.pdf', 'width', 'wide', 'height', 'tall'); #+end_src #+name: fig:hinf_filters_results_mixed_sensitivity @@ -1438,846 +1004,17 @@ exportFig('figs/hinf_filters_results_mixed_sensitivity.pdf', 'width', 700 , 'h #+RESULTS: [[file:figs/hinf_filters_results_mixed_sensitivity.png]] -#+begin_src matlab :exports none -freqs = logspace(-2, 4, 1000); +* Synthesis of three complementary filters +:PROPERTIES: +:header-args:matlab+: :tangle matlab/4_three_complementary_filters.m +:header-args:matlab+: :comments org :mkdirp yes +:CUSTOM_ID: sec:three_comp_filters +:END: -figure; -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$|H_1|$'); -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$|H_2|$'); -plot(freqs, abs(squeeze(freqresp(L, freqs, 'Hz'))), 'k--', 'DisplayName', '$|L|$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3); -#+end_src - -** Adding feature in the filters - -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -#+begin_src matlab -Wf = (1 + s/2/pi/1)/s; -Wf = s/(1 + s/2/pi/1e2); - -% W2 = W2/Wf/(1 + s/2/pi/1e3); -#+end_src - -#+begin_src matlab -P = [W1 -Wf*W1; - 0 Wf*W2; - 1 -Wf]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[Ka, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -#+end_src - -#+begin_src matlab -K = Ka*Wf; -#+end_src - -#+begin_src matlab -H1 = inv(1 + K); -H2 = 1 - H1; -#+end_src - -#+begin_src matlab :exports none -freqs = logspace(-2, 4, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca,'ColorOrderIndex',1); -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 2); - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); -ylim([-180, 180]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - - -** Compare "open-loop" shaping with "close-loop" shaping -*** Simple weights -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = ((((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n); - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W2 = ((((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n); -#+end_src - -#+begin_src matlab -Pol = [0 W1 1; - W2 -W1 0]; -#+end_src - -#+begin_src matlab :results value replace :exports results :tangle no -sprintf('The number of states of Pol is %i', length(Pol.StateName)) -#+end_src - -#+RESULTS: -: The number of states of Pol is 7 - -#+begin_src matlab :results output replace :exports both -tic; -[Hol, ~, gamma, ~] = hinfsyn(Pol, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hol_2 = Hol; -Hol_1 = 1 - Hol; -#+end_src - -#+begin_src matlab -Pcl = [0 W2 1 - W1 -W2 -1]; -#+end_src - -#+begin_src matlab :results value replace :exports results :tangle no -sprintf('The number of states of Pcl is %i', length(Pcl.StateName)) -#+end_src - -#+RESULTS: -: The number of states of Pcl is 8 - -#+begin_src matlab :results output replace :exports both -tic; -[Hcl, ~, gamma, ~] = hinfsyn(Pcl, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hcl_1 = 1 - 1/(1 + Hcl); -Hcl_2 = 1/(1 + Hcl); -#+end_src - -#+begin_src matlab :results output replace :exports results -size(Hol_1) -size(Hol_2) -size(Hcl_1) -size(Hcl_2) -#+end_src - -#+RESULTS: -#+begin_example -size(Hol_1) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hol_2) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hcl_1) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hcl_2) -State-space model with 1 outputs, 1 inputs, and 5 states. -'org_babel_eoe' -ans = - 'org_babel_eoe' -#+end_example - -#+begin_src matlab :exports none -freqs = logspace(-1, 3, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hol_1, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ OL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hol_2, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ OL'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hcl_1, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ CL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hcl_2, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ CL'); - -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 16; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_1, freqs, 'Hz')))), '-'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_2, freqs, 'Hz')))), '-'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_1, freqs, 'Hz')))), '--'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_2, freqs, 'Hz')))), '--'); -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks([-450:90:180]); ylim([-450, 200]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -*** Simple weights with LMI -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = ((((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n); - -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W2 = ((((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n); -#+end_src - -#+begin_src matlab -Pol = [0 W1 1; - W2 -W1 0]; -#+end_src - -#+begin_src matlab :results value replace :exports results :tangle no -sprintf('The number of states of Pol is %i', length(Pol.StateName)) -#+end_src - -#+RESULTS: -: The number of states of Pol is 7 - -#+begin_src matlab :results output replace :exports both -tic; -[Hol, ~, gamma, ~] = hinfsyn(Pol, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hol_2 = Hol; -Hol_1 = 1 - Hol; -#+end_src - -#+begin_src matlab -Pcl = [0 W2 1 - W1 -W2 -1]; -#+end_src - -#+begin_src matlab :results value replace :exports results :tangle no -sprintf('The number of states of Pcl is %i', length(Pcl.StateName)) -#+end_src - -#+RESULTS: -: The number of states of Pcl is 8 - -#+begin_src matlab :results output replace :exports both -tic; -[Hcl, ~, gamma, ~] = hinfsyn(Pcl, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hcl_1 = 1 - 1/(1 + Hcl); -Hcl_2 = 1/(1 + Hcl); -#+end_src - -#+begin_src matlab :results output replace :exports results -size(Hol_1) -size(Hol_2) -size(Hcl_1) -size(Hcl_2) -#+end_src - -#+RESULTS: -#+begin_example -size(Hol_1) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hol_2) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hcl_1) -State-space model with 1 outputs, 1 inputs, and 5 states. -size(Hcl_2) -State-space model with 1 outputs, 1 inputs, and 5 states. -'org_babel_eoe' -ans = - 'org_babel_eoe' -#+end_example - -#+begin_src matlab :exports none -freqs = logspace(-1, 3, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hol_1, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ OL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hol_2, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ OL'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hcl_1, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ CL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hcl_2, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ CL'); - -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 16; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_1, freqs, 'Hz')))), '-'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_2, freqs, 'Hz')))), '-'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_1, freqs, 'Hz')))), '--'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_2, freqs, 'Hz')))), '--'); -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks([-450:90:180]); ylim([-450, 200]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -*** Complex weights -#+begin_src matlab :exports none -w1 = 2*pi*0.008; x1 = 0.35; -w2 = 2*pi*0.04; x2 = 0.5; -w3 = 2*pi*0.05; x3 = 0.5; - -% Slope of +3 from w1 -wH = 0.008*(s^2/w1^2 + 2*x1/w1*s + 1)*(s/w1 + 1); -% Little bump from w2 to w3 -wH = wH*(s^2/w2^2 + 2*x2/w2*s + 1)/(s^2/w3^2 + 2*x3/w3*s + 1); -% No Slope at high frequencies -wH = wH/(s^2/w3^2 + 2*x3/w3*s + 1)/(s/w3 + 1); -% Little bump between w2 and w3 -w0 = 2*pi*0.045; xi = 0.1; A = 2; n = 1; -wH = wH*((s^2 + 2*w0*xi*A^(1/n)*s + w0^2)/(s^2 + 2*w0*xi*s + w0^2))^n; - -wH = 1/wH; -W1 = wH; -#+end_src - -#+begin_src matlab :exports none -n = 20; Rp = 1; Wp = 2*pi*0.102; -[b,a] = cheby1(n, Rp, Wp, 'high', 's'); -wL = 0.04*tf(a, b); - -wL = 1/wL; -W2 = wL; -#+end_src - -#+begin_src matlab -Pol = ss([0 W1 1; - W2 -W1 0]); -#+end_src - -#+begin_src matlab -Pcl = ss([0 W2 1 - W1 -W2 -1]); -#+end_src - -#+begin_src matlab :results output replace :exports results -size(Pol) -size(Pcl) -#+end_src - -#+RESULTS: -: size(Pol) -: State-space model with 2 outputs, 3 inputs, and 27 states. -: size(Pcl) -: State-space model with 2 outputs, 3 inputs, and 27 states. - -#+begin_src matlab :results output replace :exports both -tic; -for iter = 1:10 - [Hol, ~, gamma, ~] = hinfsyn(Pol, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'off'); -end; -toc; -#+end_src - -#+begin_src matlab -Hol_1 = 1 - Hol; -Hol_2 = Hol; -#+end_src - -#+begin_src matlab :results output replace :exports both -tic; -for iter = 1:10 - [Hcl, ~, gamma, ~] = hinfsyn(Pcl, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'off'); -end -toc; -#+end_src - -#+begin_src matlab -Hcl_1 = 1 - 1/(1 + Hcl); -Hcl_2 = 1/(1 + Hcl); -#+end_src - -#+begin_src matlab :results output replace :exports results -size(Hol_1) -size(Hol_2) -size(Hcl_1) -size(Hcl_2) -#+end_src - -#+RESULTS: -#+begin_example -size(Hol_1) -State-space model with 1 outputs, 1 inputs, and 27 states. -size(Hol_2) -State-space model with 1 outputs, 1 inputs, and 27 states. -size(Hcl_1) -State-space model with 1 outputs, 1 inputs, and 27 states. -size(Hcl_2) -State-space model with 1 outputs, 1 inputs, and 27 states. -'org_babel_eoe' -ans = - 'org_babel_eoe' -#+end_example - -#+begin_src matlab :exports none -freqs = logspace(-3, 1, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hol_1, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ OL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hol_2, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ OL'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hcl_1, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ CL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hcl_2, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ CL'); - -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([5e-3, 10]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 16; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_1, freqs, 'Hz')))), '-'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_2, freqs, 'Hz')))), '-'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_1, freqs, 'Hz')))), '--'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_2, freqs, 'Hz')))), '--'); -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks([-450:90:180]); ylim([-450, 200]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -*** Complex weights with alternative conf - -#+begin_src matlab -Pcl = ss([W1 -W1; - 0 W2; - 1 -1]); -#+end_src - -#+begin_src matlab :results output replace :exports both -tic; -[Hcl, ~, gamma, ~] = hinfsyn(Pcl, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hcl_1 = 1 - 1/(1 + Hcl); -Hcl_2 = 1/(1 + Hcl); -#+end_src - - - -*** Complex weights with LMI -#+begin_src matlab :exports none -w1 = 2*pi*0.008; x1 = 0.35; -w2 = 2*pi*0.04; x2 = 0.5; -w3 = 2*pi*0.05; x3 = 0.5; - -% Slope of +3 from w1 -wH = 0.008*(s^2/w1^2 + 2*x1/w1*s + 1)*(s/w1 + 1); -% Little bump from w2 to w3 -wH = wH*(s^2/w2^2 + 2*x2/w2*s + 1)/(s^2/w3^2 + 2*x3/w3*s + 1); -% No Slope at high frequencies -wH = wH/(s^2/w3^2 + 2*x3/w3*s + 1)/(s/w3 + 1); -% Little bump between w2 and w3 -w0 = 2*pi*0.045; xi = 0.1; A = 2; n = 1; -wH = wH*((s^2 + 2*w0*xi*A^(1/n)*s + w0^2)/(s^2 + 2*w0*xi*s + w0^2))^n; - -wH = 1/wH; -W1 = ss(minreal(wH)); -#+end_src - -#+begin_src matlab :exports none -n = 20; Rp = 1; Wp = 2*pi*0.102; -[b,a] = cheby1(n, Rp, Wp, 'high', 's'); -wL = 0.04*tf(a, b); - -wL = 1/wL; -W2 = ss(minreal(wL)); -#+end_src - -#+begin_src matlab -Pol = [0 W1 1; - W2 -W1 0]; -#+end_src - -#+begin_src matlab -Pcl = [0 W2 1 - W1 -W2 -1]; -#+end_src - -#+begin_src matlab :results output replace :exports both -tic; -[Hol, ~, gamma, ~] = hinfsyn(Pol, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hol_1 = 1 - Hol; -Hol_2 = Hol; -#+end_src - -#+begin_src matlab :results output replace :exports both -tic; -[Hcl, ~, gamma, ~] = hinfsyn(Pcl, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -toc; -#+end_src - -#+begin_src matlab -Hcl_1 = 1 - 1/(1 + Hcl); -Hcl_2 = 1/(1 + Hcl); -#+end_src - -#+begin_src matlab :results output replace :exports results -size(Hol_1) -size(Hol_2) -size(Hcl_1) -size(Hcl_2) -#+end_src - -#+RESULTS: -#+begin_example -size(Hol_1) -State-space model with 1 outputs, 1 inputs, and 34 states. -size(Hol_2) -State-space model with 1 outputs, 1 inputs, and 34 states. -size(Hcl_1) -State-space model with 1 outputs, 1 inputs, and 47 states. -size(Hcl_2) -State-space model with 1 outputs, 1 inputs, and 47 states. -'org_babel_eoe' -ans = - 'org_babel_eoe' -#+end_example - -#+begin_src matlab :exports none -freqs = logspace(-3, 1, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hol_1, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ OL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hol_2, freqs, 'Hz'))), '-', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ OL'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, abs(squeeze(freqresp(Hcl_1, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_H(s)$ - $\mathcal{H}_\infty$ CL'); -set(gca,'ColorOrderIndex',2); -plot(freqs, abs(squeeze(freqresp(Hcl_2, freqs, 'Hz'))), '--', ... - 'DisplayName', '$H_L(s)$ - $\mathcal{H}_\infty$ CL'); - -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([5e-3, 10]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 16; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_1, freqs, 'Hz')))), '-'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hol_2, freqs, 'Hz')))), '-'); - -set(gca,'ColorOrderIndex',1); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_1, freqs, 'Hz')))), '--'); -set(gca,'ColorOrderIndex',2); -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(Hcl_2, freqs, 'Hz')))), '--'); -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; -yticks([-450:90:180]); ylim([-450, 200]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -*** Conclusion -#+begin_important -There is no difference between " open-loop" shaping and "close-loop" shaping: -- same " solving" time -- same obtained filter orders -#+end_important - -** Integral Action -*** Test -#+begin_src matlab -freqs = logspace(-2, 3, 1000); -#+end_src - -\begin{equation} -W_1(s) = \frac{W_{10}(s)}{s} -\end{equation} -with $W_{10}(0) \neq 0$ - -#+begin_src matlab -W10 = 0.1*(s+125.7)^2/(s+1.257)^2*(s + 0.0001)/(1 + s/1000); -W1 = W10/s; -#+end_src - -#+begin_src matlab -n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.5; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -#+begin_src matlab :exports none -figure; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -hold off; -xlim([freqs(1), freqs(end)]); -ylim([1e-4, 20]); -xticks([0.1, 1, 10, 100, 1000]); -leg = legend('location', 'southeast', 'FontSize', 8); -leg.ItemTokenSize(1) = 18; -#+end_src - -#+begin_src matlab -V = 1; -#+end_src - -#+begin_src matlab -P = [ V*W10 W10; - 0 W2; - -V -1]; -#+end_src - -And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. -#+begin_src matlab :results output replace :exports both -[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -#+end_src - -#+begin_src matlab -H1 = 1 - H2; -#+end_src - -#+begin_src matlab :exports none -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([1e-4, 20]); -yticks([1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 18; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -*** Example 6.7.3 -#+begin_src matlab -n = 2; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 0.45; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 2; w0 = 2*pi*10; G0 = 1/10; G1 = 1000; Gc = 0.45; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -#+begin_src matlab -V = 1/(1 + s/2/pi/100); -#+end_src - -#+begin_src matlab -V = W2; -W2 = tf(1); -#+end_src - -#+begin_src matlab -P = [W1 -W1; - 0 W2; - V 0]; -#+end_src - -#+begin_src matlab :results output replace :exports both -[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); -#+end_src - -#+begin_src matlab -H2 = H2*V; -#+end_src - -#+begin_src matlab -H1 = 1 - H2; -#+end_src - -#+begin_src matlab :exports none -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([1e-4, 20]); -yticks([1e-4, 1e-3, 1e-2, 1e-1, 1, 1e1]); -leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); -leg.ItemTokenSize(1) = 18; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -* Impose a positive slope at DC or a negative slope at infinite frequency ** Introduction :ignore: +#+begin_note + The Matlab file corresponding to this section is accessible [[file:matlab/4_three_complementary_filters.m][here]]. +#+end_note ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) @@ -2288,82 +1025,140 @@ xlim([freqs(1), freqs(end)]); <> #+end_src +#+begin_src matlab +freqs = logspace(-2, 3, 1000); +#+end_src + #+begin_src matlab :tangle no addpath('./matlab'); addpath('./matlab/src'); #+end_src -#+begin_src matlab :exec no +#+begin_src matlab :eval no addpath('./src'); #+end_src -** Manually shift zeros to the origin after synthesis -Suppose we want $H_2(s)$ to be an high pass filter with a slope of +2 at low frequency (from 0Hz). +** Theory +We want: +\begin{align*} + & |H_1(j\omega)| < 1/|W_1(j\omega)|, \quad \forall\omega\\ + & |H_2(j\omega)| < 1/|W_2(j\omega)|, \quad \forall\omega\\ + & |H_3(j\omega)| < 1/|W_3(j\omega)|, \quad \forall\omega\\ + & H_1(s) + H_2(s) + H_3(s) = 1 +\end{align*} -We cannot impose that using the weight $W_2(s)$ as it would be improper. +For that, we use the $\mathcal{H}_\infty$ synthesis with the architecture shown on figure [[fig:comp_filter_three_hinf]]. -However, we may manually shift 2 of the low frequency zeros to the origin. +#+name: fig:comp_filter_three_hinf +#+caption: Generalized architecture for generating 3 complementary filters +[[file:figs-journal/comp_filter_three_hinf_fb.png]] +The $\mathcal{H}_\infty$ objective is: +\begin{align*} + & |(1 - H_2(j\omega) - H_3(j\omega)) W_1(j\omega)| < 1, \quad \forall\omega\\ + & |H_2(j\omega) W_2(j\omega)| < 1, \quad \forall\omega\\ + & |H_3(j\omega) W_3(j\omega)| < 1, \quad \forall\omega\\ +\end{align*} + +And thus if we choose $H_1 = 1 - H_2 - H_3$ we have solved the problem. + +** Weights +First we define the weights. #+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 3; w0 = 2*pi*10; G0 = 1e4; G1 = 0.1; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; +%% Design of the Weighting Functions +W1 = generateWF('n', 2, 'w0', 2*pi*1, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.5); +W2 = 0.22*(1 + s/2/pi/1)^2/(sqrt(1e-4) + s/2/pi/1)^2*(1 + s/2/pi/10)^2/(1 + s/2/pi/1000)^2; +W3 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.5); #+end_src -#+begin_src matlab -P = [W1 -W1; - 0 W2; - 1 0]; +#+begin_src matlab :exports none +%% Inverse magnitude of the weighting functions +figure; +hold on; +set(gca,'ColorOrderIndex',1) +plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); +set(gca,'ColorOrderIndex',2) +plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); +set(gca,'ColorOrderIndex',3) +plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'DisplayName', '$|W_3|^{-1}$'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +hold off; +xlim([freqs(1), freqs(end)]); ylim([2e-4, 1.3e1]) +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; #+end_src -And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command: -#+begin_src matlab -[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/three_weighting_functions.pdf', 'width', 'wide', 'height', 'normal'); #+end_src +#+name: fig:three_weighting_functions +#+caption: Three weighting functions used for the $\mathcal{H}_\infty$ synthesis of the complementary filters +#+RESULTS: +[[file:figs/three_weighting_functions.png]] + +** H-Infinity Synthesis +Then we create the generalized plant =P=. #+begin_src matlab -[z,p,k] = zpkdata(H2) +%% Generalized plant for the synthesis of 3 complementary filters +P = [W1 -W1 -W1; + 0 W2 0 ; + 0 0 W3; + 1 0 0]; #+end_src -Looking at the zeros, we see two low frequency complex conjugate zeros. -#+begin_src matlab :results output replace :exports results -z{1} +And we do the $\mathcal{H}_\infty$ synthesis. +#+begin_src matlab :results output replace :exports both +%% Standard H-Infinity Synthesis +[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); #+end_src #+RESULTS: #+begin_example -z{1} -ans = - -4690930.24283199 + 0i - -163.420524657426 + 0i - -0.853192261081498 + 0.713416012479897i - -0.853192261081498 - 0.713416012479897i - -3.15812268762265 + 0i +[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); +Resetting value of Gamma min based on D_11, D_12, D_21 terms + +Test bounds: 0.1000 < gamma <= 1050.0000 + + gamma hamx_eig xinf_eig hamy_eig yinf_eig nrho_xy p/f +1.050e+03 3.2e+00 4.5e-13 6.3e-02 -1.2e-11 0.0000 p + 525.050 3.2e+00 1.3e-13 6.3e-02 0.0e+00 0.0000 p + 262.575 3.2e+00 2.1e-12 6.3e-02 -1.5e-13 0.0000 p + 131.337 3.2e+00 1.1e-12 6.3e-02 -7.2e-29 0.0000 p + 65.719 3.2e+00 2.0e-12 6.3e-02 0.0e+00 0.0000 p + 32.909 3.2e+00 7.4e-13 6.3e-02 -5.9e-13 0.0000 p + 16.505 3.2e+00 1.4e-12 6.3e-02 0.0e+00 0.0000 p + 8.302 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p + 4.201 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p + 2.151 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p + 1.125 3.2e+00 2.8e-12 6.3e-02 0.0e+00 0.0000 p + 0.613 3.0e+00 -2.5e+03# 6.3e-02 0.0e+00 0.0000 f + 0.869 3.1e+00 -2.9e+01# 6.3e-02 0.0e+00 0.0000 f + 0.997 3.2e+00 1.9e-12 6.3e-02 0.0e+00 0.0000 p + 0.933 3.1e+00 -6.9e+02# 6.3e-02 0.0e+00 0.0000 f + 0.965 3.1e+00 -3.0e+03# 6.3e-02 0.0e+00 0.0000 f + 0.981 3.1e+00 -8.6e+03# 6.3e-02 0.0e+00 0.0000 f + 0.989 3.2e+00 -2.7e+04# 6.3e-02 0.0e+00 0.0000 f + 0.993 3.2e+00 -5.7e+05# 6.3e-02 0.0e+00 0.0000 f + 0.995 3.2e+00 2.2e-12 6.3e-02 0.0e+00 0.0000 p + 0.994 3.2e+00 1.6e-12 6.3e-02 0.0e+00 0.0000 p + 0.994 3.2e+00 1.0e-12 6.3e-02 0.0e+00 0.0000 p + + Gamma value achieved: 0.9936 #+end_example -We manually put these zeros at the origin: +** Obtained Complementary Filters +The obtained filters are: #+begin_src matlab -z{1}([3,4]) = 0; +%% +H2 = tf(H(1)); +H3 = tf(H(2)); +H1 = 1 - H2 - H3; #+end_src -And we create a modified filter $H_{2z}(s)$: -#+begin_src matlab -H2z = zpk(z,p,k); -#+end_src - -And as usual, $H_{1z}(s)$ is defined as the complementary of $H_{2z}(s)$: -#+begin_src matlab -H1z = 1 - H2z; -#+end_src - -The bode plots of $H_1(s)$, $H_2(s)$, $H_{1z}(s)$ and $H_{2z}(s)$ are shown in Figure [[fig:comp_filters_shift_zero]]. -And we see that $H_{1z}(s)$ is slightly modified when setting the zeros at the origin for $H_{2z}(s)$. - #+begin_src matlab :exports none -freqs = logspace(-2, 4, 1000); - +%% Bode plot of the obtained complementary filters figure; tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); @@ -2371,287 +1166,69 @@ tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); ax1 = nexttile([2, 1]); hold on; set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(1-H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(1-H2z, freqs, 'Hz'))), '--', 'DisplayName', '$H_{1z}$'); -plot(freqs, abs(squeeze(freqresp(H2z, freqs, 'Hz'))), '--', 'DisplayName', '$H_{2z}$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(1-H2, freqs, 'Hz'))), '-'); -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1z, freqs, 'Hz'))), '--'); -plot(freqs, 360+180/pi*phase(squeeze(freqresp(H2z, freqs, 'Hz'))), '--'); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/comp_filters_shift_zero.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:comp_filters_shift_zero -#+caption: Bode plots of $H_1(s)$, $H_2(s)$, $H_{1z}(s)$ and $H_{2z}(s)$ -#+RESULTS: -[[file:figs/comp_filters_shift_zero.png]] - -** Imposing a positive slope at DC during the synthesis phase - -Suppose we want to synthesize $H_2(s)$ such that it has a slope of +2 from DC. -We can include this "feature" in the generalized plant as shown in Figure [[fig:h_infinity_arch_H2_feature]]. - -#+begin_src latex :file h_infinity_arch_H2_feature.pdf - \begin{tikzpicture} - \node[block={4.5cm}{4.0cm}, fill=black!20!white, dashed] (P) {}; - \node[above] at (P.north) {$P(s)$}; - - \coordinate[] (inputw) at ($(P.south west)!0.8!(P.north west) + (-0.7, 0)$); - \coordinate[] (inputu) at ($(P.south west)!0.5!(P.north west) + (-0.7, 0)$); - - \coordinate[] (output1) at ($(P.south east)!0.8!(P.north east) + ( 0.7, 0)$); - \coordinate[] (output2) at ($(P.south east)!0.5!(P.north east) + ( 0.7, 0)$); - \coordinate[] (outputv) at ($(P.south east)!0.2!(P.north east) + ( 0.7, 0)$); - - \node[block, left=1.4 of output1] (W1){$W_1(s)$}; - \node[block, left=1.4 of output2] (W2){$W_2(s)$}; - \node[block, left=1.4 of outputv] (Hw){$H_{2w}(s)$}; - \node[addb={+}{}{}{}{-}, left=of W1] (sub) {}; - - \node[block, below=0.3 of P] (H2) {$H_2^\prime(s)$}; - - \draw[->] (inputw) node[above right]{$w$} -- (sub.west); - \draw[->] (H2.west) -| ($(inputu)+(0.35, 0)$) node[above]{$u$} -- (W2.west); - \draw[->] (inputu-|sub) node[branch]{} -- (sub.south); - \draw[->] (sub.east) -- (W1.west); - \draw[->] ($(sub.west)+(-0.6, 0)$) node[branch]{} |- (Hw.west); - \draw[->] (Hw.east) -- ($(outputv)+(-0.35, 0)$) node[above]{$v$} |- (H2.east); - \draw[->] (W1.east) -- (output1)node[above left]{$z_1$}; - \draw[->] (W2.east) -- (output2)node[above left]{$z_2$}; - \end{tikzpicture} -#+end_src - -#+name: fig:h_infinity_arch_H2_feature -#+caption: Generalized plant with included wanted feature represented by $H_{2w}(s)$ -#+RESULTS: -[[file:figs/h_infinity_arch_H2_feature.png]] - -After synthesis, the obtained filter will be: -\begin{equation} - H_2(s) = H_2^\prime(s) H_{2w}(s) -\end{equation} -and therefore the "feature" will be included in the filter. - -For $H_1(s)$ nothing is changed: $H_1(s) = 1 - H_2(s)$. - -The weighting functions are defined as usual: -#+begin_src matlab -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 3; w0 = 2*pi*10; G0 = 1e4; G1 = 0.1; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -The wanted feature here is a +2 slope at low frequency. -For that, we use an high pass filter with a slope of +2 at low frequency. -#+begin_src matlab -w0 = 2*pi*50; -H2w = (s/w0/(s/w0+1))^2; -#+end_src - -We define the generalized plant as shown in Figure [[fig:h_infinity_arch_H2_feature]]. -#+begin_src matlab -P = [W1 -W1; - 0 W2; - H2w 0]; -#+end_src - -And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. -#+begin_src matlab :results output replace :exports both -[H2p, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -#+end_src - -Finally, we define $H_2(s)$ as the product of the synthesized filter and the wanted "feature": -#+begin_src matlab -H2 = H2p*H2w; -#+end_src - -And we define $H_1(s)$ to be the complementary of $H_2(s)$: -#+begin_src matlab -H1 = 1 - H2; -#+end_src - -The obtained complementary filters are shown in Figure [[fig:comp_filters_H2_feature]]. - -#+begin_src matlab :exports none -freqs = logspace(-3, 3, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$'); +plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$'); - +plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); +set(gca,'ColorOrderIndex',3) +plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'DisplayName', '$|W_3|^{-1}$'); set(gca,'ColorOrderIndex',1) plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); set(gca,'ColorOrderIndex',2) plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); +set(gca,'ColorOrderIndex',3) +plot(freqs, abs(squeeze(freqresp(H3, freqs, 'Hz'))), '-', 'DisplayName', '$H_3$'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude'); set(gca, 'XTickLabel',[]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); +ylim([1e-4, 20]); +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; % Phase ax2 = nexttile; hold on; set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); +plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz')))); set(gca,'ColorOrderIndex',2) -plot(freqs, 360+180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); +plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz')))); +set(gca,'ColorOrderIndex',3) +plot(freqs, 180/pi*phase(squeeze(freqresp(H3, freqs, 'Hz')))); hold off; xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); set(gca, 'XScale', 'log'); -yticks([-180:90:180]); +yticks([-180:90:180]); ylim([-220, 220]); linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/comp_filters_H2_feature.pdf', 'width', 'wide', 'height', 'tall'); -#+end_src - -#+name: fig:comp_filters_H2_feature -#+caption: Obtained complementary fitlers -#+RESULTS: -[[file:figs/comp_filters_H2_feature.png]] - -** Imposing a negative slope at infinity frequency during the synthesis phase -Let's suppose we now want to shape a low pass filter that as a negative slope until infinite frequency. - -The used technique is the same as in the previous section, and the generalized plant is shown in Figure [[fig:h_infinity_arch_H2_feature]]. - -The weights are defined as usual. -#+begin_src matlab -n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2; -W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; - -n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2; -W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n; -#+end_src - -This time, the feature is a low pass filter with a slope of -2 at high frequency. -#+begin_src matlab -H2w = 1/(s/(2*pi*10) + 1)^2; -#+end_src - -The generalized plant is defined: -#+begin_src matlab -P = [W1 -W1; - 0 W2; - H2w 0]; -#+end_src - -And we do the $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command. -#+begin_src matlab :results output replace :exports both -[H2p, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on'); -#+end_src - -The feature is added to the synthesized filter: -#+begin_src matlab -H2 = H2p*H2w; -#+end_src - -And $H_1(s)$ is defined as follows: -#+begin_src matlab -H1 = 1 - H2; -#+end_src - -The obtained complementary filters are shown in Figure [[fig:comp_filters_H2_feature_neg_slope]]. - -#+begin_src matlab :exports none -freqs = logspace(-1, 4, 1000); - -figure; -tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$w_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$w_2$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); +#+begin_src matlab :tangle no :exports none +exportFig('figs-journal/three_complementary_filters_results.pdf', 'width', 'wide', 'height', 600); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/comp_filters_H2_feature_neg_slope.pdf', 'width', 'wide', 'height', 'tall'); +exportFig('figs/three_complementary_filters_results.pdf', 'width', 'wide', 'height', 'tall'); #+end_src -#+name: fig:comp_filters_H2_feature_neg_slope -#+caption: Obtained complementary fitlers +#+name: fig:three_complementary_filters_results +#+caption: The three complementary filters obtained after $\mathcal{H}_\infty$ synthesis #+RESULTS: -[[file:figs/comp_filters_H2_feature_neg_slope.png]] - +[[file:figs/three_complementary_filters_results.png]] * Bibliography :ignore: +:PROPERTIES: +:CUSTOM_ID: sec:bibliography +:END: bibliographystyle:unsrt bibliography:ref.bib * Functions :PROPERTIES: :header-args:matlab+: :comments none :mkdirp yes :eval no +:CUSTOM_ID: sec:functions :END: -<> ** =generateWF=: Generate Weighting Functions :PROPERTIES: @@ -2699,13 +1276,12 @@ end #+end_src Verification that the parameters $G_0$, $G_c$ and $G_\infty$ are satisfy condition eqref:eq:cond_formula_1 or eqref:eq:cond_formula_2. -#+name: eq:condition_params_formula -\begin{subequations} - \begin{align} - G_0 < 1 < G_\infty \text{ and } G_0 < G_c < G_\infty \label{eq:cond_formula_1}\\ - G_\infty < 1 < G_0 \text{ and } G_\infty < G_c < G_0 \label{eq:cond_formula_2} - \end{align} -\end{subequations} +\begin{equation} + G_0 < 1 < G_\infty \text{ and } G_0 < G_c < G_\infty \label{eq:cond_formula_1} +\end{equation} +\begin{equation} + G_\infty < 1 < G_0 \text{ and } G_\infty < G_c < G_0 \label{eq:cond_formula_2} +\end{equation} #+begin_src matlab % Verification of correct relation between G0, Gc and Ginf @@ -2725,7 +1301,7 @@ The weighting function formula use is: #+name: eq:weight_formula \begin{equation} W(s) = \left( \frac{ - \hfill{} \frac{1}{\omega_c} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}} + \frac{1}{\omega_c} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}} }{ \left(\frac{1}{G_\infty}\right)^{\frac{1}{n}} \frac{1}{\omega_c} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{1}{G_c}\right)^{\frac{1}{n}} }\right)^n diff --git a/matlab/figs b/matlab/figs-journal similarity index 100% rename from matlab/figs rename to matlab/figs-journal diff --git a/matlab/figs/comp_fir_ligo_hinf.pdf b/matlab/figs/comp_fir_ligo_hinf.pdf new file mode 100644 index 0000000..2343030 Binary files /dev/null and b/matlab/figs/comp_fir_ligo_hinf.pdf differ diff --git a/matlab/figs/comp_fir_ligo_hinf.png b/matlab/figs/comp_fir_ligo_hinf.png new file mode 100644 index 0000000..8039d8a Binary files /dev/null and b/matlab/figs/comp_fir_ligo_hinf.png differ diff --git a/matlab/figs/fir_filter_ligo.pdf b/matlab/figs/fir_filter_ligo.pdf new file mode 100644 index 0000000..26d686b Binary files /dev/null and b/matlab/figs/fir_filter_ligo.pdf differ diff --git a/matlab/figs/fir_filter_ligo.png b/matlab/figs/fir_filter_ligo.png new file mode 100644 index 0000000..2bd53ef Binary files /dev/null and b/matlab/figs/fir_filter_ligo.png differ diff --git a/matlab/figs/hinf_filters_results.pdf b/matlab/figs/hinf_filters_results.pdf new file mode 100644 index 0000000..d24290a Binary files /dev/null and b/matlab/figs/hinf_filters_results.pdf differ diff --git a/matlab/figs/hinf_filters_results.png b/matlab/figs/hinf_filters_results.png new file mode 100644 index 0000000..ce00788 Binary files /dev/null and b/matlab/figs/hinf_filters_results.png differ diff --git a/matlab/figs/hinf_filters_results_mixed_sensitivity.pdf b/matlab/figs/hinf_filters_results_mixed_sensitivity.pdf new file mode 100644 index 0000000..7e4e68c --- /dev/null +++ b/matlab/figs/hinf_filters_results_mixed_sensitivity.pdf @@ -0,0 +1,1815 @@ +%PDF-1.4 +% +1 0 obj +<< +/Producer (Apache FOP Version 2.4.0-SNAPSHOT: PDFDocumentGraphics2D) +/CreationDate (D:20210901110953+02'00') +>> +endobj +2 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +3 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +4 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +5 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +6 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +7 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +8 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +9 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +10 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +11 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +12 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +13 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +14 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +15 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +16 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +17 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +18 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +19 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +20 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +21 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +22 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +23 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +24 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +25 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +26 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +27 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +28 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +29 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +30 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +31 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +32 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +33 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +34 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +35 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +36 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +37 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +38 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +39 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +40 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +41 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +42 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +43 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +44 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +45 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +46 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +47 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +48 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +49 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +50 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +51 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +52 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +53 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +54 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +55 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +56 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +57 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +58 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +59 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +60 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +61 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +62 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +63 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +64 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +65 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +66 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +67 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +68 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +69 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +70 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +71 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +72 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +73 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +74 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +75 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +76 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +77 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +78 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +79 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +80 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +81 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +82 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +83 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +84 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +85 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +86 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +87 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +88 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +89 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +90 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +91 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +92 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +93 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +94 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +95 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +96 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +97 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +98 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +99 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +100 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +101 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +102 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +103 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +104 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +105 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +106 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +107 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +108 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +109 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +110 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +111 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +112 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +113 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +114 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +115 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +116 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +117 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +118 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +119 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +120 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +121 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +122 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +123 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +124 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +125 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +126 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +127 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +128 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +129 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +130 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +131 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +132 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +133 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +134 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +135 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +136 0 obj +<< /Length 137 0 R /Filter /FlateDecode >> +stream +xĽώt;70 X-@LHl׊ŝ;bWu]թ,^srfA2"~/q'#f^_ǚ6}ׁ?sSOV]O8z֣׿̙Sjh?~#?ycz?o/%}z1%rs0|d dGYZY7}Vrf^Ҭf1s)c|6f7\Q??zIGc=%Mohc9HgG/i~&ڰsY4k}Y>z/mݬKkΏTä>zM?ה?Qr= +]ߟkImk>kYq4|v}p5m_^X3W5$_'Q>zM?ӷք+|v}o|p^ӮHQ>zAG]״s=~~Gi6cqGk6ӹC ]ߟ@#>zM?ߏڰ+|v}*ѣ>zM?ϣ?W5| GiY&@?^|?q+|v}/-+|v}W5:v]JFhng7[W6״}%uO5lG#?8kZ2ْh_ ?ي>ZZ R?fmhn'?٪? +fO^ЮlWu>w'/hekW(GMkstO^Ю֮4>i;=GO^ЮjW . }?څpXlV+|v g sL_ڼ]g3}im +:gs}6wO^Ю,z_{]?K+|vl/sL_r'/hfym +]?s6U򟼠]?sn+|vl)d/ >{O^ЮiUJ=O^ЮiNfY{]?+|vlOcl59߇O^Юi{^>q'/hfTJ/hTy<vlOLjI]gs}Jg|vO^ЮGW ]?{O^ЮL5kjLu8;Vlol>Uē^G9W׿M?xA~@~[ꇳitcz}V}7/hÏnYvXP8+\?hCy^}췎!c:ݓJ?ho=Z/hSIOFO#hSʕ4G}Mw0Qx׾  *"q~țO{=\aF<&\aϱFB|n5Uޠ|vx+A +oPn1:oЭSX|nuޠ{{I7V9^K LQ|BX=IM|nߠ{pxJ2ދ4AZoЭ,tx. 1Az +oЭ9y~|nޠ{a{7V^ rw|n5Uߠ[{97V^ זѱcfyo"29C+K( WP +}0>f2OoQ + za7+b´0ht x^|3+/4}6E +_h/Т[2e4]9֛ncC^XZ- +c^WTEc^XN-c^XH;- + n-z]qo( -za( ueB2A+}>.},PRhQ(M"hO,Ji7W&Fb!آ$Fb آ#Nߜ _Y;-:\?^x­ql K#: za'95u县ѢX8腅ѢX8%Ӣ7W7Fb1آ5NB[^W!<P ya)o(N-zao(M-zaorɡE,BɱE/,9Xw.BqآIN _X z [آkFBqؠוiF{bYؠhFbAآfNB)[^W-Ec^X;-:B߸v C^X=q K@?ޞX9eq>ߗ/|;~Y߸WEoG /+/|ۘwi_NP|3~#ebh<cK[ /0E+/ื&}.K/&3 7>0.4䭁q;.?Cxc~7W_woMz]ؤ_v܍Mzm[~{kѻ}o[uo7ޱ%L -z`[~76_|c֤_{Mz[~S|KޚBp-yؤ}A MzФ_/& :pl/?o-z MEtMzgBql/ .ql@ߚ{/hıID|ko?3CUoЯ$[Р_F!69:3vRyѯlÍ7⟉Ƿ ۻ?Îo.]ʷocQ{{AsI2jY0L x +'o6Ae{9U#X?6O_:eX:f?$oԵZ>|;Livtm(×?dgNo}*F _̐m/ne|`ULi³zK_|K|wcLj_G*x׀i?[9J{4gM5B8¥g߫X5,_\Z>)Gv|#4j|[+Rm}ٌf`IC&e/G}[+8a^؊{G1*c; t7y&`;Y'}2e˘yuIe3Pٛ2F|?R眦GAMpfY ΉOwRG^t8Z߈&bWǏ}#qۦaZT$o3YW]_[sՐZ}LGG#)L._ZR gRI:WmniAovQ dWWZROXz/ZsK>?ͭIKxTc.ULW:F.}jJ)Xz^]yƖj˫Fg􊚂i,,jT( vȲFL*%wW>dtXanM}lwi+|ycJKv c6 >~8I؅r@vr_qjJ6v@Ï)0n[Ƹ**m ^ $U傾 GwVLlizv!Ǜ3nݤ0[ؼ~3VnZoAFѬ/5i܉%:HҺUc1L؆hPCym9'$<Z#{jC+Wia5ٿկ\1wE\Ŵ2j&j(ԜM1Wf1B ^X(SklY?C 6x,bxZqxj$o?Lyh 欿YNZ2Uf5g 骙Tÿ: uխ9oaY$~L/h\9:.UC_9WX{_֜-ofّs{~Z +]0cW, 3{Ga]*Y4gtJM~, \"LUo 6 g/mhGێ{>Y\5sC-UgX$4ghB_};\xw+y\;hꎕgsz"ȼ-۵xo gX[?}o3д歟S{ۇu쾛2hVxnLMg1gYZ:=3~n2؍3:;sдxsJgVCD`VCveeK8Cδ挿s)0;ﶤeMz- )#pk~1xX AmYrW^UTp7Viə? yƒgD=͟xA]q hFav? j46j>Ƃș?/fg>4&}pEtgƲ^~~ф!ыe鉗~, *F>Ces!a Ԝ=kOf#٭/5=xcShz1cL`~^2>I`:5> +|QLsk4h[!cZw߹Ӱ6.a[0ChK?Զv?88Ə]$gho̿1w)ض]hG 0/ř?g+2&' 2iQ1,쟬Wm̿[5`v-p1#6ܭ]?c/ ÙY-QL^6BR-g +e?<V4EebZӒ +ߜ0eط]֏݃ySg<d$~yu?;y/7s(aF֕SDyZZ]cGaYavnٶa2͌Nd +\^eQS/X̵O!KMM[Ve-ځ!ގ+n``~݀%N[ڵW -ujbtWX3܆Y?ʍ7}PaH4*khx080mk4~;syE0jswb,NO<0k8C nG&HJG)MCC 5L`" eOlDR] ;{{)//ppt)i'tۆcU-Ug^-vt'mߛ֝''{xӆ~wܚÄt]w.8=cat-aےck[XU@G^P1ziSwa`v?vL3jZsϝ,[Zf.;?lK?ǚ]|ј5îgp=BӡN}N̍´~{`w09["(]7[YX . .8(I2I93H ~]Ԟ_0 +Ob" JQ2<;,i]_׍ I + i-x콭=Sl3e;X)r +' V~\_xn;=L;#exŎ?ߵ h/X9M2Y,v[?-dwNFQ0rrtZY^хi3@{O/<;lYOMP&:и+~jGi~ՀE7e7,q!~HvY 4jN k9KrÚdz.ˠ^ř?_}{S̟~vs90.r?He;j8|r: `z\*gխk)X.ϼIYcGg$Bb%e9<ضep<`nd]p. ,0vD2~8A6y zMg̫9㧏?5]o搋\]›;ёl0ϖ/aހ9%OR//tji4 cgpo$E-^FP¤=i +nיe?BNO9/Q{veuFS Nsf܌ʬV}}r],dZ9eGK9ySX +}.8w?5FӬRa&±'/2~-*.47Č0_֟U?֞O މ2ӴҤMgrAHro敡R~:覆^gt&Ӻ&gAy몠a\ ^D3c./c[Ψ]O_5epCnE S|fA?9(;MOxՃI/]0?^¤M ՅER2h<0ͅ&+w60$$E72Ʃ(V7acyOz?C,]Βٜ]o2֝B>n֘lY`]َz錿$bv=r_}~\_*)k4 8}l ǶԞ>?tW夡秖>`熟-1lm_Mj׆v7,87,-_}\}ޘ/x iSgek>oebwsW>fmX:5ACZccB01w 9k.ȏRKx\cZ~Ƒ22B* G Sy^E>-2/,6im*?-)>51j}IpA~2x4Xc JǢ9|3o{!>_h1k {88Ys.Ç0G,Lk= ^pfw]g~L?s^7:}`OUqZlaKu8 aZҮɧ3-] ?FWf[Uk*nOu`s ?sb +֮n(RC;[<࠶ؽ my<|WkgC1L|(?ƿ- UZ\cv(?aж4ݙ?4YR)WLl3;TLsA~tu8OYLI_TI6p1~LMbLjs5eKni]M=.Lxe c%B[rA~0Éw5ܒ`$,.?ZـiSz 'K.ȏat(I ?<]3 vY;ۄ!icEuK.xdQ~`Xw|˙?wPqMa iHí{Z<0~, ()9_ ?2 01~s*OZm?0l˝zܮ<*k_oQЍ7_K?}!S.ZgKSKtzV? ]eQgcńlZ=d=mQAƆ(he԰oTL߈gr3~l0b|D۟|.`W],?sQUêE x:;k.,ikϳ> R1]O =l묏 ,O,x>jUᖞOۄY:cbd(\O1R^讳>jJa|&2ȿ=<;SGu~԰l\}ԎݪcN lS\ < lZUj~w1 W]~H;ʭ|rnR{>5 2=_T^dVOsjl.ZpWhe`?qv qj 𣆟+Jk}Z>lI|cߪ^l?\4 V,& }h>'`Zdngtuhow~Mu7g( WiQ;jet1}, /bM'͏\~Uw~ 6gӊbIҜ<\eYǡ5s$g8 p!~oaר1b7s;vY?)0a6e S4欟4p͈%#0OYy`kӸ?|13RZ۹67~v_Ubk3}:+kL:, (Ҭ0ßHbWX{.z+HͬngD=ݗz=v;[ (anQ!SKLSper4v>υ3,i +DĀjei>jί۲twz%`Ӆ+MK}1ҍ=z/˅Q%3L6a֟ ckk-[X-0d0iyofLnѷ->+m>r>>𸼝4-{-0S}j#d]Mrks`BQZ-<8nxN UyEX9>jL^ -t-o#[li-|h(?!^mK} #O;x{iKyPKU.yUo;ԮU$[Ac:[?1X)+Rî[͝[KN1kz][Ihk_X zfݪ[j_. +x.҇ ]o7I;à~nƱR(J3X:o晙6_rn.ΥD}ĉPۇ4݉C F|_3{+IO{挟ӬaЪ7~n6ּ񛳂ѡiEϐކ7~hi1ibm.z鍟So[AOOu/5{=9ϖ\8mאRfgϽo<$m-mY>ύ*|-[o/{sj~5ء?gWsjY]5/o:MK{;䝉uHZgaj3f!5X#{zjy0T5zlGvp7xWFvYGa0ѣ{g|d on0V+4{n(33|Z@Q4{8xmA+s=Θ[~9*>֜7Q}g-[:qyy5F㇆DQhVZ$xS7=ᇙdbX~[\8FHUŕ:}a(-/Mڛ6bϲ7|aZӡXimDY>`֝H_ԧ#36Mq返]~H$+`bC9cY/vMo +㕽Y˻<I%8%lAyGHӒ}h [<~K6$o g֪y ڮ3}.ZLk㷼+{@Ԯ'ʘ"-9]~c<:qEoz-_8]~fRaQ啑R}EY@[s~ƒk=R_bR~y6R_y((_Y8?m0R>NaG\IؕUBTy>kfؚ[`jۏV~,U/J>5:jfN G4r>dR1DžZ01-liih͟+oWi[)+``]jٚ[y_ V#OZ/ +yEђ_Yb Gg4eO-՝% BUSC@-L;UZk?5@pl3>J\Qj.]2O-YNi3N<陣'JWeR E/_\9,1UeD=ZʏSy`#KR@ƨ%Whrhß%; :Zl?3D/=}[f`ލPk?Vw?]k1/Y&"Gr}gÎVc=~Oü/I->&jΗ6یml->:9ڊoaJEm?5F'ٮle=v,`twKMk}ְ\uk-.Xu;wd]ҟX}Shg>ҏ’z-s'vs1hiۇi)..C9FK ޣښ +ƥ6Z4zhy=.,+Aj7K?l!wc̛c9V\yS9XxpL4fn3(25ը2Y5=lX=:,MϻkF4H[ ?hfரVp1*~jjڕ㏱%V(~nʏN[ƏWS\i^fG4,\ }Pmgޏ{1l:(>6λY<׼3'el{ˮWn,2q3}^SFI퇶)Eg +̒peޥL?Lstkv0Knek [Y?^Iuz`έy.YyM"WH֌`Z&|n .fo Gb\Ym+ ]~~nzgmUef{YDp:oasUvyj;n>ޔ6[}ok>KNCZ9?*;Krr[eֵz{ ۚfqov۩⚟{fGO5{mfo:Z?n>x#7~+(tt[RfoQmѿEOw[j\ӓ>Qvڴo>K,f {lS>v^^fy]}ݖ}QG} >#ݖ,;nMs'+)ܖDQoew>'>ſneoLU?=s7Wx=޼dz.h cafxZ gyӜϏ2{'=u17`ֶ'xa{aJjm^v.pN9^^6ϊKv.]u/\O煝K{  qmmpa<\xpa۲֦9\tqÅnR^Aըy\v0ň˷ ǃ;!#)?ʺC.t6W˟paIeM{d ;}6v?K\FDrpQhaH΍@,_p¶6Goɺ$-a,TgS+lk+ѳ^-/($ +Zw&p +Un>0IdyTOţ¶60IW<)LڐKq#mx!)L$B-?n0iv¤aK9E0i}='L=cxP4flzP4+G/X~S-Ǎ&d& cwi0:=)LmVhX&yT4gN`Vtțf5ڤ9 +v!*L' +ԣ¤3LxbĢa7T4 )if'V4I<+L +ư_i&ߠAYaҊY +̏zXa0v>YY ++ 0XwDc6+LZ9Vƨ } +fu'ռu#v%cgVF{`ImϕC=¤m٪gmi $$ +Ӗ8¤ՂQ[z\ha +\7=QsI*=ފύN 0iM0 +yKXퟀʜ`k(7¤#LòZ[-L|8Z +7Z.b +ƳSy XaVفfZOgIyNv߈.GO ,XaXR +6ny>y.GIM]7r5 0x,w`I&m\HOYaҺ N^g1/+L}bQU**LRcef47TZʣ¤1T?7bPȃ$lh!fw;P4ևƃL#`6o-n0i%@aL(V +6$9a=ee| +1M,@a۫FtY9¤=3(45M fZhlF +3C 8R4j#6cHa0&{&mfXa԰qc3=<+4%JqNnGT:HZ9(f6!*45+{Ti QT@Ic#ĕlFFD]8„D `IatMAa`kZAa7"L# 7}#; +3m$ +3 9Lcc^sƾ@a]E(4CfMX#ZK0x#Lc"ڙ&$XX3+faadݕC, +Gl6/*ɓPެqYaԺ.l{VFLձ,aG +0Mgw`Q.VEJ`V5,.iXa}=5EC>Fl)bFm` +bPހ +"E%EF[ 0ԏV6ѓ¨ +4HɃa;(Pԋ̭/(|S6>˜4`"n m 0,J#R;_ښ'q e뢐Xƙu>9K-ՋHa XIawmܲ +cThJ;(4P㧬fy0vH)alJ *̓˜v8w쒲 F;Ƌ=03$r}s_3 +Ox6yP9hxfL?f<ƓxoY40O +jiD"0i` v%x)&RUR#N +c]Ţ"R/ XVIӑf${؀?] #*B@;4#lͣ3=N{D1'sx. ++ a#Qa ;2>ŠڦRIz޸ƈ 娏)BeV}0Pq̋0 nO0:v.0^0W[ +(0.?DrE dj̵㤁]OxRF{0aY7 +W1aSsiFqwS0aacm Ʊ6s, 0J ["aƨ6ٹk.N9ae:'o̰b 0jV0Fe^SsDw֩V1@aԈPWYٚ(r@WQC7ԡ +crnZY^掎 +\(һ(vb}0]Pj]fPaYhI + +cv`e˧*_́Œ#E7P࡜y(gz|`Aa cO넁928eŒ7PXV3o)imAaejB0Fł"/$G[),۶]@ +rYMHaق 0 Ue aD]QFl\_6E%Ɓ'eb&IaŒdá@ +c(`e$)Vr\5h)Z+yRYZt]<)Lu(šK\Γ¨a.]<-P`0JoU 0 .Ґ0\lO +36;\hHaf1ÚƸC{.ѣ0fQZ>Ida; +cH"=tƘģ ߽Yaو\bVQ¨Mz'X+p +0+2_Nz`aԈm +_02fFnW¨m'XX1 ${\5CF c|c8WY؀ x}71=FDž113h>(Is0>2|ia0:Y$=}~EbOO0E' :(k/ cxd1OF َ$4~ \Oa.p׶ +7Ԯ1:Yu`"IFJ7S0JLÅ12(+(¨MעnƐKJk7/B.'ʩ=kRGY0\4O0j.pL<@j 0 ǬLʴG0JУ1]0c⿩;J7¨-Bx^jvt2@?TAQ{<6'1LYŦ-a苏#"1 +pa ̤5mxDžQcNJlZ:uYT')c:* 0jWA1nvA,K c'r< +Eǩ]mU<& cgL)¨yVAIXa GQ^G1ۥ +c,\ā]S&)*qSn Fa:Pa!ɯ>Ƌ&%GKr0%e6*4so7T5"BU)fxd@ +0XV-L)}Ha 3-,hS~ϑgzg +wF +T^G QZ׮f:RPx +c q(Sv< + 0j|m/WSǍưԄuvmgY*W&%1VcVLqT[\h5B`1YҔEY<+UPaŎ}oG +c<+ye +0Ƴ2!*Zg҄آfx syHa0rlO +c!G1ԕ֦ zT 16;¨MnbF +:Y',DxYrѡqQ[]\g1+b+YZ.¨afcyu+:F 0jyN*pajp׼].r".'`'=b['>¨-~0 ]02an,=C LpZhaIS~1[ H;-n yQbV 0 2CO,dfaK`a <V@ c\r˛iaKCt0 Fi:j> [Tfܲn0&t1aΆUm cL Fŋ pm<'FY%,s ?n0Frc%'Q`9RK3'U;mʶ,?n0FyÛdE1{r0j²vRX^P)zF +cpx:}) +B:R3'"c0 g=K{>CdVS)4b(zeP%ų(:́,ךAaFK. +c` @alЃ¨-QB1^4zP5L!Y=>Oe| 7H҃<(Za^v +c$> FQ<O(ډ5yPqҏ( (c01.q yDQ,4 0j}HaLq)\oj!b)ڳn0<)ZfY'QS`1 (QaTJ9_>jXgMM@Qʝ +cn'C`@Q\ɮ>n0J/2op'Q[<$˜@ +VbUF3(sq}J\%G +c9,0j'X='RN%sa}0?iz̥TDB +SR3=+Zx +<ΩVnwWF \Fr9СV`Q:T', pe6EQ#d ~ny9s{Rej5;)ڂE! 0fqƕQbq + 0rJO +6ʙAaTPXN\ S:6. j>/ H V,V!,bO='RԎS<&Z-9H-G -.?0a#a߹>KcJL⎃5D󜰪:`eIjEX@@ j>g xn^U+}EV8m7NXx'L!p¨\Fo#N.. 69N؃u@Qa~n|C0qzT000pF^7fwF30̤ö֟`0?u `&gfZ> Ryi fC`3`gk31| +LK`&]Vd͍ p0Ӱ p0Rxsɛ׍qt0@3+uQCǞH3 %oКLv'4aIڹ +-$8ESAQn/LˁfZqY앙`g2KQc](Lm:D"esĦz:YF Y{@3Z'A{Rf,G +3 \aaw] v>,= '(ZpA9LCMB5lb܁FuC=!ZVz\}auةBt X|"QۃL+R ĸ~ PD*v"= Z ^[TaMwVц"y@ XF ]Zw@p7¨HbDzB!yqj[rM9)ρFYM!Z9{B_x! jSWmF[{< R.$,%pv?sǍMf|0+.aLR@F x`l;z`\RfQKiсƒre}`V +qQhm VwLvQBy+F|^[<5Xz<7xgvlVKV(D`Q;(0x܍f7YA$0x8EPpXT<"1daE6He"׼i:"rBpј FEd0J|;+xOZc'QzT AF ۮTuagARV-nה ae@UĢT/,4 + +04a̫aԎU׌,ϛY0Jt a̡S{ aZfu+aXDŽsje~XGӉC1RoF- a 8 qCQ3hڔ{DU,FO0j:IxD + fE0ŽK 0j2c?!¨e,ʫ 0V8 ¨qrKJ jً#¬Pk "cc> 0FnJRc:m^A¨*fxqKjY "u`HcaFS)F]F,t9 +0k4<#1;:0v'yqC)ZvѢ<"ڙ.F8!ƀQ+SeyDz=S|b h~aye XHEGIG<QނZ9DBsgmF- d P`&_=xD1:&7D5W; ª.{ c4k7FU4g1 o0xD|zBXrubrKtYG1}[Y="ΓaYݦX6VH@Yu&lҗ+ B o K5e0\@t@cfڝN2~/˜ ±˕a.:`F-3QLOc j=&|"T2X-TZ'<2~ ̨0R-0K!{nXYIE?ј=:mg~adP+ +>UMDAi3 ̒2@s]c>uYF,˜cl}a$#;_AdNya\+LăÌBTa̢Ö@cb޺pFM -'!!nKD2`9^xB5,syBXk aLJ"!ŗǍ|yFcb]َ';oo0G1)pSgTV֫l]9hxJƬՌ-"bر91Dr0|ʙaF<cBU<$9ʬ17A,t6ƌ1 LjLl#Bw~i1 c8A +ڋb=j6C˜ TjԢoB"<`!A&d!pL~(a ߡB؁F ` )ak$8Fq<%_XYOQSP@|) +,4G +U6I +i"s9J͊6<%=8e 0'pT)aV~dO 'msq8ZA<%(o3PlҪt(a6҂V' +JX]:%։(aNh1(aVeb7JgAL(aeyDJϝeqKLe,Ԯ qʵm<%&\C8]uaVOP"Xv6eCQ.! Š+^Kgq+/Dv> ^?n0{xFFraV$Dxx(at%E%Q}w-L79QYZM=%.kz"#9g3Gg+fzJ4(Mra~-s/;Fgv<%n&ɂm7JӅe܏%Z s0oG ]#P~w^'hY%95+ N`"b@aU7Lw:i0nJ۬ >,Uq|56,Px +ȫa¬ *1avKY+f?L09Äٶ\h_7TQ~Qqߊ1=@(\q+,sl+&-4ֆxH1@¸߱L b+vE&,(sUS}3v&0xwǍƳٞffJɒ C#'ZZ8a۠焱z}.g;QS'UNUX- m1!n_}'0dP9aƄZ,*KqWժ076@ +9v9H j7՞"%̲/țf1T4R¸bgJXňO0X@ cɪʲ[03ɂ&ZP o!5ciD,0+;[U +F,3cX]9o g1ax'1.P¨ ^dh|J'nu)aLwJВZ@ #%1a:Ӆ*NoMH cvE)?qcYt/I_A)4z&hJj#?@[lc;*2 2}1ws˧eKX%&p0]ur°0Y!9awM8aXWPj C~' +l?0\P~&EPֿ)` +l51ap ~&jC_'& .)821aU"spfq+[geIi[P8 ! bhc،/0a,=DL*Ztψ S~fخ Ct1a{ rY4@ k8W !xCm8:aH=f>4z +POLl6a)'QFxdj2Mֲd5qdjׁ  j~G4. è- TW Wy@&cL0jfdjrH=Fmeڻu@Q(=2 f:q(h PLGQ[:ae\3}\V<3L5 65-F ǿ<3L51o<1J3'Q7] 1A &S;1L^^[0|l=!}»,=1u T{2ګl@Qw-A@& J_2\ YF 6#/U#.21PH.؊KFfW"0èȑ0հL`Q@;UoW~V`V^؊ &^t `QægQ{ {f%l8'zfjr_KaEU$z`Q.<=aМ@]%? +\Fdk!ac&0è!'ӆң;Gt'+/oFD`Q+'&0è-O"3RF )gQ:f5 L f3zfj:a^}qi; gQ׀` v<4\=5NeA 3&aԲ~u`è + )F#eZ=ø 0jZaP10FI{p0d@ S F-ߵF 1FM q,F -?aFM;R_\8=So|XF\Eio>a3Pيȗ3P>|LuèMhW?nWf8pL`! 6{.rѼ۾nihLMVW?K2FtE} :nj@ni@;s!΀ 36V5H1g- +0j6yli,`èn a԰74O6lQ6̴;aݳ/pL!Ӭ<7LmܼxnIm0hauL^_8L51(Lgpi lM%Q 64}jsLCJ|j(7Lfotbæ3myL~p0g 0mIo'6-9%èso_㗷qèVX~fZ3M[`V&RfZcw3)E>LJQinׁ3M^PھLJQcSl3N6e0Й>4 |i{dsx|5L 60j8J;?(uèF>4mLJQF,<Pr]˭V\ǹCbuèՁt0]@j]F t 0ӘaTf}_x|0mtBa~((Ec(,q0rgh3,r}refac a)7-˸5fQ9pnvG +7Wf1ٍ87}FLY,nm(-_cxs 0 +u`,' 3M _'a7⚙ ph6XrYUοk5vnteB$s@p%2p,,#n5X%!4f#p,Ѝ6Ⱂ7| tnѥ:aOV[a_ 8#'3(p,AY'qfwRofZv0je9per6OFʋB'YHH Y2:aLbA@>6VD5;@Q>a&Ktq,#Hޒ Y&QjDUre p2B,,b1s<)r0jo QZx0je/8~=aeMv.4o8_(k&a .:?@>26- 0j>QF u |"1h=aFJWHn5xϴh n6X K 0ja!ӆp U2V\dCGxq7̅ +0jo 0ĆQ`w0j]p# 3a!@/cèwcè%y8sd ,uP(inXH1Zi:j%fW^u`v +0*q 0z1Zku1LW y. Q$qaiHݏyJ :ίGe ˤF e=2L5)djNF2Zͣ˾ +׉=2} SQ R^vn 0juIhPy _xv{nX*'aQaԲܢ`wlGaY@T5!#Tˀ=UE Ƃ̣[ׁ SmaXĉ8dJSdMdj\i#hqc7ZEYp%Gn4a3L$ A'3à9J_`&йJnEgM!+¯W7O,":sEoHI6}}0hn^3Kڠ1(0TCBfj"g3L5Y<3 :RX}V`6_q S ghlaɝ$l dm4LGz@àJۭIҶz<4L"- #~LC&[aNAKh_d & SM0*ehjv!t0֫MU!a,ˈhۻ!ECq:\}DaiὊoV}K H5o!<`oCﱝX.P 0:p#GMoEb̪D{)/,bu/, ZCw.8P&jM]܍ D0%~DL?0R.@ T"|sw6!0kɒZjp$:v%$*zZj1`^ DQÍ,L; CUmB¿jLiU`iLcH +@R(!b8%Iaкs') M ;GRQpn .]zCbpxN:gޅ䄡ԕ"' b E|]#'GNBH@["v2:AaUNPrۿEP.a9aښ=uZĄUeg@ p&|jq!"&L2P Wf*( U~hI5ԇ|J)׉ X:dLu0y3eZ}k0@q(&ZrkX1a0Y} &Ri #& dVkĄG\% DCiGn5׉i鞁V`hayBN:,{^'b1ɲA -ٶ}<2TVE:Vqt0h(ɜ" ^E>"wA23OMnuSă!dGq" :qYă 4x0h/S`E5:`!|2j >O5$X@#3Kv>,~0Fḑ +>O[\pKO.0.ebty" B FaIv#FDhwDͲF%_DX֊?$ #;FHd| q `$ ~g7TͽSdɛfWZFXܐ-`8='`3d.X,^=axt"# xoyX8s0ªA|Co0# U>a $$2~F$ Ħ7_5B4mTq|c2 +1:aM#,B؀go † a/F@@󀰁s7t>d)?a)n$ c=>cXLahxдQN@" 50<ٍaKb>xw 0Cf a ^]! uSfBSag̑6 ICPT?z*:8UYbN$4laS}iI6AAQ|:ˠd$!T3"*kW`ñQR975GBEկ{re"" BL[7mK4DBWE°Ke CUѱ$vl>cM I_qaUO@60h huyulU 0F@! 16#g-ޤ[+ G@pZ0$ҺO$&P1&͑| XpFY/°+B"q0d )q> hBs } +&ڀ >l:0C+B< Yy"pAgm$5YRaBmkg]p#< L F|0H2ˠfL@kA[G<0$=fV@4IwK 0$=^[ jMb 2 !!Eܭy>!m TI$<= Xan]g Gq>4Ar7Z.y<2`>41i ,w.yD +|0MCƑK[e&~!231, Jluc KK`ȿl8ch!3YE@Xw 4'S*7v2>x0hǣQuZ*+*/E\ Ck?`H-mZC`s }H-Ml.L BFx,y<jfumdoE=b lj{<J] 2s<`HEiKrx u*Ct'jjs,.j޺>X12 #a>hs6#h`HbUC"dv"@AUD>$VVuݐΑ>dEp7 W !֒[>M~jA/Ck\,C\Kb@ӼY9X8SK 9$k+p0$&t_$ey8&&:x8g+;@s,MCy 1p0dv-w`Y %,8#WC>-<19=`ȵE=8CmFMh0hXVC->7[^x4$P-qh0n 4\6tR= i84Em22t "$AB`u i.`Kd2+M,:2w寀~AC.0kƅd0h@Cf/ppp  э-d0dC3uyd0f̿l`] VP@{2XeXd]x4NIvKӜ`Q>Ó y'!%%x7Qx2҅es !]Xm> ,w/ȀCpih0 ^CءlfHh0Dn944t?H\ &뱬}$y4+~l#4Y`HAFb44[4XՎ@]6NMLT4XUDؽ_ I"C=y2RGAG;ݸC$ AJ E5[ < z1j+]P&o&>UȃPB&~ˁ[ԭHn87 P3A#_\C qd;Kܐi}Bg|:`MebˤڅwBAk> =CI1\'zf E_r`0Hh|*X L90 +"iOiD9nVBF\0Q23qH`Zb! `0hm904O~C"pxCe& ~kGȹSjK&oڳ\j*:2V%.V{ +`Si%HM Z#̏4/҄x0XSH^Nf_ dj`0hKO?P\904< I+Q E)(O.4 l= <" +hp ,0XӜWHA(e.l3`ADG5= Ю miG[ V^O3~Ӻ4uѹ.4(p]`,Q$̥A%#YV  }aS2yrbp$n9.4 π.JiW} ?$w l;Q}k_aA&Fr3=)v#$>6j> d0h]~k=A !AHߥi@0wal u>ckd`Blp.AB.%` aۇ@it93–v .$3Hw<ְDb3{Ny]{䯷< PfxZ4x)Bq +.H/:Y]ڼPD|yTjEv]K쒡A]Y+7ɬ.[`Pn 쐇=) ]{Tu"3 cЅߍh\' suªHOsa_"fG:6(+Cs}'Kl"ly 5XI.oUی\U۱*a8" (R

kǥƃ{# -dƐaqD rqI9/W0k2{~ubw0aX؆R˶>JUwGl[HHqJ"pHhؤ_z"eېi=x Mk6/y6h-4ld2(Z:EV]yб†Xn%9+fcaWJ{c!Ӕݧgca,jwcaߌM  !+Dx4z qFrd,do:5oVXƥIdX(ԍ,z*Zmb#38^]( / Z,!e];{ $LGa:%mm#.FMx! 2]EۍzٵW4@Bz"R3uچ['ׁ{p<kg-+(kɨ܋ +j&WE +nze NWfrW )H߮TxB@I{yU3u e *ZX +@ +,Fo" m[uګ < ږdfp`e-7/n`!<W]]F6upt,LQ` ,DMQPXʦkX9Bt4%x$(%0:E ,HZԮSqg§Y!t``!~ KmbpBuVTB:dx4,Hq@x8OG, N[s,DjQrXhfe0 fUWu"ZqT,$"S#sL< -+e2Z``!+E" |Den'z3W`!c|ǿ ,H,9x#H,%ť>`6mj@v" < ',ޮBdp`,xH [1X/$`=Y&Jn' &x7vࠕ`!ҍk1JA Q`5}g&`]' ̌) X )H6w+@pt +i.GP4.6:XZjkYGpfrK" +9C5\:WJWYZUn~FQmWX!x.~]_~_}hד~Ɣ}7K%d49]U-PDNX UF&;*@^CvT_!L#/4ϵV ͍ՁBBwAh, $_3=W8GX"jz_i=-Dʜ6Ѱ~Q3t_X}舎+-C _QG避뀆@BbARMƃ~ry=WhҏW^V_FЛW8+}Z ++)(Ȃ$)a˓Vbj#4oB_!eLzlt3K#D. + ̓~Slۉ+eeal*+dACr+.X_Y~"6of_iAެ{ЯCɢ3W m&+"9DZ+WN<.Яv.l_!C+樼~Iw~%3q}UBG}4Rq#|D_A~i3]}%5͎+f,'}&,JWH,}:u~Ո!*Ա(S𫭇)Fi|d>WR+ ir¯z wJJ=!+4|_˰R'jiWŻ=W| B+(`T~Ӓn+$>_ #@_-8z<}W.>WL܂ +跖WY^ +aD}E칸 +@}=W=+o>Wy9G\ vq_B&N+ Z _gwCx##+X5$_9AB܀9d*hʺjqSՒѧlAB,~6D|䑳"-y#8}' +oa+Su4J߇ _7(=%vDM+'<[J||Hvs{9L{vɽǃ{ҥ+f1U^)Ap1+ }psi<|rܫ6ŴȽ+؞~Dp+:?W_U$̰|'^9bح Rܫ&8>W uWpV RWhh6>_?^m0c>WSutpV~[Ƀ{ՑXW7$DyN/+~vf'DZ k鼮|]Z_R.?_!1jU={({5M寝+yOj^q/ ^!+Q ʱW+vkz.yPP ^NImaMt0+Փ^1z5P,@D{/ad)~b^{ջ|z9AO앬ÅO>-^O?^Cƾ@OK+{;a>W5@iڥ?W/{ b'Jz% +,u@{~0ĕKld^%ƹ~WE~Q$z+Kg?ox<]ӠfG}Kv>SZ8, ?e ]z?_n䗁B?1FK^I{/?8vkA~ /Hqdp~SH`1 o@7F\O3K@89]},e;H;<{d{ ~  ~~~k .cdi/TmyE <:mbp[ayR-[>K$y@Ȕ-MZʃS/|D6O<`F!}hF{SCRy_ Zv| ~246]@]\-dC[wk+`J Eچ-4G_4U2Wh`C,Ӹ? e׫>A +gcs/Ͷaf`9Ϗl)162W,zdőjd#Qi,|U#̏Ļ@` FG>}~׌Yld~:$߫U#2W3?",,|U#ԏVu,|U#,~Gw]W?je/3W?*k sYF,|U#2-^X?}~JqĚ rd0jd_џo>}~  YF5 ,|E#+_o>}~ @UYF5iDwqYF52,|U#W^~N _GykUc hHPL^^kWer,99EMy~ _PQE6M+Uʰ2RXQbP/ $pTᓯV+Bg >ڐM 1jZE*?* x.00֖oF\Va/K]%/|0~J~ z%aWfɢdRa?ǐ~9!,fCI;8w "1ƿcH? ǐ>~0~!$ CY;w 'Dܿc8? ǐ~c!=w?ǐ~!,CI0;(w 'O1cHra,a;LoRcH? !$);lOcH?ǐ@<}/l轿 }ǐΊ::cHgqC:R G18!>Qw Èoƣ8!UFQ7 Q^tu~ǐκ;tG1XK:c8g qC:kY +}ʥ;t,G0GqC:Ytu~ǐβ;t#G18!}=ۇ(::cHgq Cz>G18!NQw r::cHgyqC:뚎ґ[ =j^ͺdn[aTy?#-߫pԿi_e5h~ڭg}Pr}r`)-?7?ʣ d]S!n@{7d2`r?b pK_R?2V{Uc{{? +Ye?{~gJzq\۰MOR.׿0E %?~Տb) ~ՏPHWh;ͱ>~Iu~m>~sHChW?Z|`O#=f+/Mf_8)!tkWS>{*$%G0l q@_׉ϏhM>1u!_p֣'=}DH=~6#/MDˆMHURzU[(W?M^+OҗWd䭫\'e+9kW)W1dF'~}~ӳ%؏~$?g=4O%s?2P !h lt@L:@_6wA?UސN~82%*vZ܏l,h7> +#:Vcqc6q>|?j+W[ؙ%@KY-_mTc})ij̭%jY +74HZy]jJ-n^i+6 +tݺT((PjZ_dP^h]SZ`H;6檶=ith 3n*",~7#?o"NEr@=ӫ)O!,?"/4yG-{K/ue?lW*6:m}\] 0CE H:a[kD&+y +C +LrC?-ܥ ZtgەR<'h+Tl<d({{Ƙ`!!߰/`Z,#CNὔiObD.JRI޳\b[3zBKbD0;tTY.9TiXiFQØKSl}Vmb]W-w03+n^w7c[Y"ˁkVoC.+6#^ fM`,f/? ͎gZ~=!׻6WnnP|3bs-od9"x!c;JO-}g{#Xejr{JUG W.ҮZ5wddҧ=hǖ *O͹_ZC2KouoˇFwʄ[>$\Y+o[ftMn[~1vARsizӗɾ?뜄Zs|DnM_h!nܙ~ƕ+4 RnTV8jLTՐ (Iؤ:i#k7/GKj2xri0rVV`AC,f +4KҳZ"2%_";;'YDnh94j=|M{Aˡ)l4/9_ %%˅9_J߈6&jey#gM,r/dECEɢɚ4L{ۿxNK,VegxK/Mֹ"Ͽ+qU:Q/0hN^h: MPȖ^"{gY]nҐ6&`"jM &{lE٤"/oq{ +_Ʈ^E+]. c8_uNfַ$MkE5L7M^e|9ym'9&NWk˜2X⢶/踈6JnxZ739B _2}I׷S C{hZWw,_$koe\2aȃ,mXW +֜&+ c,_b^K|y ,wXVʷ$ _4]&]s//=坦^:=9ކ/wޖ##N2S6OMh턻{XNqS= _E6 W{PEkΤnFN]n%/ŒۼjپhTŝ˴&kT7֝(~RhE{@?G] d=R1 /.T~-}ݨ@IW?Bɨw]? o +-9ۗSr:dhd}dyL6˒,lKl_j=}_br>\Z}aE(+7yp+djŹbD,CXK 2v⽿vq' M0ZWۗE“`Cjp+;v:dCơ̷G`[rDjۙw!~d:g!&ɖevb~dPM +Z73ٺ4B{[h ۛȖYhIQۛQ|Mww|L{kT*t1:de֊v֏YzkhYhxQ0~qwlN(ٳ-fQL>u/,$=mƏdŹw3HT,1q,\߉ oSͿuQڭ?O>eeىMtmeaeﶚ?RT,wˠofwMX07+C"O7ldQ&iC=O]&SqYHdN<>He;cP_;lfh0ywj2ݸ:ʒ#&o;g&H\N\eU-m≹_4y_v,{8l| lG|q?΋ڷӚZ jƞ;]EQ=$Z[Bney NJQ)ɏT6.9M6k~/"ɫ#+ſb7|b{MNt ^My-L$:bV +˺{-}DOڏ5ɽ\{nd^e5q,]{/82({ ~pE,2C4܁oe寋sF-(nXQMr,8kIn;?-)J7͛!o\,85  6df~HQ/vٵ Mr+ eᩅEy|pZ Zs#>C7m-p/L@b p/n;XpQvS[5(A `8#2sS$z~A3DMp_phcQ ߤ7[.r_gT}SSuZ~dqm3/ކ_5Em8GFҸ,_K.vgYޖ/ORo^vؐXn3!k>mUALze|Ģ`EYE!g4Xd#6}RчVEE;yXswXY6,6ΕM{[WeO_k|(,_\vߞ|[Y^"y>:c@{?6؎E`9 R}(#Ugey b۴g݃ȖO5/X4wo2<-qg^kE}0?cՕeiAOymYg\+ǹgL7,;,S/ԫ:fH|20~_#ò#8ۋR [5v7 [S{35KwFagOGI [*;Ŀ[~?͞Զ >nj9SZL]{H3{/ƾ_O~"w_:^niXuN}h(ri.ۯ)Yԃp~?A:s:?(]LGt*~L5m7r;?kMq֣ Hj2Tz}:ɋ-!m2ūOd_b.}~ Kf8udsQ5+C\JǑehUٴˊ@ UKjP~@ E6to&Lqzd.0vmțyFG]=?rs%.)8wTj?6ɦJKZyjٿj*wf=ᒏ& +9T8b~?$6392x+q2h8)*CB,h?4; _q|gtoi}d[8__tqv^d^Ԧwow$K,e~Y߹ `;@;8d4rD&r]WNVCb60o"v֊Y89bRލ׽I1Rս *DLß';7h[z ] /} ;y k,Mf`@Bf.7yXĵnf^m!.w>{r?[~;pSN,2w/~}_Fpa#R+Iv.C蹸j> ;V|_A`%Y $,ٖſh۴㕉|% F +ID+˟!ob 45Yl'~Asw_\8r/ic?WeYd.*Vݱʺ(x'Ѵl!̖kß'$(?uKҒZB~6H׷nWx!Cb4ۛ7O??Kj>QQ[|_խ'~ixLzWOZӧaku."rgoWh.͒,g!标X*r",?ݱâhog!nK` ]֫?GV.,)z[@o<6f#ޝ7sEGՆ}Ċm靈}2I@{CH+ysƏ+(ZЈCo~cᾆm 1]wS>ާG1Etaxt'2}.GXַbsn߰1ܾFfX4d%w~Dj2"h}?z=9bl^nB.)~Mw73 }e%*OFj`F>ӯchg&ODC:^8uwp.|dF}4U}vuح}*6Cq:՜#QXq?;;mY9G24hoyg&Фʗ Tg?3dB$qɭC]t^'P VŭG_{{!6~$+K +~?fqyvwK;W&O,r<}bfF*'U~HC8ܧӼ}ď3{~iVbL5|,J8M 2i>>zL_Rz~SͰ|M7dxfyϔ}NKhU~y01BLϧu$ɼ*df.[4P8:x33ڝ/GB f]AlG8[?N=~TX2uS^l +M]uu2hdGW[a^]WMlK|Gޖ?K;,uϽ\;(-){cįVRH~j#zdߍ/tn6j}[7rxz/amAIlm>zz2t{AC7Zx/ܖc0 C3NcbUoulAL(ȟwZ޷{}|WU~TUj]F^ ^͖߬{ _${HS5C2bn2D,\񃆕m#ށ Ad?hHha^/~T:jן+vA;zYk }hӆN/h;s~;ˆR44lA^c=72R1(G_3sHgS7.ߖ,7n-wc%[w,>i޵ToGl +!gMo#E܈˜9QǺQʡ7w,V/aI6 +Ջ }*W"!BSҏh_#cZ/|7X!bgH y:l$_^xu =AJ%aCߓ)?w*`HB ,c#WB5+GC /o~ +?(vWk7x+;쥽o^v7XE17C/s>"#Ծ9eܘR4[ؽU͖.+`lTnU7֞k,Vvߘ^?fע'}S}#fkǏJrJt Xg}s gwC=$[nz\v#ZX{LVՋW2kܧ +Y2D)7|uоG7Ep8T5t=DnY~e+u/KJa7]+_Z +sd{-{8a<}h{T6`IqaB[>${L]9 +Sܿ~T>Wjw}}_~ ׺J}BUc,ēu͡_q4X-S>{rcrukʿFE(^iʇf/]9؉iʿRc9Qs)yN~yϓc'5*SҜ~4_ys̖ym$gas)q=#M~(4VyҷbCJʓnJɱ^ڛ|_`sRȴkr+-Ǿindn7 HsI6{Yf5CKs>Slf=oڡCzγ>L,?4/>imTe7 +474ڟ~K}oo[s7-uGʕwkd>h{Wdc4 G641 +-%|5xSɂpmrʏVYBt೶ waDVq-SCR({Kdj!|%v?Eg0Y'Y ,Q^cO f ͖۬sN^6~nrOxSCߦo9?4?Wץ_7_W-_~ی哦_)*-_o^MbUiۯs~hh{McV.C uC,]5rmkjؿV}Mh6OۯҼ͆~?-l\+yGѤ*3~=To-28Po4uއcx%%kGLn=%iiN h~˞[&ĂεG'~l4~d6H;6\ȯT۷cm\:K|]ٽ#8MwOoܟSCL ~xl:LBVb ʭSҗ^ 7hal/Eb"ʞNiߟKөnr ~ǵS?zLQƿ]SY5ԩKkCRS3[ڠ>2[&q-j$}uﶪm~hvFtTDUi*8o~ڄ&CfKyR)fN vQ{5ߞ@AGS(U}{Keh56з;r؍2sq3{}uܥ[ۊo1V!oh킢a?ҙՎaF[zB~+2rYGxv;ymhwAXz];}i<3U8,zaugG=bY8Z Qp|>4 QF}0Ww|a?.D M޴ɝM:Oi'rF{49Z)ah Ms^MjQgZ~Ck:囆*l|k!Jɔ? +Gn]2Ѧ$p"藄~oBCl&(Dȟ_/E'A2h +y &i%^5Mj6#Nyik]coOܒw&O +ľi1 3 G[c?Z@['ސE"aX3Fˋ~'f ڌ1A`NQx0JeFm +:Q<勢x0jV;`a+ Q4DrM`XhFp%>Xh{>q t2BXhk ~?wF BX6ރuuaҲ;%3Sㄑ9)ZX ̥~1 ,R,B  ma + {A K`M:MtFlBa$tVB%/B8`!1:`ʃA Q`-BQ(t0jーV]^B m ,4':5B{/M$|Ѵe+t0j6m~tЖRfX Z_{B r׋_k?_;MQ%t0jX0h' )_Rr%8-!pѪB[ 5+LV`0>5/N 2@Xh`]~!B EB&4o +!ZZ=?l~!,4Ov!{GB[!f c߃O&ڲXq0NKT-#B[A\F y1bo ^؞ .:8M)QN|ZT,4tTuO_µ#퍌3Rf9  m#>3 e>XHCkG>5[(pE`meQzmX`vჅFma ",ea BYBo4}MBM4־Bې Qb5-9(vsւ'x0jۯY`Ⴥ6ôB`>(ƽ.oZ m F]  uQ; mDڌFQS2Ⴥwu@!:PF m5 ڼ@aLsVO + ,wORav+-F)ىBQ 0jōP ,4v9}l  G¨YvQs@N>ʔyĿE`R j1 + cȀjYB[nQpDm<'.\zQ |F43 +j5LNG6=>5p k=JEa3:!c6\a\Z;tZ~BXl Bر.8( #%Ž!GTBeL"8kH@%x41#jZa9)0Jh¨ j!0jt) %ěTQs_;aԖW(q"|0ׂ1*ۉZ`lI\weF83a)G +`ݾ[;~R!smW. .2Gz;!A*YQ FjWyEܺ4m5v%_ݪU[ +gC}/Tg{nz2 F 3 FOD3L {Ш  ڝ,{F`BۣxƂg^+plWXR`Wö`we!#nA=bB' ,"n +淚L +ڇLžY^> Z ,ƋL0M*amۥ #MlL"r|9aiřy¿v\7GPRv:N ks8 UWvߊfGV3sm,6px֗`l2<9!_/D0hqAs 9zҕs%D0h]7z4ٷ>#&/AVmݖ`.a'djW4 54sH`lvAf`kh?ZY}HS =ktlAAK>Lfc ؇Od$Xs׆ }kY$tAAKN߂F:k$z/?Y)$Yv# `EhpDe |sry, -u-#?\FA3sywԯ33?WP e + 793 Zk~J``3oOFWvHg/E0܌ L0g2 Mq2@`i}H0^ċaC*ʲ $Zm!j71\<MoY(AA4U +,].昑`ڳ7I 僁`U> WKS qZ WKծpI$Îl% c ɐ&H0hkM8<9^nHc^ + W4 Nx)3j. ,@:w &{SrhL0hmX`𠵵<4dLkO&ۻ,ܸ<"4-Ӷ`\#[k2 ڀ4S[[`"]#D8g-83 ݻ^dB.(H D0wɵcQf2 Z. r ֜H哈 `p) &_[ɋ bF`lek9e)T0hţP`{}AC]f h +Ǯ.5i%A_P`\lT0ha], /4p}.X0h8)łaζhA F6Lz(̤D2(>"Lo>fT0|Es~neUĂy`!(E $2\Q.{oҁrPc?, .~\P`:)S˵}+\AVTg/\0}V^;`uZOwrHr\0;`T`Ȁ>P.P;7k7~'lbd%F'/ o\0|8kN`Z$J8.坬'p.@ G͒kj ׂ'D@r.k +l:c g:w߮;JMPuJs  6e7L`M>^/ݘm) $`0޶iyJ#7r%J3s5( GϵΙ / {+ &_f`QuN2t+J=* tut*ld3 ([N"\E=BC՝ee+@싆&NЁe) "+caXtr̤=f8|S8bmG` fIJ}ݭ,C8-2oAܶU,t0{+/~odu .q͖ Z{:[ $p0H)t0_\[A?srAZ1ph!+f9ǂ֊.tHwJ'x0hvCp"9qf̊ FŖ@`*6p0|qY5kzoeN[su]` G8cAf8m +QZK3µ9ф(sd\`1z]\{8X x4/xаI`-e8'΄9ࣵf:k^fG`q:T`ow|zJJ`˦C`>k`fq-l0GY4alvfy܈sK_3̳w%6'4 C`=P8`$Wl0O">g6LdcayHa# rR`t$l0OVFV +Kp0ϗ? s^X Sp?a]f66jyvݦCzq%p0_}lga :=vbq + U/^d6W[{}*p0_=W_%|qmw!a%ek08/P4*^[,.RZƪ +_ +%j[,.]҄ r  DL*|W&6n6oؓ}+?}l`vY|Ɩ#m i備 V;*lrqT0} +H3W.N8łvӍ',{bޫJ`8@LS~' ǧNZrrP}姭6}I|*©OI`^hSѵr,"`0rZV`p2/o0DU0 +|5:{ .N"'qJ7:A`Gb+lϼ\և+_3#d0L9E Ke}x,d0=^cKI|z?P`8ZTE2J6ʔ *-WF@I4ƿaLMߊC!7l+̴3Gh0? 5@ơh0_{T`Xj2T65- xg +̴A`D ۻ CEJ9̻+ 4 vbS:OoN3sedNuzU"//WtQ`ra7^]`0T߉CFxi[0yL*/ry߉swCJŃaTx=v +UBw"l2°䱗rR a~yQ0xo) ho_> +& )nP@;LorUEҀ(0plNݗW +C!"0!/T[dx)f/A+ =NGeHJagMN!,Uum x0, СU`hdW\ǗwO`LhrM5d:mGqx0 I` I5}n듿K%}&׾7\r^`(Rt0}8 '+?? 2f: +endstream +endobj +137 0 obj +71477 +endobj +138 0 obj +[136 0 R] +endobj +139 0 obj +<< + /Resources 140 0 R + /Type /Page + /MediaBox [0 0 334 293] + /CropBox [0 0 334 293] + /BleedBox [0 0 334 293] + /TrimBox [0 0 334 293] + /Parent 141 0 R + /Contents 138 0 R +>> +endobj +142 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAA+mwa_cmsy10 + /FontBBox [-28 -959 1123 778] + /Flags 33 + /CapHeight 683 + /Ascent 778 + /Descent -959 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 143 0 R + /CIDSet 144 0 R +>> +endobj +143 0 obj +<< + /Length1 2008 + /Length 145 0 R + /Filter /FlateDecode +>> +stream +xUale~ul] +xۭʶn,v (B&ZQX41cQCn!$ `I0nj(Jk{}ywox*x;Y}pyzd8# _iMYNje%3w%.?MFի)>A+Ozs*;sBP.ɆLnDvYDuEWY=:OֲHoH|hF +9f^r pm, +b / {Ѝh +b"z5aX \? +oEv]cǘy[\D (N:qNA1A +m۰^V{*UEs j~<7>G4 +OXhwD#ָµ4תl܂3ޯrHXlŠ!'CFh?0b_HYnaHc%wDЈҮkhWPdzǮzsLMݚ%mN.rFz,2kjl^b.B˥>+VȐ6%(:Q0EO[[V^aNE$yXhx +|JrԀ.hjUת=u!8D&gh)]G~zJC#]jRcWٙpRcql@!TUV0o " u޹^}R͖-5oX[__4HO<2goA p$dh_Gn)R /85y35= +u\]XU,{@gY`Յ?U,?d\w,:o);v"6z\ŕ9*2f˘N|T2+du}D٘eʘGּY0ED9L#$Rmdm!ҍ.ucBQdΓc#"h&Ir陠pQ~IT9®f21A㱫d2ɣQtU.?;Nfm9ݥʺQHg䡀52Y }Y0f"ԍ\ԐrS2sb&R}fh:%8U7JudYǍщla6H\Ǩ$6<1m'ȤFsSIszWfs~JNmuw*9c%_^4$lnF=B*xs6O +endstream +endobj +145 0 obj +1349 +endobj +144 0 obj +<< /Length 146 0 R /Filter /FlateDecode >> +stream +xk` +endstream +endobj +146 0 obj +12 +endobj +147 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAA+mwa_cmsy10 + /Encoding /Identity-H + /ToUnicode 148 0 R + /DescendantFonts [149 0 R] +>> +endobj +149 0 obj +<< /Type /Font +/BaseFont /EAAAAA+mwa_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 142 0 R +/DW 0 +/W [ 0 [365 276 ] ] +>> +endobj +148 0 obj +<< /Length 150 0 R /Filter /FlateDecode >> +stream +x]Pj0 +t')JB}i?԰k+! +if$s6"z`ӄ_H! 8ZWT5hV H~#N37^#pz~'hr4u#~KwE(N+w> Dq='{ 5jˠ9H$݈ťL嚪tMQPYH쒷qDT QJX9uxl5U|}B +endstream +endobj +150 0 obj +235 +endobj +151 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAB+mwa_cmmi10 + /FontBBox [-34 -250 1047 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 152 0 R + /CIDSet 153 0 R +>> +endobj +152 0 obj +<< + /Length1 2852 + /Length 154 0 R + /Filter /FlateDecode +>> +stream +xV}L[?w?06q>y|g IHhll`I4!id4V0؞lL0diTQkhԩ@SEVEkT]?MjӚHٴ?j-켇a͚v{w~=缏 '4*&4&7}161_SSc0[DhrW%o_DD0,018 h?Dx66`z/st3c \Cx ~<|r0 ~8`D ;mZSw^?=Dܟ?ra~~¾.swY'341dD-pn; o5X[UWK1F'VUD ?f}2')cJy4:9J՘OT7XV~o59G UQ6m%-̨Pʜ+6 e2щ_UQ#m:%y L,5UF[GyDaZaC( zzdJ{H`/+w*X`P^zSkjv^\ⴙϾU4F"Lzec0]704 Fƨzk͡sC~Bo׋Sd)ӎl(7yKB/=C(==wf}j]gnn';J 9\,Xșp%L.aLZRLFfH:Jj2Py)l"r  +'!)HІ"@w d}dѳ^IVdjJb5ͨP5{p}EI}9%%*E)uB-eDW])#zp7O̤Shokk +x!z|B_<{NNlVWd!99LH'8gѩL~+&Y) `8r`r?b%~jdq$ԉlz:}jRn_~<ܽ?c~hR'X!W >? OKm-zmnnf!f,7]1.[l-*, +endstream +endobj +154 0 obj +1942 +endobj +153 0 obj +<< /Length 155 0 R /Filter /FlateDecode >> +stream +xk`% +endstream +endobj +155 0 obj +14 +endobj +156 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAB+mwa_cmmi10 + /Encoding /Identity-H + /ToUnicode 157 0 R + /DescendantFonts [158 0 R] +>> +endobj +158 0 obj +<< /Type /Font +/BaseFont /EAAAAB+mwa_cmmi10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 151 0 R +/DW 0 +/W [ 0 [365 943 831 680 ] ] +>> +endobj +157 0 obj +<< /Length 159 0 R /Filter /FlateDecode >> +stream +x]Pj0+l'=Cp(ur$d࿯2.tAY͌emw޽=PH]@pԦjZ .& +::,3K.ncx_pv#HT%zmF8|~pBI'k_{#S'#I!ԄAX=7#2VXMr~ɪAow"*ˇnjjB iR{|xӠ(r + w%_I킝 +endstream +endobj +159 0 obj +247 +endobj +160 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAC+mwb_cmsy10 + /FontBBox [11 -215 942 727] + /Flags 33 + /CapHeight 0 + /Ascent 727 + /Descent -215 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 161 0 R + /CIDSet 162 0 R +>> +endobj +161 0 obj +<< + /Length1 1992 + /Length 163 0 R + /Filter /FlateDecode +>> +stream +xUmle=Ҏ{`3^wLz׭s%["AZC[خueAM/CD%:_r4!HBb  m >s/^:jxiZ |'T~lTvvSdg҆70$\qm#U7s3lxl~b{gUg +l;"9I=g,Q!_^~uK_2 +y'.zWJYN,1qPo~eev2EcQw)8fg33 uk5Uuen(H",͍!UYl3&񆞄Mzmb'LHU3vUYy1VMHi=iD%S˺\> 5'- JnML1DIO&^S|r]O>Rl͹-6Wl0ȹAсQMU%EƉRXɤ0Yk4+R%nH+0EYL2&'kQU􀪜EX􊰨$-p&L"aMXTTao BUrIU̺vua7YKn-&#*ĸ9 Ony}-4h"'\YxkC%B5nń`9U;[ֽq_.|[_ޮٰT]ɚ` +U;͞6c%Z!_FΈghyF'ʌ +hR}Bfp'ޥ.Kd km ѽwBxc[EwqrSaw0/;`l>pJv.BLXG uLr0*`-,`l^sMtFS 4ioh:F֠SO KxzGI;MJ$El-Z (;Iˎ9DHu<&*+qdlU;Aԡ٩L*=-m InEb&+ -R@feVbFј*@gKӇQ]'Igt&?H{U5JQ#TG*;Ixtld> +stream +xk +endstream +endobj +164 0 obj +9 +endobj +165 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAC+mwb_cmsy10 + /Encoding /Identity-H + /ToUnicode 166 0 R + /DescendantFonts [167 0 R] +>> +endobj +167 0 obj +<< /Type /Font +/BaseFont /EAAAAC+mwb_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 160 0 R +/DW 0 +/W [ 0 [750 776 ] ] +>> +endobj +166 0 obj +<< /Length 168 0 R /Filter /FlateDecode >> +stream +x]Pj0+l CԒX}q z0h[lE^X gBpjV& +:G:g} +endstream +endobj +168 0 obj +234 +endobj +169 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAD+mwa_cmr10 + /FontBBox [-43 -250 1008 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 170 0 R + /CIDSet 171 0 R +>> +endobj +170 0 obj +<< + /Length1 6808 + /Length 172 0 R + /Filter /FlateDecode +>> +stream +xY tוߴږd-E%E-/-bƀ7@$$t!iaҜI(vv:6M'n&LӜ 3i;$!s_Cvw߽5"kחUf'u{]%kOwr$~/7G< ~;:;vԿz2 +TE{욑Tڞ̸@S}d4ʀƚuWbr5'gf޹{ է^ !M̝yy=. o@.'Q&a'] MPaAP6YJ;=:.^ν{5300ļL2})[2>$:w;[O/5.\o$i,/=030E: >.a1^ 1:&+3CR*2X{ίzriFJ)@s$xzL5RQ'Ieio5iy=/ɔL2&ku41dTZ\#aslyzDsZ[G2gK" =6Ko^kI q9>9nڞ??{bM>7#I3/Ӷ +'[lsbl[l[bM+'!9r*q4[NX2Jz'E1jI{{@GXq4%ե9>e4~yA, {ɑDS+,ݓlySԭ6&>H?=^KqRxR]FE@ *1կ(ȠTfR[KY4> +@C5h)Vt@7Pme+,C"\ff^l"v}RGv$9i6-XSEx65o:ɷwq"J.rʐ)/CXSZZ *fGe(ďdۢqJ 3^ +H^[ +1 y,O9ogU@ec3Zb\@ߎ|>[7LL} _ڷd7yFn穅~w~ϒ>%9lG0vW u+AAQ~vmB[TòqS%ZQ6XGRQV-ZE/8`UC@>@eu:`wp 4{:_FɇൂyB6 cu?50i(6OǞ{szDYpB(YTlv¤Rՠ0jd9*%g+6f[sdpO6**GViR`uf 6i;ny%}ET +I r- o!S*Shd,WF/[xVq + TU]H_%kF2|=-1$67`=3%̘ ?ؿ¸n+,Ļwƛ&"SmawImmXT9>v̿bs߿}m|iOGՠ&Ǿ˞̰6A&g:( RZSX,3(V@qQ0aa>*mZnۻ슦}Ԁwyc., zc+E +P4I$?SaΕ%-3 .s˼sӷӛ۪/>rn#֖ҪUykί4n n[50*fZn:^_\Y=>7 l67::5*n=}C0Q,Z\B2uzȨ7LiU%&7'_ : i.".Xjo5D/~5i}%n0e +UjCc7C_KMPMļFR63McQ ;<,E٘7YLRdmQܸ(w+bwn1Bx#f)lh+YyVY^wtȫ鋀2|IUZeQt -Nͪֆp@ӡ ?>:_Ɇ#':ܳN[ܒڕ&)J2 F遅K+IUGMvG1HMC]O~!^}8UTSaF{ij~aQ:)?G&,*TX+9y.Z]fR!өsP)59o(ZtbOr+uJi?{uj~FjO3_;l8Y?Z5߸q i'i}G;|mtRCEj D<yL^r `Y Ĵr8P`6ra32Ԁ[:aꞛl97,|4dT2!{:g:xql+jdܽ_dJF(u6'u1`T,(cN/ T(zIo1jQa䄼,`WۋQhGAo$9lhxfgv}zdX +keBKHB]fJtd\>("?sQxv8KD/QŜ:Gq~ g}8Krt'P=<q]/X5/E ;0G\*4" Pcu4onҔ"1i;~[v׏yxNP+d:p3JKpaBʪWK4RHI>K.]쎒ydFﲻPA9]9Lx ĪMG~y`b +}QR@#elV9!8a"SŠ! lܑ4P!-5,sl,rY-ۙdĜ#u}kZ{F^Ldtwd_;_94{f Co# ~qWᶆ{0to+Ou[urk-[jh;\sjިb=ʔ<2)ٖ["4Hp1y4t!3EX;u.;]tC|uA03ߚg~;uu-4~$䋗(t oޔ2g}xg(|o $9y=Ooi"0g(|w #&T^V)pbII>%06U#\eL}T^-RQT1MiI"1CbNW.SIyX'!Tt1Yռ8"#g{:,A1fN$ZcGW:;4ԛ=MXL`EW Ǐ׬j]j2nr;q6|w%,`tjU3Olp/\\R'kkV@\jH K nuX`\GMPrKO8+wTv[z&ܢLo}6b \HjQ馾b} `8q<놘AlRf$݀E2Ҳ[(jQf({v,,hL,> +stream +xk`Q`X*^0_ +endstream +endobj +173 0 obj +20 +endobj +174 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAD+mwa_cmr10 + /Encoding /Identity-H + /ToUnicode 175 0 R + /DescendantFonts [176 0 R] +>> +endobj +176 0 obj +<< /Type /Font +/BaseFont /EAAAAD+mwa_cmr10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 169 0 R +/DW 0 +/W [ 0 [365 500 500 500 916 500 500 555 276 388 555 555 443 500 651 391 526 443 526 276 750 443 276 333 500 680 555 394 ] ] +>> +endobj +175 0 obj +<< /Length 177 0 R /Filter /FlateDecode >> +stream +x]n0D +/E )TĢ5"cX5H;ɥzL;J#kZ nوV]un/H]eeғ%e̶ij7ɵƶ_:{x#3H*;bIU{l2^`"'͍6'Ǚ8/9du[?΁'3JARP(נ}" +P *A: D,@M  +9 rȹA1! 3YQo5> +endobj +178 0 obj +<< + /Type /Catalog + /Pages 141 0 R + /Lang (x-unknown) +>> +endobj +140 0 obj +<< + /Font << + /F677 147 0 R + /F674 156 0 R + /F675 165 0 R + /F676 174 0 R +>> + /ProcSet [/PDF /ImageB /ImageC /Text] + /ExtGState << + /GS1 2 0 R + /GS2 3 0 R + /GS3 4 0 R + /GS4 5 0 R + /GS5 6 0 R + /GS6 7 0 R + /GS7 8 0 R + /GS8 9 0 R + /GS9 10 0 R + /GS10 11 0 R + /GS11 12 0 R + /GS12 13 0 R + /GS13 14 0 R + /GS14 15 0 R + /GS15 16 0 R + /GS16 17 0 R + /GS17 18 0 R + /GS18 19 0 R + /GS19 20 0 R + /GS20 21 0 R + /GS21 22 0 R + /GS22 23 0 R + /GS23 24 0 R + /GS24 25 0 R + /GS25 26 0 R + /GS26 27 0 R + /GS27 28 0 R + /GS28 29 0 R + /GS29 30 0 R + /GS30 31 0 R + /GS31 32 0 R + /GS32 33 0 R + /GS33 34 0 R + /GS34 35 0 R + /GS35 36 0 R + /GS36 37 0 R + /GS37 38 0 R + /GS38 39 0 R + /GS39 40 0 R + /GS40 41 0 R + /GS41 42 0 R + /GS42 43 0 R + /GS43 44 0 R + /GS44 45 0 R + /GS45 46 0 R + /GS46 47 0 R + /GS47 48 0 R + /GS48 49 0 R + /GS49 50 0 R + /GS50 51 0 R + /GS51 52 0 R + /GS52 53 0 R + /GS53 54 0 R + /GS54 55 0 R + /GS55 56 0 R + /GS56 57 0 R + /GS57 58 0 R + /GS58 59 0 R + /GS59 60 0 R + /GS60 61 0 R + /GS61 62 0 R + /GS62 63 0 R + /GS63 64 0 R + /GS64 65 0 R + /GS65 66 0 R + /GS66 67 0 R + /GS67 68 0 R + /GS68 69 0 R + /GS69 70 0 R + /GS70 71 0 R + /GS71 72 0 R + /GS72 73 0 R + /GS73 74 0 R + /GS74 75 0 R + /GS75 76 0 R + /GS76 77 0 R + /GS77 78 0 R + /GS78 79 0 R + /GS79 80 0 R + /GS80 81 0 R + /GS81 82 0 R + /GS82 83 0 R + /GS83 84 0 R + /GS84 85 0 R + /GS85 86 0 R + /GS86 87 0 R + /GS87 88 0 R + /GS88 89 0 R + /GS89 90 0 R + /GS90 91 0 R + /GS91 92 0 R + /GS92 93 0 R + /GS93 94 0 R + /GS94 95 0 R + /GS95 96 0 R + /GS96 97 0 R + /GS97 98 0 R + /GS98 99 0 R + /GS99 100 0 R + /GS100 101 0 R + /GS101 102 0 R + /GS102 103 0 R + /GS103 104 0 R + /GS104 105 0 R + /GS105 106 0 R + /GS106 107 0 R + /GS107 108 0 R + /GS108 109 0 R + /GS109 110 0 R + /GS110 111 0 R + /GS111 112 0 R + /GS112 113 0 R + /GS113 114 0 R + /GS114 115 0 R + /GS115 116 0 R + /GS116 117 0 R + /GS117 118 0 R + /GS118 119 0 R + /GS119 120 0 R + /GS120 121 0 R + /GS121 122 0 R + /GS122 123 0 R + /GS123 124 0 R + /GS124 125 0 R + /GS125 126 0 R + /GS126 127 0 R + /GS127 128 0 R + /GS128 129 0 R + /GS129 130 0 R + /GS130 131 0 R + /GS131 132 0 R + /GS132 133 0 R + /GS133 134 0 R + /GS134 135 0 R +>> +>> +endobj +xref +0 179 +0000000000 65535 f +0000000015 00000 n +0000000145 00000 n +0000000197 00000 n +0000000249 00000 n +0000000301 00000 n +0000000353 00000 n +0000000405 00000 n +0000000457 00000 n +0000000509 00000 n +0000000561 00000 n +0000000614 00000 n +0000000667 00000 n +0000000720 00000 n +0000000773 00000 n +0000000826 00000 n +0000000879 00000 n +0000000932 00000 n +0000000985 00000 n +0000001038 00000 n +0000001091 00000 n +0000001144 00000 n +0000001197 00000 n +0000001250 00000 n +0000001303 00000 n +0000001356 00000 n +0000001409 00000 n +0000001462 00000 n +0000001515 00000 n +0000001568 00000 n +0000001621 00000 n +0000001674 00000 n +0000001727 00000 n +0000001780 00000 n +0000001833 00000 n +0000001887 00000 n +0000001941 00000 n +0000001995 00000 n +0000002049 00000 n +0000002103 00000 n +0000002156 00000 n +0000002209 00000 n +0000002262 00000 n +0000002315 00000 n +0000002368 00000 n +0000002421 00000 n +0000002474 00000 n +0000002527 00000 n +0000002580 00000 n +0000002633 00000 n +0000002686 00000 n +0000002739 00000 n +0000002792 00000 n +0000002845 00000 n +0000002898 00000 n +0000002951 00000 n +0000003004 00000 n +0000003057 00000 n +0000003110 00000 n +0000003163 00000 n +0000003216 00000 n +0000003269 00000 n +0000003322 00000 n +0000003375 00000 n +0000003428 00000 n +0000003481 00000 n +0000003534 00000 n +0000003587 00000 n +0000003640 00000 n +0000003693 00000 n +0000003746 00000 n +0000003799 00000 n +0000003852 00000 n +0000003905 00000 n +0000003958 00000 n +0000004011 00000 n +0000004064 00000 n +0000004117 00000 n +0000004170 00000 n +0000004223 00000 n +0000004276 00000 n +0000004329 00000 n +0000004382 00000 n +0000004435 00000 n +0000004488 00000 n +0000004541 00000 n +0000004594 00000 n +0000004647 00000 n +0000004701 00000 n +0000004755 00000 n +0000004809 00000 n +0000004863 00000 n +0000004917 00000 n +0000004971 00000 n +0000005025 00000 n +0000005078 00000 n +0000005131 00000 n +0000005184 00000 n +0000005237 00000 n +0000005290 00000 n +0000005343 00000 n +0000005397 00000 n +0000005451 00000 n +0000005505 00000 n +0000005559 00000 n +0000005613 00000 n +0000005667 00000 n +0000005721 00000 n +0000005775 00000 n +0000005829 00000 n +0000005883 00000 n +0000005937 00000 n +0000005991 00000 n +0000006045 00000 n +0000006099 00000 n +0000006153 00000 n +0000006207 00000 n +0000006261 00000 n +0000006315 00000 n +0000006369 00000 n +0000006423 00000 n +0000006477 00000 n +0000006531 00000 n +0000006585 00000 n +0000006639 00000 n +0000006693 00000 n +0000006747 00000 n +0000006802 00000 n +0000006857 00000 n +0000006912 00000 n +0000006967 00000 n +0000007022 00000 n +0000007077 00000 n +0000007132 00000 n +0000007187 00000 n +0000007242 00000 n +0000007297 00000 n +0000078852 00000 n +0000078875 00000 n +0000078902 00000 n +0000093923 00000 n +0000093784 00000 n +0000079100 00000 n +0000079356 00000 n +0000080825 00000 n +0000080803 00000 n +0000080915 00000 n +0000080935 00000 n +0000081326 00000 n +0000081095 00000 n +0000081639 00000 n +0000081660 00000 n +0000081916 00000 n +0000083978 00000 n +0000083956 00000 n +0000084070 00000 n +0000084090 00000 n +0000084489 00000 n +0000084250 00000 n +0000084814 00000 n +0000084835 00000 n +0000085087 00000 n +0000086531 00000 n +0000086509 00000 n +0000086618 00000 n +0000086637 00000 n +0000087028 00000 n +0000086797 00000 n +0000087340 00000 n +0000087361 00000 n +0000087616 00000 n +0000092718 00000 n +0000092696 00000 n +0000092816 00000 n +0000092836 00000 n +0000093329 00000 n +0000092995 00000 n +0000093763 00000 n +0000093846 00000 n +trailer +<< + /Root 178 0 R + /Info 1 0 R + /ID [<53E41E4FB7190C379CC2D5FC146BDF0A> <53E41E4FB7190C379CC2D5FC146BDF0A>] + /Size 179 +>> +startxref +96147 +%%EOF diff --git a/matlab/figs/hinf_filters_results_mixed_sensitivity.png b/matlab/figs/hinf_filters_results_mixed_sensitivity.png new file mode 100644 index 0000000..b046e66 Binary files /dev/null and b/matlab/figs/hinf_filters_results_mixed_sensitivity.png differ diff --git a/matlab/figs/hinf_synthesis_ligo_results.pdf b/matlab/figs/hinf_synthesis_ligo_results.pdf new file mode 100644 index 0000000..2c6a190 Binary files /dev/null and b/matlab/figs/hinf_synthesis_ligo_results.pdf differ diff --git a/matlab/figs/hinf_synthesis_ligo_results.png b/matlab/figs/hinf_synthesis_ligo_results.png new file mode 100644 index 0000000..f0b1281 Binary files /dev/null and b/matlab/figs/hinf_synthesis_ligo_results.png differ diff --git a/matlab/figs/ligo_specifications.pdf b/matlab/figs/ligo_specifications.pdf new file mode 100644 index 0000000..44cd974 Binary files /dev/null and b/matlab/figs/ligo_specifications.pdf differ diff --git a/matlab/figs/ligo_specifications.png b/matlab/figs/ligo_specifications.png new file mode 100644 index 0000000..87cf7b5 Binary files /dev/null and b/matlab/figs/ligo_specifications.png differ diff --git a/matlab/figs/ligo_weights.pdf b/matlab/figs/ligo_weights.pdf new file mode 100644 index 0000000..86653e0 Binary files /dev/null and b/matlab/figs/ligo_weights.pdf differ diff --git a/matlab/figs/ligo_weights.png b/matlab/figs/ligo_weights.png new file mode 100644 index 0000000..9ab2bcf Binary files /dev/null and b/matlab/figs/ligo_weights.png differ diff --git a/matlab/figs/three_complementary_filters_results.pdf b/matlab/figs/three_complementary_filters_results.pdf new file mode 100644 index 0000000..14f8ae0 Binary files /dev/null and b/matlab/figs/three_complementary_filters_results.pdf differ diff --git a/matlab/figs/three_complementary_filters_results.png b/matlab/figs/three_complementary_filters_results.png new file mode 100644 index 0000000..b1eda21 Binary files /dev/null and b/matlab/figs/three_complementary_filters_results.png differ diff --git a/matlab/figs/three_weighting_functions.pdf b/matlab/figs/three_weighting_functions.pdf new file mode 100644 index 0000000..9177cf4 --- /dev/null +++ b/matlab/figs/three_weighting_functions.pdf @@ -0,0 +1,1288 @@ +%PDF-1.4 +% +1 0 obj +<< +/Producer (Apache FOP Version 2.4.0-SNAPSHOT: PDFDocumentGraphics2D) +/CreationDate (D:20210901112556+02'00') +>> +endobj +2 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +3 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +4 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +5 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +6 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +7 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +8 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +9 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +10 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +11 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +12 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +13 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +14 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +15 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +16 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +17 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +18 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +19 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +20 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +21 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +22 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +23 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +24 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +25 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +26 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +27 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +28 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +29 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +30 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +31 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +32 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +33 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +34 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +35 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +36 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +37 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +38 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +39 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +40 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +41 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +42 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +43 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +44 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +45 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +46 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +47 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +48 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +49 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +50 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +51 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +52 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +53 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +54 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +55 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +56 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +57 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +58 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +59 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +60 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +61 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +62 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +63 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +64 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +65 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +66 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +67 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +68 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +69 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +70 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +71 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +72 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +73 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +74 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +75 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +76 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +77 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +78 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +79 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +80 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +81 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +82 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +83 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +84 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +85 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +86 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +87 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +88 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +89 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +90 0 obj +<< +/Type /ExtGState +/CA 0.2509804 +>> +endobj +91 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +92 0 obj +<< +/Type /ExtGState +/CA 0.14901961 +>> +endobj +93 0 obj +<< /Length 94 0 R /Filter /FlateDecode >> +stream +xĽϮ$972$ÀeKx` lȆq4<{f)WuVgiו#~q_}O>/}JގvgVnrϾך][wz;+W7?.bKM?J-v%^}Kv!bOPX-%KOԳO^"Pq什# DXsĚ?zXbk9{5b=%XG/=/ViO!Kϋ՛6Rn[o%Kڷ)ߓt^.W5r=)-vݯkz^rܥ֮wq5R=j +F}hr\'|)EUǦ>yT+IO·XGyM䦭$CH?toXW2.^#h:mPS}4W5^_>|e;MJ{^/;z]g>z\=adkϟF5}I~HQᕅ^#ԪkbMF5z{Gy]|RTi'yMyik\5/uyD̟Fy&-瞟?z\Mjlk5r=^vGoRT[.>z\kzA\kvkz^8)F5}m}ÌF5N?+_Gy]߶~H*[ +&oV~RGGj_?T?!=)C*6#kdOʔyO@O՚?zTǓR\j޹k*OJuV}nL:-:'j?8ޟR\o x^Y[!v6,!  mͳEKv~CY#V [~5]gzU/^ ƹdzX:Q^ ֹ ~y?>z`ϛ&Y{K}{I?6 {D7rКK{Z>.|{z?d0?z`EQj=c _e?]M@I&3:G/4]?!Ͱ`G/4҉-w`G/4:z+G/4:4Y|<{_v]cub׉xOy\G/~JK=rO{o`G/=t?^^ o}}-^ o.ͩ=6~Om.%XCz]2|~OERخ)|~OGa'/N e-k߳웭m)?L =%eaG/(B=בK{zQV[:rޗ ]Ȕ\'/~3=B/4=_'/g٫<֙?yXK,;\a{\m߯ ͈~8.O^ yy)H3|~K?zߋNs L@g3~Kw)gEI/sd]&A.SA_庿A_%A_eAoJYߠ-sc7$#Hog-Y_ ֆ/ZBWg@o,*f-!/ڳAf@h~ђ";DE+w6oEO7v!OC_Hh~-;Dv~~;DEw~oW!/̿C6@?-~I|H?t~";Dikw !/zٿEHm]_5H~J;DEwoWm";C%Hȸn>|"/r9B-{dZ.L]Ehӻ/2wM_e6"z@T5A ,Z ^C(^Bg&/2wM _8wI}8qz@={@%~qk"-4ZF I ^S@h*&/P'A8FxM__Կ_8xI]uy@5~%~qkqK,cd7 + NJ^<h&y/Px/2yM_ey@5vkj +}@_~{FE"-Oa/f}a82A/RTˮO::o_o___7t?K{o7nfܫ^v>O7R[ߎ;'$ sj?~ B*rxx72%r]H{z\X:4Gu?!#>w"_:v IkH0r3鈀mIwH:ngu_Q6)HBg +#a, hJ +3)"IRulIOGz y)#E^ǐH %RHOɐHcEzF)B>gDZH/dBzF(BgD"Qi{S"E(x YW2=%R8");;^rOL ҷ+R酔Kψp,^HH])H:gZxD/$XzJȨEz3"-\JA*=%RdQ"NȟD^GH9): +gb$ g,+ɓiaK +"6 )2$^G@)J:gDZXH/GzJȇEz1SaȄDz!%?%&2^H !, (R1򼎓 qY1=#P_ + ",'R.y^ǽL -4X(,y^Ʒs$5^5Q'j,5A'jL?Q"D"5,(5.RH,"=Qc"DM)$jޞ1b&D5Q'jL"?Qc"DM)$jޞ" "}CE +E'j'$jHO(-GK&D5Q'jL=QcDM)$jޞ1b&D5HoOԘH1QEzE +E'jL3&jHߐ1b&D5Q'jL=QD"5&RLDޟqBf(5?*"}K"?QH1Q$zB&D DM($j@oO PHyޞ1qB&DB&ޞ1DMgM<]wwКK>6ȦҖKŤ\~obnw9_e05Fv~ ?EHtczҶ}:V#uӡVhS ~v4cdi?{L|6λdpIJ<Ϛ ++15;whI3Rkm?#)һHU;ߋ.)uH?"J;qI) DuxT'~4P<.q-N`fGwy}#9øtFÜ)ufMd0Lqk9cL'Eǫ=jg b눔aJ]f?XӤkP2󓔔Cfs̥CPvH~iz+j]Z0jg*M- utYvuGr]F_q}1rdˁ9v@ +? J:kPm{m6V|oC&c|A׾Ǫ%v6AcձӯC TZ%Dou}I6W/H27 +h|_)zi]ө[1iQ={:1ԝvH-kv|s<j)7Pk9TZVλnEvTl?P*䫺~(.NKaHA)93G{31u(K9YH7%fݪ=s'=88|UOٴ: ?HAM[i ^£EP%Y3E:=mFTk|w +[*=H= m؎jNtu-pH:w4Az;uci~,` +ڛ]q +R.XξHvS$ԙ|V\B 3o HTPn `ӧWt&/u}V8ZDX~3 +Zr\TP`m!.p7I֕X;¹|Mt#fh@R]Z- +0Xj+ɹAcGmwC)}Z@r#M)oP|)[{oֺ SN I/ Uٷg&8HA?!F5!ᆨԻ~$ 1(MS< Q,*X$.fʙ6n1 u=Sn[\6΋P;Ո +e̷3hĶoC9ArGIϞ!BҪ;Ÿ*[Pk6J:l4bt`{p;ڝҫFz~s;Gܪ٦_UEEKs z݌j{`D*aH=1D, xJ^9 bD ]5UR[u[+(0 ȼ.H}^cs)mWC 1<׫I{s<*8= H|aꤸcHFy:ztTm! $VEU͹*޲wW, )*}dVLR"%h:yfF?iTQpЅ~aQ/?= DK7 * i)99ρ(9uJɽ5_r $镑;!Uv1L-R3(ۢ86 &5)d)Xϣ:.t쇬mOwkNOHe,RaOw{C]ꁘ"Ki[4?qwKUΤ],- +;[-@ phwݚna\z{Pڽ"w +.sٱ/7!͓*223Oahvc ?*nE}#6Ȁ*\H%$'ԮD?F*!<.8=[lӣcڕz] +36]hamlo!Vq@F^W9"5u{TT"SB؜EMJԏF_CެE[`Vj6ܜ[}@c(Ծ"#a,'iGMR[X [_1x+]'҉W"Qw򻫲N_OTM:Y'o1{z ;3A? gID'ylz<}@=;t4!a:-ˁ5.Ќ j' +ݍBcӏE?J_pV UD@h@ОɻЪRU}^ٍv ݾN 6ޙ+#w*kH7Cw·@rtsU\mdPrJwF^$Q uVI-:w*[K"Xw7|*3|<`H%-wx&B0D^lm\G L^A2{ť w τ] +:b|zUw{'AeE̱;^i5;~]?j8XU6/q /Ord@R2d%5w"]!]/y}$l=Hŵ +<{I9.궊:-үwJ.:cLSaA[CJ'x',3!Y_W'9 +񙐿?u3''BOЭDƴg񙐿BIm'uuN/q {A8\܍|~ QYRUȒB4{ +" D4-2=A7QI +KDu-9uSvi{N$ +̍Z#[H3ffOVq|*.Ĩ=* r!%7m: LY٣ +i)J* K5Ⱦ5 CP8FnEG72OՋ{Z`"OnrUEҥ/uōS0l) +1tݝ=2ځRAr3w9dNnE,Kʶz:HܿZA_q4 i#Vـ:W˞(x:o6Apޭat,fB Pm \fjL j|ߛ(5)TQDfqJǏ׫IPl&H5Hn +qJU0V#gaHz5n2VOJ5cw!75\rtZ$n,< *:%*!Kr&BՔ 94 I`NV)'[4#0lf0qz2f Rȧ[7Yt +d֑oF x#~Rzw RG,כSuN˝ud$9 ~ >-he`|8rUs5ci74Gr0#IݻeNk} NX%y;I衇] +Q)=SW$g|۞m܅t;a҂5nMJ=H KIoo&-ž&'E% oT,ڶ@B)pGϬJnetq\-N{]$F1+T _:[ǰ*5:(Sxwܘfv~M1 p"ݨmJ~Arֵl(C ս_f=bOnR~x`6lJϲ1 +s;]=7u+HHp&:_XVYJn Lqçh(M0r)tbܼڷ! Zs7JzuQxpBtmN&(y3'v@QMvdؙ8LI#t&[xWƔs +Q+ᴍF#M7E%;- *Mo/,_$B|/̎{dbܩrJ~t4(ꄶlHH;hDQ˫_󓲓wHDO?hvOH`ռ8)(pN6ݕ}ܶkCщ^y`jP]ɬú{B4"l8ţtf:%g%_XÌJ殕ݼ0g]ةDt!sޕ$rNk#X~jc`RSJ #qZaa/:kC%(%%sx#νQKKbŲHZ'ϋk0+}IհQ +x2U2BlT,CgMa#}]Uvk7\ nevZ?FJ"nk#1w~0( +0W* F˜\1 #1ai0X؝Sm:dݬ/ߊmŹ'0/Ń2KQ1g£[&80*]vWdGF u4,s W +Ke`Td"`Ӵ= +&:L{ȗF*qI̅wN&֛?D" 5U&rQ6ʙb\DT,|g)Rr[n|\4#>S=yr]DuyQuKv9MvĶ `& n4T27g\!YuÜJywzsqݔ@)}`T|oL +ouWid-:Q8ٍJ2XЀ FX>հ a I[:ӹݰNm{d.Byckzh?X7jli!d)Mt@4PKOɉjf@pj1y  7+D7iNݝuxs`$0ln''L|2f?8aRT饯(-u +ԓmVZq09Rvd,'l`U'g=#x_!yJ0$[lnP)[7탛f }YǙw[|Kquf4$A EsrNe}hqJQ;β#%V9noNoK4q:)Q'axp!mn X+Ql4VTmz.&ݨ9'`l +~0XyJ;v5Fț"ia!ps8ۡ;PfN͊j~yL\U~ Y<e|yY[Vydw?Ɓ0,WYiա{,G0IIyQ=ma'L>#NkЈkw?#*rDmF[X|v^2MRjd6dNnV=ImTl!1!>s߬:t"`QԩvJf41Y k6g%؇`;r(~vh+lǢME$ +yxN//dVCf +xCz9-2w\Zp +Jمw.+izfe}재,H1ijց0n$AzcWF^Cʁ\=1#^k|Ua`Lz0FY-^B0Ïb= f#_Oa.:0+h\U…X2`t#Q,^x6Bk$?kЇ'}'`52=,u\k#mOym\om@"`5:: [ϑ|_aљoR\WYNônkNz[ox~u;(VN0b{rHWRlG DLoei`ֵI*tOis7dyiٍi,QyMߊQI^ V9 :襨ofI扛+0 +&jwWsHǸ׹߰;:PW$vTֿQ0;5NTBvOF${ì453QAF!6ìb޼W֗gOb'y)=00t"K +yw/VY'<6Vw#',7+&`<0D2r:6)ewwOl +B/\>fǧ'QͲi52RY<Ϟ *e`_ț6Q (7K|zDwNz#a40~[AjuD1I~դ7:e60N08" 0kv_ J;IzC~IS#c5` ,ް(ژy%f VQªxM53XG{=$`:t_vex| 0'f0FG2 Rɔso NX #!/"jTo4cC!faĽ;F"[<"eJg$yӳvM7e":1R0}שq ('F#Q~n*Lu`VKz4-aKFI5ѺÚ68]4KRdʄ\;qd=imCp +ŽhìScuڊg}!ˡA92uR}`?lQַX&K-i@;r ~1N8i)#G2ժiDlQBi}0]% w_W-A*,>T9Fcd\[.t!&z>br7j4W}k +2s8W8lle_ǖԠ>Жad8PW&FU(u2jnar1412s#6ݼճpe$WP; B-NLt/.dap TU"?^Cp]md^2+$]`u9sѝ}U$ t{}bn:Ew+9|LP`$72ۆh5tL{*wu1g2Űrsp'AZX>ag(aRTL!&1t@=$ G-1٣ٍ7) vhaL=ƱVBOU[Ea!452/ wnt!nLcS\15O0]CS)6__PXX'7HHNdrޟXry b%{Qay`6EXU@[k`0R^mRl4h'N@"=gXıKBf\yHxq$ox.w{|dƺZǡ2cZk!oXtɾzjQ\%|;6P'|,E+:gSud6d}k.7-=s>lHϯEp(bb3*+wf:Xg~fIǨϾm,"YO6/|G3.~y^5VETG4,,ǘvX2ӤWg_a4mJg 2t> cF%i^fw&\ oq\^s\x]7̬ m0@҃`ywbe_#/Pmvک0q;&rG~_}FmZE˴ +W}Z_}gU[aݖaH(9m`{CF;omF[ !sg} C嵰4aJVJgNʁud;9:*e: bpmzTe0lc6&ycEY/}nUGHƌ]ô+x*e>dK3t mrNBKmajl0t͸ƱóQ֏s,+tkLԃlc< +s~X[Sʑ2^$6| # ͕i9v VIl`I]^n$1z17+iPeod\= iW:N0mN1axެRA7K.c]nWZm;fF2Q +s/<]7l9'汎oh[6cvpm9f i Ss}3^Ԍw 3#XGyᩴ\neu?&z-d>] +چ9yգC01h`# WՙA&wöezm{wsҸaO{ И>-!}sW=4z鞌o< X($kYlN4d7{Gy`6i/mt_b .ecއOAߢ:qZ5!]9*5݁6xBfGbzcn`^dPZ6|{0崊~t^o'6vX6o8:69f40 =|)W޽Xx`^7F%.Wܷ4%W΁Vn: -`['~;1L뽦{?FAuyj_+0rN'(97Ka$`«ebI:km>fZL2sk4 zS bMt9~3L/؝jײ{ <`kX`Fmarfg3i}RlzR"3ɖtX5/ ,[i9f4[Fэe- g0mYf[6qmYwkٖ뿰meB·v[Q#-K 0 ܲżn~H-O˽-[aBT3 nY&.s,]fu [`6 &-zX`<poY^Ra::c&i^p[طm"[>G-DFs̿D˦]VAk[a,G3e9gf"h}ܖ +*Jɮf".!1of#o UfrU2.=Pj#N{yG!eeU0gf%myk䢐IZ.j \`ҎNC8sQDnxwf.o*|b.IVpsQk7 NU5sHn ;]yv.TY7l%#ii:\y7XFf`vHx t9(ڣtI5;mP,]N}lM~_M l'l{ QAiNi51uQ9m{E)MFߜ%m&NJ* [#i-t]f*GBEi#Pv]q녲JZA6svQۘ&6f.0)Q H(%ˊK h?_es5Ol :f.[C.0mś>\V.N^s[i/_m\f udB3rU(+(5 +^3 g/=Hl?HeF3[M<^c@w1z>0yѯ +*tj0K9!f2/*,n ^)p?:/Fh>Q=O+5>hkewjыNB966qz}3S/̤^>!xzmbzz6lͧ^֭$@e]NPB_S(ES/ؽh*^Lދ)mhq@E2lP8kM&/trmW.DE#yʆMD_4nEO_0<&/Gԯa"d:>dؾ4 '辌<f/k:~yk%aaf%[Ne6~Y+g {~6m u bp.V]2+_F!FG$2bebJ{?"-m_`=Nb2wva,mPt` G:61aTnKV=&/9/`F>S#@F T0Z=h1 &0ڽQOLF 9A83z.3xf.ꝏHF7{bs&.0c6y=RMt`4Sf&Bdug1Bt)Yձ It fQH{d / `WG3e4yvKXma/u,Sb0n-s0shfYj쾑fjgn00ZtKJf3-0fv1C7?g~0 _;Df3;flfY [~a6# a>[c&0IBq,,a>Ȅ:_W3M@݆}H0Uiz'p|cq> U1lȜ0CUi:3: l <8-9[oln2fL\3gc#w>"iX8h'eXlʃAf4-aG%uQ; GGa6X ߑ=1aOx|$Ї+1 b666 f㦼MbfL!fӭtr!S䭍wd"ô?`\qK}JSxM혙^36a&pw@0F ]Λ0'+ VPvlJ1FAI1nv2Fe^a#[e c@pI0'v+o؃l7 @@Qe'T` #B<{P);8H/{AG$!{e~D2IpАbӡM.:Г/>=7Ise@벷 z0Q.,c0MeT :8LRFU٨&,eTJ@&LSfN7U^ʨ`lu 3S8UTeV$9!yq9Vm[G+쏹3_Ɔ3_SE舽d,3 Ÿ3e~zG,ͽ@ZFY}e- ZfF}Ϳr-mK[fT۸#3qQ|e`Sv.Ȋ ø e`$t'2+$q3;I?oǰO3 @"3 +Ϫ@}Rk`#8̨ec1즙 ai0B,fCΜy!T[Ld99ݜaT l2D{C23zMr 3<:ShY3gbwRgOH|M΄f` PAIԯ6ŏifۛ ϰl78a=h`Uk9ӚH0j&^3'j"s|!6ܜ=pA 1™ ١`vK`Jo&&~30yrd Όa g`RW!j8f12s L +/$gPw5 39g +hvnWm8&R3"Xrzp'"Jɾ@iFE +^R͚7;A%4S'7燙̈%*,>3&MpNW:ә5fJ1h&63 ʸ̌H!4qQ/1@edF%>$Q& +ȟ +SY̚U~g0k؊g +f1f3 +# )$ etaz^,PL>= uE3wWTrzE.F@3sP6O2*@ZQ4QF}uG8{=x˘uCgʹeTO™Z4'2hXb9e.a<1;_*W6ӝ{lb,kL Xc. -7WH<跓ؾЕ52gʰrNkt򭉬 /Kzp[fY ʮցrFv2 +^ LNP}  +dF  dL>.:5LM9A3iz d͆ܧ~ѧMdaxMgZ2 \(/dy_!sq$3\ hdTbt3@|ҦӘM|d@B#ujld@~>ӑm +RD]̐d~&.ȖV!&UllM3 rsgDf1 dß Ȗ-3-m[L?l}lyfǖn&[^֙{lygE1c:%4-k[L;əulQ3آgαEϤcQϔcˁ13Cfnl9fƖs[Nܙjl9gt`[,fl?fjiSgf[ dlf)mf[`,_,_,^,],\,΁[,ہZ,Y,X,W,V,zU,+3XpqXtXXtXXtXtXt+XtFXtaXt|XXXtXtX :b1b"F!@)=,_yX  a1@bX)0XW6,Ffְ* a18bX.P`^` !@/,]X R la1 B5Pk` +@ü',MS4aK,:Є-1@ľM34aK=Є-1@Mؒ4aK.!-9.OؒP-*l)Ta?0- )li4LaKB` +[SbE` +[/SҶ–v$0-m))lig LaKL` +[gSvbN +=>'li +҄',.a sL{<3̰zxG 3L}D0d $?ga7gc)=8 cG 3,QC7X&0D.N1sF3g##F6pDfX/a3΀fuwNab#v50%f06FX;Lf{n_9 Iw̜a}Zˁ30?7q`mcs3̰lE!8 Y@aM3 J?"gaJaQþ9Lf 9k2vf0(e3gl1VS9 3̰kdG 3~ 3,yְ30zٷza0q,}D0Øs 40KϤa +[0n(a`av4 #ia)H澇3iau|D0Ⱦ9FN:Lfgi#i3f>f0(<}؃3{whfiL3.ʃ3tf 3}̜a'M30faSx3 f ?'0?X&ΰlU 3̰~y3ganI` cgt3kapA6YDNc`0ÊM)p5-硫wFO0 2Fōwͬa6&^h` J d 3h| 6Nߜ.̠. ,3ja蚙.̰kG P|w 3̦D^v'4{Y c@~y|aϴUg]A҈ŋf0KY.0f .,&0K_G KeX`؃2 l2x<>2>P=(8/֘3 ~g>: 8ÌoD/{g[79ò{uag30i=8Àd8l 3Z +a`*na`4 +a` 5ߛ8èh^Ϛ v:G Lt?sx9lAMaT 3 s&0+~P̤a`*H%Df :f7'ۙIòFcJ3i00ut4 lLM,.BiBKi c:G$ 4&0j"[݁4 0:4,[̬a|ѩY(R{cH]` ;Jb{R` R/m6fڰl)}6 ě׈00 RiÌ3m@yam1Qh_Y r2)޳6 (cG 6 ,ʹaVIP :f65f0c`Zam?Z +m~tȻhìDQDL#3mT+6 n46̪%? mRj hh-n0.KTa` G Ӂ%#ٮ&0,? O0{.z@xzxKf嬘^BX} b YF[ Zba`Skqvsʙ8K1:ò$oa`Lƫn'Fo@ CG64CiÀӧsA~@ssڿІ }҆|'̬a@$'i fcIPDU,Is-^HЋ3ZYiܻ_ B~^541#ݨMaҚW31b_8f0fΰlA]롙3 ڡ_r Ò0WՇΜa ;g4B7pa`.pQ&0 %F͜>8p16jK0B4:ZtFF F-8iF"UY}$^iXIƱͤa`>YpB1)//Hòՙ2 +߅4 J|x XaicHpPR#pa`UfIS1p;i eW0\a֛&']&0ki˟f.a:|G Õ$~M3oia`W7Gd㥭paE̥C;r/av==H@_†HF݊?"2sP@ FĂ1C8ĆM bYl1^9q%{cG$#Zø|v4bD7lȑj&"1QԈ$lm$ls?7Q4c<.1mu#D3O\bDώ@&F囗61kXſsK)Qi7wOHI݋@(fԔӜʸVE(BRb@S0yD)l( b;*R15''YňaPX&Z1BpNJ5_20YHR>3i2Vlҁ38'WM@/F Kll#B=qm|1$,'9Hh(HG?# @?F)JbzoMcVޢH@Syct[؃rˣ-0Q#y +_(lΟcAF%hc8i !K6t[`YȬ@a!|2׉aƆMDdf鼥ȉ&&22aV TdX&*G[W2d Z}.YY]AJΦ5Q>LHf~ɲ_lz_vӰ,y^8ɨRdf d>[:mG%`΍KfqMMvAΉKu>8pQC؃JWLceY(,W(< (54PF4)PQ6lioQFrb3zw )~Yo Xv# cMY(>8QMsQ|k&* TKʨ>.3UL_Ft殉l>@kYVFQ>f+1&G2KiYsu<X8:0ѫ %I_DYf#ԧ_ouax?O/ ]^ xg`vo}8,43H6]s2K .+!;L$~_Tn6Nur&;G{ejQi~qsWg%^vjp2Zpʂ/SBa)]|?[Qa/S7u{yc}~ԴМM+ ٨t0 +b(1)ka?̛b9tU٨͓EznjƲՀ:2Yֺ.vMn`SfjiԝeFq, L?ɝA +^;]٨{;mDSj?N!=q$$71c; iceϧ=Cj79R$S>,{hɞd1{i; xJ}|&̫ޔ|6jAz <=yi+r\?kN-}d^KL'[s\mu}FLFg,M[0NPM h3߱3])+Lk>seVLR=g~Sx: jOi1m<9< =ϸ +WygsQŋ*{ZzQȘWv QuFo6?l)틦LubMiHpVSw)|.K }hs>)9.B8K9cn]9;Qƙ`833)(bω3=s<|-Ds + Amv&mgN jw]6;žn۵Rifnj͞ +kp͞j`_`7 [Ejƌ!룑O|\ۙf<Ւ ͞jYD31PfOY4(#ގ3cbR3 }af؍@2ImkGߋ(:L%dx.ltv|DW؄Kƌ?х}sh=V7ɘ1v +Ō:v] ݺfTf3U0MU7L nԡnNC-27l:2oK02͓:Wte`|.$ղyBx~n/jjg0,3$:b,'+zgҧ(ab^phe5uJmbeTEsVRF +luRW(mn7*tRgk3WQ@e\` +enǼE1e'kBydXn^y+ˆ؊uv #d80"*LWj+*0s"[I:p`HxT(aJX!aD,0ˆj:!{: L(HeߢFOƓx0Z$ͮ7z[`jtV YaVj`Dg[/)⠲k0B}ii\ႉ3op zXM`DlU,w^QT0Y{jS)Fwu$ lu"%$FgTBz`DTL<ٽ + soyn!HaHOml(0UP dAʃSιߤd-0l)`M}Yo=2Sf +鲔.L +]~/E/M?rT)b +.K%Zp~:^tÿwVQ_N؃K Kzu"kQ&Rd7~1C_ +Vn1A~J!P)~)ya9U*R2uqR`SDDu}})Y4@NIp_-?pr_jťf8KRĭtþ1GZ_D۱o2R4Sj*/E([}L䋈}KKKܥR4S[7UtV.~E*%ۥj_ڥ`"do2 ܑ]} )v)z2/<.EL)?.Glwݸ.E+ gti]xg).Exe]_yL;ނPyIs(*係;e8~%qNlc/⚡m/̞@F>;|gfW)mx}~?|p| ?`PA=?x9`տ}TLt|QOQ|W)GG/?p~k+eJ>^^ȃ1KL zmsݚ_w=yέ9__l +endstream +endobj +94 0 obj +34104 +endobj +95 0 obj +[93 0 R] +endobj +96 0 obj +<< + /Resources 97 0 R + /Type /Page + /MediaBox [0 0 307 174] + /CropBox [0 0 307 174] + /BleedBox [0 0 307 174] + /TrimBox [0 0 307 174] + /Parent 98 0 R + /Contents 95 0 R +>> +endobj +99 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAA+mwa_cmsy10 + /FontBBox [-28 -959 1123 778] + /Flags 33 + /CapHeight 683 + /Ascent 778 + /Descent -959 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 100 0 R + /CIDSet 101 0 R +>> +endobj +100 0 obj +<< + /Length1 2008 + /Length 102 0 R + /Filter /FlateDecode +>> +stream +xUale~ul] +xۭʶn,v (B&ZQX41cQCn!$ `I0nj(Jk{}ywox*x;Y}pyzd8# _iMYNje%3w%.?MFի)>A+Ozs*;sBP.ɆLnDvYDuEWY=:OֲHoH|hF +9f^r pm, +b / {Ѝh +b"z5aX \? +oEv]cǘy[\D (N:qNA1A +m۰^V{*UEs j~<7>G4 +OXhwD#ָµ4תl܂3ޯrHXlŠ!'CFh?0b_HYnaHc%wDЈҮkhWPdzǮzsLMݚ%mN.rFz,2kjl^b.B˥>+VȐ6%(:Q0EO[[V^aNE$yXhx +|JrԀ.hjUת=u!8D&gh)]G~zJC#]jRcWٙpRcql@!TUV0o " u޹^}R͖-5oX[__4HO<2goA p$dh_Gn)R /85y35= +u\]XU,{@gY`Յ?U,?d\w,:o);v"6z\ŕ9*2f˘N|T2+du}D٘eʘGּY0ED9L#$Rmdm!ҍ.ucBQdΓc#"h&Ir陠pQ~IT9®f21A㱫d2ɣQtU.?;Nfm9ݥʺQHg䡀52Y }Y0f"ԍ\ԐrS2sb&R}fh:%8U7JudYǍщla6H\Ǩ$6<1m'ȤFsSIszWfs~JNmuw*9c%_^4$lnF=B*xs6O +endstream +endobj +102 0 obj +1349 +endobj +101 0 obj +<< /Length 103 0 R /Filter /FlateDecode >> +stream +xk` +endstream +endobj +103 0 obj +12 +endobj +104 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAA+mwa_cmsy10 + /Encoding /Identity-H + /ToUnicode 105 0 R + /DescendantFonts [106 0 R] +>> +endobj +106 0 obj +<< /Type /Font +/BaseFont /EAAAAA+mwa_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 99 0 R +/DW 0 +/W [ 0 [365 276 ] ] +>> +endobj +105 0 obj +<< /Length 107 0 R /Filter /FlateDecode >> +stream +x]Pj0 +t')JB}i?԰k+! +if$s6"z`ӄ_H! 8ZWT5hV H~#N37^#pz~'hr4u#~KwE(N+w> Dq='{ 5jˠ9H$݈ťL嚪tMQPYH쒷qDT QJX9uxl5U|}B +endstream +endobj +107 0 obj +235 +endobj +108 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAB+mwa_cmmi10 + /FontBBox [-34 -250 1047 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 109 0 R + /CIDSet 110 0 R +>> +endobj +109 0 obj +<< + /Length1 2312 + /Length 111 0 R + /Filter /FlateDecode +>> +stream +xV}Lw4_8i\H L ![ZP K)l-*=(BKڢ(Gjl(UZ)]UMӦZ-R*lZaP?m= OBDw|'f?IɬAc!Yz S|뻣,NQ;)~I]ӝMڵ.Q%[E8xW"r- fWa;1sj2ܨ6hxxJa:U>)sY/9q<,!`?a/t܋{t~ls{\\u|W)~x7Ii\\o/¼..=l+n[\;.MeWI/8*!p'H1zv U/xWU]㍕Ҷ㛃Ifς8VYgNr8?rz:看u׾Rq=Ջ+pOȶdGŏ'6*A>i䜈IzR { +Ec.b.@NJX9/1G9V2L&wɲ1C-SX@-bM,^y963e((Opi$,El مau4201,P9%ƞ1Qx&Y֘kfNAZ߮Paa+tγTˎ*Lh/̤Yh +w(3`P62 9Tz3eĞVPF̂93g&;C164LƜMʐ9gf4bԍ,}Ҥ{'d67 M!Lַ3ؤY^w874g^? ѮChwO%P?7wG Ë"n-RKw4b1 omk[ +endstream +endobj +111 0 obj +1607 +endobj +110 0 obj +<< /Length 112 0 R /Filter /FlateDecode >> +stream +xk`H +endstream +endobj +112 0 obj +12 +endobj +113 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAB+mwa_cmmi10 + /Encoding /Identity-H + /ToUnicode 114 0 R + /DescendantFonts [115 0 R] +>> +endobj +115 0 obj +<< /Type /Font +/BaseFont /EAAAAB+mwa_cmmi10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 108 0 R +/DW 0 +/W [ 0 [365 943 ] ] +>> +endobj +114 0 obj +<< /Length 116 0 R /Filter /FlateDecode >> +stream +x]Pj0 +t=,NRJ/K,M-g m琿*cah⃼1N~!0h]Qՠ;[M2"u8uxxXz ;@|iӳAwH֍pn/!.B=t_Ѿ&'>N'%_k@W[5A*$F,eTMv77`]6FUBeڝ]6j!Jx+/} +endstream +endobj +116 0 obj +236 +endobj +117 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAC+mwb_cmsy10 + /FontBBox [11 -215 942 727] + /Flags 33 + /CapHeight 0 + /Ascent 727 + /Descent -215 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 118 0 R + /CIDSet 119 0 R +>> +endobj +118 0 obj +<< + /Length1 1992 + /Length 120 0 R + /Filter /FlateDecode +>> +stream +xUmle=Ҏ{`3^wLz׭s%["AZC[خueAM/CD%:_r4!HBb  m >s/^:jxiZ |'T~lTvvSdg҆70$\qm#U7s3lxl~b{gUg +l;"9I=g,Q!_^~uK_2 +y'.zWJYN,1qPo~eev2EcQw)8fg33 uk5Uuen(H",͍!UYl3&񆞄Mzmb'LHU3vUYy1VMHi=iD%S˺\> 5'- JnML1DIO&^S|r]O>Rl͹-6Wl0ȹAсQMU%EƉRXɤ0Yk4+R%nH+0EYL2&'kQU􀪜EX􊰨$-p&L"aMXTTao BUrIU̺vua7YKn-&#*ĸ9 Ony}-4h"'\YxkC%B5nń`9U;[ֽq_.|[_ޮٰT]ɚ` +U;͞6c%Z!_FΈghyF'ʌ +hR}Bfp'ޥ.Kd km ѽwBxc[EwqrSaw0/;`l>pJv.BLXG uLr0*`-,`l^sMtFS 4ioh:F֠SO KxzGI;MJ$El-Z (;Iˎ9DHu<&*+qdlU;Aԡ٩L*=-m InEb&+ -R@feVbFј*@gKӇQ]'Igt&?H{U5JQ#TG*;Ixtld> +stream +xk +endstream +endobj +121 0 obj +9 +endobj +122 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAC+mwb_cmsy10 + /Encoding /Identity-H + /ToUnicode 123 0 R + /DescendantFonts [124 0 R] +>> +endobj +124 0 obj +<< /Type /Font +/BaseFont /EAAAAC+mwb_cmsy10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 117 0 R +/DW 0 +/W [ 0 [750 776 ] ] +>> +endobj +123 0 obj +<< /Length 125 0 R /Filter /FlateDecode >> +stream +x]Pj0+l CԒX}q z0h[lE^X gBpjV& +:G:g} +endstream +endobj +125 0 obj +234 +endobj +126 0 obj +<< + /Type /FontDescriptor + /FontName /EAAAAD+mwa_cmr10 + /FontBBox [-43 -250 1008 750] + /Flags 33 + /CapHeight 683 + /Ascent 750 + /Descent -250 + /ItalicAngle 0 + /StemV 0 + /MissingWidth 500 + /FontFile2 127 0 R + /CIDSet 128 0 R +>> +endobj +127 0 obj +<< + /Length1 5900 + /Length 129 0 R + /Filter /FlateDecode +>> +stream +xX tSיۤ'ˋd-W-d[m-lKe[,6X`,/x $Ґt!䤜4Ӟ9HMNKLN39f24'3' = JI_{3@CpjWFe S4w>Z$g)Il_R3@nX|_&p {gB(bW?ufK*y؇|ȗP-}T?l:5<rlJR q,Ⱦ@ނ}xp^4< 0 S0[aD @B~P IJ{cdϲ(+e>`tI/O^feMrSjM<ͻGq%kn~Bwدⵁ +'ڒtk|r(<rIH(uo ')TM&q(wiL%#I-)4La׷MWB(E B_!SCX/sqUъւt_qIUOKWb\0ۻi 86 * cCB̶cCY~8Gp^ PxQ"M! ha/J_6"fH٠0)}NM_ ̼Gc=DyDFbp +0+$V$6[V +u.Z2/z%lɒhP2}=VyVAB1r4p[ keUJUgu)b2rȗRI^Z.h|a!¬iy\$ #[x}0˿NtVj!wRيHO`[aLڙڝKa֞J]{/:2+$̪HgCs#-mEJa e#q䱄Ϥ|AmR՟<}e&hVB^)ʁ#JSgr|)Pt˅,>"cX鰌@`sR0*Sc25_חX[ȑt0QID7h9杫 ~-ufV]_H&m$-s/?TYS f) wqD܉;Kq .d&AxUKAT2L/(#fm,:"<wsA)2򋀝4 +nbyO?Z AJuUP_hjihR-0r0Lj@\VBx +֠˻cҌFAwKV-F7!25Q"ä/ "C !JBZ]ik^ +W-4WYt:c蹍[J:O/̟io;3w[אkFG;zV[;fp18u8jvŢ6O{7?TMXcKtMlG;Z I1(s079Ŕ6 =(cU,)ͤY"&O!p5ZvN%urL ֕t|}:|/TÂ2Z[DFJqFU"#Ԝ>t`Ԇ?/=tO ״7CTXdJd.>H8)֒ +=E*R#-ܠ0+D/9&t _sI + s:Q*T:ojȧ'ZffFvO׍qYXD鶡(-Jm#jn6{P8Btl|L;wq !9c|lWCf|*l"lmb/(jյ.G^GG_ᰥ+m*2-9ْ)I/mZnb£Kl鵤k +endstream +endobj +129 0 obj +4379 +endobj +128 0 obj +<< /Length 130 0 R /Filter /FlateDecode >> +stream +xk`a`X*0[~} +endstream +endobj +130 0 obj +20 +endobj +131 0 obj +<< + /Type /Font + /Subtype /Type0 + /BaseFont /EAAAAD+mwa_cmr10 + /Encoding /Identity-H + /ToUnicode 132 0 R + /DescendantFonts [133 0 R] +>> +endobj +133 0 obj +<< /Type /Font +/BaseFont /EAAAAD+mwa_cmr10 +/CIDToGIDMap /Identity +/Subtype /CIDFontType2 +/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> +/FontDescriptor 126 0 R +/DW 0 +/W [ 0 [365 500 500 500 500 651 391 443 526 555 555 443 526 276 750 443 276 916 500 500 276 388 555 ] ] +>> +endobj +132 0 obj +<< /Length 134 0 R /Filter /FlateDecode >> +stream +x]j0y +C;()P KPB~ *iiZ=WDU$hG0;E[gvI*t@V;8Q_vTzA)D-I = +M4v_L"=2U7ٓ8ξ^M޻_%2'4V*rhw_5?{ܚVH[.L8P +ALe +*[r@ ()(O th@ӏJɔPjr!wI2P A8/A~eB~Ee ڪw6ƈA Zu9W#n6v?l +endstream +endobj +134 0 obj +334 +endobj +98 0 obj +<< /Type /Pages +/Count 1 +/Kids [96 0 R ] >> +endobj +135 0 obj +<< + /Type /Catalog + /Pages 98 0 R + /Lang (x-unknown) +>> +endobj +97 0 obj +<< + /Font << + /F677 104 0 R + /F674 113 0 R + /F675 122 0 R + /F676 131 0 R +>> + /ProcSet [/PDF /ImageB /ImageC /Text] + /ExtGState << + /GS1 2 0 R + /GS2 3 0 R + /GS3 4 0 R + /GS4 5 0 R + /GS5 6 0 R + /GS6 7 0 R + /GS7 8 0 R + /GS8 9 0 R + /GS9 10 0 R + /GS10 11 0 R + /GS11 12 0 R + /GS12 13 0 R + /GS13 14 0 R + /GS14 15 0 R + /GS15 16 0 R + /GS16 17 0 R + /GS17 18 0 R + /GS18 19 0 R + /GS19 20 0 R + /GS20 21 0 R + /GS21 22 0 R + /GS22 23 0 R + /GS23 24 0 R + /GS24 25 0 R + /GS25 26 0 R + /GS26 27 0 R + /GS27 28 0 R + /GS28 29 0 R + /GS29 30 0 R + /GS30 31 0 R + /GS31 32 0 R + /GS32 33 0 R + /GS33 34 0 R + /GS34 35 0 R + /GS35 36 0 R + /GS36 37 0 R + /GS37 38 0 R + /GS38 39 0 R + /GS39 40 0 R + /GS40 41 0 R + /GS41 42 0 R + /GS42 43 0 R + /GS43 44 0 R + /GS44 45 0 R + /GS45 46 0 R + /GS46 47 0 R + /GS47 48 0 R + /GS48 49 0 R + /GS49 50 0 R + /GS50 51 0 R + /GS51 52 0 R + /GS52 53 0 R + /GS53 54 0 R + /GS54 55 0 R + /GS55 56 0 R + /GS56 57 0 R + /GS57 58 0 R + /GS58 59 0 R + /GS59 60 0 R + /GS60 61 0 R + /GS61 62 0 R + /GS62 63 0 R + /GS63 64 0 R + /GS64 65 0 R + /GS65 66 0 R + /GS66 67 0 R + /GS67 68 0 R + /GS68 69 0 R + /GS69 70 0 R + /GS70 71 0 R + /GS71 72 0 R + /GS72 73 0 R + /GS73 74 0 R + /GS74 75 0 R + /GS75 76 0 R + /GS76 77 0 R + /GS77 78 0 R + /GS78 79 0 R + /GS79 80 0 R + /GS80 81 0 R + /GS81 82 0 R + /GS82 83 0 R + /GS83 84 0 R + /GS84 85 0 R + /GS85 86 0 R + /GS86 87 0 R + /GS87 88 0 R + /GS88 89 0 R + /GS89 90 0 R + /GS90 91 0 R + /GS91 92 0 R +>> +>> +endobj +xref +0 136 +0000000000 65535 f +0000000015 00000 n +0000000145 00000 n +0000000197 00000 n +0000000249 00000 n +0000000301 00000 n +0000000353 00000 n +0000000405 00000 n +0000000457 00000 n +0000000509 00000 n +0000000561 00000 n +0000000614 00000 n +0000000667 00000 n +0000000720 00000 n +0000000773 00000 n +0000000826 00000 n +0000000879 00000 n +0000000932 00000 n +0000000985 00000 n +0000001038 00000 n +0000001091 00000 n +0000001144 00000 n +0000001197 00000 n +0000001250 00000 n +0000001303 00000 n +0000001356 00000 n +0000001409 00000 n +0000001462 00000 n +0000001515 00000 n +0000001568 00000 n +0000001621 00000 n +0000001674 00000 n +0000001727 00000 n +0000001780 00000 n +0000001833 00000 n +0000001886 00000 n +0000001939 00000 n +0000001992 00000 n +0000002045 00000 n +0000002098 00000 n +0000002151 00000 n +0000002204 00000 n +0000002257 00000 n +0000002311 00000 n +0000002365 00000 n +0000002419 00000 n +0000002473 00000 n +0000002527 00000 n +0000002581 00000 n +0000002634 00000 n +0000002687 00000 n +0000002740 00000 n +0000002793 00000 n +0000002846 00000 n +0000002899 00000 n +0000002952 00000 n +0000003005 00000 n +0000003058 00000 n +0000003111 00000 n +0000003164 00000 n +0000003217 00000 n +0000003270 00000 n +0000003323 00000 n +0000003376 00000 n +0000003429 00000 n +0000003482 00000 n +0000003535 00000 n +0000003588 00000 n +0000003641 00000 n +0000003694 00000 n +0000003747 00000 n +0000003800 00000 n +0000003853 00000 n +0000003906 00000 n +0000003959 00000 n +0000004012 00000 n +0000004065 00000 n +0000004118 00000 n +0000004171 00000 n +0000004224 00000 n +0000004277 00000 n +0000004330 00000 n +0000004383 00000 n +0000004436 00000 n +0000004489 00000 n +0000004542 00000 n +0000004595 00000 n +0000004648 00000 n +0000004701 00000 n +0000004754 00000 n +0000004807 00000 n +0000004860 00000 n +0000004914 00000 n +0000004968 00000 n +0000039148 00000 n +0000039170 00000 n +0000039195 00000 n +0000053206 00000 n +0000053070 00000 n +0000039389 00000 n +0000039644 00000 n +0000041113 00000 n +0000041091 00000 n +0000041203 00000 n +0000041223 00000 n +0000041613 00000 n +0000041383 00000 n +0000041926 00000 n +0000041947 00000 n +0000042203 00000 n +0000043930 00000 n +0000043908 00000 n +0000044020 00000 n +0000044040 00000 n +0000044431 00000 n +0000044200 00000 n +0000044745 00000 n +0000044766 00000 n +0000045018 00000 n +0000046462 00000 n +0000046440 00000 n +0000046549 00000 n +0000046568 00000 n +0000046959 00000 n +0000046728 00000 n +0000047271 00000 n +0000047292 00000 n +0000047547 00000 n +0000052046 00000 n +0000052024 00000 n +0000052144 00000 n +0000052164 00000 n +0000052637 00000 n +0000052323 00000 n +0000053049 00000 n +0000053130 00000 n +trailer +<< + /Root 135 0 R + /Info 1 0 R + /ID [<089B729C59F6CA2B68E9050E13AAEED0> <089B729C59F6CA2B68E9050E13AAEED0>] + /Size 136 +>> +startxref +54713 +%%EOF diff --git a/matlab/figs/three_weighting_functions.png b/matlab/figs/three_weighting_functions.png new file mode 100644 index 0000000..c55635f Binary files /dev/null and b/matlab/figs/three_weighting_functions.png differ diff --git a/matlab/figs/weight_formula.pdf b/matlab/figs/weight_formula.pdf new file mode 100644 index 0000000..a1a26d6 Binary files /dev/null and b/matlab/figs/weight_formula.pdf differ diff --git a/matlab/figs/weight_formula.png b/matlab/figs/weight_formula.png new file mode 100644 index 0000000..49524cb Binary files /dev/null and b/matlab/figs/weight_formula.png differ diff --git a/matlab/figs/weights_W1_W2.pdf b/matlab/figs/weights_W1_W2.pdf new file mode 100644 index 0000000..9ea3638 Binary files /dev/null and b/matlab/figs/weights_W1_W2.pdf differ diff --git a/matlab/figs/weights_W1_W2.png b/matlab/figs/weights_W1_W2.png new file mode 100644 index 0000000..508bee5 Binary files /dev/null and b/matlab/figs/weights_W1_W2.png differ diff --git a/matlab/index.html b/matlab/index.html deleted file mode 100644 index bef5dca..0000000 --- a/matlab/index.html +++ /dev/null @@ -1,1603 +0,0 @@ - - - - - - -Complementary Filters Shaping Using $\mathcal{H}_\infty$ Synthesis - Matlab Computation - - - - - - - - -

-

Complementary Filters Shaping Using \(\mathcal{H}_\infty\) Synthesis - Matlab Computation

- - -

-In this document, the design of complementary filters is studied. -

- -

-One use of complementary filter is described below: -

-
-

-The basic idea of a complementary filter involves taking two or more sensors, filtering out unreliable frequencies for each sensor, and combining the filtered outputs to get a better estimate throughout the entire bandwidth of the system. -To achieve this, the sensors included in the filter should complement one another by performing better over specific parts of the system bandwidth. -

-
- -

-This document is divided into several sections: -

-
    -
  • in section 1, the \(\mathcal{H}_\infty\) synthesis is used for generating two complementary filters
  • -
  • in section 2, a method using the \(\mathcal{H}_\infty\) synthesis is proposed to shape three of more complementary filters
  • -
  • in section 3, the \(\mathcal{H}_\infty\) synthesis is used and compared with FIR complementary filters used for LIGO
  • -
- -
-

-Add the Matlab code use to obtain the results presented in the paper are accessible here and presented below. -

- -
- -
-

1 H-Infinity synthesis of complementary filters

-
-
-

-The Matlab file corresponding to this section is accessible here. -

- -
-
- -
-

1.1 Synthesis Architecture

-
-

-We here synthesize two complementary filters using the \(\mathcal{H}_\infty\) synthesis. -The goal is to specify upper bounds on the norms of the two complementary filters \(H_1(s)\) and \(H_2(s)\) while ensuring their complementary property (\(H_1(s) + H_2(s) = 1\)). -

- -

-In order to do so, we use the generalized plant shown on figure 1 where \(W_1(s)\) and \(W_2(s)\) are weighting transfer functions that will be used to shape \(H_1(s)\) and \(H_2(s)\) respectively. -

- - -
-

h_infinity_robust_fusion.png -

-

Figure 1: \(\mathcal{H}_\infty\) synthesis of the complementary filters

-
- -

-The \(\mathcal{H}_\infty\) synthesis applied on this generalized plant will give a transfer function \(H_2\) (figure 1) such that the \(\mathcal{H}_\infty\) norm of the transfer function from \(w\) to \([z_1,\ z_2]\) is less than one: -\[ \left\| \begin{array}{c} (1 - H_2(s)) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \] -

- -

-Thus, if the above condition is verified, we can define \(H_1(s) = 1 - H_2(s)\) and we have that: -\[ \left\| \begin{array}{c} H_1(s) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \] -Which is almost (with an maximum error of \(\sqrt{2}\)) equivalent to: -

-\begin{align*} - |H_1(j\omega)| &< \frac{1}{|W_1(j\omega)|}, \quad \forall \omega \\ - |H_2(j\omega)| &< \frac{1}{|W_2(j\omega)|}, \quad \forall \omega -\end{align*} - -

-We then see that \(W_1(s)\) and \(W_2(s)\) can be used to shape both \(H_1(s)\) and \(H_2(s)\) while ensuring their complementary property by the definition of \(H_1(s) = 1 - H_2(s)\). -

-
-
- -
-

1.2 Design of Weighting Function

-
-

-A formula is proposed to help the design of the weighting functions: -

-\begin{equation} - W(s) = \left( \frac{ - \frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{G_0}{G_c}\right)^{\frac{1}{n}} - }{ - \left(\frac{1}{G_\infty}\right)^{\frac{1}{n}} \frac{1}{\omega_0} \sqrt{\frac{1 - \left(\frac{G_0}{G_c}\right)^{\frac{2}{n}}}{1 - \left(\frac{G_c}{G_\infty}\right)^{\frac{2}{n}}}} s + \left(\frac{1}{G_c}\right)^{\frac{1}{n}} - }\right)^n -\end{equation} - -

-The parameters permits to specify: -

-
    -
  • the low frequency gain: \(G_0 = lim_{\omega \to 0} |W(j\omega)|\)
  • -
  • the high frequency gain: \(G_\infty = lim_{\omega \to \infty} |W(j\omega)|\)
  • -
  • the absolute gain at \(\omega_0\): \(G_c = |W(j\omega_0)|\)
  • -
  • the absolute slope between high and low frequency: \(n\)
  • -
- -

-The general shape of a weighting function generated using the formula is shown in figure 2. -

- - -
-

weight_formula.png -

-

Figure 2: Gain of the Weighting Function formula

-
- -
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- - -
-

weights_W1_W2.png -

-

Figure 3: Weights on the complementary filters \(W_1\) and \(W_2\) and the associated performance weights

-
-
-
- -
-

1.3 H-Infinity Synthesis

-
-

-We define the generalized plant \(P\) on matlab. -

-
-
P = [W1 -W1;
-     0   W2;
-     1   0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. -

-
-
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-Resetting value of Gamma min based on D_11, D_12, D_21 terms
-
-Test bounds:      0.1000 <  gamma  <=   1050.0000
-
-  gamma    hamx_eig  xinf_eig  hamy_eig   yinf_eig   nrho_xy   p/f
-1.050e+03   2.8e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-  525.050   2.8e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-  262.575   2.8e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-  131.337   2.8e+01   2.4e-07   4.1e+00   -1.0e-13    0.0000    p
-   65.719   2.8e+01   2.4e-07   4.1e+00   -9.5e-14    0.0000    p
-   32.909   2.8e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-   16.505   2.8e+01   2.4e-07   4.1e+00   -1.0e-13    0.0000    p
-    8.302   2.8e+01   2.4e-07   4.1e+00   -7.2e-14    0.0000    p
-    4.201   2.8e+01   2.4e-07   4.1e+00   -2.5e-25    0.0000    p
-    2.151   2.7e+01   2.4e-07   4.1e+00   -3.8e-14    0.0000    p
-    1.125   2.6e+01   2.4e-07   4.1e+00   -5.4e-24    0.0000    p
-    0.613   2.3e+01 -3.7e+01#  4.1e+00    0.0e+00    0.0000    f
-    0.869   2.6e+01 -3.7e+02#  4.1e+00    0.0e+00    0.0000    f
-    0.997   2.6e+01 -1.1e+04#  4.1e+00    0.0e+00    0.0000    f
-    1.061   2.6e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-    1.029   2.6e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-    1.013   2.6e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-    1.005   2.6e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-    1.001   2.6e+01 -3.1e+04#  4.1e+00   -3.8e-14    0.0000    f
-    1.003   2.6e+01 -2.8e+05#  4.1e+00    0.0e+00    0.0000    f
-    1.004   2.6e+01   2.4e-07   4.1e+00   -5.8e-24    0.0000    p
-    1.004   2.6e+01   2.4e-07   4.1e+00    0.0e+00    0.0000    p
-
- Gamma value achieved:     1.0036
-
- -

-We then define the high pass filter \(H_1 = 1 - H_2\). The bode plot of both \(H_1\) and \(H_2\) is shown on figure 4. -

- -
-
H1 = 1 - H2;
-
-
-
-
- -
-

1.4 Obtained Complementary Filters

-
-

-The obtained complementary filters are shown on figure 4. -

- - -
-

hinf_filters_results.png -

-

Figure 4: Obtained complementary filters using \(\mathcal{H}_\infty\) synthesis

-
-
-
-
- -
-

2 Generating 3 complementary filters

-
-

- -

-
-

-The Matlab file corresponding to this section is accessible here. -

- -
-
- -
-

2.1 Theory

-
-

-We want: -

-\begin{align*} - & |H_1(j\omega)| < 1/|W_1(j\omega)|, \quad \forall\omega\\ - & |H_2(j\omega)| < 1/|W_2(j\omega)|, \quad \forall\omega\\ - & |H_3(j\omega)| < 1/|W_3(j\omega)|, \quad \forall\omega\\ - & H_1(s) + H_2(s) + H_3(s) = 1 -\end{align*} - -

-For that, we use the \(\mathcal{H}_\infty\) synthesis with the architecture shown on figure 5. -

- - -
-

comp_filter_three_hinf.png -

-

Figure 5: Generalized architecture for generating 3 complementary filters

-
- -

-The \(\mathcal{H}_\infty\) objective is: -

-\begin{align*} - & |(1 - H_2(j\omega) - H_3(j\omega)) W_1(j\omega)| < 1, \quad \forall\omega\\ - & |H_2(j\omega) W_2(j\omega)| < 1, \quad \forall\omega\\ - & |H_3(j\omega) W_3(j\omega)| < 1, \quad \forall\omega\\ -\end{align*} - -

-And thus if we choose \(H_1 = 1 - H_2 - H_3\) we have solved the problem. -

-
-
- -
-

2.2 Weights

-
-

-First we define the weights. -

-
-
n = 2; w0 = 2*pi*1; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-W2 = 0.22*(1 + s/2/pi/1)^2/(sqrt(1e-4) + s/2/pi/1)^2*(1 + s/2/pi/10)^2/(1 + s/2/pi/1000)^2;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W3 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- - -
-

three_weighting_functions.png -

-

Figure 6: Three weighting functions used for the \(\mathcal{H}_\infty\) synthesis of the complementary filters

-
-
-
- -
-

2.3 H-Infinity Synthesis

-
-

-Then we create the generalized plant P. -

-
-
P = [W1 -W1 -W1;
-     0   W2  0 ;
-     0   0   W3;
-     1   0   0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis. -

-
-
[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H, ~, gamma, ~] = hinfsyn(P, 1, 2,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-Resetting value of Gamma min based on D_11, D_12, D_21 terms
-
-Test bounds:      0.1000 <  gamma  <=   1050.0000
-
-  gamma    hamx_eig  xinf_eig  hamy_eig   yinf_eig   nrho_xy   p/f
-1.050e+03   3.2e+00   4.5e-13   6.3e-02   -1.2e-11    0.0000    p
-  525.050   3.2e+00   1.3e-13   6.3e-02    0.0e+00    0.0000    p
-  262.575   3.2e+00   2.1e-12   6.3e-02   -1.5e-13    0.0000    p
-  131.337   3.2e+00   1.1e-12   6.3e-02   -7.2e-29    0.0000    p
-   65.719   3.2e+00   2.0e-12   6.3e-02    0.0e+00    0.0000    p
-   32.909   3.2e+00   7.4e-13   6.3e-02   -5.9e-13    0.0000    p
-   16.505   3.2e+00   1.4e-12   6.3e-02    0.0e+00    0.0000    p
-    8.302   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
-    4.201   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
-    2.151   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
-    1.125   3.2e+00   2.8e-12   6.3e-02    0.0e+00    0.0000    p
-    0.613   3.0e+00 -2.5e+03#  6.3e-02    0.0e+00    0.0000    f
-    0.869   3.1e+00 -2.9e+01#  6.3e-02    0.0e+00    0.0000    f
-    0.997   3.2e+00   1.9e-12   6.3e-02    0.0e+00    0.0000    p
-    0.933   3.1e+00 -6.9e+02#  6.3e-02    0.0e+00    0.0000    f
-    0.965   3.1e+00 -3.0e+03#  6.3e-02    0.0e+00    0.0000    f
-    0.981   3.1e+00 -8.6e+03#  6.3e-02    0.0e+00    0.0000    f
-    0.989   3.2e+00 -2.7e+04#  6.3e-02    0.0e+00    0.0000    f
-    0.993   3.2e+00 -5.7e+05#  6.3e-02    0.0e+00    0.0000    f
-    0.995   3.2e+00   2.2e-12   6.3e-02    0.0e+00    0.0000    p
-    0.994   3.2e+00   1.6e-12   6.3e-02    0.0e+00    0.0000    p
-    0.994   3.2e+00   1.0e-12   6.3e-02    0.0e+00    0.0000    p
-
- Gamma value achieved:     0.9936
-
-
-
- -
-

2.4 Obtained Complementary Filters

-
-

-The obtained filters are: -

-
-
H2 = tf(H(1));
-H3 = tf(H(2));
-H1 = 1 - H2 - H3;
-
-
- - -
-

three_complementary_filters_results.png -

-

Figure 7: The three complementary filters obtained after \(\mathcal{H}_\infty\) synthesis

-
-
-
-
- -
-

3 Implement complementary filters for LIGO

-
-

- -

-
-

-The Matlab file corresponding to this section is accessible here. -

- -
- -

-Let’s try to design complementary filters that are corresponding to the complementary filters design for the LIGO and described in (Hua 2005). -

- -

-The FIR complementary filters designed in (Hua 2005) are of order 512. -

-
- -
-

3.1 Specifications

-
-

-The specifications for the filters are: -

-
    -
  1. From \(0\) to \(0.008\text{ Hz}\),the magnitude of the filter’s transfer function should be less than or equal to \(8 \times 10^{-3}\)
  2. -
  3. From \(0.008\text{ Hz}\) to \(0.04\text{ Hz}\), it attenuates the input signal proportional to frequency cubed
  4. -
  5. Between \(0.04\text{ Hz}\) and \(0.1\text{ Hz}\), the magnitude of the transfer function should be less than 3
  6. -
  7. Above \(0.1\text{ Hz}\), the maximum of the magnitude of the complement filter should be as close to zero as possible. In our system, we would like to have the magnitude of the complementary filter to be less than \(0.1\). As the filters obtained in (Hua 2005) have a magnitude of \(0.045\), we will set that as our requirement
  8. -
- -

-The specifications are translated in upper bounds of the complementary filters are shown on figure 8. -

- - -
-

ligo_specifications.png -

-

Figure 8: Specification for the LIGO complementary filters

-
-
-
- -
-

3.2 FIR Filter

-
-

-We here try to implement the FIR complementary filter synthesis as explained in (Hua 2005). -For that, we use the CVX matlab Toolbox. -

- -

-We setup the CVX toolbox and use the SeDuMi solver. -

-
-
cvx_startup;
-cvx_solver sedumi;
-
-
- -

-We define the frequency vectors on which we will constrain the norm of the FIR filter. -

-
-
w1 = 0:4.06e-4:0.008;
-w2 = 0.008:4.06e-4:0.04;
-w3 = 0.04:8.12e-4:0.1;
-w4 = 0.1:8.12e-4:0.83;
-
-
- -

-We then define the order of the FIR filter. -

-
-
n = 512;
-
-
- -
-
A1 = [ones(length(w1),1),  cos(kron(w1'.*(2*pi),[1:n-1]))];
-A2 = [ones(length(w2),1),  cos(kron(w2'.*(2*pi),[1:n-1]))];
-A3 = [ones(length(w3),1),  cos(kron(w3'.*(2*pi),[1:n-1]))];
-A4 = [ones(length(w4),1),  cos(kron(w4'.*(2*pi),[1:n-1]))];
-
-B1 = [zeros(length(w1),1), sin(kron(w1'.*(2*pi),[1:n-1]))];
-B2 = [zeros(length(w2),1), sin(kron(w2'.*(2*pi),[1:n-1]))];
-B3 = [zeros(length(w3),1), sin(kron(w3'.*(2*pi),[1:n-1]))];
-B4 = [zeros(length(w4),1), sin(kron(w4'.*(2*pi),[1:n-1]))];
-
-
- -

-We run the convex optimization. -

-
-
cvx_begin
-
-variable y(n+1,1)
-
-% t
-maximize(-y(1))
-
-for i = 1:length(w1)
-    norm([0 A1(i,:); 0 B1(i,:)]*y) <= 8e-3;
-end
-
-for  i = 1:length(w2)
-    norm([0 A2(i,:); 0 B2(i,:)]*y) <= 8e-3*(2*pi*w2(i)/(0.008*2*pi))^3;
-end
-
-for i = 1:length(w3)
-    norm([0 A3(i,:); 0 B3(i,:)]*y) <= 3;
-end
-
-for i = 1:length(w4)
-    norm([[1 0]'- [0 A4(i,:); 0 B4(i,:)]*y]) <= y(1);
-end
-
-cvx_end
-
-h = y(2:end);
-
-
- -
-cvx_begin
-variable y(n+1,1)
-% t
-maximize(-y(1))
-for i = 1:length(w1)
-    norm([0 A1(i,:); 0 B1(i,:)]*y) <= 8e-3;
-end
-for  i = 1:length(w2)
-    norm([0 A2(i,:); 0 B2(i,:)]*y) <= 8e-3*(2*pi*w2(i)/(0.008*2*pi))^3;
-end
-for i = 1:length(w3)
-    norm([0 A3(i,:); 0 B3(i,:)]*y) <= 3;
-end
-for i = 1:length(w4)
-    norm([[1 0]'- [0 A4(i,:); 0 B4(i,:)]*y]) <= y(1);
-end
-cvx_end
-
-Calling SeDuMi 1.34: 4291 variables, 1586 equality constraints
-   For improved efficiency, SeDuMi is solving the dual problem.
-------------------------------------------------------------
-SeDuMi 1.34 (beta) by AdvOL, 2005-2008 and Jos F. Sturm, 1998-2003.
-Alg = 2: xz-corrector, Adaptive Step-Differentiation, theta = 0.250, beta = 0.500
-eqs m = 1586, order n = 3220, dim = 4292, blocks = 1073
-nnz(A) = 1100727 + 0, nnz(ADA) = 1364794, nnz(L) = 683190
- it :     b*y       gap    delta  rate   t/tP*  t/tD*   feas cg cg  prec
-  0 :            4.11E+02 0.000
-  1 :  -2.58E+00 1.25E+02 0.000 0.3049 0.9000 0.9000   4.87  1  1  3.0E+02
-  2 :  -2.36E+00 3.90E+01 0.000 0.3118 0.9000 0.9000   1.83  1  1  6.6E+01
-  3 :  -1.69E+00 1.31E+01 0.000 0.3354 0.9000 0.9000   1.76  1  1  1.5E+01
-  4 :  -8.60E-01 7.10E+00 0.000 0.5424 0.9000 0.9000   2.48  1  1  4.8E+00
-  5 :  -4.91E-01 5.44E+00 0.000 0.7661 0.9000 0.9000   3.12  1  1  2.5E+00
-  6 :  -2.96E-01 3.88E+00 0.000 0.7140 0.9000 0.9000   2.62  1  1  1.4E+00
-  7 :  -1.98E-01 2.82E+00 0.000 0.7271 0.9000 0.9000   2.14  1  1  8.5E-01
-  8 :  -1.39E-01 2.00E+00 0.000 0.7092 0.9000 0.9000   1.78  1  1  5.4E-01
-  9 :  -9.99E-02 1.30E+00 0.000 0.6494 0.9000 0.9000   1.51  1  1  3.3E-01
- 10 :  -7.57E-02 8.03E-01 0.000 0.6175 0.9000 0.9000   1.31  1  1  2.0E-01
- 11 :  -5.99E-02 4.22E-01 0.000 0.5257 0.9000 0.9000   1.17  1  1  1.0E-01
- 12 :  -5.28E-02 2.45E-01 0.000 0.5808 0.9000 0.9000   1.08  1  1  5.9E-02
- 13 :  -4.82E-02 1.28E-01 0.000 0.5218 0.9000 0.9000   1.05  1  1  3.1E-02
- 14 :  -4.56E-02 5.65E-02 0.000 0.4417 0.9045 0.9000   1.02  1  1  1.4E-02
- 15 :  -4.43E-02 2.41E-02 0.000 0.4265 0.9004 0.9000   1.01  1  1  6.0E-03
- 16 :  -4.37E-02 8.90E-03 0.000 0.3690 0.9070 0.9000   1.00  1  1  2.3E-03
- 17 :  -4.35E-02 3.24E-03 0.000 0.3641 0.9164 0.9000   1.00  1  1  9.5E-04
- 18 :  -4.34E-02 1.55E-03 0.000 0.4788 0.9086 0.9000   1.00  1  1  4.7E-04
- 19 :  -4.34E-02 8.77E-04 0.000 0.5653 0.9169 0.9000   1.00  1  1  2.8E-04
- 20 :  -4.34E-02 5.05E-04 0.000 0.5754 0.9034 0.9000   1.00  1  1  1.6E-04
- 21 :  -4.34E-02 2.94E-04 0.000 0.5829 0.9136 0.9000   1.00  1  1  9.9E-05
- 22 :  -4.34E-02 1.63E-04 0.015 0.5548 0.9000 0.0000   1.00  1  1  6.6E-05
- 23 :  -4.33E-02 9.42E-05 0.000 0.5774 0.9053 0.9000   1.00  1  1  3.9E-05
- 24 :  -4.33E-02 6.27E-05 0.000 0.6658 0.9148 0.9000   1.00  1  1  2.6E-05
- 25 :  -4.33E-02 3.75E-05 0.000 0.5972 0.9187 0.9000   1.00  1  1  1.6E-05
- 26 :  -4.33E-02 1.89E-05 0.000 0.5041 0.9117 0.9000   1.00  1  1  8.6E-06
- 27 :  -4.33E-02 9.72E-06 0.000 0.5149 0.9050 0.9000   1.00  1  1  4.5E-06
- 28 :  -4.33E-02 2.94E-06 0.000 0.3021 0.9194 0.9000   1.00  1  1  1.5E-06
- 29 :  -4.33E-02 9.73E-07 0.000 0.3312 0.9189 0.9000   1.00  2  2  5.3E-07
- 30 :  -4.33E-02 2.82E-07 0.000 0.2895 0.9063 0.9000   1.00  2  2  1.6E-07
- 31 :  -4.33E-02 8.05E-08 0.000 0.2859 0.9049 0.9000   1.00  2  2  4.7E-08
- 32 :  -4.33E-02 1.43E-08 0.000 0.1772 0.9059 0.9000   1.00  2  2  8.8E-09
-
-iter seconds digits       c*x               b*y
- 32     49.4   6.8 -4.3334083581e-02 -4.3334090214e-02
-|Ax-b| =   3.7e-09, [Ay-c]_+ =   1.1E-10, |x|=  1.0e+00, |y|=  2.6e+00
-
-Detailed timing (sec)
-   Pre          IPM          Post
-3.902E+00    4.576E+01    1.035E-02
-Max-norms: ||b||=1, ||c|| = 3,
-Cholesky |add|=0, |skip| = 0, ||L.L|| = 4.26267.
-------------------------------------------------------------
-Status: Solved
-Optimal value (cvx_optval): -0.0433341
-h = y(2:end);
-
- -

-Finally, we compute the filter response over the frequency vector defined and the result is shown on figure 9 which is very close to the filters obtain in (Hua 2005). -

- -
-
w = [w1 w2 w3 w4];
-H = [exp(-j*kron(w'.*2*pi,[0:n-1]))]*h;
-
-
- - -
-

fir_filter_ligo.png -

-

Figure 9: FIR Complementary filters obtain after convex optimization

-
-
-
- -
-

3.3 Weights

-
-

-We design weights that will be used for the \(\mathcal{H}_\infty\) synthesis of the complementary filters. -These weights will determine the order of the obtained filters. -Here are the requirements on the filters: -

-
    -
  • reasonable order
  • -
  • to be as close as possible to the specified upper bounds
  • -
  • stable minimum phase
  • -
- -

-The bode plot of the weights is shown on figure 10. -

- - -
-

ligo_weights.png -

-

Figure 10: Weights for the \(\mathcal{H}_\infty\) synthesis

-
-
-
- -
-

3.4 H-Infinity Synthesis

-
-

-We define the generalized plant as shown on figure 1. -

-
-
P = [0   wL;
-     wH -wH;
-     1   0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. -

-
-
[Hl, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[Hl, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-Resetting value of Gamma min based on D_11, D_12, D_21 terms
-
-Test bounds:      0.3276 <  gamma  <=      1.8063
-
-  gamma    hamx_eig  xinf_eig  hamy_eig   yinf_eig   nrho_xy   p/f
-    1.806   1.4e-02 -1.7e-16   3.6e-03   -4.8e-12    0.0000    p
-    1.067   1.3e-02 -4.2e-14   3.6e-03   -1.9e-12    0.0000    p
-    0.697   1.3e-02 -3.0e-01#  3.6e-03   -3.5e-11    0.0000    f
-    0.882   1.3e-02 -9.5e-01#  3.6e-03   -1.2e-34    0.0000    f
-    0.975   1.3e-02 -2.7e+00#  3.6e-03   -1.6e-12    0.0000    f
-    1.021   1.3e-02 -8.7e+00#  3.6e-03   -4.5e-16    0.0000    f
-    1.044   1.3e-02 -6.5e-14   3.6e-03   -3.0e-15    0.0000    p
-    1.032   1.3e-02 -1.8e+01#  3.6e-03    0.0e+00    0.0000    f
-    1.038   1.3e-02 -3.8e+01#  3.6e-03    0.0e+00    0.0000    f
-    1.041   1.3e-02 -8.3e+01#  3.6e-03   -2.9e-33    0.0000    f
-    1.042   1.3e-02 -1.9e+02#  3.6e-03   -3.4e-11    0.0000    f
-    1.043   1.3e-02 -5.3e+02#  3.6e-03   -7.5e-13    0.0000    f
-
- Gamma value achieved:     1.0439
-
- -

-The high pass filter is defined as \(H_H = 1 - H_L\). -

-
-
Hh = 1 - Hl;
-
-
- -

-The size of the filters is shown below. -

- -
-size(Hh), size(Hl)
-State-space model with 1 outputs, 1 inputs, and 27 states.
-State-space model with 1 outputs, 1 inputs, and 27 states.
-
- -

-The bode plot of the obtained filters as shown on figure 11. -

- - -
-

hinf_synthesis_ligo_results.png -

-

Figure 11: Obtained complementary filters using the \(\mathcal{H}_\infty\) synthesis

-
-
-
- -
-

3.5 Compare FIR and H-Infinity Filters

-
-

-Let’s now compare the FIR filters designed in (Hua 2005) and the one obtained with the \(\mathcal{H}_\infty\) synthesis on figure 12. -

- - -
-

comp_fir_ligo_hinf.png -

-

Figure 12: Comparison between the FIR filters developped for LIGO and the \(\mathcal{H}_\infty\) complementary filters

-
-
-
-
- -
-

4 Alternative Synthesis

-
-
-
-

4.1 Two generalized plants

-
-

-In order to synthesize the complementary filter using the proposed method, we can use two alternative generalized plant as shown in Figures 13 and 14. -

- -\begin{equation} - P_1 = \begin{bmatrix} W_1 & -W_1 \\ 0 & W_2 \\ 1 & 0 \end{bmatrix} -\end{equation} - - - -
-

h_infinity_arch_1.png -

-

Figure 13: Complementary Filter Synthesis - Conf 1

-
- -\begin{equation} - P_2 = \begin{bmatrix} 0 & W_1 & 1 \\ W_2 & -W_1 & 0 \end{bmatrix} -\end{equation} - - -
-

h_infinity_arch_2.png -

-

Figure 14: Complementary Filter Synthesis - Conf 2

-
- -

-Let’s run the \(\mathcal{H}_\infty\) synthesis for both generalized plant using the same weights and see if the obtained filters are the same: -

-
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -
-
P1 = [W1 -W1;
-      0   W2;
-      1   0];
-
-
- -
-
[H2, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H2, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-  Test bounds:  0.3263 <=  gamma  <=  1000
-
-    gamma        X>=0        Y>=0       rho(XY)<1    p/f
-  1.807e+01     1.4e-07     0.0e+00     1.185e-18     p
-  2.428e+00     1.5e-07     0.0e+00     1.285e-18     p
-  8.902e-01    -2.9e+02 #  -7.1e-17     5.168e-19     f
-  1.470e+00     1.5e-07     0.0e+00     1.462e-14     p
-  1.144e+00     1.5e-07     0.0e+00     1.260e-14     p
-  1.009e+00     1.5e-07     0.0e+00     4.120e-13     p
-  9.478e-01    -6.8e+02 #  -2.4e-17     1.449e-14     f
-  9.780e-01    -1.6e+03 #  -7.3e-17     6.791e-14     f
-  9.934e-01    -4.2e+03 #  -1.2e-16     3.524e-14     f
-  1.001e+00    -2.0e+04 #  -2.3e-17     5.717e-20     f
-  1.005e+00     1.5e-07     0.0e+00     8.953e-18     p
-  1.003e+00    -2.2e+05 #  -1.8e-17     3.225e-12     f
-  1.004e+00     1.5e-07     0.0e+00     2.445e-12     p
-  Limiting gains...
-  1.004e+00     1.6e-07     0.0e+00     5.811e-18     p
-
-  Best performance (actual): 1.004
-
- -
-
P2 = [0   W1 1;
-      W2 -W1 0];
-
-
- -
-
[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-  Test bounds:  0.3263 <=  gamma  <=  1000
-
-    gamma        X>=0        Y>=0       rho(XY)<1    p/f
-  1.807e+01     0.0e+00     1.4e-07     2.055e-16     p
-  2.428e+00     0.0e+00     1.4e-07     1.894e-18     p
-  8.902e-01    -2.1e-16    -2.7e+02 #   1.466e-16     f
-  1.470e+00     0.0e+00     1.4e-07     4.118e-16     p
-  1.144e+00     0.0e+00     1.5e-07     2.105e-18     p
-  1.009e+00     0.0e+00     1.5e-07     2.590e-13     p
-  9.478e-01    -9.5e-17    -6.3e+02 #   1.663e-19     f
-  9.780e-01    -1.1e-16    -1.5e+03 #   1.546e-14     f
-  9.934e-01    -2.8e-17    -4.0e+03 #   3.934e-14     f
-  1.001e+00    -3.1e-17    -1.9e+04 #   1.191e-19     f
-  1.005e+00     0.0e+00     1.5e-07     1.443e-12     p
-  1.003e+00    -8.3e-17    -2.1e+05 #   8.807e-13     f
-  1.004e+00     0.0e+00     1.5e-07     1.459e-15     p
-  Limiting gains...
-  1.004e+00     0.0e+00     1.5e-07     9.086e-19     p
-
-  Best performance (actual): 1.004
-
- -

-And indeed, we can see that the exact same filters are obtained (Figure 15). -

- -
-

hinf_comp_P1_P2_syn.png -

-

Figure 15: Comparison of \(H_2(s)\) when using \(P_1(s)\) or \(P_2(s)\)

-
-
-
- -
-

4.2 Shaping the Low pass filter or the high pass filter?

-
-

-Let’s see if there is a difference by explicitly shaping \(H_1(s)\) or \(H_2(s)\). -

- -
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -

-Let’s first synthesize \(H_1(s)\): -

-
-
P1 = [W2 -W2;
-      0   W1;
-      1   0];
-
-
- -
-
[H1, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H1, ~, gamma, ~] = hinfsyn(P1, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-  Test bounds:  0.3263 <=  gamma  <=  1.712
-
-    gamma        X>=0        Y>=0       rho(XY)<1    p/f
-  7.476e-01    -2.5e+01 #  -8.3e-18     4.938e-20     f
-  1.131e+00     1.9e-07     0.0e+00     1.566e-16     p
-  9.197e-01    -1.4e+02 #  -7.9e-17     4.241e-17     f
-  1.020e+00     1.9e-07     0.0e+00     2.095e-16     p
-  9.686e-01    -3.8e+02 #  -7.0e-17     1.463e-23     f
-  9.940e-01    -1.5e+03 #  -1.3e-17     3.168e-19     f
-  1.007e+00     1.9e-07     0.0e+00     1.696e-15     p
-  1.000e+00    -4.8e+03 #  -7.1e-18     7.203e-20     f
-  1.004e+00     1.9e-07     0.0e+00     1.491e-14     p
-  1.002e+00    -1.1e+04 #  -2.6e-16     2.579e-14     f
-  1.003e+00    -2.8e+04 #  -6.0e-18     8.558e-20     f
-  Limiting gains...
-  1.004e+00     2.0e-07     0.0e+00     5.647e-18     p
-  1.004e+00     1.0e-06     0.0e+00     5.648e-18     p
-
-  Best performance (actual): 1.004
-
- -

-And now \(H_2(s)\): -

-
-
P2 = [W1 -W1;
-      0   W2;
-      1   0];
-
-
- -
-
[H2, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-
- -
-[H2b, ~, gamma, ~] = hinfsyn(P2, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on');
-
-  Test bounds:  0.3263 <=  gamma  <=  1000
-
-    gamma        X>=0        Y>=0       rho(XY)<1    p/f
-  1.807e+01     1.4e-07     0.0e+00     1.185e-18     p
-  2.428e+00     1.5e-07     0.0e+00     1.285e-18     p
-  8.902e-01    -2.9e+02 #  -7.1e-17     5.168e-19     f
-  1.470e+00     1.5e-07     0.0e+00     1.462e-14     p
-  1.144e+00     1.5e-07     0.0e+00     1.260e-14     p
-  1.009e+00     1.5e-07     0.0e+00     4.120e-13     p
-  9.478e-01    -6.8e+02 #  -2.4e-17     1.449e-14     f
-  9.780e-01    -1.6e+03 #  -7.3e-17     6.791e-14     f
-  9.934e-01    -4.2e+03 #  -1.2e-16     3.524e-14     f
-  1.001e+00    -2.0e+04 #  -2.3e-17     5.717e-20     f
-  1.005e+00     1.5e-07     0.0e+00     8.953e-18     p
-  1.003e+00    -2.2e+05 #  -1.8e-17     3.225e-12     f
-  1.004e+00     1.5e-07     0.0e+00     2.445e-12     p
-  Limiting gains...
-  1.004e+00     1.6e-07     0.0e+00     5.811e-18     p
-
-  Best performance (actual): 1.004
-
- -

-And compare \(H_1(s)\) with \(1 - H_2(s)\) and \(H_2(s)\) with \(1 - H_1(s)\) in Figure 16. -

- -
-

hinf_comp_H1_H2_syn.png -

-

Figure 16: Comparison of \(H_1(s)\) with \(1-H_2(s)\), and \(H_2(s)\) with \(1-H_1(s)\)

-
-
-
- -
-

4.3 Using Feedback architecture

-
-
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -

-Let’s first synthesize \(H_1(s)\): -

-
-
P = [W1 -W1;
-     0   W2;
-     1  -1];
-
-
- -
-
[K, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
-
-
- -
-
H1 = inv(1 + K);
-H2 = 1 - H1;
-
-
-
-
- -
-

4.4 Adding feature in the filters

-
-
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -
-
Wf = (1 + s/2/pi/1)/s;
-Wf = s/(1 + s/2/pi/1e2);
-
-% W2 = W2/Wf/(1 + s/2/pi/1e3);
-
-
- -
-
P = [W1 -Wf*W1;
-     0   Wf*W2;
-     1  -Wf];
-
-
- -
-
[Ka, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
-
-
- -
-
K = Ka*Wf;
-
-
- -
-
H1 = inv(1 + K);
-H2 = 1 - H1;
-
-
-
-
-
- -
-

5 Impose a positive slope at DC or a negative slope at infinite frequency

-
-
-
-

5.1 Manually shift zeros to the origin after synthesis

-
-

-Suppose we want \(H_2(s)\) to be an high pass filter with a slope of +2 at low frequency (from 0Hz). -

- -

-We cannot impose that using the weight \(W_2(s)\) as it would be improper. -

- -

-However, we may manually shift 2 of the low frequency zeros to the origin. -

- -
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1e4; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -
-
P = [W1 -W1;
-     0   W2;
-     1   0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command: -

-
-
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
-
-
- -
-
[z,p,k] = zpkdata(H2)
-
-
- -

-Looking at the zeros, we see two low frequency complex conjugate zeros. -

-
-z{1}
-ans =
-          -4690930.24283199 +                     0i
-          -163.420524657426 +                     0i
-         -0.853192261081498 +     0.713416012479897i
-         -0.853192261081498 -     0.713416012479897i
-          -3.15812268762265 +                     0i
-
- -

-We manually put these zeros at the origin: -

-
-
z{1}([3,4]) = 0;
-
-
- -

-And we create a modified filter \(H_{2z}(s)\): -

-
-
H2z = zpk(z,p,k);
-
-
- -

-And as usual, \(H_{1z}(s)\) is defined as the complementary of \(H_{2z}(s)\): -

-
-
H1z = 1 - H2z;
-
-
- -

-The bode plots of \(H_1(s)\), \(H_2(s)\), \(H_{1z}(s)\) and \(H_{2z}(s)\) are shown in Figure 17. -And we see that \(H_{1z}(s)\) is slightly modified when setting the zeros at the origin for \(H_{2z}(s)\). -

- - -
-

comp_filters_shift_zero.png -

-

Figure 17: Bode plots of \(H_1(s)\), \(H_2(s)\), \(H_{1z}(s)\) and \(H_{2z}(s)\)

-
-
-
- -
-

5.2 Imposing a positive slope at DC during the synthesis phase

-
-

-Suppose we want to synthesize \(H_2(s)\) such that it has a slope of +2 from DC. -We can include this “feature” in the generalized plant as shown in Figure 18. -

- - -
-

h_infinity_arch_H2_feature.png -

-

Figure 18: Generalized plant with included wanted feature represented by \(H_{2w}(s)\)

-
- -

-After synthesis, the obtained filter will be: -

-\begin{equation} - H_2(s) = H_2^\prime(s) H_{2w}(s) -\end{equation} -

-and therefore the “feature” will be included in the filter. -

- -

-For \(H_1(s)\) nothing is changed: \(H_1(s) = 1 - H_2(s)\). -

- -

-The weighting functions are defined as usual: -

-
-
n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 3; w0 = 2*pi*10; G0 = 1e4; G1 = 0.1; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -

-The wanted feature here is a +2 slope at low frequency. -For that, we use an high pass filter with a slope of +2 at low frequency. -

-
-
w0 = 2*pi*50;
-H2w = (s/w0/(s/w0+1))^2;
-
-
- -

-We define the generalized plant as shown in Figure 18. -

-
-
P = [W1 -W1;
-     0   W2;
-     H2w 0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. -

-
-
[H2p, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
-
-
- -

-Finally, we define \(H_2(s)\) as the product of the synthesized filter and the wanted “feature”: -

-
-
H2 = H2p*H2w;
-
-
- -

-And we define \(H_1(s)\) to be the complementary of \(H_2(s)\): -

-
-
H1 = 1 - H2;
-
-
- -

-The obtained complementary filters are shown in Figure 19. -

- - -
-

comp_filters_H2_feature.png -

-

Figure 19: Obtained complementary fitlers

-
-
-
- -
-

5.3 Imposing a negative slope at infinity frequency during the synthesis phase

-
-

-Let’s suppose we now want to shape a low pass filter that as a negative slope until infinite frequency. -

- -

-The used technique is the same as in the previous section, and the generalized plant is shown in Figure 18. -

- -

-The weights are defined as usual. -

-
-
n = 3; w0 = 2*pi*10; G0 = 1000; G1 = 0.1; Gc = 1/2;
-W1 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-n = 2; w0 = 2*pi*11; G0 = 1/10; G1 = 1000; Gc = 1/2;
-W2 = (((1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (G0/Gc)^(1/n))/((1/G1)^(1/n)*(1/w0)*sqrt((1-(G0/Gc)^(2/n))/(1-(Gc/G1)^(2/n)))*s + (1/Gc)^(1/n)))^n;
-
-
- -

-This time, the feature is a low pass filter with a slope of -2 at high frequency. -

-
-
H2w = 1/(s/(2*pi*10) + 1)^2;
-
-
- -

-The generalized plant is defined: -

-
-
P = [W1 -W1;
-     0   W2;
-     H2w 0];
-
-
- -

-And we do the \(\mathcal{H}_\infty\) synthesis using the hinfsyn command. -

-
-
[H2p, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'lmi', 'DISPLAY', 'on');
-
-
- -

-The feature is added to the synthesized filter: -

-
-
H2 = H2p*H2w;
-
-
- -

-And \(H_1(s)\) is defined as follows: -

-
-
H1 = 1 - H2;
-
-
- -

-The obtained complementary filters are shown in Figure 20. -

- - -
-

comp_filters_H2_feature_neg_slope.png -

-

Figure 20: Obtained complementary fitlers

-
-
-
-
- - -

- -

- -

Bibliography

-
-
Hua, Wensheng. 2005. “Low Frequency Vibration Isolation and Alignment System for Advanced LIGO.” stanford university.
-
- - -
-

6 Functions

-
-
-
-

6.1 generateWF: Generate Weighting Functions

-
-

- -

- -

-This Matlab function is accessible here. -

-
- -
-

Function description

-
-
-
function [W] = generateWF(args)
-% createWeight -
-%
-% Syntax: [W] = generateWeight(args)
-%
-% Inputs:
-%    - n  - Weight Order (integer)
-%    - G0 - Low frequency Gain
-%    - G1 - High frequency Gain
-%    - Gc - Gain of the weight at frequency w0
-%    - w0 - Frequency at which |W(j w0)| = Gc [rad/s]
-%
-% Outputs:
-%    - W - Generated Weight
-
-
-
-
- -
-

Optional Parameters

-
-
-
arguments
-    args.n    (1,1) double {mustBeInteger, mustBePositive} = 1
-    args.G0   (1,1) double {mustBeNumeric, mustBePositive} = 0.1
-    args.Ginf (1,1) double {mustBeNumeric, mustBePositive} = 10
-    args.Gc   (1,1) double {mustBeNumeric, mustBePositive} = 1
-    args.w0   (1,1) double {mustBeNumeric, mustBePositive} = 1
-end
-
-mustBeBetween(args.G0, args.Gc, args.Ginf);
-
-
-
-
- -
-

Generate the Weighting function

-
-
-
s = zpk('s');
-
-
- -
-
W = (((1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.Ginf)^(2/args.n)))*s + ...
-      (args.G0/args.Gc)^(1/args.n))/...
-     ((1/args.Ginf)^(1/args.n)*(1/args.w0)*sqrt((1-(args.G0/args.Gc)^(2/args.n))/(1-(args.Gc/args.Ginf)^(2/args.n)))*s + ...
-      (1/args.Gc)^(1/args.n)))^args.n;
-
-
-
-
- - -
-

Verification of the \(G_0\), \(G_c\) and \(G_\infty\) gains

-
-
-
% Custom validation function
-function mustBeBetween(a,b,c)
-    if ~((a > b && b > c) || (c > b && b > a))
-        eid = 'createWeight:inputError';
-        msg = 'Gc should be between G0 and Ginf.';
-        throwAsCaller(MException(eid,msg))
-    end
-
-
-
-
-
- -
-

6.2 generateCF: Generate Complementary Filters

-
-

- -

- -

-This Matlab function is accessible here. -

-
- -
-

Function description

-
-
-
function [H1, H2] = generateCF(W1, W2, args)
-% createWeight -
-%
-% Syntax: [W] = generateCF(args)
-%
-% Inputs:
-%    - W1 - Weighting Function for H1
-%    - W2 - Weighting Function for H2
-%    - args:
-%      - method  - H-Infinity solver ('lmi' or 'ric')
-%      - display - Display synthesis results ('on' or 'off')
-%
-% Outputs:
-%    - H1 - Generated H1 Filter
-%    - H2 - Generated H2 Filter
-
-
-
-
- -
-

Optional Parameters

-
-
-
arguments
-    W1
-    W2
-    args.method  char {mustBeMember(args.method,{'lmi', 'ric'})} = 'ric'
-    args.display char {mustBeMember(args.display,{'on', 'off'})} = 'on'
-end
-
-
-
-
- -
-

H-Infinity Synthesis

-
-
-
P = [W1 -W1;
-     0   W2;
-     1   0];
-
-
- -
-
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', args.method, 'DISPLAY', args.display);
-
-
- -
-
H1 = 1 - H2;
-
-
-
-
-
-
-
-
-

Author: Thomas Dehaeze

-

Created: 2021-04-29 jeu. 17:25

-
- -