Start to modify the way disturbances are configured

This commit is contained in:
Thomas Dehaeze 2024-11-05 23:34:34 +01:00
parent 825f626961
commit 31d4dd5f24
3 changed files with 338 additions and 263 deletions

View File

@ -1,183 +1,229 @@
function [] = initializeDisturbances(args) function [] = initializeDisturbances(args)
% initializeDisturbances - Initialize the disturbances % initializeDisturbances - Initialize the disturbances
% %
% Syntax: [] = initializeDisturbances(args) % Syntax: [] = initializeDisturbances(args)
% %
% Inputs: % Inputs:
% - args - % - args -
arguments arguments
% Global parameter to enable or disable the disturbances % Global parameter to enable or disable the disturbances
args.enable logical {mustBeNumericOrLogical} = true args.enable logical {mustBeNumericOrLogical} = true
% Ground Motion - X direction % Ground Motion - X direction
args.Dwx logical {mustBeNumericOrLogical} = true args.Dwx logical {mustBeNumericOrLogical} = true
% Ground Motion - Y direction % Ground Motion - Y direction
args.Dwy logical {mustBeNumericOrLogical} = true args.Dwy logical {mustBeNumericOrLogical} = true
% Ground Motion - Z direction % Ground Motion - Z direction
args.Dwz logical {mustBeNumericOrLogical} = true args.Dwz logical {mustBeNumericOrLogical} = true
% Translation Stage - X direction % Translation Stage - X direction
args.Fty_x logical {mustBeNumericOrLogical} = true args.Fty_x logical {mustBeNumericOrLogical} = true
% Translation Stage - Z direction % Translation Stage - Z direction
args.Fty_z logical {mustBeNumericOrLogical} = true args.Fty_z logical {mustBeNumericOrLogical} = true
% Spindle - X direction % Spindle - X direction
args.Frz_x logical {mustBeNumericOrLogical} = true args.Frz_x logical {mustBeNumericOrLogical} = true
% Spindle - Y direction % Spindle - Y direction
args.Frz_y logical {mustBeNumericOrLogical} = true args.Frz_y logical {mustBeNumericOrLogical} = true
% Spindle - Z direction % Spindle - Z direction
args.Frz_z logical {mustBeNumericOrLogical} = true args.Frz_z logical {mustBeNumericOrLogical} = true
end end
load('dist_psd.mat', 'dist_f'); % Initialization of random numbers
rng("shuffle");
dist_f.f = dist_f.f(2:end); %% Ground Motion
dist_f.psd_gm = dist_f.psd_gm(2:end); load('dist_psd.mat', 'dist_f');
dist_f.psd_ty = dist_f.psd_ty(2:end);
dist_f.psd_rz = dist_f.psd_rz(2:end);
Fs = 2*dist_f.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz] % Frequency Data
N = 2*length(dist_f.f); % Number of Samples match the one of the wanted PSD Dw.f = dist_f.f(2:end);
T0 = N/Fs; % Signal Duration [s] Dw.psd_x = dist_f.psd_gm(2:end);
df = 1/T0; % Frequency resolution of the DFT [Hz] Dw.psd_y = dist_f.psd_gm(2:end);
% Also equal to (dist_f.f(2)-dist_f.f(1)) Dw.psd_z = dist_f.psd_gm(2:end);
t = linspace(0, T0, N+1)'; % Time Vector [s]
Ts = 1/Fs; % Sampling Time [s]
phi = dist_f.psd_gm; % Time data
C = zeros(N/2,1); Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
for i = 1:N/2 N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
C(i) = sqrt(phi(i)*df); T0 = N/Fs; % Signal Duration [s]
end Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
if args.Dwx && args.enable C = zeros(N/2,1);
rng(111); for i = 1:N/2
C(i) = sqrt(Dw.psd_x(i)/T0);
end
if args.Dwx && args.enable
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwx = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m] Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else else
Dwx = zeros(length(t), 1); Dw.x = zeros(length(Dw.t), 1);
end end
if args.Dwy && args.enable if args.Dwy && args.enable
rng(112);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwy = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m] Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else else
Dwy = zeros(length(t), 1); Dw.y = zeros(length(Dw.t), 1);
end end
if args.Dwy && args.enable if args.Dwy && args.enable
rng(113);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwz = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m] Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else else
Dwz = zeros(length(t), 1); Dw.z = zeros(length(Dw.t), 1);
end end
if args.Fty_x && args.enable load('dist_psd.mat', 'dist_f');
phi = dist_f.psd_ty; % TODO - we take here the vertical direction which is wrong but approximate dist_f.f = dist_f.f(2:end);
dist_f.psd_gm = dist_f.psd_gm(2:end);
dist_f.psd_ty = dist_f.psd_ty(2:end);
dist_f.psd_rz = dist_f.psd_rz(2:end);
%% Translation Stage
load('dist_psd.mat', 'dist_f');
% Frequency Data
Ty.f = dist_f.f(2:end);
Ty.psd_x = dist_f.psd_ty(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Ty.psd_z = dist_f.psd_ty(2:end);
% Time data
Fs = 2*Ty.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Ty.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Ty.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Ty.psd_x(i)/T0);
end
% Translation Stage - X
if args.Fty_x && args.enable
phi = Ty.psd_x;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end end
rng(121);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N]
Fty_x = u; Ty.x = u;
else else
Fty_x = zeros(length(t), 1); Ty.x = zeros(length(Ty.t), 1);
end end
if args.Fty_z && args.enable % Translation Stage - Z
phi = dist_f.psd_ty; if args.Fty_z && args.enable
phi = Ty.psd_z;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end end
rng(122);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N]
Fty_z = u; Ty.z = u;
else else
Fty_z = zeros(length(t), 1); Ty.z = zeros(length(Ty.t), 1);
end end
% if args.Frz_x && args.enable %% Translation Stage
% phi = dist_f.psd_rz; load('dist_psd.mat', 'dist_f');
% C = zeros(N/2,1);
% for i = 1:N/2
% C(i) = sqrt(phi(i)*df);
% end
% rng(131);
% theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
% Cx = [0 ; C.*complex(cos(theta),sin(theta))];
% Cx = [Cx; flipud(conj(Cx(2:end)))];;
% u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
% Frz_x = u;
% else
Frz_x = zeros(length(t), 1);
% end
% if args.Frz_y && args.enable % Frequency Data
% phi = dist_f.psd_rz; Rz.f = dist_f.f(2:end);
% C = zeros(N/2,1); Rz.psd_x = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
% for i = 1:N/2 Rz.psd_y = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
% C(i) = sqrt(phi(i)*df); Rz.psd_z = dist_f.psd_rz(2:end);
% end
% rng(131);
% theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
% Cx = [0 ; C.*complex(cos(theta),sin(theta))];
% Cx = [Cx; flipud(conj(Cx(2:end)))];;
% u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
% Frz_z = u;
% else
Frz_y = zeros(length(t), 1);
% end
if args.Frz_z && args.enable % Time data
phi = dist_f.psd_rz; Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Rz.psd_x(i)/T0);
end
% Translation Stage - X
if args.Frz_x && args.enable
phi = Rz.psd_x;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz x [N]
Rz.x = u;
else
Rz.x = zeros(length(Rz.t), 1);
end
% Translation Stage - Y
if args.Frz_y && args.enable
phi = Rz.psd_y;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz y [N]
Rz.y = u;
else
Rz.y = zeros(length(Rz.t), 1);
end
% Translation Stage - Z
if args.Frz_z && args.enable
phi = Rz.psd_z;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end end
rng(131);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
Frz_z = u; Rz.z = u;
else else
Frz_z = zeros(length(t), 1); Rz.z = zeros(length(Rz.t), 1);
end end
u = zeros(length(t), 6); u = zeros(100, 6);
Fd = u; Fd = u;
Dwx = Dwx - Dwx(1); Dw.x = Dw.x - Dw.x(1);
Dwy = Dwy - Dwy(1); Dw.y = Dw.y - Dw.y(1);
Dwz = Dwz - Dwz(1); Dw.z = Dw.z - Dw.z(1);
Fty_x = Fty_x - Fty_x(1); Ty.x = Ty.x - Ty.x(1);
Fty_z = Fty_z - Fty_z(1); Ty.z = Ty.z - Ty.z(1);
Frz_z = Frz_z - Frz_z(1); Rz.x = Rz.x - Rz.x(1);
Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
if exist('./mat', 'dir') if exist('./mat', 'dir')
if exist('./mat/nass_disturbances.mat', 'file') if exist('./mat/nass_disturbances.mat', 'file')
save('mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args', '-append'); save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else else
save('mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args'); save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end end
elseif exist('./matlab', 'dir') elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_disturbances.mat', 'file') if exist('./matlab/mat/nass_disturbances.mat', 'file')
save('matlab/mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args', '-append'); save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else else
save('matlab/mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args'); save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end end
end end

