nass-metrology-test-bench/index.html

2047 lines
128 KiB
HTML

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2019-09-17 mar. 15:53 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Cercalo Test Bench</title>
<meta name="generator" content="Org mode" />
<meta name="author" content="Dehaeze Thomas" />
<style type="text/css">
<!--/*--><![CDATA[/*><!--*/
.title { text-align: center;
margin-bottom: .2em; }
.subtitle { text-align: center;
font-size: medium;
font-weight: bold;
margin-top:0; }
.todo { font-family: monospace; color: red; }
.done { font-family: monospace; color: green; }
.priority { font-family: monospace; color: orange; }
.tag { background-color: #eee; font-family: monospace;
padding: 2px; font-size: 80%; font-weight: normal; }
.timestamp { color: #bebebe; }
.timestamp-kwd { color: #5f9ea0; }
.org-right { margin-left: auto; margin-right: 0px; text-align: right; }
.org-left { margin-left: 0px; margin-right: auto; text-align: left; }
.org-center { margin-left: auto; margin-right: auto; text-align: center; }
.underline { text-decoration: underline; }
#postamble p, #preamble p { font-size: 90%; margin: .2em; }
p.verse { margin-left: 3%; }
pre {
border: 1px solid #ccc;
box-shadow: 3px 3px 3px #eee;
padding: 8pt;
font-family: monospace;
overflow: auto;
margin: 1.2em;
}
pre.src {
position: relative;
overflow: visible;
padding-top: 1.2em;
}
pre.src:before {
display: none;
position: absolute;
background-color: white;
top: -10px;
right: 10px;
padding: 3px;
border: 1px solid black;
}
pre.src:hover:before { display: inline;}
/* Languages per Org manual */
pre.src-asymptote:before { content: 'Asymptote'; }
pre.src-awk:before { content: 'Awk'; }
pre.src-C:before { content: 'C'; }
/* pre.src-C++ doesn't work in CSS */
pre.src-clojure:before { content: 'Clojure'; }
pre.src-css:before { content: 'CSS'; }
pre.src-D:before { content: 'D'; }
pre.src-ditaa:before { content: 'ditaa'; }
pre.src-dot:before { content: 'Graphviz'; }
pre.src-calc:before { content: 'Emacs Calc'; }
pre.src-emacs-lisp:before { content: 'Emacs Lisp'; }
pre.src-fortran:before { content: 'Fortran'; }
pre.src-gnuplot:before { content: 'gnuplot'; }
pre.src-haskell:before { content: 'Haskell'; }
pre.src-hledger:before { content: 'hledger'; }
pre.src-java:before { content: 'Java'; }
pre.src-js:before { content: 'Javascript'; }
pre.src-latex:before { content: 'LaTeX'; }
pre.src-ledger:before { content: 'Ledger'; }
pre.src-lisp:before { content: 'Lisp'; }
pre.src-lilypond:before { content: 'Lilypond'; }
pre.src-lua:before { content: 'Lua'; }
pre.src-matlab:before { content: 'MATLAB'; }
pre.src-mscgen:before { content: 'Mscgen'; }
pre.src-ocaml:before { content: 'Objective Caml'; }
pre.src-octave:before { content: 'Octave'; }
pre.src-org:before { content: 'Org mode'; }
pre.src-oz:before { content: 'OZ'; }
pre.src-plantuml:before { content: 'Plantuml'; }
pre.src-processing:before { content: 'Processing.js'; }
pre.src-python:before { content: 'Python'; }
pre.src-R:before { content: 'R'; }
pre.src-ruby:before { content: 'Ruby'; }
pre.src-sass:before { content: 'Sass'; }
pre.src-scheme:before { content: 'Scheme'; }
pre.src-screen:before { content: 'Gnu Screen'; }
pre.src-sed:before { content: 'Sed'; }
pre.src-sh:before { content: 'shell'; }
pre.src-sql:before { content: 'SQL'; }
pre.src-sqlite:before { content: 'SQLite'; }
/* additional languages in org.el's org-babel-load-languages alist */
pre.src-forth:before { content: 'Forth'; }
pre.src-io:before { content: 'IO'; }
pre.src-J:before { content: 'J'; }
pre.src-makefile:before { content: 'Makefile'; }
pre.src-maxima:before { content: 'Maxima'; }
pre.src-perl:before { content: 'Perl'; }
pre.src-picolisp:before { content: 'Pico Lisp'; }
pre.src-scala:before { content: 'Scala'; }
pre.src-shell:before { content: 'Shell Script'; }
pre.src-ebnf2ps:before { content: 'ebfn2ps'; }
/* additional language identifiers per "defun org-babel-execute"
in ob-*.el */
pre.src-cpp:before { content: 'C++'; }
pre.src-abc:before { content: 'ABC'; }
pre.src-coq:before { content: 'Coq'; }
pre.src-groovy:before { content: 'Groovy'; }
/* additional language identifiers from org-babel-shell-names in
ob-shell.el: ob-shell is the only babel language using a lambda to put
the execution function name together. */
pre.src-bash:before { content: 'bash'; }
pre.src-csh:before { content: 'csh'; }
pre.src-ash:before { content: 'ash'; }
pre.src-dash:before { content: 'dash'; }
pre.src-ksh:before { content: 'ksh'; }
pre.src-mksh:before { content: 'mksh'; }
pre.src-posh:before { content: 'posh'; }
/* Additional Emacs modes also supported by the LaTeX listings package */
pre.src-ada:before { content: 'Ada'; }
pre.src-asm:before { content: 'Assembler'; }
pre.src-caml:before { content: 'Caml'; }
pre.src-delphi:before { content: 'Delphi'; }
pre.src-html:before { content: 'HTML'; }
pre.src-idl:before { content: 'IDL'; }
pre.src-mercury:before { content: 'Mercury'; }
pre.src-metapost:before { content: 'MetaPost'; }
pre.src-modula-2:before { content: 'Modula-2'; }
pre.src-pascal:before { content: 'Pascal'; }
pre.src-ps:before { content: 'PostScript'; }
pre.src-prolog:before { content: 'Prolog'; }
pre.src-simula:before { content: 'Simula'; }
pre.src-tcl:before { content: 'tcl'; }
pre.src-tex:before { content: 'TeX'; }
pre.src-plain-tex:before { content: 'Plain TeX'; }
pre.src-verilog:before { content: 'Verilog'; }
pre.src-vhdl:before { content: 'VHDL'; }
pre.src-xml:before { content: 'XML'; }
pre.src-nxml:before { content: 'XML'; }
/* add a generic configuration mode; LaTeX export needs an additional
(add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */
pre.src-conf:before { content: 'Configuration File'; }
table { border-collapse:collapse; }
caption.t-above { caption-side: top; }
caption.t-bottom { caption-side: bottom; }
td, th { vertical-align:top; }
th.org-right { text-align: center; }
th.org-left { text-align: center; }
th.org-center { text-align: center; }
td.org-right { text-align: right; }
td.org-left { text-align: left; }
td.org-center { text-align: center; }
dt { font-weight: bold; }
.footpara { display: inline; }
.footdef { margin-bottom: 1em; }
.figure { padding: 1em; }
.figure p { text-align: center; }
.equation-container {
display: table;
text-align: center;
width: 100%;
}
.equation {
vertical-align: middle;
}
.equation-label {
display: table-cell;
text-align: right;
vertical-align: middle;
}
.inlinetask {
padding: 10px;
border: 2px solid gray;
margin: 10px;
background: #ffffcc;
}
#org-div-home-and-up
{ text-align: right; font-size: 70%; white-space: nowrap; }
textarea { overflow-x: auto; }
.linenr { font-size: smaller }
.code-highlighted { background-color: #ffff00; }
.org-info-js_info-navigation { border-style: none; }
#org-info-js_console-label
{ font-size: 10px; font-weight: bold; white-space: nowrap; }
.org-info-js_search-highlight
{ background-color: #ffff00; color: #000000; font-weight: bold; }
.org-svg { width: 90%; }
/*]]>*/-->
</style>
<link rel="stylesheet" type="text/css" href="./css/htmlize.css"/>
<link rel="stylesheet" type="text/css" href="./css/readtheorg.css"/>
<link rel="stylesheet" type="text/css" href="./css/zenburn.css"/>
<script type="text/javascript" src="./js/jquery.min.js"></script>
<script type="text/javascript" src="./js/bootstrap.min.js"></script>
<script type="text/javascript" src="./js/jquery.stickytableheaders.min.js"></script>
<script type="text/javascript" src="./js/readtheorg.js"></script>
<script type="text/javascript">
/*
@licstart The following is the entire license notice for the
JavaScript code in this tag.
Copyright (C) 2012-2019 Free Software Foundation, Inc.
The JavaScript code in this tag is free software: you can
redistribute it and/or modify it under the terms of the GNU
General Public License (GNU GPL) as published by the Free Software
Foundation, either version 3 of the License, or (at your option)
any later version. The code is distributed WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
As additional permission under GNU GPL version 3 section 7, you
may distribute non-source (e.g., minimized or compacted) forms of
that code without the copy of the GNU GPL normally required by
section 4, provided you include this license notice and a URL
through which recipients can access the Corresponding Source.
@licend The above is the entire license notice
for the JavaScript code in this tag.
*/
<!--/*--><![CDATA[/*><!--*/
function CodeHighlightOn(elem, id)
{
var target = document.getElementById(id);
if(null != target) {
elem.cacheClassElem = elem.className;
elem.cacheClassTarget = target.className;
target.className = "code-highlighted";
elem.className = "code-highlighted";
}
}
function CodeHighlightOff(elem, id)
{
var target = document.getElementById(id);
if(elem.cacheClassElem)
elem.className = elem.cacheClassElem;
if(elem.cacheClassTarget)
target.className = elem.cacheClassTarget;
}
/*]]>*///-->
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
displayAlign: "center",
displayIndent: "0em",
"HTML-CSS": { scale: 100,
linebreaks: { automatic: "false" },
webFont: "TeX"
},
SVG: {scale: 100,
linebreaks: { automatic: "false" },
font: "TeX"},
NativeMML: {scale: 100},
TeX: { equationNumbers: {autoNumber: "AMS"},
MultLineWidth: "85%",
TagSide: "right",
TagIndent: ".8em"
}
});
</script>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body>
<div id="content">
<h1 class="title">Cercalo Test Bench</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org3519192">1. Introduction</a>
<ul>
<li><a href="#org872df99">1.1. Block Diagram</a></li>
<li><a href="#orgeb18df8">1.2. Cercalo</a></li>
<li><a href="#orgabd5452">1.3. Optical Setup</a></li>
<li><a href="#orga857b69">1.4. Newport</a></li>
<li><a href="#org65c50b5">1.5. 4 quadrant Diode</a></li>
<li><a href="#orge0ab4f9">1.6. ADC/DAC</a></li>
</ul>
</li>
<li><a href="#org29ba44d">2. Identification of the system dynamics</a>
<ul>
<li><a href="#orgf19c09b">2.1. Calibration of the 4 Quadrant Diode</a>
<ul>
<li><a href="#org488413f">2.1.1. Input / Output data</a></li>
<li><a href="#orgbbc3ad2">2.1.2. Linear Regression to obtain the gain of the 4QD</a></li>
</ul>
</li>
<li><a href="#org7dd4e6c">2.2. Identification of the Cercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</a>
<ul>
<li><a href="#org6078ef0">2.2.1. Electrical Schematic</a></li>
<li><a href="#orgaa575f2">2.2.2. Theoretical Transfer Functions</a></li>
<li><a href="#orgc24d0bd">2.2.3. Identified Transfer Functions</a></li>
</ul>
</li>
<li><a href="#org8b914fd">2.3. Identification of the Cercalo Dynamics</a>
<ul>
<li><a href="#org45f478a">2.3.1. Input / Output data</a></li>
<li><a href="#orga76fba2">2.3.2. Coherence</a></li>
<li><a href="#org131ac39">2.3.3. Estimation of the Frequency Response Function Matrix</a></li>
<li><a href="#orgf0a3476">2.3.4. Time Delay</a></li>
<li><a href="#org0174055">2.3.5. Extraction of a transfer function matrix</a></li>
</ul>
</li>
<li><a href="#org29f709e">2.4. Identification of the Newport Dynamics</a>
<ul>
<li><a href="#org18a03ed">2.4.1. Input / Output data</a></li>
<li><a href="#org978a0c9">2.4.2. Coherence</a></li>
<li><a href="#orgc0c5d02">2.4.3. Estimation of the Frequency Response Function Matrix</a></li>
<li><a href="#orgdfcee7e">2.4.4. Time Delay</a></li>
<li><a href="#org314a223">2.4.5. Extraction of a transfer function matrix</a></li>
</ul>
</li>
<li><a href="#org8fe71fd">2.5. Full System</a></li>
</ul>
</li>
<li><a href="#org07fb936">3. Active Damping</a>
<ul>
<li><a href="#org07da045">3.1. Load Plant</a></li>
<li><a href="#orge1669f2">3.2. Test</a></li>
</ul>
</li>
<li><a href="#orgf4f85b9">4. <span class="todo TODO">TODO</span> Huddle Test</a></li>
<li><a href="#org03828c5">5. Plant Scaling</a></li>
<li><a href="#org8254d1a">6. Plant Analysis</a>
<ul>
<li><a href="#org592969b">6.1. Load Plant</a></li>
<li><a href="#org966d85b">6.2. RGA-Number</a></li>
<li><a href="#org7063733">6.3. Rotation Matrix</a></li>
</ul>
</li>
<li><a href="#org759298e">7. Control Objective</a></li>
<li><a href="#org96df63d">8. Decentralized Control</a>
<ul>
<li><a href="#orgde6febc">8.1. Load Plant</a></li>
<li><a href="#orgf815918">8.2. Diagonal Controller</a></li>
</ul>
</li>
<li><a href="#orge641704">9. Measurement of the non-repeatability</a></li>
</ul>
</div>
</div>
<div id="outline-container-org3519192" class="outline-2">
<h2 id="org3519192"><span class="section-number-2">1</span> Introduction</h2>
<div class="outline-text-2" id="text-1">
</div>
<div id="outline-container-org872df99" class="outline-3">
<h3 id="org872df99"><span class="section-number-3">1.1</span> Block Diagram</h3>
<div class="outline-text-3" id="text-1-1">
<p>
The block diagram of the setup to be controlled is shown in Fig. <a href="#org3b04014">1</a>.
</p>
<div id="org3b04014" class="figure">
<p><img src="figs/cercalo_diagram_simplify.png" alt="cercalo_diagram_simplify.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Block Diagram of the Experimental Setup</p>
</div>
<p>
The transfer functions in the system are:
</p>
<ul class="org-ul">
<li><b>Current Amplifier</b>: from the voltage set by the DAC to the current going to the Cercalo's inductors
\[ G_i = \begin{bmatrix} G_{i,h} & 0 \\ 0 & G_{i,v} \end{bmatrix} \text{ in } \left[ \frac{A}{V} \right] \]
\[ \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} = G_i \begin{bmatrix} U_{c,h} \\ U_{c,v} \end{bmatrix} \]</li>
<li><b>Impedance of the Cercalo</b> that converts the current going to the cercalo to the voltage across the cercalo:
\[ Z_c = \begin{bmatrix} Z_{c,h} & 0 \\ 0 & Z_{c,v} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
\[ \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} = Z_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
<li><b>Voltage Amplifier</b>: from the voltage across the Cercalo inductors to the measured voltage
\[ G_a = \begin{bmatrix} G_{a,h} & 0 \\ 0 & G_{a,v} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
\[ \begin{bmatrix} V_{c,h} \\ V_{c,v} \end{bmatrix} = G_a \begin{bmatrix} \tilde{V}_{c,h} \\ \tilde{V}_{c,v} \end{bmatrix} \]</li>
<li><b>Cercalo</b>: Transfer function from the current going through the cercalo inductors to the 4 quadrant measurement
\[ G_c = \begin{bmatrix} G_{\frac{V_{p,h}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,h}}{\tilde{U}_{c,v}}} \\ G_{\frac{V_{p,v}}{\tilde{U}_{c,h}}} & G_{\frac{V_{p,v}}{\tilde{U}_{c,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{A} \right] \]
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} I_{c,h} \\ I_{c,v} \end{bmatrix} \]</li>
<li><b>Newport</b> Transfer function from the command signal of the Newport to the 4 quadrant measurement
\[ G_n = \begin{bmatrix} G_{\frac{V_{p,h}}{U_{n,h}}} & G_{\frac{V_{p,h}}{U_{n,v}}} \\ G_{\frac{V_{p,v}}{U_{n,h}}} & G_{\frac{V_{n,v}}{U_{n,v}}} \end{bmatrix} \text{ in } \left[ \frac{V}{V} \right] \]
\[ \begin{bmatrix} V_{p,h} \\ V_{p,v} \end{bmatrix} = G_c \begin{bmatrix} V_{n,h} \\ V_{n,v} \end{bmatrix} \]</li>
<li><b>4 Quadrant Diode</b>: the gain of the 4 quadrant diode in [V/rad] is inverse in order to obtain the physical angle of the beam
\[ G_d = \begin{bmatrix} G_{d,h} & 0 \\ 0 & G_{d,v} \end{bmatrix} \text{ in } \left[\frac{V}{rad}\right] \]</li>
</ul>
<p>
The block diagram with each transfer function is shown in Fig. <a href="#org0ea7908">2</a>.
</p>
<div id="org0ea7908" class="figure">
<p><img src="figs/cercalo_diagram.png" alt="cercalo_diagram.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Block Diagram of the Experimental Setup with detailed dynamics</p>
</div>
</div>
</div>
<div id="outline-container-orgeb18df8" class="outline-3">
<h3 id="orgeb18df8"><span class="section-number-3">1.2</span> Cercalo</h3>
<div class="outline-text-3" id="text-1-2">
<p>
From the Cercalo documentation, we have the parameters shown on table <a href="#org6430d98">1</a>.
</p>
<table id="org6430d98" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 1:</span> Cercalo Parameters</caption>
<colgroup>
<col class="org-left" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">&#xa0;</th>
<th scope="col" class="org-right">Maximum Stroke [deg]</th>
<th scope="col" class="org-right">Resonance Frequency [Hz]</th>
<th scope="col" class="org-right">DC Gain [mA/deg]</th>
<th scope="col" class="org-right">Gain at resonance [deg/V]</th>
<th scope="col" class="org-right">RC Resistance [Ohm]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">AX1 (Horizontal)</td>
<td class="org-right">5</td>
<td class="org-right">411.13</td>
<td class="org-right">28.4</td>
<td class="org-right">382.9</td>
<td class="org-right">9.41</td>
</tr>
<tr>
<td class="org-left">AX2 (Vertical)</td>
<td class="org-right">5</td>
<td class="org-right">252.5</td>
<td class="org-right">35.2</td>
<td class="org-right">350.4</td>
<td class="org-right">&#xa0;</td>
</tr>
</tbody>
</table>
<p>
The Inductance and DC resistance of the two axis of the Cercalo have been measured:
</p>
<ul class="org-ul">
<li>\(L_{c,h} = 0.1\ \text{mH}\)</li>
<li>\(L_{c,v} = 0.1\ \text{mH}\)</li>
<li>\(R_{c,h} = 9.3\ \Omega\)</li>
<li>\(R_{c,v} = 8.3\ \Omega\)</li>
</ul>
<p>
Let's first consider the <b>horizontal direction</b> and we try to model the Cercalo by a spring/mass/damper system (Fig. <a href="#org1c65c6f">3</a>).
</p>
<div id="org1c65c6f" class="figure">
<p><img src="figs/mech_cercalo.png" alt="mech_cercalo.png" />
</p>
<p><span class="figure-number">Figure 3: </span>1 degree-of-freedom model of the Cercalo</p>
</div>
<p>
The equation of motion is:
</p>
\begin{align*}
\frac{x}{F} &= \frac{1}{k + c s + m s^2} \\
&= \frac{G_0}{1 + 2 \xi \frac{s}{\omega_0} + \frac{s^2}{\omega_0^2}}
\end{align*}
<p>
with:
</p>
<ul class="org-ul">
<li>\(G_0 = 1/k\) is the gain at DC in rad/N</li>
<li>\(\xi = \frac{c}{2 \sqrt{km}}\) is the damping ratio of the system</li>
<li>\(\omega_0 = \sqrt{\frac{k}{m}}\) is the resonance frequency in rad</li>
</ul>
<p>
The force \(F\) applied to the mass is proportional to the current \(I\) flowing through the voice coils:
\[ \frac{F}{I} = \alpha \]
with \(\alpha\) is in \(N/A\) and is to be determined.
</p>
<p>
The current \(I\) is also proportional to the voltage at the output of the buffer:
</p>
\begin{align*}
\frac{I_c}{U_c} &= \frac{1}{(R + R_c) + L_c s} \\
&\approx 0.02 \left[ \frac{A}{V} \right]
\end{align*}
<p>
Let's try to determine the equivalent mass and spring values.
From table <a href="#org6430d98">1</a>, for the horizontal direction:
\[ \left| \frac{x}{I} \right|(0) = \left| \alpha \frac{x}{F} \right|(0) = 28.4\ \frac{mA}{deg} = 1.63\ \frac{A}{rad} \]
</p>
<p>
So:
\[ \alpha \frac{1}{k} = 1.63 \Longleftrightarrow k = \frac{\alpha}{1.63} \left[\frac{N}{rad}\right] \]
</p>
<p>
We also know the resonance frequency:
\[ \omega_0 = 411.1\ \text{Hz} = 2583\ \frac{rad}{s} \]
</p>
<p>
And the gain at resonance:
</p>
\begin{align*}
\left| \frac{x}{U_c} \right|(j\omega_0) &= \left| 0.02 \frac{x}{I_c} \right| (j\omega_0) \\
&= \left| 0.02 \alpha \frac{x}{F} \right| (j\omega_0) \\
&= 0.02 \alpha \frac{1/k}{2\xi} \\
&= 282.9\ \left[\frac{deg}{V}\right] \\
&= 4.938\ \left[\frac{rad}{V}\right]
\end{align*}
<p>
Thus:
</p>
\begin{align*}
& \frac{\alpha}{2 \xi k} = 245 \\
\Leftrightarrow & \frac{1.63}{2 \xi} = 245 \\
\Leftrightarrow & \xi = 0.0033 \\
\Leftrightarrow & \xi = 0.33 \%
\end{align*}
<div class="important">
\begin{align*}
G_0 &= \frac{1.63}{\alpha}\ \frac{rad}{N} \\
\xi &= 0.0033 \\
\omega_0 &= 2583\ \frac{rad}{s}
\end{align*}
<p>
and in terms of the physical properties:
</p>
\begin{align*}
k &= \frac{\alpha}{1.63}\ \frac{N}{rad} \\
\xi &= 0.0033 \\
m &= \frac{\alpha}{1.1 \cdot 10^7}\ \frac{kg}{m^2}
\end{align*}
<p>
Thus, we have to determine \(\alpha\).
This can be done experimentally by determining the gain at DC or at resonance of the system.
For that, we need to know the angle of the mirror, thus we need to <b>calibrate</b> the photo-diodes.
This will be done using the Newport.
</p>
</div>
</div>
</div>
<div id="outline-container-orgabd5452" class="outline-3">
<h3 id="orgabd5452"><span class="section-number-3">1.3</span> Optical Setup</h3>
</div>
<div id="outline-container-orga857b69" class="outline-3">
<h3 id="orga857b69"><span class="section-number-3">1.4</span> Newport</h3>
<div class="outline-text-3" id="text-1-4">
<p>
Parameters of the Newport are shown in Fig. <a href="#org882caed">4</a>.
</p>
<p>
It's dynamics for small angle excitation is shown in Fig. <a href="#orgbe2df74">5</a>.
</p>
<p>
And we have:
</p>
\begin{align*}
G_{n, h}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V} \\
G_{n, v}(0) &= 2.62 \cdot 10^{-3}\ \frac{rad}{V}
\end{align*}
<div id="org882caed" class="figure">
<p><img src="figs/newport_doc.png" alt="newport_doc.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Documentation of the Newport</p>
</div>
<div id="orgbe2df74" class="figure">
<p><img src="figs/newport_gain.png" alt="newport_gain.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Transfer function of the Newport</p>
</div>
</div>
</div>
<div id="outline-container-org65c50b5" class="outline-3">
<h3 id="org65c50b5"><span class="section-number-3">1.5</span> 4 quadrant Diode</h3>
<div class="outline-text-3" id="text-1-5">
<p>
The front view of the 4 quadrant photo-diode is shown in Fig. <a href="#org0b9b9ab">6</a>.
</p>
<div id="org0b9b9ab" class="figure">
<p><img src="figs/4qd_naming.png" alt="4qd_naming.png" />
</p>
<p><span class="figure-number">Figure 6: </span>Front view of the 4QD</p>
</div>
<p>
Each of the photo-diode is amplified using a 4-channel amplifier as shown in Fig. <a href="#org9c0de93">7</a>.
</p>
<div id="org9c0de93" class="figure">
<p><img src="figs/4qd_amplifier.png" alt="4qd_amplifier.png" />
</p>
<p><span class="figure-number">Figure 7: </span>Wiring of the amplifier. The amplifier is located on the bottom right of the board</p>
</div>
</div>
</div>
<div id="outline-container-orge0ab4f9" class="outline-3">
<h3 id="orge0ab4f9"><span class="section-number-3">1.6</span> ADC/DAC</h3>
<div class="outline-text-3" id="text-1-6">
<p>
Let's compute the theoretical noise of the ADC/DAC.
</p>
\begin{align*}
\Delta V &= 20 V \\
n &= 16bits \\
q &= \Delta V/2^n = 305 \mu V \\
f_N &= 10kHz \\
\Gamma_n &= \frac{q^2}{12 f_N} = 7.76 \cdot 10^{-13} \frac{V^2}{Hz}
\end{align*}
<p>
with \(\Delta V\) the total range of the ADC, \(n\) its number of bits, \(q\) the quantization, \(f_N\) the sampling frequency and \(\Gamma_n\) its theoretical Power Spectral Density.
</p>
</div>
</div>
</div>
<div id="outline-container-org29ba44d" class="outline-2">
<h2 id="org29ba44d"><span class="section-number-2">2</span> Identification of the system dynamics</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org15c1ca3"></a>
</p>
<p>
In this section, we seek to identify all the blocks as shown in Fig. <a href="#org3b04014">1</a>.
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Signal</th>
<th scope="col" class="org-left">Name</th>
<th scope="col" class="org-left">Unit</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Voltage Sent to Cercalo - Horizontal</td>
<td class="org-left"><code>Uch</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Cercalo - Vertical</td>
<td class="org-left"><code>Ucv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Newport - Horizontal</td>
<td class="org-left"><code>Unh</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Voltage Sent to Newport - Vertical</td>
<td class="org-left"><code>Unv</code></td>
<td class="org-left">[V]</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="org-left">4Q Photodiode Measurement - Horizontal</td>
<td class="org-left"><code>Vph</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">4Q Photodiode Measurement - Vertical</td>
<td class="org-left"><code>Vpv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Measured Voltage across the Inductance - Horizontal</td>
<td class="org-left"><code>Vch</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Measured Voltage across the Inductance - Vertical</td>
<td class="org-left"><code>Vcv</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Newport Metrology - Horizontal</td>
<td class="org-left"><code>Vnh</code></td>
<td class="org-left">[V]</td>
</tr>
<tr>
<td class="org-left">Newport Metrology - Vertical</td>
<td class="org-left"><code>Vnv</code></td>
<td class="org-left">[V]</td>
</tr>
</tbody>
<tbody>
<tr>
<td class="org-left">Attocube Measurement</td>
<td class="org-left"><code>Va</code></td>
<td class="org-left">[m]</td>
</tr>
</tbody>
</table>
<div class="note">
<p>
All the files (data and Matlab scripts) are accessible <a href="data/cercalo_identification.zip">here</a>.
</p>
</div>
</div>
<div id="outline-container-orgf19c09b" class="outline-3">
<h3 id="orgf19c09b"><span class="section-number-3">2.1</span> Calibration of the 4 Quadrant Diode</h3>
<div class="outline-text-3" id="text-2-1">
<p>
Prior to any dynamic identification, we would like to be able to determine the meaning of the 4 quadrant diode measurement.
For instance, instead of obtaining transfer function in [V/V] from the input of the cercalo to the measurement voltage of the 4QD, we would like to obtain the transfer function in [rad/V].
This will give insight to physical interpretation.
</p>
<p>
To calibrate the 4 quadrant photo-diode, we can use the metrology included in the Newport.
We can choose precisely the angle of the Newport mirror and see what is the value measured by the 4 Quadrant Diode.
We then should be able to obtain the "gain" of the 4QD in [V/rad].
</p>
</div>
<div id="outline-container-org488413f" class="outline-4">
<h4 id="org488413f"><span class="section-number-4">2.1.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-1-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_cal_pd_h.mat', 't', 'Vph', 'Vpv', 'Vnh'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_cal_pd_v.mat', 't', 'Vph', 'Vpv', 'Vnv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first seconds where the Cercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vnh<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
t0 = <span class="org-highlight-numbers-number">1</span>;
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vnv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
</pre>
</div>
<div id="orgc9d2415" class="figure">
<p><img src="figs/calib_4qd_h.png" alt="calib_4qd_h.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Identification signals when exciting the horizontal direction (<a href="./figs/calib_4qd_h.png">png</a>, <a href="./figs/calib_4qd_h.pdf">pdf</a>)</p>
</div>
<div id="org116dcc2" class="figure">
<p><img src="figs/calib_4qd_v.png" alt="calib_4qd_v.png" />
</p>
<p><span class="figure-number">Figure 9: </span>Identification signals when exciting in the vertical direction (<a href="./figs/calib_4qd_v.png">png</a>, <a href="./figs/calib_4qd_v.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgbbc3ad2" class="outline-4">
<h4 id="orgbbc3ad2"><span class="section-number-4">2.1.2</span> Linear Regression to obtain the gain of the 4QD</h4>
<div class="outline-text-4" id="text-2-1-2">
<p>
We plot the angle of mirror
</p>
<p>
Gain of the Newport metrology in [rad/V].
</p>
<div class="org-src-container">
<pre class="src src-matlab">gn0 = <span class="org-highlight-numbers-number">2</span>.<span class="org-highlight-numbers-number">62e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>;
</pre>
</div>
<p>
The angular displacement of the beam is twice the angular displacement of the Newport mirror.
</p>
<p>
We do a linear regression
\[ y = a x + b \]
where:
</p>
<ul class="org-ul">
<li>\(y\) is the measured voltage of the 4QD in [V]</li>
<li>\(x\) is the beam angle (twice the mirror angle) in [rad]</li>
<li>\(a\) is the identified gain of the 4QD in [rad/V]</li>
</ul>
<p>
The linear regression is shown in Fig. <a href="#org3b7b1cd">10</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">bh = <span class="org-rainbow-delimiters-depth-1">[</span>ones<span class="org-rainbow-delimiters-depth-2">(</span>size<span class="org-rainbow-delimiters-depth-3">(</span>uh.Vnh<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>gn0<span class="org-type">*</span>uh.Vnh<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">\</span>uh.Vph;
bv = <span class="org-rainbow-delimiters-depth-1">[</span>ones<span class="org-rainbow-delimiters-depth-2">(</span>size<span class="org-rainbow-delimiters-depth-3">(</span>uv.Vnv<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>gn0<span class="org-type">*</span>uv.Vnv<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">\</span>uv.Vpv;
</pre>
</div>
<div id="org3b7b1cd" class="figure">
<p><img src="figs/4qd_linear_reg.png" alt="4qd_linear_reg.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Linear Regression (<a href="./figs/4qd_linear_reg.png">png</a>, <a href="./figs/4qd_linear_reg.pdf">pdf</a>)</p>
</div>
<p>
Thus, we obtain the "gain of the 4 quadrant photo-diode as shown on table <a href="#org27870f3">2</a>.
</p>
<table id="org27870f3" border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption class="t-above"><span class="table-number">Table 2:</span> Identified Gain of the 4 quadrant diode</caption>
<colgroup>
<col class="org-right" />
<col class="org-right" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-right">Horizontal [V/rad]</th>
<th scope="col" class="org-right">Vertical [V/rad]</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-right">-31.0</td>
<td class="org-right">36.3</td>
</tr>
</tbody>
</table>
<div class="org-src-container">
<pre class="src src-matlab">Gd = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span>bh<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-3">)</span> <span class="org-highlight-numbers-number">0</span> ;
<span class="org-highlight-numbers-number">0</span> bv<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We obtain:
</p>
\begin{align*}
\frac{V_{qd,h}}{\alpha_{0,h}} &\approx 0.032\ \left[ \frac{rad}{V} \right] \\
&\approx 32.3\ \left[ \frac{\mu rad}{mV} \right]
\end{align*}
\begin{align*}
\frac{V_{qd,v}}{\alpha_{0,v}} &\approx 0.028\ \left[ \frac{rad}{V} \right] \\
&\approx 27.6\ \left[ \frac{\mu rad}{mV} \right]
\end{align*}
</div>
</div>
</div>
<div id="outline-container-org7dd4e6c" class="outline-3">
<h3 id="org7dd4e6c"><span class="section-number-3">2.2</span> Identification of the Cercalo Impedance, Current Amplifier and Voltage Amplifier dynamics</h3>
<div class="outline-text-3" id="text-2-2">
<p>
We wish here to determine \(G_i\) and \(G_a\) shown in Fig. <a href="#org3b04014">1</a>.
</p>
<p>
We ignore the electro-mechanical coupling.
</p>
</div>
<div id="outline-container-org6078ef0" class="outline-4">
<h4 id="org6078ef0"><span class="section-number-4">2.2.1</span> Electrical Schematic</h4>
<div class="outline-text-4" id="text-2-2-1">
<p>
The schematic of the electrical circuit used to drive the Cercalo is shown in Fig. <a href="#orge5d70b8">11</a>.
</p>
<div id="orge5d70b8" class="figure">
<p><img src="figs/cercalo_amplifier.png" alt="cercalo_amplifier.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Current Amplifier Schematic</p>
</div>
<p>
The elements are:
</p>
<ul class="org-ul">
<li>\(U_c\): the voltage generated by the DAC</li>
<li>BUF: is a unity-gain open-loop buffer that allows to increase the output current</li>
<li>\(R\): a chosen resistor that will determine the gain of the current amplifier</li>
<li>\(L_c\): inductor present in the Cercalo</li>
<li>\(R_c\): resistance of the inductor</li>
<li>\(\tilde{V}_c\): voltage measured across the Cercalo's inductor</li>
<li>\(V_c\): amplified voltage measured across the Cercalo's inductor</li>
<li>\(I_c\) is the current going through the Cercalo's inductor</li>
</ul>
<p>
The values of the components have been measured for the horizontal and vertical directions:
</p>
<ul class="org-ul">
<li>\(R_h = 41 \Omega\)</li>
<li>\(L_{c,h} = 0.1 mH\)</li>
<li>\(R_{c,h} = 9.3 \Omega\)</li>
<li>\(R_v = 41 \Omega\)</li>
<li>\(L_{c,v} = 0.1 mH\)</li>
<li>\(R_{c,v} = 8.3 \Omega\)</li>
</ul>
<p>
Let's first determine the transfer function from \(U_c\) to \(I_c\).
</p>
<p>
We have that:
\[ U_c = (R + R_c) I_c + L_c s I_c \]
</p>
<p>
Thus:
</p>
\begin{align}
G_i(s) &= \frac{I_c}{U_c} \\
&= \frac{1}{(R + R_c) + L_c s} \\
&= \frac{G_{i,0}}{1 + s/\omega_0}
\end{align}
<p>
with
</p>
<ul class="org-ul">
<li>\(G_{i,0} = \frac{1}{R + R_c}\)</li>
<li>\(\omega_0 = \frac{R + R_c}{L_c}\)</li>
</ul>
<p>
Now, determine the transfer function from \(I_c\) to \(\tilde{V}_c\):
\[ \tilde{V}_C = R_c I_c + L_c s I_c \]
Thus:
</p>
\begin{align}
Z_c(s) &= \frac{\tilde{V}_c}{I_c} \\
&= R_c + L_c s
\end{align}
<p>
Finally, the transfer function of the voltage amplifier \(G_a\) is simply a low pass filter:
</p>
\begin{align}
G_a(s) &= \frac{V_c}{\tilde{V}_c} \\
&= \frac{G_{a,0}}{1 + s/\omega_c}
\end{align}
<p>
with
</p>
<ul class="org-ul">
<li>\(G_{a,0}\) is the gain 1000 (60dB)</li>
<li>\(\omega_c\) is the cut-off frequency of the voltage amplifier set to 1000Hz</li>
</ul>
</div>
</div>
<div id="outline-container-orgaa575f2" class="outline-4">
<h4 id="orgaa575f2"><span class="section-number-4">2.2.2</span> Theoretical Transfer Functions</h4>
<div class="outline-text-4" id="text-2-2-2">
<p>
The values of the components in the current amplifier have been measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Rh = <span class="org-highlight-numbers-number">41</span>; <span class="org-comment">% [Ohm]</span>
Lch = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [H]</span>
Rch = <span class="org-highlight-numbers-number">9</span>.<span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [Ohm]</span>
Rv = <span class="org-highlight-numbers-number">41</span>; <span class="org-comment">% [Ohm]</span>
Lcv = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1e</span><span class="org-type">-</span><span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [H]</span>
Rcv = <span class="org-highlight-numbers-number">8</span>.<span class="org-highlight-numbers-number">3</span>; <span class="org-comment">% [Ohm]</span>
</pre>
</div>
\begin{align*}
G_i(s) &= \frac{1}{(R + R_c) + L_c s} \\
Z_c(s) &= R_c + L_c s \\
G_a(s) &= \frac{1000}{1 + s/\omega_c}
\end{align*}
<div class="org-src-container">
<pre class="src src-matlab">Gi = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span>Rh <span class="org-type">+</span> Rch <span class="org-type">+</span> Lch <span class="org-type">*</span> s<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span>Rv <span class="org-type">+</span> Rcv <span class="org-type">+</span> Lcv <span class="org-type">*</span> s<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Zc = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>Rch<span class="org-type">+</span>Lch<span class="org-type">*</span>s, Rcv<span class="org-type">+</span>Lcv<span class="org-type">*</span>s<span class="org-rainbow-delimiters-depth-1">)</span>;
Ga = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1000</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org3761ab1" class="figure">
<p><img src="figs/current_amplifier_tf.png" alt="current_amplifier_tf.png" />
</p>
<p><span class="figure-number">Figure 12: </span>Transfer function for the current amplifier (<a href="./figs/current_amplifier_tf.png">png</a>, <a href="./figs/current_amplifier_tf.pdf">pdf</a>)</p>
</div>
<div class="important">
<p>
Over the frequency band of interest, the current amplifier transfer function \(G_i\) can be considered as constant.
This is the same for the impedance \(Z_c\).
</p>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Gi = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-3">(</span>Rh <span class="org-type">+</span> Rch<span class="org-rainbow-delimiters-depth-3">)</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-3">(</span>Rv <span class="org-type">+</span> Rcv<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Zc = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span>Rch, Rcv<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgc24d0bd" class="outline-4">
<h4 id="orgc24d0bd"><span class="section-number-4">2.2.3</span> Identified Transfer Functions</h4>
<div class="outline-text-4" id="text-2-2-3">
<p>
Noise is generated using the DAC (\([U_{c,h}\ U_{c,v}]\)) and we measure the output of the voltage amplifier \([V_{c,h}, V_{c,v}]\).
From that, we should be able to identify \(G_a Z_c G_i\).
</p>
<p>
The identification data is loaded.
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_uch.mat', 't', 'Uch', 'Vch'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_ucv.mat', 't', 'Ucv', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first seconds where the Cercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>GaZcGi_h, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vch, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>GaZcGi_v, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vcv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org96f6b44" class="figure">
<p><img src="figs/current_amplifier_comp_theory_id.png" alt="current_amplifier_comp_theory_id.png" />
</p>
<p><span class="figure-number">Figure 13: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id.pdf">pdf</a>)</p>
</div>
<p>
There is a gain mismatch, that is probably due to bad identification of the inductance and resistance measurement of the cercalo inductors.
Thus, we suppose \(G_a\) is perfectly known (the gain and cut-off frequency of the voltage amplifier is very accurate) and that \(G_i\) is also well determined as it mainly depends on the resistor used in the amplifier that is well measured.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gi_resp_h = abs<span class="org-rainbow-delimiters-depth-1">(</span>GaZcGi_h<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">./</span>squeeze<span class="org-rainbow-delimiters-depth-1">(</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>freqresp<span class="org-rainbow-delimiters-depth-3">(</span>Ga<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">1</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span>Zc<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">1</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-4">)</span>, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Gi_resp_v = abs<span class="org-rainbow-delimiters-depth-1">(</span>GaZcGi_v<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">./</span>squeeze<span class="org-rainbow-delimiters-depth-1">(</span>abs<span class="org-rainbow-delimiters-depth-2">(</span>freqresp<span class="org-rainbow-delimiters-depth-3">(</span>Ga<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">*</span>Zc<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span>, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Gi = tf<span class="org-rainbow-delimiters-depth-1">(</span>blkdiag<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>Gi_resp_h<span class="org-rainbow-delimiters-depth-4">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">20</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span>, mean<span class="org-rainbow-delimiters-depth-3">(</span>Gi_resp_v<span class="org-rainbow-delimiters-depth-4">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">20</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-highlight-numbers-number">200</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org4ac2439" class="figure">
<p><img src="figs/current_amplifier_comp_theory_id_bis.png" alt="current_amplifier_comp_theory_id_bis.png" />
</p>
<p><span class="figure-number">Figure 14: </span>Identified and Theoretical Transfer Function \(G_a G_i\) (<a href="./figs/current_amplifier_comp_theory_id_bis.png">png</a>, <a href="./figs/current_amplifier_comp_theory_id_bis.pdf">pdf</a>)</p>
</div>
<p>
Finally, we have the following transfer functions:
</p>
<pre class="example">
ans = filepath;
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
end
'org_babel_eoe'
Gi,Zc,Ga
'org_babel_eoe'
ans = filepath;
if ischar(ans), fid = fopen('/tmp/babel-ZKMGJu/matlab-FA7h5L', 'w'); fprintf(fid, '%s\n', ans); fclose(fid);
else, dlmwrite('/tmp/babel-ZKMGJu/matlab-FA7h5L', ans, '\t')
end
'org_babel_eoe'
ans =
'org_babel_eoe'
Gi,Zc,Ga
Gi =
From input 1 to output...
1: 0.01275
2: 0
From input 2 to output...
1: 0
2: 0.01382
Static gain.
Zc =
From input 1 to output...
1: 9.3
2: 0
From input 2 to output...
1: 0
2: 8.3
Static gain.
Ga =
From input 1 to output...
6.2832e+06
1: ----------
(s+6283)
2: 0
From input 2 to output...
1: 0
6.2832e+06
2: ----------
(s+6283)
Continuous-time zero/pole/gain model.
</pre>
</div>
</div>
</div>
<div id="outline-container-org8b914fd" class="outline-3">
<h3 id="org8b914fd"><span class="section-number-3">2.3</span> Identification of the Cercalo Dynamics</h3>
<div class="outline-text-3" id="text-2-3">
<p>
We now wish to identify the dynamics of the Cercalo identified by \(G_c\) on the block diagram in Fig. <a href="#org3b04014">1</a>.
</p>
<p>
To do so, we inject some noise at the input of the current amplifier \([U_{c,h},\ U_{c,v}]\) (one input after the other) and we measure simultaneously the output of the 4QD \([V_{p,h},\ V_{p,v}]\).
</p>
<p>
The transfer function obtained will be \(G_c G_i\), and because we have already identified \(G_i\), we can obtain \(G_c\) by multiplying the obtained transfer function matrix by \({G_i}^{-1}\).
</p>
</div>
<div id="outline-container-org45f478a" class="outline-4">
<h4 id="org45f478a"><span class="section-number-4">2.3.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-3-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_uch.mat', 't', 'Uch', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_ucv.mat', 't', 'Ucv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first seconds where the Cercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
uh.Uch<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
t0 = <span class="org-highlight-numbers-number">1</span>;
uv.Ucv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
</pre>
</div>
<div id="org11b6434" class="figure">
<p><img src="figs/identification_uh.png" alt="identification_uh.png" />
</p>
<p><span class="figure-number">Figure 15: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_uh.png">png</a>, <a href="./figs/identification_uh.pdf">pdf</a>)</p>
</div>
<div id="org12f9542" class="figure">
<p><img src="figs/identification_uv.png" alt="identification_uv.png" />
</p>
<p><span class="figure-number">Figure 16: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_uv.png">png</a>, <a href="./figs/identification_uv.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orga76fba2" class="outline-4">
<h4 id="orga76fba2"><span class="section-number-4">2.3.2</span> Coherence</h4>
<div class="outline-text-4" id="text-2-3-2">
<p>
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>coh_Uch_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Uch_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Ucv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Ucv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org7963278" class="figure">
<p><img src="figs/coh_cercalo.png" alt="coh_cercalo.png" />
</p>
<p><span class="figure-number">Figure 17: </span>Coherence (<a href="./figs/coh_cercalo.png">png</a>, <a href="./figs/coh_cercalo.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org131ac39" class="outline-4">
<h4 id="org131ac39"><span class="section-number-4">2.3.3</span> Estimation of the Frequency Response Function Matrix</h4>
<div class="outline-text-4" id="text-2-3-3">
<p>
We compute an estimate of the transfer functions.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>tf_Uch_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Uch_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Uch, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Ucv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Ucv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Ucv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org7bbc71b" class="figure">
<p><img src="figs/frf_cercalo_gain.png" alt="frf_cercalo_gain.png" />
</p>
<p><span class="figure-number">Figure 18: </span>Frequency Response Matrix (<a href="./figs/frf_cercalo_gain.png">png</a>, <a href="./figs/frf_cercalo_gain.pdf">pdf</a>)</p>
</div>
<div id="orge616ff8" class="figure">
<p><img src="figs/frf_cercalo_phase.png" alt="frf_cercalo_phase.png" />
</p>
<p><span class="figure-number">Figure 19: </span>Frequency Response Matrix<sub>Phase</sub> (<a href="./figs/frf_cercalo_phase.png">png</a>, <a href="./figs/frf_cercalo_phase.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgf0a3476" class="outline-4">
<h4 id="orgf0a3476"><span class="section-number-4">2.3.4</span> Time Delay</h4>
<div class="outline-text-4" id="text-2-3-4">
<p>
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
</p>
<p>
Estimation of the time delay:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts_delay = Ts; <span class="org-comment">% [s]</span>
G_delay = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-string">'InputDelay'</span>, Ts_delay<span class="org-rainbow-delimiters-depth-1">)</span>;
G_delay_resp = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>freqresp<span class="org-rainbow-delimiters-depth-2">(</span>G_delay, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We then remove the time delay from the frequency response function.
</p>
<div class="org-src-container">
<pre class="src src-matlab">tf_Uch_Vph = tf_Uch_Vph<span class="org-type">./</span>G_delay_resp;
tf_Uch_Vpv = tf_Uch_Vpv<span class="org-type">./</span>G_delay_resp;
tf_Ucv_Vph = tf_Ucv_Vph<span class="org-type">./</span>G_delay_resp;
tf_Ucv_Vpv = tf_Ucv_Vpv<span class="org-type">./</span>G_delay_resp;
</pre>
</div>
</div>
</div>
<div id="outline-container-org0174055" class="outline-4">
<h4 id="org0174055"><span class="section-number-4">2.3.5</span> Extraction of a transfer function matrix</h4>
<div class="outline-text-4" id="text-2-3-5">
<p>
First we define the initial guess for the resonance frequencies and the weights associated.
</p>
<div class="org-src-container">
<pre class="src src-matlab">freqs_res_uh = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">410</span><span class="org-rainbow-delimiters-depth-1">]</span>; <span class="org-comment">% [Hz]</span>
freqs_res_uv = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">250</span><span class="org-rainbow-delimiters-depth-1">]</span>; <span class="org-comment">% [Hz]</span>
</pre>
</div>
<p>
We then make an initial guess on the complex values of the poles.
</p>
<div class="org-src-container">
<pre class="src src-matlab">xi = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">001</span>; <span class="org-comment">% Approximate modal damping</span>
poles_uh = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">+</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uh<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">-</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">]</span>;
poles_uv = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">+</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>freqs_res_uv<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>xi <span class="org-type">-</span> <span class="org-highlight-numbers-number">1i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">]</span>;
</pre>
</div>
<p>
We then define the weight that will be used for the fitting.
Basically, we want more weight around the resonance and at low frequency (below the first resonance).
Also, we want more importance where we have a better coherence.
Finally, we ignore data above some frequency.
</p>
<div class="org-src-container">
<pre class="src src-matlab">weight_Uch_Vph = coh_Uch_Vph';
weight_Uch_Vpv = coh_Uch_Vpv';
weight_Ucv_Vph = coh_Ucv_Vph';
weight_Ucv_Vpv = coh_Ucv_Vpv';
alpha = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">1</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">freq_i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs_res_uh</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
weight_Uch_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
weight_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uh<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
weight_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
weight_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">-</span>alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span> <span class="org-type">+</span> alpha<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>freqs_res_uv<span class="org-rainbow-delimiters-depth-2">(</span>freq_i<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">10</span>;
<span class="org-keyword">end</span>
weight_Uch_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
weight_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
weight_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
weight_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-highlight-numbers-number">0</span>;
</pre>
</div>
<p>
The weights are shown in Fig. <a href="#org38a4998">20</a>.
</p>
<div id="org38a4998" class="figure">
<p><img src="figs/weights_cercalo.png" alt="weights_cercalo.png" />
</p>
<p><span class="figure-number">Figure 20: </span>Weights amplitude (<a href="./figs/weights_cercalo.png">png</a>, <a href="./figs/weights_cercalo.pdf">pdf</a>)</p>
</div>
<p>
When we set some options for <code>vfit3</code>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">opts = struct<span class="org-rainbow-delimiters-depth-1">()</span>;
opts.stable = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Enforce stable poles</span>
opts.asymp = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Force D matrix to be null</span>
opts.relax = <span class="org-highlight-numbers-number">1</span>; <span class="org-comment">% Use vector fitting with relaxed non-triviality constraint</span>
opts.skip_pole = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Do NOT skip pole identification</span>
opts.skip_res = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Do NOT skip identification of residues (C,D,E)</span>
opts.cmplx_ss = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Create real state space model with block diagonal A</span>
opts.spy1 = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% No plotting for first stage of vector fitting</span>
opts.spy2 = <span class="org-highlight-numbers-number">0</span>; <span class="org-comment">% Create magnitude plot for fitting of f(s)</span>
</pre>
</div>
<p>
We define the number of iteration.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Niter = <span class="org-highlight-numbers-number">5</span>;
</pre>
</div>
<p>
An we run the <code>vectfit3</code> algorithm.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Uch_Vph, poles, <span class="org-type">~</span>, fit_Uch_Vph<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Uch_Vph<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vph, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Uch_Vpv, poles, <span class="org-type">~</span>, fit_Uch_Vpv<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Uch_Vpv<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uh, weight_Uch_Vpv, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Ucv_Vph, poles, <span class="org-type">~</span>, fit_Ucv_Vph<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Ucv_Vph<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vph, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
<span class="org-keyword">for</span> <span class="org-variable-name">iter</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:Niter</span>
<span class="org-rainbow-delimiters-depth-1">[</span>SER_Ucv_Vpv, poles, <span class="org-type">~</span>, fit_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">]</span> = vectfit3<span class="org-rainbow-delimiters-depth-1">(</span>tf_Ucv_Vpv<span class="org-type">.'</span>, <span class="org-highlight-numbers-number">1i</span><span class="org-type">*</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>f, poles_uv, weight_Ucv_Vpv, opts<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
</pre>
</div>
<div id="org6e49a66" class="figure">
<p><img src="figs/identification_matrix_fit.png" alt="identification_matrix_fit.png" />
</p>
<p><span class="figure-number">Figure 21: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit.png">png</a>, <a href="./figs/identification_matrix_fit.pdf">pdf</a>)</p>
</div>
<div id="orgfafe5c8" class="figure">
<p><img src="figs/identification_matrix_fit_phase.png" alt="identification_matrix_fit_phase.png" />
</p>
<p><span class="figure-number">Figure 22: </span>Transfer Function Extraction of the FRF matrix (<a href="./figs/identification_matrix_fit_phase.png">png</a>, <a href="./figs/identification_matrix_fit_phase.pdf">pdf</a>)</p>
</div>
<p>
And finally, we create the identified \(G_c\) matrix by multiplying by \({G_i}^{-1}\).
</p>
<div class="org-src-container">
<pre class="src src-matlab">G_Uch_Vph = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Uch_Vph.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Uch_Vph.B,SER_Uch_Vph.C,SER_Uch_Vph.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
G_Ucv_Vph = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Ucv_Vph.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Ucv_Vph.B,SER_Ucv_Vph.C,SER_Ucv_Vph.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
G_Uch_Vpv = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Uch_Vpv.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Uch_Vpv.B,SER_Uch_Vpv.C,SER_Uch_Vpv.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
G_Ucv_Vpv = tf<span class="org-rainbow-delimiters-depth-1">(</span>minreal<span class="org-rainbow-delimiters-depth-2">(</span>ss<span class="org-rainbow-delimiters-depth-3">(</span>full<span class="org-rainbow-delimiters-depth-4">(</span>SER_Ucv_Vpv.A<span class="org-rainbow-delimiters-depth-4">)</span>,SER_Ucv_Vpv.B,SER_Ucv_Vpv.C,SER_Ucv_Vpv.D<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Gc = <span class="org-rainbow-delimiters-depth-1">[</span>G_Uch_Vph, G_Ucv_Vph;
G_Uch_Vpv, G_Ucv_Vpv<span class="org-rainbow-delimiters-depth-1">]</span><span class="org-type">*</span>inv<span class="org-rainbow-delimiters-depth-1">(</span>Gi<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org29f709e" class="outline-3">
<h3 id="org29f709e"><span class="section-number-3">2.4</span> Identification of the Newport Dynamics</h3>
<div class="outline-text-3" id="text-2-4">
<p>
We here identify the transfer function from a reference sent to the Newport \([U_{n,h},\ U_{n,v}]\) to the measurement made by the 4QD \([V_{p,h},\ V_{p,v}]\).
</p>
<p>
To do so, we inject noise to the Newport \([U_{n,h},\ U_{n,v}]\) and we record the 4QD measurement \([V_{p,h},\ V_{p,v}]\).
</p>
</div>
<div id="outline-container-org18a03ed" class="outline-4">
<h4 id="org18a03ed"><span class="section-number-4">2.4.1</span> Input / Output data</h4>
<div class="outline-text-4" id="text-2-4-1">
<p>
The identification data is loaded
</p>
<div class="org-src-container">
<pre class="src src-matlab">uh = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_unh.mat', 't', 'Unh', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
uv = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_unv.mat', 't', 'Unv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first seconds where the Cercalo is turned on.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">3</span>;
uh.Unh<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t<span class="org-rainbow-delimiters-depth-1">(</span>uh.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uh.t = uh.t <span class="org-type">-</span> uh.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
t0 = <span class="org-highlight-numbers-number">1</span>.<span class="org-highlight-numbers-number">5</span>;
uv.Unv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vph<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.Vpv<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t<span class="org-rainbow-delimiters-depth-1">(</span>uv.t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
uv.t = uv.t <span class="org-type">-</span> uv.t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
</pre>
</div>
<div id="org906edc3" class="figure">
<p><img src="figs/identification_unh.png" alt="identification_unh.png" />
</p>
<p><span class="figure-number">Figure 23: </span>Identification signals when exciting the horizontal direction (<a href="./figs/identification_unh.png">png</a>, <a href="./figs/identification_unh.pdf">pdf</a>)</p>
</div>
<div id="org32607b6" class="figure">
<p><img src="figs/identification_unv.png" alt="identification_unv.png" />
</p>
<p><span class="figure-number">Figure 24: </span>Identification signals when exciting in the vertical direction (<a href="./figs/identification_unv.png">png</a>, <a href="./figs/identification_unv.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org978a0c9" class="outline-4">
<h4 id="org978a0c9"><span class="section-number-4">2.4.2</span> Coherence</h4>
<div class="outline-text-4" id="text-2-4-2">
<p>
The window used for the spectral analysis is an <code>hanning</code> windows with temporal size equal to 1 second.
</p>
<div class="org-src-container">
<pre class="src src-matlab">win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>ceil<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>coh_Unh_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unh_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>coh_Unv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = mscohere<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org69a538e" class="figure">
<p><img src="figs/id_newport_coherence.png" alt="id_newport_coherence.png" />
</p>
<p><span class="figure-number">Figure 25: </span>Coherence (<a href="./figs/id_newport_coherence.png">png</a>, <a href="./figs/id_newport_coherence.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgc0c5d02" class="outline-4">
<h4 id="orgc0c5d02"><span class="section-number-4">2.4.3</span> Estimation of the Frequency Response Function Matrix</h4>
<div class="outline-text-4" id="text-2-4-3">
<p>
We compute an estimate of the transfer functions.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>tf_Unh_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unh_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uh.Unh, uh.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unv_Vph, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vph, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>tf_Unv_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = tfestimate<span class="org-rainbow-delimiters-depth-1">(</span>uv.Unv, uv.Vpv, win, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org2cdb3e3" class="figure">
<p><img src="figs/frf_newport_gain.png" alt="frf_newport_gain.png" />
</p>
<p><span class="figure-number">Figure 26: </span>Frequency Response Matrix (<a href="./figs/frf_newport_gain.png">png</a>, <a href="./figs/frf_newport_gain.pdf">pdf</a>)</p>
</div>
<div id="org02a1305" class="figure">
<p><img src="figs/frf_newport_phase.png" alt="frf_newport_phase.png" />
</p>
<p><span class="figure-number">Figure 27: </span>Frequency Response Matrix Phase (<a href="./figs/frf_newport_phase.png">png</a>, <a href="./figs/frf_newport_phase.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgdfcee7e" class="outline-4">
<h4 id="orgdfcee7e"><span class="section-number-4">2.4.4</span> Time Delay</h4>
<div class="outline-text-4" id="text-2-4-4">
<p>
Now, we would like to remove the time delay included in the FRF prior to the model extraction.
</p>
<p>
Estimation of the time delay:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Ts_delay = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">0005</span>; <span class="org-comment">% [s]</span>
G_delay = tf<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1</span>, <span class="org-string">'InputDelay'</span>, Ts_delay<span class="org-rainbow-delimiters-depth-1">)</span>;
G_delay_resp = squeeze<span class="org-rainbow-delimiters-depth-1">(</span>freqresp<span class="org-rainbow-delimiters-depth-2">(</span>G_delay, f, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We then remove the time delay from the frequency response function.
</p>
<div id="org28407ed" class="figure">
<p><img src="figs/time_delay_newport.png" alt="time_delay_newport.png" />
</p>
<p><span class="figure-number">Figure 28: </span>Phase change due to time-delay in the Newport dynamics (<a href="./figs/time_delay_newport.png">png</a>, <a href="./figs/time_delay_newport.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org314a223" class="outline-4">
<h4 id="org314a223"><span class="section-number-4">2.4.5</span> Extraction of a transfer function matrix</h4>
<div class="outline-text-4" id="text-2-4-5">
<p>
From Fig. <a href="#org2cdb3e3">26</a>, it seems reasonable to model the Newport dynamics as diagonal and constant.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gn = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>tf<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>abs<span class="org-rainbow-delimiters-depth-4">(</span>tf_Unh_Vph<span class="org-rainbow-delimiters-depth-5">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">10</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-highlight-numbers-number">100</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, tf<span class="org-rainbow-delimiters-depth-2">(</span>mean<span class="org-rainbow-delimiters-depth-3">(</span>abs<span class="org-rainbow-delimiters-depth-4">(</span>tf_Unv_Vpv<span class="org-rainbow-delimiters-depth-5">(</span>f<span class="org-type">&gt;</span><span class="org-highlight-numbers-number">10</span> <span class="org-type">&amp;</span> f<span class="org-type">&lt;</span><span class="org-highlight-numbers-number">100</span><span class="org-rainbow-delimiters-depth-5">)</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org8fe71fd" class="outline-3">
<h3 id="org8fe71fd"><span class="section-number-3">2.5</span> Full System</h3>
<div class="outline-text-3" id="text-2-5">
<p>
We now have identified:
</p>
<ul class="org-ul">
<li>\(G_i\)</li>
<li>\(G_a\)</li>
<li>\(G_c\)</li>
<li>\(G_n\)</li>
<li>\(G_d\)</li>
</ul>
<p>
We name the input and output of each transfer function:
</p>
<div class="org-src-container">
<pre class="src src-matlab">Gi.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gi.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Zc.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Zc.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vtch', 'Vtcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Ga.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vtch', 'Vtcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Ga.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gc.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gc.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vpch', 'Vpcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gn.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gn.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vpnh', 'Vpnv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gd.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Rh', 'Rv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Gd.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Sh = sumblk<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Vph = Vpch + Vpnh'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Sv = sumblk<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Vpv = Vpcv + Vpnv'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv', 'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
sys = connect<span class="org-rainbow-delimiters-depth-1">(</span>Gi, Zc, Ga, Gc, Gn, inv<span class="org-rainbow-delimiters-depth-2">(</span>Gd<span class="org-rainbow-delimiters-depth-2">)</span>, Sh, Sv, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
The file <code>mat/plant.mat</code> is accessible <a href="./mat/plant.mat">here</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">save<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org07fb936" class="outline-2">
<h2 id="org07fb936"><span class="section-number-2">3</span> Active Damping</h2>
<div class="outline-text-2" id="text-3">
</div>
<div id="outline-container-org07da045" class="outline-3">
<h3 id="org07da045"><span class="section-number-3">3.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-3-1">
<div class="org-src-container">
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-orge1669f2" class="outline-3">
<h3 id="orge1669f2"><span class="section-number-3">3.2</span> Test</h3>
<div class="outline-text-3" id="text-3-2">
<div class="org-src-container">
<pre class="src src-matlab">bode<span class="org-rainbow-delimiters-depth-1">(</span>sys<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">Kppf = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">-</span><span class="org-highlight-numbers-number">10000</span><span class="org-type">/</span>s, tf<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Kppf.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
Kppf.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
sys_cl = connect<span class="org-rainbow-delimiters-depth-1">(</span>sys, Kppf, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-type">figure</span>; bode<span class="org-rainbow-delimiters-depth-1">(</span>sys_cl<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-rainbow-delimiters-depth-3">{</span><span class="org-string">'Vph', 'Vpv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">)</span></span><span class="org-string">, sys</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">(</span></span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Vph', 'Vpv'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">, </span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgf4f85b9" class="outline-2">
<h2 id="orgf4f85b9"><span class="section-number-2">4</span> <span class="todo TODO">TODO</span> Huddle Test</h2>
<div class="outline-text-2" id="text-4">
<p>
We load the data taken during the Huddle Test.
</p>
<div class="org-src-container">
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_huddle_test.mat'</span>, <span class="org-underline">...</span>
<span class="org-string">'t', 'Uch', 'Ucv'</span>, <span class="org-underline">...</span>
<span class="org-string">'Unh', 'Unv'</span>, <span class="org-underline">...</span>
<span class="org-string">'Vph', 'Vpv'</span>, <span class="org-underline">...</span>
<span class="org-string">'Vch', 'Vcv'</span>, <span class="org-underline">...</span>
<span class="org-string">'Vnh', 'Vnv'</span>, <span class="org-underline">...</span>
<span class="org-string">'Va'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first second of data where everything is settling down.
</p>
<div class="org-src-container">
<pre class="src src-matlab">t0 = <span class="org-highlight-numbers-number">1</span>;
Uch<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Ucv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Unh<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Unv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vph<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vpv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vch<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vcv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vnh<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Vnv<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
Va<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
t<span class="org-rainbow-delimiters-depth-1">(</span>t<span class="org-type">&lt;</span>t0<span class="org-rainbow-delimiters-depth-1">)</span> = <span class="org-rainbow-delimiters-depth-1">[]</span>;
t = t <span class="org-type">-</span> t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; % We start at t=<span class="org-highlight-numbers-number">0</span>
</pre>
</div>
<p>
We compute the Power Spectral Density of the horizontal and vertical positions of the beam as measured by the 4 quadrant diode.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>psd_Vph, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vph, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>psd_Vpv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vpv, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
hold on;
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vph<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vp_h<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vpv<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vp_v<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
hold off;
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'yscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; ylabel</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">'</span>ASD $<span class="org-type">\</span>left<span class="org-rainbow-delimiters-depth-2">[</span><span class="org-type">\</span>frac<span class="org-rainbow-delimiters-depth-3">{</span>V<span class="org-rainbow-delimiters-depth-3">}{</span><span class="org-type">\</span>sqrt<span class="org-rainbow-delimiters-depth-4">{</span>Hz<span class="org-rainbow-delimiters-depth-4">}</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-type">\</span>right<span class="org-rainbow-delimiters-depth-2">]</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>
legend<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Location', 'southwest'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
xlim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We compute the Power Spectral Density of the voltage across the inductance used for horizontal and vertical positioning of the Cercalo.
</p>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-rainbow-delimiters-depth-1">[</span>psd_Vch, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vch, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>psd_Vcv, <span class="org-type">~</span><span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>Vcv, hanning<span class="org-rainbow-delimiters-depth-2">(</span>ceil<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">*</span>fs<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
hold on;
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vch<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vc_h<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>psd_Vcv<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-string">'DisplayName', '</span>$<span class="org-type">\</span>Gamma_<span class="org-rainbow-delimiters-depth-2">{</span>Vc_v<span class="org-rainbow-delimiters-depth-2">}</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>;
hold off;
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; set</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">gca, 'yscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Frequency </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">'</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">)</span></span><span class="org-string">; ylabel</span><span class="org-string"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-string">'</span>ASD $<span class="org-type">\</span>left<span class="org-rainbow-delimiters-depth-2">[</span><span class="org-type">\</span>frac<span class="org-rainbow-delimiters-depth-3">{</span>V<span class="org-rainbow-delimiters-depth-3">}{</span><span class="org-type">\</span>sqrt<span class="org-rainbow-delimiters-depth-4">{</span>Hz<span class="org-rainbow-delimiters-depth-4">}</span><span class="org-rainbow-delimiters-depth-3">}</span><span class="org-type">\</span>right<span class="org-rainbow-delimiters-depth-2">]</span>$'<span class="org-rainbow-delimiters-depth-1">)</span>
legend<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Location', 'southwest'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
xlim<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">[</span><span class="org-highlight-numbers-number">1</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-2">]</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org03828c5" class="outline-2">
<h2 id="org03828c5"><span class="section-number-2">5</span> Plant Scaling</h2>
<div class="outline-text-2" id="text-5">
<ul class="org-ul">
<li>measured noise</li>
<li>expected perturbations</li>
<li>maximum input usage</li>
<li>maximum wanted error</li>
</ul>
</div>
</div>
<div id="outline-container-org8254d1a" class="outline-2">
<h2 id="org8254d1a"><span class="section-number-2">6</span> Plant Analysis</h2>
<div class="outline-text-2" id="text-6">
</div>
<div id="outline-container-org592969b" class="outline-3">
<h3 id="org592969b"><span class="section-number-3">6.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-6-1">
<div class="org-src-container">
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'G'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org966d85b" class="outline-3">
<h3 id="org966d85b"><span class="section-number-3">6.2</span> RGA-Number</h3>
<div class="outline-text-3" id="text-6-2">
<div class="org-src-container">
<pre class="src src-matlab">freqs = logspace<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">4</span>, <span class="org-highlight-numbers-number">1000</span><span class="org-rainbow-delimiters-depth-1">)</span>;
G_resp = freqresp<span class="org-rainbow-delimiters-depth-1">(</span>G, freqs, <span class="org-string">'Hz'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
A = zeros<span class="org-rainbow-delimiters-depth-1">(</span>size<span class="org-rainbow-delimiters-depth-2">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
RGAnum = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
A<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = G_resp<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">.*</span>inv<span class="org-rainbow-delimiters-depth-1">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>';
RGAnum<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = sum<span class="org-rainbow-delimiters-depth-1">(</span>sum<span class="org-rainbow-delimiters-depth-2">(</span>abs<span class="org-rainbow-delimiters-depth-3">(</span>A<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-type">-</span>eye<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-4">)</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
<span class="org-comment">% </span><span class="org-comment"><span class="org-constant">RGA </span></span><span class="org-comment">= G0.*inv(G0)';</span>
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
plot<span class="org-rainbow-delimiters-depth-1">(</span>freqs, RGAnum<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-type">set</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-variable-name">gca</span>, <span class="org-string">'xscale', 'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">U = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
S = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>
V = zeros<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span>, <span class="org-highlight-numbers-number">2</span>, length<span class="org-rainbow-delimiters-depth-2">(</span>freqs<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">for</span> <span class="org-variable-name">i</span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:length</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">(</span></span><span class="org-constant">freqs</span><span class="org-constant"><span class="org-rainbow-delimiters-depth-1">)</span></span>
<span class="org-rainbow-delimiters-depth-1">[</span>Ui, Si, Vi<span class="org-rainbow-delimiters-depth-1">]</span> = svd<span class="org-rainbow-delimiters-depth-1">(</span>G_resp<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
U<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Ui;
S<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Si;
V<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-type">:</span>, <span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = Vi;
<span class="org-keyword">end</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org7063733" class="outline-3">
<h3 id="org7063733"><span class="section-number-3">6.3</span> Rotation Matrix</h3>
<div class="outline-text-3" id="text-6-3">
<div class="org-src-container">
<pre class="src src-matlab">G0 = freqresp<span class="org-rainbow-delimiters-depth-1">(</span>G, <span class="org-highlight-numbers-number">0</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-org759298e" class="outline-2">
<h2 id="org759298e"><span class="section-number-2">7</span> Control Objective</h2>
<div class="outline-text-2" id="text-7">
<p>
The maximum expected stroke is \(y_\text{max} = 3mm \approx 5e^{-2} rad\) at \(1Hz\).
The maximum wanted error is \(e_\text{max} = 10 \mu rad\).
</p>
<p>
Thus, we require the sensitivity function at \(\omega_0 = 1\text{ Hz}\):
</p>
\begin{align*}
|S(j\omega_0)| &< \left| \frac{e_\text{max}}{y_\text{max}} \right| \\
&< 2 \cdot 10^{-4}
\end{align*}
<p>
In terms of loop gain, this is equivalent to:
\[ |L(j\omega_0)| > 5 \cdot 10^{3} \]
</p>
</div>
</div>
<div id="outline-container-org96df63d" class="outline-2">
<h2 id="org96df63d"><span class="section-number-2">8</span> Decentralized Control</h2>
<div class="outline-text-2" id="text-8">
<p>
<a id="org4e742a7"></a>
</p>
<p>
In this section, we try to implement a simple decentralized controller.
</p>
<div class="note">
<p>
All the files (data and Matlab scripts) are accessible <a href="data/decentralized_control.zip">here</a>.
</p>
</div>
</div>
<div id="outline-container-orgde6febc" class="outline-3">
<h3 id="orgde6febc"><span class="section-number-3">8.1</span> Load Plant</h3>
<div class="outline-text-3" id="text-8-1">
<div class="org-src-container">
<pre class="src src-matlab">load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/plant.mat', 'sys', 'Gi', 'Zc', 'Ga', 'Gc', 'Gn', 'Gd'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-orgf815918" class="outline-3">
<h3 id="orgf815918"><span class="section-number-3">8.2</span> Diagonal Controller</h3>
<div class="outline-text-3" id="text-8-2">
<p>
Using <code>SISOTOOL</code>, a diagonal controller is designed.
The two SISO loop gains are shown in Fig. <a href="#org8ca046f">29</a>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Kh = <span class="org-type">-</span><span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">25598</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">112</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span> <span class="org-type">+</span> <span class="org-highlight-numbers-number">15</span>.<span class="org-highlight-numbers-number">93</span><span class="org-type">*</span>s <span class="org-type">+</span> <span class="org-highlight-numbers-number">6</span>.<span class="org-highlight-numbers-number">686e06</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-3">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">352</span>.<span class="org-highlight-numbers-number">5</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">+</span>s<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-type">/</span><span class="org-constant">pi</span><span class="org-type">/</span><span class="org-highlight-numbers-number">2000</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
Kv = <span class="org-highlight-numbers-number">10207</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">55</span>.<span class="org-highlight-numbers-number">15</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span> <span class="org-type">+</span> <span class="org-highlight-numbers-number">17</span>.<span class="org-highlight-numbers-number">45</span><span class="org-type">*</span>s <span class="org-type">+</span> <span class="org-highlight-numbers-number">2</span>.<span class="org-highlight-numbers-number">491e06</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span>s<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">491</span>.<span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span><span class="org-rainbow-delimiters-depth-2">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">7695</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
K = blkdiag<span class="org-rainbow-delimiters-depth-1">(</span>Kh, Kv<span class="org-rainbow-delimiters-depth-1">)</span>;
K.InputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Rh', 'Rv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
K.OutputName = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
</pre>
</div>
<div id="org8ca046f" class="figure">
<p><img src="figs/diag_contr_loop_gain.png" alt="diag_contr_loop_gain.png" />
</p>
<p><span class="figure-number">Figure 29: </span>Loop Gain using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_loop_gain.png">png</a>, <a href="./figs/diag_contr_loop_gain.pdf">pdf</a>)</p>
</div>
<p>
We then close the loop and we look at the transfer function from the Newport rotation signal to the beam angle (Fig. <a href="#org1a57ffe">30</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">inputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Uch', 'Ucv', 'Unh', 'Unv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
outputs = <span class="org-rainbow-delimiters-depth-1">{</span><span class="org-string">'Vch', 'Vcv', 'Ich', 'Icv', 'Rh', 'Rv', 'Vph', 'Vpv'</span><span class="org-rainbow-delimiters-depth-1">}</span>;
sys_cl = connect<span class="org-rainbow-delimiters-depth-1">(</span>sys, <span class="org-type">-</span>K, inputs, outputs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org1a57ffe" class="figure">
<p><img src="figs/diag_contr_effect_newport.png" alt="diag_contr_effect_newport.png" />
</p>
<p><span class="figure-number">Figure 30: </span>Effect of the Newport rotation on the beam position when the loop is closed using the Decentralized Diagonal Controller (<a href="./figs/diag_contr_effect_newport.png">png</a>, <a href="./figs/diag_contr_effect_newport.pdf">pdf</a>)</p>
</div>
</div>
</div>
</div>
<div id="outline-container-orge641704" class="outline-2">
<h2 id="orge641704"><span class="section-number-2">9</span> Measurement of the non-repeatability</h2>
</div>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2019-09-17 mar. 15:53</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>
</html>