%% Clear Workspace and Close figures
clear; close all; clc;

%% Intialize Laplace variable
s = zpk('s');

% Load Data
% As usual, the measurement data are loaded.

load('int_enc_id_noise_bis.mat', 'interferometer', 'encoder', 'u', 't');



% The first 0.1 seconds are removed as it corresponds to transient behavior.

interferometer = interferometer(t>0.1);
encoder = encoder(t>0.1);
u = u(t>0.1);
t = t(t>0.1);



% Finally the offset are removed using the =detrend= command.

interferometer = detrend(interferometer, 0);
encoder = detrend(encoder, 0);
u = detrend(u, 0);

% Excitation and Measured Signals
% The excitation signal is a white noise filtered by a low pass filter to not excite too much the high frequency modes.

% The excitation signal is shown in Figure [[fig:encoder_identification_excitation_time]].

figure;
plot(t, u);
xlabel('Time [s]'); ylabel('Voltage [V]');



% #+name: fig:encoder_identification_excitation_time
% #+caption:
% #+RESULTS:
% [[file:figs/encoder_identification_excitation_time.png]]

% The measured motion by the interferometer and encoder is shown in Figure

figure;
hold on;
plot(t, interferometer, 'DisplayName', 'Interferometer');
plot(t, encoder, 'DisplayName', 'Encoder');
hold off;
xlabel('Time [s]'); ylabel('Displacement [m]');
legend('location', 'southeast');

% Identification
% Now the dynamics from the voltage sent to the voltage amplitude driving the APA95ML to the measured displacement by both the encoder and interferometer are computed.


Ts = 1e-4; % Sampling Time [s]
win = hann(ceil(10/Ts));

[tf_i_est, f] = tfestimate(u, interferometer, win, [], [], 1/Ts);
[co_i_est, ~] = mscohere(u, interferometer, win, [], [], 1/Ts);

[tf_e_est, ~] = tfestimate(u, encoder, win, [], [], 1/Ts);
[co_e_est, ~] = mscohere(u, encoder, win, [], [], 1/Ts);



% The obtained coherence is shown in Figure [[fig:identification_dynamics_coherence]].
% It is shown that the identification is good until 500Hz for the interferometer and until 1kHz for the encoder.


figure;
hold on;
plot(f, co_i_est, '-', 'DisplayName', 'Interferometer')
plot(f, co_e_est, '-', 'DisplayName', 'Encoder')
set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
ylabel('Coherence'); xlabel('Frequency [Hz]');
hold off;
xlim([0.5, 5e3]);
legend('location', 'southwest');



% #+name: fig:identification_dynamics_coherence
% #+caption:
% #+RESULTS:
% [[file:figs/identification_dynamics_coherence.png]]

% The compared dynamics as measured by the intereferometer and encoder are shown in Figure [[fig:identification_dynamics_bode]].


figure;
 tiledlayout(3, 1, 'TileSpacing', 'None', 'Padding', 'None');

 ax1 = nexttile([2, 1]);
 hold on;
 plot(f, abs(tf_i_est), '-', 'DisplayName', 'Interferometer')
 plot(f, abs(tf_e_est), '-', 'DisplayName', 'Encoder')
 set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'log');
 ylabel('Amplitude'); set(gca, 'XTickLabel',[]);
 hold off;
 ylim([1e-7, 3e-4]);
 legend('location', 'southwest');

 ax2 = nexttile;
 hold on;
 plot(f, 180/pi*angle(tf_i_est), '-')
 plot(f, 180/pi*angle(tf_e_est), '-')
 set(gca, 'Xscale', 'log'); set(gca, 'Yscale', 'lin');
 ylabel('Phase [deg]'); xlabel('Frequency [Hz]');
hold off;
 yticks(-360:90:360);
 axis padded 'auto x'

 linkaxes([ax1,ax2], 'x');
 xlim([0.5, 5e3]);
