Add analysis on the generation of time domain signal to match a PSD

This commit is contained in:
2019-12-02 11:23:50 +01:00
parent 37c44ee0d9
commit aaaf94f7c3
12 changed files with 1062 additions and 57 deletions

View File

@@ -3,7 +3,7 @@
"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-08-15 jeu. 12:31 -->
<!-- 2019-12-02 lun. 11:22 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Compute Spectral Densities of signals with Matlab</title>
@@ -270,29 +270,77 @@ for the JavaScript code in this tag.
src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS_HTML"></script>
</head>
<body>
<div id="org-div-home-and-up">
<a accesskey="h" href="./index.html"> UP </a>
|
<a accesskey="H" href="./index.html"> HOME </a>
</div><div id="content">
<div id="content">
<h1 class="title">Compute Spectral Densities of signals with Matlab</h1>
<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org7cc41f2">1. Sensitivity of the instrumentation</a></li>
<li><a href="#orgac6792b">2. Convert the time domain from volts to velocity</a></li>
<li><a href="#org01a363c">3. Power Spectral Density and Amplitude Spectral Density</a></li>
<li><a href="#org90edcdd">4. Modification of a signal's Power Spectral Density when going through an LTI system</a></li>
<li><a href="#orgfb2734c">5. From PSD of the velocity to the PSD of the displacement</a></li>
<li><a href="#org9310776">1. Spectral Analysis - Basics</a>
<ul>
<li><a href="#org2041123">1.1. PSD of ADC quantization noise</a></li>
<li><a href="#orgb854582">1.2. Sensitivity of the instrumentation</a></li>
<li><a href="#org78ed1de">1.3. Convert the time domain from volts to velocity</a></li>
<li><a href="#org8775e6e">1.4. Power Spectral Density and Amplitude Spectral Density</a></li>
<li><a href="#orgcba62e6">1.5. Modification of a signal's Power Spectral Density when going through an LTI system</a></li>
<li><a href="#org3adf2bb">1.6. From PSD of the velocity to the PSD of the displacement</a></li>
<li><a href="#org83b26dc">1.7. Cumulative Power/Amplitude Spectrum</a></li>
<li><a href="#org5ace856">1.8. <span class="todo TODO">TODO</span> Add best practices from the Article and simple snippet that works</a></li>
</ul>
</li>
<li><a href="#orga6e1da0">2. Technique 1 : Approximation with a transfer function</a>
<ul>
<li><a href="#orge44fa26">2.1. Signal's PSD</a></li>
<li><a href="#org35e87c7">2.2. Transfer Function that approximate the ASD</a></li>
<li><a href="#org5b0597b">2.3. Generated Time domain signal</a></li>
<li><a href="#org2bb9116">2.4. Comparison of the Power Spectral Densities</a></li>
<li><a href="#org6d66594">2.5. Simulink</a></li>
</ul>
</li>
<li><a href="#orgd4fbbd9">3. Technique 2 : IFFT</a>
<ul>
<li><a href="#org98e4f2a">3.1. Signal's PSD</a></li>
<li><a href="#orgcb607b3">3.2. Algorithm</a></li>
<li><a href="#org4ff718c">3.3. Obtained Time Domain Signal</a></li>
<li><a href="#orgc9527e8">3.4. PSD Comparison</a></li>
</ul>
</li>
<li><a href="#org7fe2f42">4. <span class="todo TODO">TODO</span> Compute the Noise level and Signal level from PSD</a>
<ul>
<li><a href="#org640e940">4.1. Computation</a></li>
</ul>
</li>
</ul>
</div>
</div>
<p>
This document presents the mathematics as well as the matlab scripts to do the spectral analysis of a measured signal.
This document presents the mathematics as well as the matlab scripts to do various spectral analysis on a measured signal.
</p>
<p>
Some matlab documentation about Spectral Analysis can be found <a href="https://fr.mathworks.com/help/signal/ug/spectral-analysis.html">here</a>.
</p>
<p>
First, in section <a href="#orgd149260">1</a>, some basics of spectral analysis are presented.
</p>
<p>
In some cases, we want to generate a time domain signal with defined Power Spectral Density.
Two methods are presented in sections <a href="#org2ea1c7b">2</a> and <a href="#org84b5cd1">3</a>.
</p>
<p>
Finally, some notes are done on how to compute the noise level and signal level from a given Power Spectral Density in section <a href="#org7bce553">4</a>.
</p>
<div id="outline-container-org9310776" class="outline-2">
<h2 id="org9310776"><span class="section-number-2">1</span> Spectral Analysis - Basics</h2>
<div class="outline-text-2" id="text-1">
<p>
<a id="orgd149260"></a>
</p>
<p>
Typically this signal is coming from an inertial sensor, a force sensor or any other sensor.
</p>
@@ -300,10 +348,85 @@ Typically this signal is coming from an inertial sensor, a force sensor or any o
<p>
We here take the example of a signal coming from a Geophone measurement the vertical velocity of the floor at the ESRF.
</p>
</div>
<div id="outline-container-org7cc41f2" class="outline-2">
<h2 id="org7cc41f2"><span class="section-number-2">1</span> Sensitivity of the instrumentation</h2>
<div class="outline-text-2" id="text-1">
<div id="outline-container-org2041123" class="outline-3">
<h3 id="org2041123"><span class="section-number-3">1.1</span> PSD of ADC quantization noise</h3>
<div class="outline-text-3" id="text-1-1">
<p>
This is taken from <a href="https://www.allaboutcircuits.com/technical-articles/quantization-nois-amplitude-quantization-error-analog-to-digital-converters/">here</a>.
</p>
<p>
Let's note:
</p>
<ul class="org-ul">
<li>\(q\) is the corresponding value in [V] of the least significant bit (LSB)</li>
<li>\(\Delta V\) is the full range of the ADC in [V]</li>
<li>\(n\) is the number of ADC's bits</li>
<li>\(f_s\) is the sample frequency in [Hz]</li>
</ul>
<p>
Let's suppose that the ADC is ideal.
The only noise comes from the quantization error.
Interestingly, the noise amplitude is uniformly distributed.
</p>
<p>
The quantization noise can take a value between \(\pm q/2\), and the probability density function is constant in this range (i.e., its a uniform distribution).
Since the integral of the probability density function is equal to one, its value will be \(1/q\) for \(-q/2 < e < q/2\) (Fig. <a href="#orgee629ae">1</a>).
</p>
<div id="orgee629ae" class="figure">
<p><img src="figs/probability_density_function_adc.png" alt="probability_density_function_adc.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Probability density function \(p(e)\) of the ADC error \(e\)</p>
</div>
<p>
Now, we can calculate the time average power of the quantization noise as
</p>
\begin{equation}
P_q = \int_{-q/2}^{q/2} e^2 p(e) de = \frac{q^2}{12}
\end{equation}
<p>
The other important parameter of a noise source is the power spectral density (PSD), which indicates how the noise power spreads in different frequency bands.
To find the power spectral density, we need to calculate the Fourier transform of the autocorrelation function of the noise.
</p>
<p>
Assuming that the noise samples are not correlated with one another, we can approximate the autocorrelation function with a delta function in the time domain.
Since the Fourier transform of a delta function is equal to one, the <b>power spectral density will be frequency independent</b>.
Therefore, the quantization noise is white noise with total power equal to \(P_q = \frac{q^2}{12}\).
</p>
<p>
Thus, the two-sided PSD (from \(\frac{-f_s}{2}\) to \(\frac{f_s}{2}\)), we should divide the noise power \(P_q\) by \(f_s\):
</p>
\begin{equation}
\int_{-f_s/2}^{f_s/2} \Gamma(f) d f = f_s \Gamma = \frac{q^2}{12}
\end{equation}
<p>
Finally:
</p>
\begin{equation}
\begin{align}
\Gamma &= \frac{q^2}{12 f_s} \\
&= \frac{\left(\frac{\Delta V}{2^n}\right)^2}{12 f_s} \text{ in } \left[ \frac{V^2}{Hz} \right]
\end{align}
\end{equation}
</div>
</div>
<div id="outline-container-orgb854582" class="outline-3">
<h3 id="orgb854582"><span class="section-number-3">1.2</span> Sensitivity of the instrumentation</h3>
<div class="outline-text-3" id="text-1-2">
<p>
The measured signal \(x\) by the ADC is in Volts.
The corresponding real velocity \(v\) in m/s.
@@ -314,17 +437,17 @@ To obtain the real quantity as measured by the sensor, one have to know the sens
</p>
<div id="org0a5ff56" class="figure">
<div id="orgad69fc7" class="figure">
<p><img src="figs/velocity_to_voltage.png" alt="velocity_to_voltage.png" />
</p>
<p><span class="figure-number">Figure 1: </span>Schematic of the instrumentation used for the measurement</p>
<p><span class="figure-number">Figure 2: </span>Schematic of the instrumentation used for the measurement</p>
</div>
</div>
</div>
<div id="outline-container-orgac6792b" class="outline-2">
<h2 id="orgac6792b"><span class="section-number-2">2</span> Convert the time domain from volts to velocity</h2>
<div class="outline-text-2" id="text-2">
<div id="outline-container-org78ed1de" class="outline-3">
<h3 id="org78ed1de"><span class="section-number-3">1.3</span> Convert the time domain from volts to velocity</h3>
<div class="outline-text-3" id="text-1-3">
<p>
Let's say, we know that the sensitivity of the geophone used is
\[ G_g(s) = G_0 \frac{\frac{s}{2\pi f_0}}{1 + \frac{s}{2\pi f_0}} \quad \left[\frac{V}{m/s}\right] \]
@@ -348,11 +471,11 @@ And the gain of the amplifier is 1000: \(G_m(s) = 1000\).
</div>
<p>
If \({G_m(s)}^{-1} {G_g(s)}^{-1}\) is proper, we can simulate this dynamical system to go from the voltage to the velocity units (figure <a href="#orgd3dfdc8">2</a>).
If \({G_m(s)}^{-1} {G_g(s)}^{-1}\) is proper, we can simulate this dynamical system to go from the voltage to the velocity units (figure <a href="#orgf9120d4">3</a>).
</p>
<div class="org-src-container">
<pre class="src src-matlab">data = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_028.mat', 'data'</span><span class="org-rainbow-delimiters-depth-1">)</span>; data = data.data;
<pre class="src src-matlab">data = load<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'mat/data_028.mat'</span>, <span class="org-string">'data'</span><span class="org-rainbow-delimiters-depth-1">)</span>; data = data.data;
t = data<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-highlight-numbers-number">3</span><span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% [s]</span>
x = data<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-type">:</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">-</span>mean<span class="org-rainbow-delimiters-depth-1">(</span>data<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">:</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% The offset if removed (coming from the voltage amplifier) [v]</span>
@@ -362,17 +485,17 @@ dt = t<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-high
</div>
<div id="orgd3dfdc8" class="figure">
<div id="orgf9120d4" class="figure">
<p><img src="figs/voltage_to_velocity.png" alt="voltage_to_velocity.png" />
</p>
<p><span class="figure-number">Figure 2: </span>Schematic of the instrumentation used for the measurement</p>
<p><span class="figure-number">Figure 3: </span>Schematic of the instrumentation used for the measurement</p>
</div>
<p>
We simulate this system with matlab:
</p>
<div class="org-src-container">
<pre class="src src-matlab">v = lsim<span class="org-rainbow-delimiters-depth-1">(</span>inv<span class="org-rainbow-delimiters-depth-2">(</span>Gg<span class="org-type">*</span>Gm<span class="org-rainbow-delimiters-depth-2">)</span>, v, t<span class="org-rainbow-delimiters-depth-1">)</span>;
<pre class="src src-matlab">v = lsim<span class="org-rainbow-delimiters-depth-1">(</span>inv<span class="org-rainbow-delimiters-depth-2">(</span>Gg<span class="org-type">*</span>Gm<span class="org-rainbow-delimiters-depth-2">)</span>, x, t<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
@@ -382,22 +505,22 @@ And we plot the obtained velocity
<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>t, v<span class="org-rainbow-delimiters-depth-1">)</span>;
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">"Time [s]"</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">"Velocity [m/s]"</span><span class="org-rainbow-delimiters-depth-1">)</span>;
xlabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">"Time </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">s</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">"</span><span class="org-rainbow-delimiters-depth-1">)</span>; ylabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">"Velocity </span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">m/s</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">"</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div id="org4dd86c0" class="figure">
<div id="org8b13b82" class="figure">
<p><img src="figs/velocity_time.png" alt="velocity_time.png" />
</p>
<p><span class="figure-number">Figure 3: </span>Measured Velocity</p>
<p><span class="figure-number">Figure 4: </span>Measured Velocity</p>
</div>
</div>
</div>
<div id="outline-container-org01a363c" class="outline-2">
<h2 id="org01a363c"><span class="section-number-2">3</span> Power Spectral Density and Amplitude Spectral Density</h2>
<div class="outline-text-2" id="text-3">
<div id="outline-container-org8775e6e" class="outline-3">
<h3 id="org8775e6e"><span class="section-number-3">1.4</span> Power Spectral Density and Amplitude Spectral Density</h3>
<div class="outline-text-3" id="text-1-4">
<p>
We now have the velocity in the time domain:
\[ v(t)\ [m/s] \]
@@ -437,27 +560,27 @@ ylabel<span class="org-rainbow-delimiters-depth-1">(</span>'Power Spectral Densi
The Amplitude Spectral Density (ASD) is the square root of the Power Spectral Density:
</p>
\begin{equation}
\Gamma_{vv}(f) = \sqrt{S_{vv}(f)} \quad \left[ \frac{m/s}{\sqrt{Hz}} \right]
\Gamma_{vv}(f) = \sqrt{S_{vv}(f)} \quad \left[ \frac{m/s}{\sqrt{Hz}} \right]
\end{equation}
<div class="org-src-container">
<pre class="src src-matlab"><span class="org-type">figure</span>;
loglog<span class="org-rainbow-delimiters-depth-1">(</span>f, sqrt<span class="org-rainbow-delimiters-depth-2">(</span>Sv<span class="org-rainbow-delimiters-depth-2">)</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-rainbow-delimiters-depth-1">)</span>;
ylabel<span class="org-rainbow-delimiters-depth-1">(</span>'Amplitude Spectral Density $<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>m<span class="org-type">/</span>s<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>
ylabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Amplitude Spectral Density $\left</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">[</span></span><span class="org-string">\frac</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">{</span></span><span class="org-string">m/s</span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}{</span></span><span class="org-string">\sqrt</span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">{</span></span><span class="org-string">Hz</span><span class="org-string"><span class="org-rainbow-delimiters-depth-4">}</span></span><span class="org-string"><span class="org-rainbow-delimiters-depth-3">}</span></span><span class="org-string">\right</span><span class="org-string"><span class="org-rainbow-delimiters-depth-2">]</span></span><span class="org-string">$'</span><span class="org-rainbow-delimiters-depth-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org90edcdd" class="outline-2">
<h2 id="org90edcdd"><span class="section-number-2">4</span> Modification of a signal's Power Spectral Density when going through an LTI system</h2>
<div class="outline-text-2" id="text-4">
<div id="outline-container-orgcba62e6" class="outline-3">
<h3 id="orgcba62e6"><span class="section-number-3">1.5</span> Modification of a signal's Power Spectral Density when going through an LTI system</h3>
<div class="outline-text-3" id="text-1-5">
<div id="org9eca4b8" class="figure">
<div id="org5a3eaea" class="figure">
<p><img src="figs/velocity_to_voltage_psd.png" alt="velocity_to_voltage_psd.png" />
</p>
<p><span class="figure-number">Figure 4: </span>Schematic of the instrumentation used for the measurement</p>
<p><span class="figure-number">Figure 5: </span>Schematic of the instrumentation used for the measurement</p>
</div>
<p>
@@ -476,14 +599,14 @@ And we also have:
</div>
</div>
<div id="outline-container-orgfb2734c" class="outline-2">
<h2 id="orgfb2734c"><span class="section-number-2">5</span> From PSD of the velocity to the PSD of the displacement</h2>
<div class="outline-text-2" id="text-5">
<div id="outline-container-org3adf2bb" class="outline-3">
<h3 id="org3adf2bb"><span class="section-number-3">1.6</span> From PSD of the velocity to the PSD of the displacement</h3>
<div class="outline-text-3" id="text-1-6">
<div id="orga1a0bc5" class="figure">
<div id="org14e4432" class="figure">
<p><img src="figs/velocity_to_displacement_psd.png" alt="velocity_to_displacement_psd.png" />
</p>
<p><span class="figure-number">Figure 5: </span>Schematic of the instrumentation used for the measurement</p>
<p><span class="figure-number">Figure 6: </span>Schematic of the instrumentation used for the measurement</p>
</div>
<p>
@@ -545,7 +668,12 @@ And we have
Note here that we always have
\[ PSD_x \left(f = \frac{1}{2\pi}\right) = PSD_v \left(f = \frac{1}{2\pi}\right) = PSD_a \left(f = \frac{1}{2\pi}\right), \quad \frac{1}{2\pi} \approx 0.16 [Hz] \]
</p>
</div>
</div>
<div id="outline-container-org83b26dc" class="outline-3">
<h3 id="org83b26dc"><span class="section-number-3">1.7</span> Cumulative Power/Amplitude Spectrum</h3>
<div class="outline-text-3" id="text-1-7">
<p>
If we want to compute the Cumulative Power Spectrum:
\[ CPS_v(f) = \int_0^f PSD_v(\nu) d\nu \quad [(m/s)^2] \]
@@ -567,15 +695,425 @@ Then, we can obtain the Root Mean Square value of the velocity:
</p>
<div class="org-src-container">
<pre class="src src-matlab">
<pre class="src src-matlab"><span class="org-type">figure</span>;
hold on;
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, cumtrapz<span class="org-rainbow-delimiters-depth-2">(</span>f, Sv<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'</span>, <span class="org-string">'log'</span><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">'yscale'</span>, <span class="org-string">'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-rainbow-delimiters-depth-1">)</span>; ylabel<span class="org-rainbow-delimiters-depth-1">(</span>'Cumulative Power Spectrum <span class="org-rainbow-delimiters-depth-2">[</span>$<span class="org-rainbow-delimiters-depth-3">(</span>m<span class="org-type">/</span>s<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">^</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-1">)</span>
</pre>
</div>
<p>
In order to integrate from high frequency to low frequency:
</p>
<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, flip<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-type">-</span>cumtrapz<span class="org-rainbow-delimiters-depth-3">(</span>flip<span class="org-rainbow-delimiters-depth-4">(</span>f<span class="org-rainbow-delimiters-depth-4">)</span>, flip<span class="org-rainbow-delimiters-depth-4">(</span>Sv<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>;
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'</span>, <span class="org-string">'log'</span><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">'yscale'</span>, <span class="org-string">'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-rainbow-delimiters-depth-1">)</span>; ylabel<span class="org-rainbow-delimiters-depth-1">(</span>'Cumulative Power Spectrum <span class="org-rainbow-delimiters-depth-2">[</span>$<span class="org-rainbow-delimiters-depth-3">(</span>m<span class="org-type">/</span>s<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">^</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-1">)</span>
</pre>
</div>
</div>
</div>
<div id="outline-container-org5ace856" class="outline-3">
<h3 id="org5ace856"><span class="section-number-3">1.8</span> <span class="todo TODO">TODO</span> Add best practices from the Article and simple snippet that works</h3>
</div>
</div>
<div id="outline-container-orga6e1da0" class="outline-2">
<h2 id="orga6e1da0"><span class="section-number-2">2</span> Technique 1 : Approximation with a transfer function</h2>
<div class="outline-text-2" id="text-2">
<p>
<a id="org2ea1c7b"></a>
</p>
</div>
<div id="outline-container-orge44fa26" class="outline-3">
<h3 id="orge44fa26"><span class="section-number-3">2.1</span> Signal's PSD</h3>
<div class="outline-text-3" id="text-2-1">
<p>
We load the PSD of the signal we wish to replicate.
</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/dist_psd.mat'</span>, <span class="org-string">'dist_f'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first value with very high PSD.
</p>
<div class="org-src-container">
<pre class="src src-matlab">dist_f.f = dist_f.f<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">:</span>end<span class="org-rainbow-delimiters-depth-1">)</span>;
dist_f.psd_gm = dist_f.psd_gm<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">:</span>end<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
The PSD of the signal is shown on figure <a href="#fig:psd_ground_motion">fig:psd_ground_motion</a>.
</p>
<div id="org809f585" class="figure">
<p><img src="figs/psd_ground_motion.png" alt="psd_ground_motion.png" />
</p>
<p><span class="figure-number">Figure 7: </span>PSD of the signal (<a href="./figs/psd_ground_motion.png">png</a>, <a href="./figs/psd_ground_motion.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-org35e87c7" class="outline-3">
<h3 id="org35e87c7"><span class="section-number-3">2.2</span> Transfer Function that approximate the ASD</h3>
<div class="outline-text-3" id="text-2-2">
<div class="org-src-container">
<pre class="src src-matlab">G_gm = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">002</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">3</span>.<span class="org-highlight-numbers-number">169</span><span class="org-type">*</span>s <span class="org-type">+</span> <span class="org-highlight-numbers-number">27</span>.<span class="org-highlight-numbers-number">74</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-rainbow-delimiters-depth-2">(</span>s<span class="org-type">+</span><span class="org-highlight-numbers-number">32</span>.<span class="org-highlight-numbers-number">73</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">8</span>.<span class="org-highlight-numbers-number">829</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">7</span>.<span class="org-highlight-numbers-number">983</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org5b0597b" class="outline-3">
<h3 id="org5b0597b"><span class="section-number-3">2.3</span> Generated Time domain signal</h3>
<div class="outline-text-3" id="text-2-3">
<div class="org-src-container">
<pre class="src src-matlab">Fs = <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>dist_f.f<span class="org-rainbow-delimiters-depth-1">(</span>end<span class="org-rainbow-delimiters-depth-1">)</span>;
Ts = <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span>Fs;
t = <span class="org-highlight-numbers-number">0</span><span class="org-type">:</span>Ts<span class="org-type">:</span><span class="org-highlight-numbers-number">500</span>;
u = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>Fs<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span>randn<span class="org-rainbow-delimiters-depth-1">(</span>length<span class="org-rainbow-delimiters-depth-2">(</span>t<span class="org-rainbow-delimiters-depth-2">)</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">u_o = lsim<span class="org-rainbow-delimiters-depth-1">(</span>G_gm, u, t<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>;
plot<span class="org-rainbow-delimiters-depth-1">(</span>t, u_o<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
<div id="outline-container-org2bb9116" class="outline-3">
<h3 id="org2bb9116"><span class="section-number-3">2.4</span> Comparison of the Power Spectral Densities</h3>
<div class="outline-text-3" id="text-2-4">
<div class="org-src-container">
<pre class="src src-matlab">nx = length<span class="org-rainbow-delimiters-depth-1">(</span>u_o<span class="org-rainbow-delimiters-depth-1">)</span>;
na = <span class="org-highlight-numbers-number">16</span>;
win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>floor<span class="org-rainbow-delimiters-depth-2">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>pxx, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>u_o, win, <span class="org-highlight-numbers-number">0</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, Fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
Finally, we compare the PSD of the original signal and the obtained signal on figure <a href="#fig:psd_comparison">fig:psd_comparison</a>.
</p>
</div>
</div>
<div id="outline-container-org6d66594" class="outline-3">
<h3 id="org6d66594"><span class="section-number-3">2.5</span> Simulink</h3>
<div class="outline-text-3" id="text-2-5">
<div id="org3a810b6" class="figure">
<p><img src="figs/simulink_psd_generate.png" alt="simulink_psd_generate.png" />
</p>
<p><span class="figure-number">Figure 8: </span>Simulink Schematic</p>
</div>
<p>
The parameters for the <code>Band-Limited White Noise</code> are:
</p>
<ul class="org-ul">
<li>Noise Power: 1</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab">nx = length<span class="org-rainbow-delimiters-depth-1">(</span>out.u_gm.Data<span class="org-rainbow-delimiters-depth-1">)</span>;
na = <span class="org-highlight-numbers-number">8</span>;
win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>floor<span class="org-rainbow-delimiters-depth-2">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>pxx, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>out.u_gm.Data, win, <span class="org-highlight-numbers-number">0</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-highlight-numbers-number">1e3</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<div id="outline-container-orgd4fbbd9" class="outline-2">
<h2 id="orgd4fbbd9"><span class="section-number-2">3</span> Technique 2 : IFFT</h2>
<div class="outline-text-2" id="text-3">
<p>
<a id="org84b5cd1"></a>
</p>
<p>
The technique comes from <a class='org-ref-reference' href="#preumont94_random_vibrat_spect_analy">preumont94_random_vibrat_spect_analy</a> (section 12.11).
</p>
</div>
<div id="outline-container-org98e4f2a" class="outline-3">
<h3 id="org98e4f2a"><span class="section-number-3">3.1</span> Signal's PSD</h3>
<div class="outline-text-3" id="text-3-1">
<p>
We load the PSD of the signal we wish to replicate.
</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/dist_psd.mat'</span>, <span class="org-string">'dist_f'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We remove the first value with very high PSD.
</p>
<div class="org-src-container">
<pre class="src src-matlab">dist_f.f = dist_f.f<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">:</span>end<span class="org-rainbow-delimiters-depth-1">)</span>;
dist_f.psd_gm = dist_f.psd_gm<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">3</span><span class="org-type">:</span>end<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
The PSD of the signal is shown on figure <a href="#fig:psd_original">fig:psd_original</a>.
</p>
<div id="org7969683" class="figure">
<p><img src="figs/psd_original.png" alt="psd_original.png" />
</p>
<p><span class="figure-number">Figure 9: </span>PSD of the original signal (<a href="./figs/psd_original.png">png</a>, <a href="./figs/psd_original.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgcb607b3" class="outline-3">
<h3 id="orgcb607b3"><span class="section-number-3">3.2</span> Algorithm</h3>
<div class="outline-text-3" id="text-3-2">
<p>
We define some parameters.
</p>
<div class="org-src-container">
<pre class="src src-matlab">Fs = <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>dist_f.f<span class="org-rainbow-delimiters-depth-1">(</span>end<span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]</span>
N = <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span>length<span class="org-rainbow-delimiters-depth-1">(</span>dist_f.f<span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% Number of Samples match the one of the wanted PSD</span>
T0 = N<span class="org-type">/</span>Fs; <span class="org-comment">% Signal Duration [s]</span>
df = <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span>T0; <span class="org-comment">% Frequency resolution of the DFT [Hz]</span>
% Also equal to (dist_f.f(<span class="org-highlight-numbers-number">2</span>)<span class="org-type">-</span>dist_f.f(<span class="org-highlight-numbers-number">1</span>))
</pre>
</div>
<p>
We then specify the wanted PSD.
</p>
<div class="org-src-container">
<pre class="src src-matlab">phi = dist_f.psd_gm;
</pre>
</div>
<p>
Create amplitudes corresponding to wanted PSD.
</p>
<div class="org-src-container">
<pre class="src src-matlab">C = zeros<span class="org-rainbow-delimiters-depth-1">(</span>N<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">for</span> <span class="org-variable-name"><span class="org-constant">i</span></span> = <span class="org-constant"><span class="org-highlight-numbers-number">1</span></span><span class="org-constant">:N/</span><span class="org-constant"><span class="org-highlight-numbers-number">2</span></span>
C<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-1">)</span> = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>phi<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-constant">i</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>df<span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-keyword">end</span>
</pre>
</div>
<p>
Add random phase to <code>C</code>.
</p>
<div class="org-src-container">
<pre class="src src-matlab">theta = <span class="org-highlight-numbers-number">2</span><span class="org-type">*</span><span class="org-constant">pi</span><span class="org-type">*</span>rand<span class="org-rainbow-delimiters-depth-1">(</span>N<span class="org-type">/</span><span class="org-highlight-numbers-number">2</span>,<span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% Generate random phase [rad]</span>
Cx = <span class="org-rainbow-delimiters-depth-1">[</span><span class="org-highlight-numbers-number">0</span> ; C<span class="org-type">.*</span>complex<span class="org-rainbow-delimiters-depth-2">(</span>cos<span class="org-rainbow-delimiters-depth-3">(</span>theta<span class="org-rainbow-delimiters-depth-3">)</span>,sin<span class="org-rainbow-delimiters-depth-3">(</span>theta<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">]</span>;
Cx = <span class="org-rainbow-delimiters-depth-1">[</span>Cx; flipud<span class="org-rainbow-delimiters-depth-2">(</span>conj<span class="org-rainbow-delimiters-depth-3">(</span>Cx<span class="org-rainbow-delimiters-depth-4">(</span><span class="org-highlight-numbers-number">2</span><span class="org-type">:</span>end<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 id="outline-container-org4ff718c" class="outline-3">
<h3 id="org4ff718c"><span class="section-number-3">3.3</span> Obtained Time Domain Signal</h3>
<div class="outline-text-3" id="text-3-3">
<p>
The time domain data is generated by an inverse FFT.
We normalize the <code>ifft</code> Matlab command.
</p>
<div class="org-src-container">
<pre class="src src-matlab">u = <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span>sqrt<span class="org-rainbow-delimiters-depth-2">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>df<span class="org-type">*</span><span class="org-highlight-numbers-number">1</span><span class="org-type">/</span>Fs<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">*</span>ifft<span class="org-rainbow-delimiters-depth-1">(</span>Cx<span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% Normalisation of the IFFT</span>
t = linspace<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">0</span>, T0, N<span class="org-type">+</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>; <span class="org-comment">% Time Vector [s]</span>
</pre>
</div>
<div id="org69c5e9c" class="figure">
<p><img src="figs/signal_time_domain.png" alt="signal_time_domain.png" />
</p>
<p><span class="figure-number">Figure 10: </span>Obtained signal in the time domain (<a href="./figs/signal_time_domain.png">png</a>, <a href="./figs/signal_time_domain.pdf">pdf</a>)</p>
</div>
</div>
</div>
<div id="outline-container-orgc9527e8" class="outline-3">
<h3 id="orgc9527e8"><span class="section-number-3">3.4</span> PSD Comparison</h3>
<div class="outline-text-3" id="text-3-4">
<p>
We duplicate the time domain signal to have a longer signal and thus a more precise PSD result.
</p>
<div class="org-src-container">
<pre class="src src-matlab">u_rep = repmat<span class="org-rainbow-delimiters-depth-1">(</span>u, <span class="org-highlight-numbers-number">10</span>, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
We compute the PSD of the obtained signal with the following commands.
</p>
<div class="org-src-container">
<pre class="src src-matlab">nx = length<span class="org-rainbow-delimiters-depth-1">(</span>u_rep<span class="org-rainbow-delimiters-depth-1">)</span>;
na = <span class="org-highlight-numbers-number">16</span>;
win = hanning<span class="org-rainbow-delimiters-depth-1">(</span>floor<span class="org-rainbow-delimiters-depth-2">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>pxx, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>u_rep, win, <span class="org-highlight-numbers-number">0</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, Fs<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
Finally, we compare the PSD of the original signal and the obtained signal on figure <a href="#fig:psd_comparison">fig:psd_comparison</a>.
</p>
<div id="orgce3ea03" class="figure">
<p><img src="figs/psd_comparison.png" alt="psd_comparison.png" />
</p>
<p><span class="figure-number">Figure 11: </span>Comparison of the PSD of the original signal and the PSD of the obtained signal (<a href="./figs/psd_comparison.png">png</a>, <a href="./figs/psd_comparison.pdf">pdf</a>)</p>
</div>
</div>
</div>
</div>
<div id="outline-container-org7fe2f42" class="outline-2">
<h2 id="org7fe2f42"><span class="section-number-2">4</span> <span class="todo TODO">TODO</span> Compute the Noise level and Signal level from PSD</h2>
<div class="outline-text-2" id="text-4">
<p>
<a id="org7bce553"></a>
</p>
</div>
<div id="outline-container-org640e940" class="outline-3">
<h3 id="org640e940"><span class="section-number-3">4.1</span> Computation</h3>
<div class="outline-text-3" id="text-4-1">
<ul class="org-ul">
<li class="off"><code>[&#xa0;]</code> Add table to compare the methods</li>
<li class="off"><code>[&#xa0;]</code> Add some explanations</li>
</ul>
<div class="org-src-container">
<pre class="src src-matlab">N = <span class="org-highlight-numbers-number">10000</span>;
dt = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">001</span>;
t = dt<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">0</span><span class="org-type">:</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span>N<span class="org-type">-</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">'</span>;
</pre>
</div>
<p>
Parameters of the signal
</p>
<div class="org-src-container">
<pre class="src src-matlab">asig = <span class="org-highlight-numbers-number">0</span>.<span class="org-highlight-numbers-number">8</span>; <span class="org-comment">% Amplitude of the signal [V]</span>
fsig = <span class="org-highlight-numbers-number">100</span>; <span class="org-comment">% Frequency of the signal [Hz]</span>
anoi = <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">% RMS value of the noise</span>
x = anoi<span class="org-type">*</span>randn<span class="org-rainbow-delimiters-depth-1">(</span>N, <span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-type">+</span> asig<span class="org-type">*</span>sin<span class="org-rainbow-delimiters-depth-1">(</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>fsig<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">*</span>t<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>;
plot<span class="org-rainbow-delimiters-depth-1">(</span>t, x<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
Compute the PSD of the signal.
</p>
<div class="org-src-container">
<pre class="src src-matlab">nx = length<span class="org-rainbow-delimiters-depth-1">(</span>x<span class="org-rainbow-delimiters-depth-1">)</span>;
na = <span class="org-highlight-numbers-number">8</span>;
win = blackmanharris<span class="org-rainbow-delimiters-depth-1">(</span>floor<span class="org-rainbow-delimiters-depth-2">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span>;
<span class="org-rainbow-delimiters-depth-1">[</span>pxx, f<span class="org-rainbow-delimiters-depth-1">]</span> = pwelch<span class="org-rainbow-delimiters-depth-1">(</span>x, win, <span class="org-highlight-numbers-number">0</span>, <span class="org-rainbow-delimiters-depth-2">[]</span>, <span class="org-highlight-numbers-number">1</span><span class="org-type">/</span>dt<span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<p>
Normalization of the PSD.
</p>
<div class="org-src-container">
<pre class="src src-matlab">CG = sum<span class="org-rainbow-delimiters-depth-1">(</span>win<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-1">)</span>;
NG = sum<span class="org-rainbow-delimiters-depth-1">(</span>win<span class="org-type">.^</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">/</span><span class="org-rainbow-delimiters-depth-1">(</span>nx<span class="org-type">/</span>na<span class="org-rainbow-delimiters-depth-1">)</span>;
fbin = f<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-type">-</span> f<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">1</span><span class="org-rainbow-delimiters-depth-1">)</span>;
pxx_norm = pxx<span class="org-type">*</span><span class="org-rainbow-delimiters-depth-1">(</span>NG<span class="org-type">*</span>fbin<span class="org-type">/</span><span class="org-rainbow-delimiters-depth-2">(</span>CG<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
<div class="org-src-container">
<pre class="src src-matlab">isig = round<span class="org-rainbow-delimiters-depth-1">(</span>fsig<span class="org-type">/</span>fbin<span class="org-rainbow-delimiters-depth-1">)</span><span class="org-type">+</span><span class="org-highlight-numbers-number">1</span>;
</pre>
</div>
<p>
Estimate the Signal magnitude.
</p>
<div class="org-src-container">
<pre class="src src-matlab">srmt = asig<span class="org-type">/</span>sqrt<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-comment">% Theoretical value of signal magnitude</span>
srms = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>sum<span class="org-rainbow-delimiters-depth-2">(</span>pxx<span class="org-rainbow-delimiters-depth-3">(</span>isig<span class="org-type">-</span><span class="org-highlight-numbers-number">5</span><span class="org-type">:</span>isig<span class="org-type">+</span><span class="org-highlight-numbers-number">5</span><span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span>fbin<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-comment">% Signal spectrum integrated</span>
srmsp = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>pxx<span class="org-rainbow-delimiters-depth-2">(</span>isig<span class="org-rainbow-delimiters-depth-2">)</span> <span class="org-type">*</span> NG<span class="org-type">*</span>fbin<span class="org-type">/</span>CG<span class="org-type">^</span><span class="org-highlight-numbers-number">2</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-comment">% Maximum read off spectrum</span>
</pre>
</div>
<p>
Estimate the noise floor.
</p>
<div class="org-src-container">
<pre class="src src-matlab">nth = anoi<span class="org-type">/</span>sqrt<span class="org-rainbow-delimiters-depth-1">(</span>max<span class="org-rainbow-delimiters-depth-2">(</span>f<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-comment">% Theoretical value [V/sqrt(Hz)]</span>
inmax = isig<span class="org-type">-</span><span class="org-highlight-numbers-number">20</span>;
nsum = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>sum<span class="org-rainbow-delimiters-depth-2">(</span>pxx<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span>inmax<span class="org-rainbow-delimiters-depth-3">)</span><span class="org-type">*</span>fbin<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-type">/</span> sqrt<span class="org-rainbow-delimiters-depth-1">(</span>f<span class="org-rainbow-delimiters-depth-2">(</span>inmax<span class="org-rainbow-delimiters-depth-2">)</span><span class="org-rainbow-delimiters-depth-1">)</span> <span class="org-comment">% Signal spectrum integrated</span>
navg = sqrt<span class="org-rainbow-delimiters-depth-1">(</span>mean<span class="org-rainbow-delimiters-depth-2">(</span>pxx<span class="org-rainbow-delimiters-depth-3">(</span><span class="org-highlight-numbers-number">1</span><span class="org-type">:</span>inmax<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-comment">% pwelch output averaged</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, pxx<span class="org-rainbow-delimiters-depth-1">)</span>
plot<span class="org-rainbow-delimiters-depth-1">(</span>f, pxx_norm<span class="org-rainbow-delimiters-depth-1">)</span>
hold off;
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-rainbow-delimiters-depth-1">)</span>;
ylabel<span class="org-rainbow-delimiters-depth-1">(</span><span class="org-string">'Power Spectral Density'</span><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'</span>, <span class="org-string">'log'</span><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">'yscale'</span>, <span class="org-string">'log'</span><span class="org-rainbow-delimiters-depth-1">)</span>;
</pre>
</div>
</div>
</div>
</div>
<p>
<h1 class='org-ref-bib-h1'>Bibliography</h1>
<ul class='org-ref-bib'><li><a id="preumont94_random_vibrat_spect_analy">[preumont94_random_vibrat_spect_analy]</a> <a name="preumont94_random_vibrat_spect_analy"></a>Andr\'e Preumont, Random Vibration and Spectral Analysis, Springer Netherlands (1994).</li>
</ul>
</p>
</div>
<div id="postamble" class="status">
<p class="author">Author: Dehaeze Thomas</p>
<p class="date">Created: 2019-08-15 jeu. 12:31</p>
<p class="date">Created: 2019-12-02 lun. 11:22</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
</body>