Compare commits
No commits in common. "b1517f1c35404d4f5b26462cb2fb9157d2b964fc" and "c073d945d1d37df773efbccad00001870dc5e201" have entirely different histories.
b1517f1c35
...
c073d945d1
@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Dehaeze Thomas
|
||||
Copyright (c) 2020 Dehaeze Thomas
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
@ -1,98 +0,0 @@
|
||||
#!/bin/env perl
|
||||
|
||||
# Shebang is only to get syntax highlighting right across GitLab, GitHub and IDEs.
|
||||
# This file is not meant to be run, but read by `latexmk`.
|
||||
|
||||
# ======================================================================================
|
||||
# Perl `latexmk` configuration file
|
||||
# ======================================================================================
|
||||
|
||||
# ======================================================================================
|
||||
# PDF Generation/Building/Compilation
|
||||
# ======================================================================================
|
||||
|
||||
@default_files=('dehaeze21_desig_compl_filte_matlab.tex');
|
||||
|
||||
# PDF-generating modes are:
|
||||
# 1: pdflatex, as specified by $pdflatex variable (still largely in use)
|
||||
# 2: postscript conversion, as specified by the $ps2pdf variable (useless)
|
||||
# 3: dvi conversion, as specified by the $dvipdf variable (useless)
|
||||
# 4: lualatex, as specified by the $lualatex variable (best)
|
||||
# 5: xelatex, as specified by the $xelatex variable (second best)
|
||||
$pdf_mode = 1;
|
||||
|
||||
# Treat undefined references and citations as well as multiply defined references as
|
||||
# ERRORS instead of WARNINGS.
|
||||
# This is only checked in the *last* run, since naturally, there are undefined references
|
||||
# in initial runs.
|
||||
# This setting is potentially annoying when debugging/editing, but highly desirable
|
||||
# in the CI pipeline, where such a warning should result in a failed pipeline, since the
|
||||
# final document is incomplete/corrupted.
|
||||
#
|
||||
# However, I could not eradicate all warnings, so that `latexmk` currently fails with
|
||||
# this option enabled.
|
||||
# Specifically, `microtype` fails together with `fontawesome`/`fontawesome5`, see:
|
||||
# https://tex.stackexchange.com/a/547514/120853
|
||||
# The fix in that answer did not help.
|
||||
# Setting `verbose=silent` to mute `microtype` warnings did not work.
|
||||
# Switching between `fontawesome` and `fontawesome5` did not help.
|
||||
$warnings_as_errors = 0;
|
||||
|
||||
# Show used CPU time. Looks like: https://tex.stackexchange.com/a/312224/120853
|
||||
$show_time = 1;
|
||||
|
||||
# Default is 5; we seem to need more owed to the complexity of the document.
|
||||
# Actual documents probably don't need this many since they won't use all features,
|
||||
# plus won't be compiling from cold each time.
|
||||
$max_repeat=7;
|
||||
|
||||
# --shell-escape option (execution of code outside of latex) is required for the
|
||||
#'svg' package.
|
||||
# It converts raw SVG files to the PDF+PDF_TEX combo using InkScape.
|
||||
#
|
||||
# SyncTeX allows to jump between source (code) and output (PDF) in IDEs with support
|
||||
# (many have it). A value of `1` is enabled (gzipped), `-1` is enabled but uncompressed,
|
||||
# `0` is off.
|
||||
# Testing in VSCode w/ LaTeX Workshop only worked for the compressed version.
|
||||
# Adjust this as needed. Of course, only relevant for local use, no effect on a remote
|
||||
# CI pipeline (except for slower compilation, probably).
|
||||
#
|
||||
# %O and %S will forward Options and the Source file, respectively, given to latexmk.
|
||||
#
|
||||
# `set_tex_cmds` applies to all *latex commands (latex, xelatex, lualatex, ...), so
|
||||
# no need to specify these each. This allows to simply change `$pdf_mode` to get a
|
||||
# different engine. Check if this works with `latexmk --commands`.
|
||||
set_tex_cmds("--shell-escape -interaction=nonstopmode --synctex=1 %O %S");
|
||||
|
||||
# Use default pdf viewer
|
||||
$pdf_previewer = 'zathura';
|
||||
|
||||
# option 2 is same as 1 (run biber when necessary), but also deletes the
|
||||
# regeneratable bbl-file in a clenaup (`latexmk -c`). Do not use if original
|
||||
# bib file is not available!
|
||||
$bibtex_use = 2; # default: 1
|
||||
|
||||
# Change default `biber` call, help catch errors faster/clearer. See
|
||||
# https://web.archive.org/web/20200526101657/https://www.semipol.de/2018/06/12/latex-best-practices.html#database-entries
|
||||
$biber = "biber --validate-datamodel %O %S";
|
||||
|
||||
# ======================================================================================
|
||||
# Auxiliary Files
|
||||
# ======================================================================================
|
||||
|
||||
# Let latexmk know about generated files, so they can be used to detect if a
|
||||
# rerun is required, or be deleted in a cleanup.
|
||||
# loe: List of Examples (KOMAScript)
|
||||
# lol: List of Listings (`listings` and `minted` packages)
|
||||
# run.xml: biber runs
|
||||
# glg: glossaries log
|
||||
# glstex: generated from glossaries-extra
|
||||
push @generated_exts, 'loe', 'lol', 'run.xml', 'glg', 'glstex';
|
||||
|
||||
# Also delete the *.glstex files from package glossaries-extra. Problem is,
|
||||
# that that package generates files of the form "basename-digit.glstex" if
|
||||
# multiple glossaries are present. Latexmk looks for "basename.glstex" and so
|
||||
# does not find those. For that purpose, use wildcard.
|
||||
# Also delete files generated by gnuplot/pgfplots contour plots
|
||||
# (.dat, .script, .table).
|
||||
$clean_ext = "%R-*.glstex %R_contourtmp*.*";
|
File diff suppressed because it is too large
Load Diff
@ -1,22 +1,13 @@
|
||||
#+TITLE: A new method of designing complementary filters for sensor fusion using the $\mathcal{H}_\infty$ synthesis - Matlab Computation
|
||||
:DRAWER:
|
||||
#+LANGUAGE: en
|
||||
#+EMAIL: dehaeze.thomas@gmail.com
|
||||
#+AUTHOR: Dehaeze Thomas
|
||||
|
||||
#+HTML_LINK_HOME: ../index.html
|
||||
#+HTML_LINK_UP: ../index.html
|
||||
|
||||
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
|
||||
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
|
||||
|
||||
#+BIND: org-latex-image-default-option "scale=1"
|
||||
#+BIND: org-latex-image-default-width ""
|
||||
|
||||
#+LATEX_CLASS: scrreprt
|
||||
#+LATEX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full]
|
||||
#+LATEX_HEADER_EXTRA: \input{preamble.tex}
|
||||
#+LATEX_HEADER_EXTRA: \addbibresource{ref.bib}
|
||||
#+LaTeX_CLASS: scrreprt
|
||||
#+LaTeX_HEADER_EXTRA: \input{/home/thomas/Cloud/org-theme/preamble.tex}
|
||||
|
||||
#+PROPERTY: header-args:matlab :session *MATLAB*
|
||||
#+PROPERTY: header-args:matlab+ :comments none
|
||||
@ -28,27 +19,15 @@
|
||||
#+PROPERTY: header-args:matlab+ :output-dir figs
|
||||
:END:
|
||||
|
||||
#+begin_export html
|
||||
<hr>
|
||||
<p>This report is also available as a <a href="./dehaeze21_desig_compl_filte_matlab.pdf">pdf</a>.</p>
|
||||
<hr>
|
||||
#+end_export
|
||||
|
||||
#+begin_export latex
|
||||
\clearpage
|
||||
#+end_export
|
||||
|
||||
* Introduction :ignore:
|
||||
|
||||
The present document is a companion file for the journal paper cite:dehaeze21_new_method_desig_compl_filter.
|
||||
All the Matlab cite:matlab20 scripts used in the paper are here shared and explained.
|
||||
This file is the Matlab file for the paper cite:dehaeze21_new_method_desig_compl_filter.
|
||||
|
||||
This document is divided into the following sections also corresponding to the paper sections:
|
||||
- Section [[#sec:h_inf_synthesis_complementary_filters]]: the shaping of complementary filters is written as an $\mathcal{H}_\infty$ optimization problem using weighting functions. The weighting function design is discussed and the method is applied for the design of a set of simple complementary filters.
|
||||
- Section [[#sec:comp_filters_ligo]]: the effectiveness of the proposed complementary filter synthesis strategy is demonstrated by designing complex complementary filters used in the first isolation stage at the LIGO
|
||||
- Section [[#sec:closed_loop_complementary_filters]]: complementary filters are designed using the classical feedback loop
|
||||
- Section [[#sec:three_comp_filters]]: the proposed design method is generalized for the design of a set of three complementary filters
|
||||
- Section [[#sec:matlab_scripts]]: complete Matlab scripts and functions developed are listed
|
||||
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:closed_loop_complementary_filters]]
|
||||
|
||||
* H-Infinity synthesis of complementary filters
|
||||
:PROPERTIES:
|
||||
@ -56,46 +35,10 @@ This document is divided into the following sections also corresponding to the p
|
||||
:CUSTOM_ID: sec:h_inf_synthesis_complementary_filters
|
||||
:END:
|
||||
|
||||
** Synthesis Architecture
|
||||
In order to generate two complementary filters with a wanted shape, the generalized plant of Figure [[fig:h_infinity_robust_fusion_plant]] can be used.
|
||||
The included weights $W_1(s)$ and $W_2(s)$ are used to specify the upper bounds of the complementary filters being generated.
|
||||
|
||||
#+name: fig:h_infinity_robust_fusion_plant
|
||||
#+caption: Generalized plant used for the $\mathcal{H}_\infty$ synthesis of a set of two complementary fiters
|
||||
[[file:figs-journal/h_infinity_robust_fusion_plant.png]]
|
||||
|
||||
Applied the standard $\mathcal{H}_\infty$ synthesis on this generalized plant will give a transfer function $H_2(s)$ (see Figure [[fig:h_infinity_robust_fusion_fb]]) such that the $\mathcal{H}_\infty$ norm of the transfer function from $w$ to $[z_1,\ z_2]$ is less than one eqref:eq:h_inf_objective.
|
||||
|
||||
#+name: fig:h_infinity_robust_fusion_fb
|
||||
#+caption: Generalized plant with the synthesized filter obtained after the $\mathcal{H}_\infty$ synthesis
|
||||
[[file:figs-journal/h_infinity_robust_fusion_fb.png]]
|
||||
|
||||
\begin{equation}
|
||||
\left\| \begin{array}{c} (1 - H_2(s)) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1 \label{eq:h_inf_objective}
|
||||
\end{equation}
|
||||
|
||||
Thus, if the synthesis is successful and the above condition is verified, we can define $H_1(s)$ to be the complementary of $H_2(s)$ eqref:eq:H1_complementary_of_H2 and we have condition eqref:eq:shaping_comp_filters verified.
|
||||
|
||||
\begin{equation}
|
||||
H_1(s) = 1 - H_2(s) \label{eq:H1_complementary_of_H2}
|
||||
\end{equation}
|
||||
|
||||
\begin{equation}
|
||||
\left\| \begin{array}{c} H_1(s) W_1(s) \\ H_2(s) W_2(s) \end{array} \right\|_\infty < 1
|
||||
\quad \Longrightarrow \quad
|
||||
\left\{
|
||||
\begin{array}{c}
|
||||
|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{array}
|
||||
\right. \label{eq:shaping_comp_filters}
|
||||
\end{equation}
|
||||
|
||||
We then see that $W_1(s)$ and $W_2(s)$ can be used to set the wanted upper bounds of the magnitudes of both $H_1(s)$ and $H_2(s)$.
|
||||
|
||||
The presented synthesis method therefore allows to shape two filters $H_1(s)$ and $H_2(s)$ eqref:eq:shaping_comp_filters while ensuring their complementary property eqref:eq:H1_complementary_of_H2.
|
||||
|
||||
The complete Matlab script for this part is given in Section [[#sec:1_synthesis_complementary_filters]].
|
||||
** Introduction :ignore:
|
||||
#+begin_note
|
||||
The Matlab file corresponding to this section is accessible [[file:matlab/1_synthesis_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)
|
||||
@ -121,14 +64,37 @@ addpath('./matlab/src');
|
||||
addpath('./src');
|
||||
#+end_src
|
||||
|
||||
** Design of Weighting Function - Proposed formula
|
||||
** 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 [[fig:h_infinity_robst_fusion]] 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.
|
||||
|
||||
#+name: fig:h_infinity_robst_fusion
|
||||
#+caption: $\mathcal{H}_\infty$ synthesis of the complementary filters
|
||||
[[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 \]
|
||||
|
||||
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)$.
|
||||
|
||||
** 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 \label{eq:weighting_function_formula}
|
||||
}\right)^n
|
||||
\end{equation}
|
||||
|
||||
The parameters permits to specify:
|
||||
@ -186,16 +152,11 @@ exportFig('figs/weight_formula.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:weight_formula
|
||||
#+caption: Magnitude of the weighting function generated using formula eqref:eq:weighting_function_formula
|
||||
#+caption: Gain of the Weighting Function formula
|
||||
#+RESULTS:
|
||||
[[file:figs/weight_formula.png]]
|
||||
|
||||
** Weighting functions for the design of two complementary filters
|
||||
<<sec:weighting_functions_example>>
|
||||
|
||||
The weighting function formula eqref:eq:weighting_function_formula is used to generate the upper bounds of two complementary filters that we wish to design.
|
||||
|
||||
The matlab function =generateWF= is described in Section [[#sec:generateWF]].
|
||||
** Example
|
||||
|
||||
#+begin_src matlab
|
||||
%% Design of the Weighting Functions
|
||||
@ -203,8 +164,6 @@ 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
|
||||
|
||||
The inverse magnitude of these two weighting functions are shown in Figure [[fig:weights_W1_W2]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Plot of the Weighting function magnitude
|
||||
figure;
|
||||
@ -237,12 +196,12 @@ exportFig('figs/weights_W1_W2.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+end_src
|
||||
|
||||
#+name: fig:weights_W1_W2
|
||||
#+caption: Inverse magnitude of the design weighting functions
|
||||
#+caption: Weights on the complementary filters $W_1$ and $W_2$ and the associated performance weights
|
||||
#+RESULTS:
|
||||
[[file:figs/weights_W1_W2.png]]
|
||||
|
||||
** Synthesis of the complementary filters
|
||||
The generalized plant of Figure [[fig:h_infinity_robust_fusion_plant]] is defined as follows:
|
||||
** H-Infinity Synthesis
|
||||
We define the generalized plant $P$ on matlab.
|
||||
#+begin_src matlab
|
||||
%% Generalized Plant
|
||||
P = [W1 -W1;
|
||||
@ -250,7 +209,7 @@ P = [W1 -W1;
|
||||
1 0];
|
||||
#+end_src
|
||||
|
||||
And the $\mathcal{H}_\infty$ synthesis is performed using the =hinfsyn= command.
|
||||
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');
|
||||
@ -283,23 +242,20 @@ And the $\mathcal{H}_\infty$ synthesis is performed using the =hinfsyn= command.
|
||||
Best performance (actual): 0.9897
|
||||
#+end_example
|
||||
|
||||
As shown above, the obtained $\mathcal{H}_\infty$ norm of the transfer function from $w$ to $[z_1,\ z_2]$ is found to be less than one meaning the synthesis is successful.
|
||||
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]].
|
||||
|
||||
We then define the filter $H_1(s)$ to be the complementary of $H_2(s)$ eqref:eq:H1_complementary_of_H2.
|
||||
#+begin_src matlab
|
||||
%% Define H1 to be the complementary of H2
|
||||
H1 = 1 - H2;
|
||||
#+end_src
|
||||
|
||||
The function =generateCF= can also be used to synthesize the complementary filters.
|
||||
This function is described in Section [[#sec:generateCF]].
|
||||
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 below and are found to be of order 5.
|
||||
Their bode plots are shown in figure [[fig:hinf_filters_results]] and compare with the defined upper bounds.
|
||||
The obtained complementary filters are shown on figure [[fig:hinf_filters_results]].
|
||||
|
||||
#+begin_src matlab :results output replace :exports results :tangle no
|
||||
zpk(H1)
|
||||
@ -387,9 +343,13 @@ exportFig('figs/hinf_filters_results.pdf', 'width', 'wide', 'height', 'tall');
|
||||
:END:
|
||||
|
||||
** Introduction :ignore:
|
||||
In this section, the proposed method for the design of complementary filters is validated for the design of a set of two complex complementary filters used for the first isolation stage at the LIGO cite:hua04_low_ligo.
|
||||
#+begin_note
|
||||
The Matlab file corresponding to this section is accessible [[file:matlab/2_ligo_complementary_filters.m][here]].
|
||||
#+end_note
|
||||
|
||||
The complete Matlab script for this part is given in Section [[#sec:2_ligo_complementary_filters]].
|
||||
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.
|
||||
|
||||
The FIR complementary filters designed in cite:hua05_low_ligo are of order 512.
|
||||
|
||||
** Matlab Init :noexport:ignore:
|
||||
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
|
||||
@ -416,13 +376,13 @@ addpath('./src');
|
||||
#+end_src
|
||||
|
||||
** Specifications
|
||||
The specifications for the set of complementary filters ($L_1,H_1$) used at the LIGO are summarized below (for further details, refer to cite:hua04_polyp_fir_compl_filter_contr_system):
|
||||
- From 0 to 0.008 Hz, the magnitude $|L_1(j\omega)|$ should be less or equal to $8 \times 10^{-4}$
|
||||
- Between 0.008 Hz to 0.04 Hz, the filter $L_1(s)$ should attenuate the input signal proportional to frequency cubed
|
||||
- Between 0.04 Hz to 0.1 Hz, the magnitude $|L_1(j\omega)|$ should be less than $3$
|
||||
- Above 0.1 Hz, the magnitude $|H_1(j\omega)|$ should be less than $0.045$
|
||||
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. From $0.008\text{ Hz}$ to $0.04\text{ Hz}$, it attenuates the input signal proportional to frequency cubed
|
||||
3. Between $0.04\text{ Hz}$ and $0.1\text{ Hz}$, the magnitude of the transfer function should be less than 3
|
||||
4. 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 cite:hua05_low_ligo have a magnitude of $0.045$, we will set that as our requirement
|
||||
|
||||
The specifications are translated into upper bounds of the complementary filters and are shown in Figure [[fig:ligo_specifications]].
|
||||
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
|
||||
@ -455,9 +415,10 @@ exportFig('figs/ligo_specifications.pdf', 'width', 'wide', 'height', 'normal');
|
||||
[[file:figs/ligo_specifications.png]]
|
||||
|
||||
** FIR Filter
|
||||
To replicated the complementary filters developed in cite:hua04_low_ligo, the CVX Matlab toolbox cite:grant14_cvx is used.
|
||||
We here try to implement the FIR complementary filter synthesis as explained in cite:hua05_low_ligo.
|
||||
For that, we use the [[http://cvxr.com/cvx/][CVX matlab Toolbox]].
|
||||
|
||||
The CVX toolbox is initialized and the =SeDuMi= solver cite:sturm99_using_sedum is used.
|
||||
We setup the CVX toolbox and use the =SeDuMi= solver.
|
||||
#+begin_src matlab
|
||||
%% Initialized CVX
|
||||
cvx_startup;
|
||||
@ -473,7 +434,7 @@ w3 = 0.04:8.12e-4:0.1;
|
||||
w4 = 0.1:8.12e-4:0.83;
|
||||
#+end_src
|
||||
|
||||
The order $n$ of the FIR filter is defined.
|
||||
We then define the order of the FIR filter.
|
||||
#+begin_src matlab
|
||||
%% Filter order
|
||||
n = 512;
|
||||
@ -492,7 +453,7 @@ 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]))];
|
||||
#+end_src
|
||||
|
||||
And the convex optimization is run.
|
||||
We run the convex optimization.
|
||||
#+begin_src matlab :results output replace :wrap example
|
||||
%% Convex optimization
|
||||
cvx_begin
|
||||
@ -600,7 +561,7 @@ Optimal value (cvx_optval): -0.0433341
|
||||
h = y(2:end);
|
||||
#+end_example
|
||||
|
||||
Finally, the filter response is computed 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:hua04_low_ligo.
|
||||
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
|
||||
@ -660,18 +621,17 @@ exportFig('figs/fir_filter_ligo.pdf', 'width', 'wide', 'height', 'tall');
|
||||
#+RESULTS:
|
||||
[[file:figs/fir_filter_ligo.png]]
|
||||
|
||||
** Weighting function design
|
||||
The weightings function that will be used for the $\mathcal{H}_\infty$ synthesis of the complementary filters are now designed.
|
||||
|
||||
** 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 and minimum phase
|
||||
- stable minimum phase
|
||||
|
||||
The weighting function for the High Pass filter is defined as follows:
|
||||
#+begin_src matlab
|
||||
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;
|
||||
@ -691,8 +651,7 @@ wH = 1/wH;
|
||||
wH = minreal(ss(wH));
|
||||
#+end_src
|
||||
|
||||
And the weighting function for the Low pass filter is taken as a Chebyshev Type I filter.
|
||||
#+begin_src matlab
|
||||
#+begin_src matlab :exports none
|
||||
%% Design of the weight for the low pass filter
|
||||
n = 20; % Filter order
|
||||
Rp = 1; % Peak to peak passband ripple
|
||||
@ -706,8 +665,6 @@ wL = 1/wL;
|
||||
wL = minreal(ss(wL));
|
||||
#+end_src
|
||||
|
||||
The inverse magnitude of the weighting functions are shown in Figure [[fig:ligo_weights]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Magnitude of the designed Weights and initial specifications
|
||||
figure;
|
||||
@ -744,8 +701,8 @@ exportFig('figs/ligo_weights.pdf', 'width', 'wide', 'height', 'normal');
|
||||
#+RESULTS:
|
||||
[[file:figs/ligo_weights.png]]
|
||||
|
||||
** Synthesis of the complementary filters
|
||||
The generalized plant of figure [[fig:h_infinity_robust_fusion_plant]] is defined.
|
||||
** 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;
|
||||
@ -753,7 +710,7 @@ P = [0 wL;
|
||||
1 0];
|
||||
#+end_src
|
||||
|
||||
And the standard $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command is performed.
|
||||
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');
|
||||
@ -783,13 +740,7 @@ Test bounds: 0.3276 < gamma <= 1.8063
|
||||
Gamma value achieved: 1.0439
|
||||
#+end_example
|
||||
|
||||
The obtained $\mathcal{H}_\infty$ norm is found to be close than one meaning the synthesis is successful.
|
||||
|
||||
The high pass filter $H_H(s)$ is defined to be the complementary of the synthesized low pass filter $H_L(s)$:
|
||||
\begin{equation}
|
||||
H_H(s) = 1 - H_L(s)
|
||||
\end{equation}
|
||||
|
||||
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;
|
||||
@ -801,7 +752,7 @@ Hh = minreal(Hh);
|
||||
Hl = minreal(Hl);
|
||||
#+end_src
|
||||
|
||||
The size of the filters is shown to be equal to the sum of the weighting functions orders.
|
||||
The size of the filters is shown below.
|
||||
|
||||
#+begin_src matlab :exports results :results output replace :wrap example :tangle no
|
||||
size(Hh), size(Hl)
|
||||
@ -814,7 +765,7 @@ State-space model with 1 outputs, 1 inputs, and 27 states.
|
||||
State-space model with 1 outputs, 1 inputs, and 27 states.
|
||||
#+end_example
|
||||
|
||||
The magnitude of the obtained filters as well as the requirements are shown in Figure [[fig:hinf_synthesis_ligo_results]].
|
||||
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
|
||||
@ -848,11 +799,8 @@ exportFig('figs/hinf_synthesis_ligo_results.pdf', 'width', 'wide', 'height', 'no
|
||||
#+RESULTS:
|
||||
[[file:figs/hinf_synthesis_ligo_results.png]]
|
||||
|
||||
** Comparison of the FIR filters and synthesized filters
|
||||
|
||||
Let's now compare the FIR filters designed in cite:hua04_low_ligo with the with complementary filters obtained with the $\mathcal{H}_\infty$ synthesis.
|
||||
|
||||
This is done in Figure [[fig:comp_fir_ligo_hinf]], and both set of filters are found to be very close to each other.
|
||||
** Compare FIR and H-Infinity Filters
|
||||
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
|
||||
@ -924,14 +872,9 @@ exportFig('figs/comp_fir_ligo_hinf.pdf', 'width', 'wide', 'height', 'tall');
|
||||
:END:
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
In this section, the classical feedback architecture shown in Figure [[fig:feedback_sensor_fusion]] is used for the design of complementary filters.
|
||||
|
||||
#+name: fig:feedback_sensor_fusion
|
||||
#+caption: "Closed-Loop" complementary filters
|
||||
[[file:figs-journal/feedback_sensor_fusion.png]]
|
||||
|
||||
The complete Matlab script for this part is given in Section [[#sec:3_closed_loop_complementary_filters]].
|
||||
#+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)
|
||||
@ -957,62 +900,26 @@ addpath('./matlab/src');
|
||||
addpath('./src');
|
||||
#+end_src
|
||||
|
||||
** Weighting Function design
|
||||
Weighting functions using the =generateWF= Matlab function are designed to specify the upper bounds of the complementary filters to be designed.
|
||||
These weighting functions are the same as the ones used in Section [[sec:weighting_functions_example]].
|
||||
|
||||
** Using Feedback architecture
|
||||
#+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
|
||||
|
||||
** Generalized plant
|
||||
The generalized plant of Figure [[fig:feedback_synthesis_architecture_generalized_plant]] is defined below:
|
||||
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
|
||||
|
||||
#+name: fig:feedback_synthesis_architecture_generalized_plant
|
||||
#+caption: Generalized plant used for the $\mathcal{H}_\infty$ synthesis of "closed-loop" complementary filters
|
||||
[[file:figs-journal/feedback_synthesis_architecture_generalized_plant.png]]
|
||||
|
||||
** Synthesis of the closed-loop complementary filters
|
||||
And the standard $\mathcal{H}_\infty$ synthesis is performed.
|
||||
#+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
|
||||
|
||||
#+RESULTS:
|
||||
#+begin_example
|
||||
Test bounds: 0.3191 <= gamma <= 1.669
|
||||
|
||||
gamma X>=0 Y>=0 rho(XY)<1 p/f
|
||||
7.299e-01 -1.5e-19 -2.4e+01 # 1.555e-18 f
|
||||
1.104e+00 0.0e+00 1.6e-07 2.037e-19 p
|
||||
8.976e-01 -3.2e-16 -1.4e+02 # 5.561e-16 f
|
||||
9.954e-01 0.0e+00 1.6e-07 1.041e-15 p
|
||||
9.452e-01 -1.1e-15 -3.8e+02 # 4.267e-15 f
|
||||
9.700e-01 -6.5e-16 -1.6e+03 # 9.876e-15 f
|
||||
9.826e-01 0.0e+00 1.6e-07 8.775e-39 p
|
||||
9.763e-01 -5.0e-16 -6.2e+03 # 3.519e-14 f
|
||||
9.795e-01 0.0e+00 1.6e-07 6.971e-20 p
|
||||
9.779e-01 -1.9e-31 -2.2e+04 # 5.600e-18 f
|
||||
9.787e-01 0.0e+00 1.6e-07 5.546e-19 p
|
||||
Limiting gains...
|
||||
9.789e-01 0.0e+00 1.6e-07 1.084e-13 p
|
||||
9.789e-01 0.0e+00 9.7e-07 1.137e-13 p
|
||||
|
||||
Best performance (actual): 0.9789
|
||||
#+end_example
|
||||
|
||||
** Synthesized filters
|
||||
The obtained filter $L(s)$ can then be included in the feedback architecture shown in Figure [[fig:hinf_filters_results_mixed_sensitivity]].
|
||||
|
||||
The closed-loop transfer functions from $\hat{x}_1$ to $\hat{x}$ and from $\hat{x}_2$ to $\hat{x}$ corresponding respectively to the sensitivity and complementary sensitivity transfer functions are defined below:
|
||||
#+begin_src matlab
|
||||
%% Complementary filters
|
||||
H1 = inv(1 + L);
|
||||
@ -1037,8 +944,6 @@ zpk(H2) =
|
||||
(s+1.29e05) (s^2 + 102.1s + 2733) (s^2 + 69.45s + 3272)
|
||||
#+end_example
|
||||
|
||||
The bode plots of the synthesized complementary filters are compared with the upper bounds in Figure [[fig:hinf_filters_results_mixed_sensitivity]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Bode plot of the obtained Complementary filters with upper-bounds
|
||||
freqs = logspace(-1, 3, 1000);
|
||||
@ -1095,21 +1000,21 @@ exportFig('figs/hinf_filters_results_mixed_sensitivity.pdf', 'width', 'wide', 'h
|
||||
#+end_src
|
||||
|
||||
#+name: fig:hinf_filters_results_mixed_sensitivity
|
||||
#+caption: Bode plot of the obtained complementary filters
|
||||
#+caption:
|
||||
#+RESULTS:
|
||||
[[file:figs/hinf_filters_results_mixed_sensitivity.png]]
|
||||
|
||||
* 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:
|
||||
|
||||
** Introduction :ignore:
|
||||
|
||||
In this section, the proposed synthesis method of complementary filters is generalized for the synthesis of a set of three complementary filters.
|
||||
|
||||
The complete Matlab script for this part is given in Section [[#sec:4_three_complementary_filters]].
|
||||
#+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)
|
||||
@ -1133,35 +1038,32 @@ addpath('./matlab/src');
|
||||
addpath('./src');
|
||||
#+end_src
|
||||
|
||||
** Synthesis Architecture
|
||||
The synthesis objective is to shape three filters that are complementary.
|
||||
This corresponds to the conditions eqref:eq:obj_three_cf where $W_1(s)$, $W_2(s)$ and $W_3(s)$ are weighting functions used to specify the maximum wanted magnitude of the three complementary filters.
|
||||
|
||||
\begin{equation}
|
||||
\begin{aligned}
|
||||
& |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 \\
|
||||
& |H_3(j\omega)| < \frac{1}{|W_3(j\omega)|}, \quad \forall\omega \\
|
||||
** 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{aligned} \label{eq:obj_three_cf}
|
||||
\end{equation}
|
||||
\end{align*}
|
||||
|
||||
This synthesis can be done by performing the standard $\mathcal{H}_\infty$ synthesis with on the generalized plant in Figure [[fig:comp_filter_three_hinf]].
|
||||
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-journal/comp_filter_three_hinf_fb.png]]
|
||||
|
||||
After synthesis, filter $H_2(s)$ and $H_3(s)$ are obtained as shown in Figure [[fig:comp_filter_three_hinf]].
|
||||
The last filter $H_1(s)$ is defined as the complementary of the two others as in eqref:eq:H1_complementary_of_H2_H3.
|
||||
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*}
|
||||
|
||||
\begin{equation}
|
||||
H_1(s) = 1 - H_2(s) - H_3(s) \label{eq:H1_complementary_of_H2_H3}
|
||||
\end{equation}
|
||||
And thus if we choose $H_1 = 1 - H_2 - H_3$ we have solved the problem.
|
||||
|
||||
** Weights
|
||||
The three weighting functions are defined as shown below.
|
||||
|
||||
First we define the weights.
|
||||
#+begin_src matlab
|
||||
%% Design of the Weighting Functions
|
||||
W1 = generateWF('n', 2, 'w0', 2*pi*1, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.5);
|
||||
@ -1169,8 +1071,6 @@ 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/
|
||||
W3 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.5);
|
||||
#+end_src
|
||||
|
||||
Their inverse magnitudes are displayed in Figure [[fig:three_weighting_functions]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Inverse magnitude of the weighting functions
|
||||
figure;
|
||||
@ -1199,9 +1099,7 @@ exportFig('figs/three_weighting_functions.pdf', 'width', 'wide', 'height', 'norm
|
||||
[[file:figs/three_weighting_functions.png]]
|
||||
|
||||
** H-Infinity Synthesis
|
||||
|
||||
The generalized plant in Figure [[fig:comp_filter_three_hinf]] containing the weighting functions is defined below.
|
||||
|
||||
Then we create the generalized plant =P=.
|
||||
#+begin_src matlab
|
||||
%% Generalized plant for the synthesis of 3 complementary filters
|
||||
P = [W1 -W1 -W1;
|
||||
@ -1210,7 +1108,7 @@ P = [W1 -W1 -W1;
|
||||
1 0 0];
|
||||
#+end_src
|
||||
|
||||
And the standard $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command is performed.
|
||||
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');
|
||||
@ -1218,6 +1116,7 @@ And the standard $\mathcal{H}_\infty$ synthesis using the =hinfsyn= command is p
|
||||
|
||||
#+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
|
||||
@ -1249,21 +1148,15 @@ Test bounds: 0.1000 < gamma <= 1050.0000
|
||||
Gamma value achieved: 0.9936
|
||||
#+end_example
|
||||
|
||||
The two synthesized filters $H_2(s)$ and $H_3(s)$ are defined below:
|
||||
#+begin_src matlab :exports none
|
||||
%% Synthesized H2 and H3 filters
|
||||
** Obtained Complementary Filters
|
||||
The obtained filters are:
|
||||
#+begin_src matlab
|
||||
%%
|
||||
H2 = tf(H(1));
|
||||
H3 = tf(H(2));
|
||||
#+end_src
|
||||
|
||||
And the third filter $H_1(s)$ is defined using eqref:eq:H1_complementary_of_H2_H3.
|
||||
#+begin_src matlab
|
||||
%% H1 is defined as the complementary filter of H2 and H3
|
||||
H1 = 1 - H2 - H3;
|
||||
#+end_src
|
||||
|
||||
The bode plots of the three obtained complementary filters are shown in Figure [[fig:three_complementary_filters_results]].
|
||||
|
||||
#+begin_src matlab :exports none
|
||||
%% Bode plot of the obtained complementary filters
|
||||
figure;
|
||||
@ -1324,53 +1217,31 @@ exportFig('figs/three_complementary_filters_results.pdf', 'width', 'wide', 'heig
|
||||
#+RESULTS:
|
||||
[[file:figs/three_complementary_filters_results.png]]
|
||||
|
||||
* Matlab Scripts
|
||||
* Bibliography :ignore:
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:matlab_scripts
|
||||
:CUSTOM_ID: sec:bibliography
|
||||
:END:
|
||||
** =1_synthesis_complementary_filters.m=
|
||||
bibliographystyle:unsrt
|
||||
bibliography:ref.bib
|
||||
|
||||
* Functions
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:1_synthesis_complementary_filters
|
||||
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
||||
:CUSTOM_ID: sec:functions
|
||||
:END:
|
||||
This scripts corresponds to section 3 of cite:dehaeze21_new_method_desig_compl_filter.
|
||||
|
||||
#+INCLUDE: "matlab/1_synthesis_complementary_filters.m" src matlab -n
|
||||
|
||||
** =2_ligo_complementary_filters.m=
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:2_ligo_complementary_filters
|
||||
:END:
|
||||
|
||||
This scripts corresponds to section 4 of cite:dehaeze21_new_method_desig_compl_filter.
|
||||
|
||||
#+INCLUDE: "matlab/2_ligo_complementary_filters.m" src matlab -n
|
||||
|
||||
** =3_closed_loop_complementary_filters.m=
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:3_closed_loop_complementary_filters
|
||||
:END:
|
||||
|
||||
This scripts corresponds to section 5.1 of cite:dehaeze21_new_method_desig_compl_filter.
|
||||
|
||||
#+INCLUDE: "matlab/3_closed_loop_complementary_filters.m" src matlab -n
|
||||
|
||||
** =4_three_complementary_filters.m=
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:4_three_complementary_filters
|
||||
:END:
|
||||
|
||||
This scripts corresponds to section 5.2 of cite:dehaeze21_new_method_desig_compl_filter.
|
||||
|
||||
#+INCLUDE: "matlab/4_three_complementary_filters.m" src matlab -n
|
||||
|
||||
** =generateWF=: Generate Weighting Functions
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/src/generateWF.m
|
||||
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
||||
:CUSTOM_ID: sec:generateWF
|
||||
:END:
|
||||
<<sec:generateWF>>
|
||||
|
||||
This function is used to easily generate weighting functions from classical requirements.
|
||||
This Matlab function is accessible [[file:matlab/src/generateWF.m][here]].
|
||||
|
||||
*** Function description
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
|
||||
#+begin_src matlab
|
||||
function [W] = generateWF(args)
|
||||
@ -1387,7 +1258,13 @@ function [W] = generateWF(args)
|
||||
%
|
||||
% Outputs:
|
||||
% - W - Generated Weighting Function
|
||||
#+end_src
|
||||
|
||||
*** Optional Parameters
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
#+begin_src matlab
|
||||
%% Argument validation
|
||||
arguments
|
||||
args.n (1,1) double {mustBeInteger, mustBePositive} = 1
|
||||
@ -1396,19 +1273,54 @@ arguments
|
||||
args.Gc (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||||
args.w0 (1,1) double {mustBeNumeric, mustBePositive} = 1
|
||||
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.
|
||||
\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
|
||||
mustBeBetween(args.G0, args.Gc, args.Ginf);
|
||||
#+end_src
|
||||
|
||||
*** Generate the Weighting function
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
#+begin_src matlab
|
||||
%% Initialize the Laplace variable
|
||||
s = zpk('s');
|
||||
#+end_src
|
||||
|
||||
The weighting function formula use is:
|
||||
#+name: eq:weight_formula
|
||||
\begin{equation}
|
||||
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}
|
||||
|
||||
#+begin_src matlab
|
||||
%% 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;
|
||||
#+end_src
|
||||
|
||||
|
||||
*** Verification of the $G_0$, $G_c$ and $G_\infty$ gains
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
#+begin_src matlab
|
||||
%% Custom validation function
|
||||
function mustBeBetween(a,b,c)
|
||||
if ~((a > b && b > c) || (c > b && b > a))
|
||||
@ -1421,11 +1333,15 @@ function mustBeBetween(a,b,c)
|
||||
** =generateCF=: Generate Complementary Filters
|
||||
:PROPERTIES:
|
||||
:header-args:matlab+: :tangle matlab/src/generateCF.m
|
||||
:header-args:matlab+: :comments none :mkdirp yes :eval no
|
||||
:CUSTOM_ID: sec:generateCF
|
||||
:END:
|
||||
<<sec:generateCF>>
|
||||
|
||||
This function is used to easily synthesize a set of two complementary filters using the $\mathcal{H}_\infty$ synthesis.
|
||||
This Matlab function is accessible [[file:matlab/src/generateCF.m][here]].
|
||||
|
||||
*** Function description
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
|
||||
#+begin_src matlab
|
||||
function [H1, H2] = generateCF(W1, W2, args)
|
||||
@ -1443,7 +1359,13 @@ function [H1, H2] = generateCF(W1, W2, args)
|
||||
% Outputs:
|
||||
% - H1 - Generated H1 Filter
|
||||
% - H2 - Generated H2 Filter
|
||||
#+end_src
|
||||
|
||||
*** Optional Parameters
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
#+begin_src matlab
|
||||
%% Argument validation
|
||||
arguments
|
||||
W1
|
||||
@ -1451,17 +1373,25 @@ arguments
|
||||
args.method char {mustBeMember(args.method,{'lmi', 'ric'})} = 'ric'
|
||||
args.display char {mustBeMember(args.display,{'on', 'off'})} = 'on'
|
||||
end
|
||||
#+end_src
|
||||
|
||||
*** H-Infinity Synthesis
|
||||
:PROPERTIES:
|
||||
:UNNUMBERED: t
|
||||
:END:
|
||||
#+begin_src matlab
|
||||
%% The generalized plant is defined
|
||||
P = [W1 -W1;
|
||||
0 W2;
|
||||
1 0];
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab :results output replace :exports both
|
||||
%% The standard H-infinity synthesis is performed
|
||||
[H2, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', args.method, 'DISPLAY', args.display);
|
||||
#+end_src
|
||||
|
||||
#+begin_src matlab
|
||||
%% H1 is defined as the complementary of H2
|
||||
H1 = 1 - H2;
|
||||
#+end_src
|
||||
* Bibliography :ignore:
|
||||
#+latex: \printbibliography
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
matlab/index.pdf
Normal file
BIN
matlab/index.pdf
Normal file
Binary file not shown.
@ -1,114 +0,0 @@
|
||||
\usepackage{float}
|
||||
|
||||
\usepackage{caption,tabularx,booktabs}
|
||||
|
||||
\usepackage{biblatex}
|
||||
|
||||
\usepackage{fontawesome}
|
||||
|
||||
\usepackage{caption}
|
||||
\usepackage{subcaption}
|
||||
|
||||
\captionsetup[figure]{labelfont=bf}
|
||||
\captionsetup[subfigure]{labelfont=bf}
|
||||
\captionsetup[listing]{labelfont=bf}
|
||||
\captionsetup[table]{labelfont=bf}
|
||||
|
||||
\usepackage{xcolor}
|
||||
|
||||
\definecolor{my-blue}{HTML}{6b7adb}
|
||||
\definecolor{my-pale-blue}{HTML}{e6e9f9}
|
||||
\definecolor{my-red}{HTML}{db6b6b}
|
||||
\definecolor{my-pale-red}{HTML}{f9e6e6}
|
||||
\definecolor{my-green}{HTML}{6bdbb6}
|
||||
\definecolor{my-pale-green}{HTML}{e6f9f3}
|
||||
\definecolor{my-yellow}{HTML}{dbd26b}
|
||||
\definecolor{my-pale-yellow}{HTML}{f9f7e6}
|
||||
\definecolor{my-orange}{HTML}{dba76b}
|
||||
\definecolor{my-pale-orange}{HTML}{f9f0e6}
|
||||
\definecolor{my-grey}{HTML}{a3a3a3}
|
||||
\definecolor{my-pale-grey}{HTML}{f0f0f0}
|
||||
\definecolor{my-turq}{HTML}{6bc7db}
|
||||
\definecolor{my-pale-turq}{HTML}{e6f6f9}
|
||||
|
||||
\usepackage{inconsolata}
|
||||
|
||||
\usepackage[newfloat=true, chapter]{minted}
|
||||
\usemintedstyle{autumn}
|
||||
|
||||
\setminted{frame=lines,breaklines=true,tabsize=4,fontsize=\scriptsize,autogobble=true,labelposition=topline,bgcolor=my-pale-grey}
|
||||
\setminted[matlab]{label=Matlab}
|
||||
\setminted[latex]{label=LaTeX}
|
||||
\setminted[bash]{label=Bash}
|
||||
\setminted[python]{label=Python}
|
||||
\setminted[text]{label=Results}
|
||||
\setminted[md]{label=Org Mode}
|
||||
|
||||
\setmintedinline{fontsize=\normalsize,bgcolor=my-pale-grey}
|
||||
|
||||
\usepackage[most]{tcolorbox}
|
||||
|
||||
\tcbuselibrary{minted}
|
||||
|
||||
\newtcolorbox{seealso}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=See Also}
|
||||
\newtcolorbox{hint}{ enhanced,breakable,colback=my-pale-grey,colframe=my-grey,fonttitle=\bfseries,title=Hint}
|
||||
\newtcolorbox{definition}{enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Definition}
|
||||
\newtcolorbox{important}{ enhanced,breakable,colback=my-pale-red, colframe=my-red, fonttitle=\bfseries,title=Important}
|
||||
\newtcolorbox{exampl}[1][]{ enhanced,breakable,colback=my-pale-green,colframe=my-green,fonttitle=\bfseries,title=Example,#1}
|
||||
\newtcolorbox{exercice}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Exercice}
|
||||
\newtcolorbox{question}{ enhanced,breakable,colback=my-pale-yellow,colframe=my-yellow,fonttitle=\bfseries,title=Question}
|
||||
\newtcolorbox{answer}{ enhanced,breakable,colback=my-pale-turq,colframe=my-turq,fonttitle=\bfseries,title=Answer}
|
||||
\newtcolorbox{summary}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Summary}
|
||||
\newtcolorbox{note}{ enhanced,breakable,colback=my-pale-blue,colframe=my-blue,fonttitle=\bfseries,title=Note}
|
||||
\newtcolorbox{caution}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Caution}
|
||||
\newtcolorbox{warning}{ enhanced,breakable,colback=my-pale-orange,colframe=my-orange,fonttitle=\bfseries,title=Warning}
|
||||
|
||||
\newtcolorbox{my-quote}[1]{%
|
||||
colback=my-pale-grey,
|
||||
grow to right by=-10mm,
|
||||
grow to left by=-10mm,
|
||||
boxrule=0pt,
|
||||
boxsep=0pt,
|
||||
breakable,
|
||||
enhanced jigsaw,
|
||||
borderline west={4pt}{0pt}{my-grey}}
|
||||
|
||||
\renewenvironment{quote}{\begin{my-quote}}{\end{my-quote}}
|
||||
|
||||
\newtcolorbox{my-verse}[1]{%
|
||||
colback=my-pale-grey,
|
||||
grow to right by=-10mm,
|
||||
grow to left by=-10mm,
|
||||
boxrule=0pt,
|
||||
boxsep=0pt,
|
||||
breakable,
|
||||
enhanced jigsaw,
|
||||
borderline west={4pt}{0pt}{my-grey}}
|
||||
|
||||
\renewenvironment{verse}{\begin{my-verse}}{\end{my-verse}}
|
||||
|
||||
\usepackage{environ}% http://ctan.org/pkg/environ
|
||||
\NewEnviron{aside}{%
|
||||
\marginpar{\BODY}
|
||||
}
|
||||
|
||||
\renewenvironment{verbatim}{\VerbatimEnvironment\begin{minted}[]{text}}{\end{minted}}
|
||||
|
||||
\usepackage{soul}
|
||||
\sethlcolor{my-pale-grey}
|
||||
|
||||
\let\OldTexttt\texttt
|
||||
\renewcommand{\texttt}[1]{{\ttfamily\hl{\mbox{\,#1\,}}}}
|
||||
|
||||
\makeatletter
|
||||
\preto\Gin@extensions{png,}
|
||||
\DeclareGraphicsRule{.png}{pdf}{.pdf}{\noexpand\Gin@base.pdf}
|
||||
\makeatother
|
||||
|
||||
\usepackage{hyperref}
|
||||
\hypersetup{
|
||||
colorlinks = true,
|
||||
allcolors = my-blue
|
||||
}
|
||||
|
||||
\usepackage{hypcap}
|
@ -1,64 +1,16 @@
|
||||
@inproceedings{hua04_low_ligo,
|
||||
author = {Hua, Wensheng and Adhikari, R and DeBra, Daniel B and
|
||||
Giaime, Joseph A and Hammond, Giles Dominic and Hardham, C and
|
||||
Hennessy, Mike and How, Jonathan P and Lantz, Brian T and
|
||||
Macinnis, M and others},
|
||||
title = {Low-frequency active vibration isolation for advanced
|
||||
{LIGO}},
|
||||
booktitle = {Gravitational Wave and Particle Astrophysics Detectors},
|
||||
year = 2004,
|
||||
volume = 5500,
|
||||
pages = {194--205},
|
||||
organization = {International Society for Optics and Photonics},
|
||||
@phdthesis{hua05_low_ligo,
|
||||
author = {Hua, Wensheng},
|
||||
school = {stanford university},
|
||||
title = {Low frequency vibration isolation and alignment system for
|
||||
advanced LIGO},
|
||||
year = 2005,
|
||||
}
|
||||
|
||||
@inproceedings{dehaeze21_new_method_desig_compl_filter,
|
||||
@article{dehaeze21_new_method_desig_compl_filter,
|
||||
author = {Dehaeze, Thomas and Vermat, Mohit and Collette, Christophe},
|
||||
title = {A New Method of Designing Complementary Fil},
|
||||
booktitle = {Gravitational Wave and Particle Astrophysics Detectors},
|
||||
year = 2004,
|
||||
volume = 5500,
|
||||
pages = {194--205},
|
||||
organization = {International Society for Optics and Photonics},
|
||||
}
|
||||
|
||||
@book{matlab20,
|
||||
author = {MATLAB},
|
||||
title = {version 9.9.0 (R2020b)},
|
||||
year = 2020,
|
||||
publisher = {The MathWorks Inc.},
|
||||
address = {Natick, Massachusetts},
|
||||
}
|
||||
|
||||
@article{sturm99_using_sedum,
|
||||
author = {Sturm, Jos F},
|
||||
title = {Using {SeDuMi} 1.02, a Matlab Toolbox for Optimization Over
|
||||
Symmetric Cones},
|
||||
journal = {Optimization methods and software},
|
||||
volume = 11,
|
||||
number = {1-4},
|
||||
pages = {625--653},
|
||||
year = 1999,
|
||||
doi = {10.1080/10556789908805766},
|
||||
url = {https://doi.org/10.1080/10556789908805766},
|
||||
publisher = {Taylor \& Francis},
|
||||
}
|
||||
|
||||
@inproceedings{hua04_polyp_fir_compl_filter_contr_system,
|
||||
author = {Hua, Wensheng and Debra, B. and Hardham, T. and Lantz, T.
|
||||
and Giaime, A.},
|
||||
title = {Polyphase {FIR} Complementary Filters for Control Systems},
|
||||
booktitle = {Proceedings of ASPE Spring Topical Meeting on Control of
|
||||
Precision Systems},
|
||||
year = 2004,
|
||||
pages = {109--114},
|
||||
}
|
||||
|
||||
@misc{grant14_cvx,
|
||||
author = {Michael Grant and Stephen Boyd},
|
||||
howpublished = {\url{http://cvxr.com/cvx}},
|
||||
month = 3,
|
||||
title = {{CVX}: Matlab Software for Disciplined Convex Programming,
|
||||
version 2.1},
|
||||
year = 2014,
|
||||
title = {A New Method of Designing Complementary Filters for Sensor
|
||||
Fusion Using the $\mathcal{H}_\infty$ Synthesis},
|
||||
journal = {Mechanical Systems and Signal Processing},
|
||||
year = 2021,
|
||||
month = {Nov},
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user