nass-micro-station-measurem.../huddle-test-geophones/signal_processing.m

253 lines
6.8 KiB
Mathematica
Raw Normal View History

2019-04-18 17:11:25 +02:00
% Matlab Init :noexport:ignore:
clear; close all; clc;
%% Intialize Laplace variable
s = zpk('s');
%% Initialize ans with org-babel
ans = 0;
% Load data
% We load the data of the z axis of two geophones.
load('mat/data_001.mat', 't', 'x1', 'x2');
dt = t(2) - t(1);
% Time Domain Data
figure;
hold on;
plot(t, x1);
plot(t, x2);
hold off;
xlabel('Time [s]');
ylabel('Voltage [V]');
xlim([t(1), t(end)]);
% #+NAME: fig:data_time_domain
% #+CAPTION: Time domain Data
% #+RESULTS: fig:data_time_domain
% [[file:figs/data_time_domain.png]]
figure;
hold on;
plot(t, x1);
plot(t, x2);
hold off;
xlabel('Time [s]');
ylabel('Voltage [V]');
xlim([0 1]);
% Computation of the ASD of the measured voltage
% We first define the parameters for the frequency domain analysis.
win = hanning(ceil(length(x1)/100));
Fs = 1/dt;
[pxx1, f] = pwelch(x1, win, [], [], Fs);
[pxx2, ~] = pwelch(x2, win, [], [], Fs);
% Scaling to take into account the sensibility of the geophone and the voltage amplifier
% The Geophone used are L22.
% Their sensibility are shown on figure [[fig:geophone_sensibility]].
S0 = 88; % Sensitivity [V/(m/s)]
f0 = 2; % Cut-off frequnecy [Hz]
S = (s/2/pi/f0)/(1+s/2/pi/f0);
figure;
bodeFig({S});
ylabel('Amplitude [V/(m/s)]')
% #+NAME: fig:geophone_sensibility
% #+CAPTION: Sensibility of the Geophone
% #+RESULTS: fig:geophone_sensibility
% [[file:figs/geophone_sensibility.png]]
% We also take into account the gain of the electronics which is here set to be $60dB$.
% The amplifiers also include a low pass filter with a cut-off frequency set at 1kHz.
G0 = 60; % [dB]
2019-04-18 17:25:02 +02:00
G = 10^(G0/20)/(1+s/2/pi/1000);
2019-04-18 17:11:25 +02:00
% We divide the ASD measured (in $\text{V}/\sqrt{\text{Hz}}$) by the transfer function of the voltage amplifier to obtain the ASD of the voltage across the geophone.
% We further divide the result by the sensibility of the Geophone to obtain the ASD of the velocity in $m/s/\sqrt{Hz}$.
2019-04-18 17:25:02 +02:00
scaling = 1./squeeze(abs(freqresp(G*S, f, 'Hz')));
2019-04-18 17:11:25 +02:00
% Computation of the ASD of the velocity
% The ASD of the measured velocity is shown on figure [[fig:psd_velocity]].
figure;
hold on;
2019-04-18 17:25:02 +02:00
plot(f, sqrt(pxx1).*scaling);
plot(f, sqrt(pxx2).*scaling);
2019-04-18 17:11:25 +02:00
hold off;
set(gca, 'xscale', 'log');
set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('PSD [m/s/sqrt(Hz)]')
xlim([2, 500]);
2019-04-18 17:25:02 +02:00
% #+NAME: fig:psd_velocity
% #+CAPTION: Spectral density of the velocity
% #+RESULTS: fig:psd_velocity
% [[file:figs/psd_velocity.png]]
% We also plot the ASD in displacement (figure [[fig:asd_displacement]]);
figure;
hold on;
plot(f, (pxx1.*scaling./f).^2);
plot(f, (pxx2.*scaling./f).^2);
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('PSD [m/s/sqrt(Hz)]')
xlim([2, 500]);
2019-04-18 17:11:25 +02:00
% Transfer function between the two geophones
% We here compute the transfer function from one geophone to the other.
% The result is shown on figure [[fig:tf_geophones]].
% We also compute the coherence between the two signals (figure [[fig:coh_geophones]]).
[T12, ~] = tfestimate(x1, x2, win, [], [], Fs);
figure;
ax1 = subplot(2, 1, 1);
plot(f, abs(T12));
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
set(gca, 'XTickLabel',[]);
ylabel('Magnitude');
ax2 = subplot(2, 1, 2);
plot(f, mod(180+180/pi*phase(T12), 360)-180);
set(gca, 'xscale', 'log');
ylim([-180, 180]);
yticks([-180, -90, 0, 90, 180]);
xlabel('Frequency [Hz]'); ylabel('Phase');
linkaxes([ax1,ax2],'x');
xlim([1, 500]);
% #+NAME: fig:tf_geophones
% #+CAPTION: Estimated transfer function between the two geophones
% #+RESULTS: fig:tf_geophones
% [[file:figs/tf_geophones.png]]
[coh12, ~] = mscohere(x1, x2, win, [], [], Fs);
figure;
plot(f, coh12);
set(gca, 'xscale', 'log');
xlabel('Frequency [Hz]'); ylabel('Coherence');
ylim([0,1]); xlim([1, 500]);
% Estimation of the sensor noise
% The technique to estimate the sensor noise is taken from cite:barzilai98_techn_measur_noise_sensor_presen.
% The coherence between signals $X$ and $Y$ is defined as follow
% \[ \gamma^2_{XY}(\omega) = \frac{|G_{XY}(\omega)|^2}{|G_{X}(\omega)| |G_{Y}(\omega)|} \]
% where $|G_X(\omega)|$ is the output Power Spectral Density (PSD) of signal $X$ and $|G_{XY}(\omega)|$ is the Cross Spectral Density (CSD) of signal $X$ and $Y$.
% The PSD and CSD are defined as follow:
% \begin{align}
% |G_X(\omega)| &= \frac{2}{n_d T} \sum^{n_d}_{n=1} \left| X_k(\omega, T) \right|^2 \\
% |G_{XY}(\omega)| &= \frac{2}{n_d T} \sum^{n_d}_{n=1} [ X_k^*(\omega, T) ] [ Y_k(\omega, T) ]
% \end{align}
% where:
% - $n_d$ is the number for records averaged
% - $T$ is the length of each record
% - $X_k(\omega, T)$ is the finite Fourier transform of the kth record
% - $X_k^*(\omega, T)$ is its complex conjugate
% The =mscohere= function is compared with this formula on Appendix (section [[sec:coherence]]), it is shown that it is identical.
% Figure [[fig:huddle_test]] illustrate a block diagram model of the system used to determine the sensor noise of the geophone.
% Two geophones are mounted side by side to ensure that they are exposed by the same motion input $U$.
% Each sensor has noise $N$ and $M$.
% #+NAME: fig:huddle_test
% #+CAPTION: Huddle test block diagram
% [[file:figs/huddle-test.png]]
% We here assume that each sensor has the same magnitude of instrumental noise ($N = M$).
% We also assume that $H_1 = H_2 = 1$.
% We then obtain:
% #+NAME: eq:coh_bis
% \begin{equation}
% \gamma_{XY}^2(\omega) = \frac{1}{1 + 2 \left( \frac{|G_N(\omega)|}{|G_U(\omega)|} \right) + \left( \frac{|G_N(\omega)|}{|G_U(\omega)|} \right)^2}
% \end{equation}
% Since the input signal $U$ and the instrumental noise $N$ are incoherent:
% #+NAME: eq:incoherent_noise
% \begin{equation}
% |G_X(\omega)| = |G_N(\omega)| + |G_U(\omega)|
% \end{equation}
% From equations [[eq:coh_bis]] and [[eq:incoherent_noise]], we finally obtain
% #+begin_important
% #+NAME: eq:noise_psd
% \begin{equation}
% |G_N(\omega)| = |G_X(\omega)| \left( 1 - \sqrt{\gamma_{XY}^2(\omega)} \right)
% \end{equation}
% #+end_important
% The instrumental noise is computed below. The result in V^2/Hz is shown on figure [[fig:intrumental_noise_V]].
pxxN = pxx1.*(1 - coh12);
figure;
hold on;
plot(f, pxx1, '-');
plot(f, pxx2, '-');
plot(f, pxxN, 'k--');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('PSD [$V^2/Hz$]');
xlim([1, 500]);
% #+NAME: fig:intrumental_noise_V
% #+CAPTION: Instrumental Noise and Measurement in $V^2/Hz$
% #+RESULTS: fig:intrumental_noise_V
% [[file:figs/intrumental_noise_V.png]]
% This is then further converted into velocity and compared with the ground velocity measurement. (figure [[fig:intrumental_noise_velocity]])
figure;
hold on;
plot(f, sqrt(pxx1).*scaling, '-');
plot(f, sqrt(pxx2).*scaling, '-');
plot(f, sqrt(pxxN).*scaling, 'k--');
hold off;
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
xlabel('Frequency [Hz]'); ylabel('PSD [$m/s/\sqrt{Hz}$]');
xlim([1, 500]);