119 lines
3.2 KiB
Mathematica
119 lines
3.2 KiB
Mathematica
|
%% 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]);
|