Binary file not shown.

View File

@ -299,8 +299,11 @@ Procedure:
[[*=initializeDisturbances=: Initialize Disturbances][=initializeDisturbances=: Initialize Disturbances]] [[*=initializeDisturbances=: Initialize Disturbances][=initializeDisturbances=: Initialize Disturbances]]
- [ ] It is suppose in this script that all disturbances have the same frequency vectors, and therefore the same time vector... - [X] It is suppose in this script that all disturbances have the same frequency vectors, and therefore the same time vector...
- [ ] See how to deal with that It does not anymore
- [X] See how to deal with that
Be able to pass custom =.mat= files (one mat file per disturbance)?
- [ ] Ground motion, X, Y and Z - [ ] Ground motion, X, Y and Z
- [ ] Ty stage, X and Z - [ ] Ty stage, X and Z
@ -2486,8 +2489,8 @@ initializeDisturbances(...
'Dwz', true, ... % Ground Motion - Z direction 'Dwz', true, ... % Ground Motion - Z direction
'Fty_x', false, ... % Translation Stage - X direction 'Fty_x', false, ... % Translation Stage - X direction
'Fty_z', false, ... % Translation Stage - Z direction 'Fty_z', false, ... % Translation Stage - Z direction
'Frz_x', false, ... % Spindle - X direction 'Frz_x', true, ... % Spindle - X direction
'Frz_y', false, ... % Spindle - Y direction 'Frz_y', true, ... % Spindle - Y direction
'Frz_z', true); % Spindle - Z direction 'Frz_z', true); % Spindle - Z direction
initializeReferences(... initializeReferences(...
@ -2501,9 +2504,9 @@ tomo_align_dist = simout;
#+begin_src matlab :exports none #+begin_src matlab :exports none
figure; figure;
hold on; hold on;
plot(tomo_align_dist.y.x.Time, tomo_align_dist.y.x.Data) plot(tomo_align_dist.y.x.Time, 1e6*tomo_align_dist.y.x.Data)
plot(tomo_align_dist.y.y.Time, tomo_align_dist.y.y.Data) plot(tomo_align_dist.y.y.Time, 1e6*tomo_align_dist.y.y.Data)
plot(tomo_align_dist.y.z.Time, tomo_align_dist.y.z.Data) plot(tomo_align_dist.y.z.Time, 1e6*tomo_align_dist.y.z.Data)
hold off; hold off;
#+end_src #+end_src
@ -2540,18 +2543,16 @@ hold off;
#+end_src #+end_src
** Raster Scans with the translation stage ** Raster Scans with the translation stage
<<sec:ty_scans>>
#+begin_src matlab #+begin_src matlab
initializeReferences('Dy_type', 'triangular', 'Dy_amplitude', 10e-3, 'Dy_period', 1); initializeReferences('Dy_type', 'triangular', 'Dy_amplitude', 10e-3, 'Dy_period', 1);
sim(mdl); sim(mdl);
ty_scan_triangle = simout; ty_scan_triangle = simout;
% save('./mat/experiment_tomography.mat', 'ty_scan_triangle', '-append'); % save('./mat/experiment_tomography.mat', 'ty_scan_triangle', '-append');
#+end_src #+end_src
* Conclusion * Conclusion
<<sec:uniaxial_conclusion>> <<sec:uniaxial_conclusion>>
* Bibliography :ignore: * Bibliography :ignore:
#+latex: \printbibliography[heading=bibintoc,title={Bibliography}] #+latex: \printbibliography[heading=bibintoc,title={Bibliography}]
@ -2979,200 +2980,228 @@ arguments
end end
#+end_src #+end_src
*** Load Data
#+begin_src matlab #+begin_src matlab
load('dist_psd.mat', 'dist_f'); % Initialization of random numbers
rng("shuffle");
#+end_src #+end_src
*** Ground Motion
#+begin_src matlab
%% Ground Motion
load('dist_psd.mat', 'dist_f');
% Frequency Data
Dw.f = dist_f.f(2:end);
Dw.psd_x = dist_f.psd_gm(2:end);
Dw.psd_y = dist_f.psd_gm(2:end);
Dw.psd_z = dist_f.psd_gm(2:end);
% Time data
Fs = 2*Dw.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Dw.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Dw.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Dw.psd_x(i)/T0);
end
if args.Dwx && args.enable
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.x = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dw.x = zeros(length(Dw.t), 1);
end
if args.Dwy && args.enable
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.y = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dw.y = zeros(length(Dw.t), 1);
end
if args.Dwy && args.enable
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dw.z = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dw.z = zeros(length(Dw.t), 1);
end
#+end_src
*** Translation Stage
We remove the first frequency point that usually is very large. We remove the first frequency point that usually is very large.
#+begin_src matlab :exports none #+begin_src matlab :exports none
load('dist_psd.mat', 'dist_f');
dist_f.f = dist_f.f(2:end); dist_f.f = dist_f.f(2:end);
dist_f.psd_gm = dist_f.psd_gm(2:end); dist_f.psd_gm = dist_f.psd_gm(2:end);
dist_f.psd_ty = dist_f.psd_ty(2:end); dist_f.psd_ty = dist_f.psd_ty(2:end);
dist_f.psd_rz = dist_f.psd_rz(2:end); dist_f.psd_rz = dist_f.psd_rz(2:end);
#+end_src #+end_src
*** Parameters
We define some parameters that will be used in the algorithm.
#+begin_src matlab #+begin_src matlab
Fs = 2*dist_f.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz] %% Translation Stage
N = 2*length(dist_f.f); % Number of Samples match the one of the wanted PSD load('dist_psd.mat', 'dist_f');
T0 = N/Fs; % Signal Duration [s]
df = 1/T0; % Frequency resolution of the DFT [Hz] % Frequency Data
% Also equal to (dist_f.f(2)-dist_f.f(1)) Ty.f = dist_f.f(2:end);
t = linspace(0, T0, N+1)'; % Time Vector [s] Ty.psd_x = dist_f.psd_ty(2:end); % TODO - we take here the vertical direction which is wrong but approximate
Ts = 1/Fs; % Sampling Time [s] Ty.psd_z = dist_f.psd_ty(2:end);
#+end_src
% Time data
Fs = 2*Ty.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
N = 2*length(Ty.f); % Number of Samples match the one of the wanted PSD
T0 = N/Fs; % Signal Duration [s]
Ty.t = linspace(0, T0, N+1)'; % Time Vector [s]
*** Ground Motion
#+begin_src matlab
phi = dist_f.psd_gm;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(Ty.psd_x(i)/T0);
end end
#+end_src
#+begin_src matlab % Translation Stage - X
if args.Dwx && args.enable
rng(111);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwx = N/sqrt(2)*ifft(Cx); % Ground Motion - x direction [m]
else
Dwx = zeros(length(t), 1);
end
#+end_src
#+begin_src matlab
if args.Dwy && args.enable
rng(112);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwy = N/sqrt(2)*ifft(Cx); % Ground Motion - y direction [m]
else
Dwy = zeros(length(t), 1);
end
#+end_src
#+begin_src matlab
if args.Dwy && args.enable
rng(113);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
Dwz = N/sqrt(2)*ifft(Cx); % Ground Motion - z direction [m]
else
Dwz = zeros(length(t), 1);
end
#+end_src
*** Translation Stage - X direction
#+begin_src matlab
if args.Fty_x && args.enable if args.Fty_x && args.enable
phi = dist_f.psd_ty; % TODO - we take here the vertical direction which is wrong but approximate phi = Ty.psd_x;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end end
rng(121);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty x [N]
Fty_x = u; Ty.x = u;
else else
Fty_x = zeros(length(t), 1); Ty.x = zeros(length(Ty.t), 1);
end end
#+end_src
*** Translation Stage - Z direction % Translation Stage - Z
#+begin_src matlab
if args.Fty_z && args.enable if args.Fty_z && args.enable
phi = dist_f.psd_ty; phi = Ty.psd_z;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end end
rng(122);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Ty z [N]
Fty_z = u; Ty.z = u;
else else
Fty_z = zeros(length(t), 1); Ty.z = zeros(length(Ty.t), 1);
end end
#+end_src #+end_src
*** Spindle - X direction *** Spindle
#+begin_src matlab #+begin_src matlab
% if args.Frz_x && args.enable %% Translation Stage
% phi = dist_f.psd_rz; load('dist_psd.mat', 'dist_f');
% C = zeros(N/2,1);
% for i = 1:N/2
% C(i) = sqrt(phi(i)*df);
% end
% rng(131);
% theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
% Cx = [0 ; C.*complex(cos(theta),sin(theta))];
% Cx = [Cx; flipud(conj(Cx(2:end)))];;
% u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
% Frz_x = u;
% else
Frz_x = zeros(length(t), 1);
% end
#+end_src
*** Spindle - Y direction % Frequency Data
#+begin_src matlab Rz.f = dist_f.f(2:end);
% if args.Frz_y && args.enable Rz.psd_x = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
% phi = dist_f.psd_rz; Rz.psd_y = dist_f.psd_rz(2:end); % TODO - we take here the vertical direction which is wrong but approximate
% C = zeros(N/2,1); Rz.psd_z = dist_f.psd_rz(2:end);
% for i = 1:N/2
% C(i) = sqrt(phi(i)*df);
% end
% rng(131);
% theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
% Cx = [0 ; C.*complex(cos(theta),sin(theta))];
% Cx = [Cx; flipud(conj(Cx(2:end)))];;
% u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
% Frz_z = u;
% else
Frz_y = zeros(length(t), 1);
% end
#+end_src
*** Spindle - Z direction % Time data
#+begin_src matlab Fs = 2*Rz.f(end); % Sampling Frequency of data is twice the maximum frequency of the PSD vector [Hz]
if args.Frz_z && args.enable N = 2*length(Rz.f); % Number of Samples match the one of the wanted PSD
phi = dist_f.psd_rz; T0 = N/Fs; % Signal Duration [s]
Rz.t = linspace(0, T0, N+1)'; % Time Vector [s]
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(Rz.psd_x(i)/T0);
end
% Translation Stage - X
if args.Frz_x && args.enable
phi = Rz.psd_x;
C = zeros(N/2,1); C = zeros(N/2,1);
for i = 1:N/2 for i = 1:N/2
C(i) = sqrt(phi(i)*df); C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz x [N]
Rz.x = u;
else
Rz.x = zeros(length(Rz.t), 1);
end
% Translation Stage - Y
if args.Frz_y && args.enable
phi = Rz.psd_y;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end
theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz y [N]
Rz.y = u;
else
Rz.y = zeros(length(Rz.t), 1);
end
% Translation Stage - Z
if args.Frz_z && args.enable
phi = Rz.psd_z;
C = zeros(N/2,1);
for i = 1:N/2
C(i) = sqrt(phi(i)/T0);
end end
rng(131);
theta = 2*pi*rand(N/2,1); % Generate random phase [rad] theta = 2*pi*rand(N/2,1); % Generate random phase [rad]
Cx = [0 ; C.*complex(cos(theta),sin(theta))]; Cx = [0 ; C.*complex(cos(theta),sin(theta))];
Cx = [Cx; flipud(conj(Cx(2:end)))];; Cx = [Cx; flipud(conj(Cx(2:end)))];;
u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N] u = N/sqrt(2)*ifft(Cx); % Disturbance Force Rz z [N]
Frz_z = u; Rz.z = u;
else else
Frz_z = zeros(length(t), 1); Rz.z = zeros(length(Rz.t), 1);
end end
#+end_src #+end_src
*** Direct Forces *** Direct Forces
#+begin_src matlab #+begin_src matlab
u = zeros(length(t), 6); u = zeros(100, 6);
Fd = u; Fd = u;
#+end_src #+end_src
*** Set initial value to zero *** Set initial value to zero
#+begin_src matlab #+begin_src matlab
Dwx = Dwx - Dwx(1); Dw.x = Dw.x - Dw.x(1);
Dwy = Dwy - Dwy(1); Dw.y = Dw.y - Dw.y(1);
Dwz = Dwz - Dwz(1); Dw.z = Dw.z - Dw.z(1);
Fty_x = Fty_x - Fty_x(1); Ty.x = Ty.x - Ty.x(1);
Fty_z = Fty_z - Fty_z(1); Ty.z = Ty.z - Ty.z(1);
Frz_z = Frz_z - Frz_z(1); Rz.x = Rz.x - Rz.x(1);
Rz.y = Rz.y - Rz.y(1);
Rz.z = Rz.z - Rz.z(1);
#+end_src #+end_src
*** Save the Structure *** Save the Structure
#+begin_src matlab #+begin_src matlab
if exist('./mat', 'dir') if exist('./mat', 'dir')
if exist('./mat/nass_disturbances.mat', 'file') if exist('./mat/nass_disturbances.mat', 'file')
save('mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args', '-append'); save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else else
save('mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args'); save('mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end end
elseif exist('./matlab', 'dir') elseif exist('./matlab', 'dir')
if exist('./matlab/mat/nass_disturbances.mat', 'file') if exist('./matlab/mat/nass_disturbances.mat', 'file')
save('matlab/mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args', '-append'); save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args', '-append');
else else
save('matlab/mat/nass_disturbances.mat', 'Dwx', 'Dwy', 'Dwz', 'Fty_x', 'Fty_z', 'Frz_x', 'Frz_y', 'Frz_z', 'Fd', 'Ts', 't', 'args'); save('matlab/mat/nass_disturbances.mat', 'Dw', 'Ty', 'Rz', 'Fd', 'args');
end end
end end
#+end_src #+end_src