add all files
This commit is contained in:
23
A3-micro-station-modal-analysis/mat/acc_pos.txt
Normal file
23
A3-micro-station-modal-analysis/mat/acc_pos.txt
Normal file
@@ -0,0 +1,23 @@
|
||||
23 1.5500e-001 -9.0000e-002 -5.9400e-001
|
||||
22 0.0000e+000 1.8000e-001 -5.9400e-001
|
||||
21 -1.5500e-001 -9.0000e-002 -5.9400e-001
|
||||
20 8.6490e-001 -5.0600e-001 -9.5060e-001
|
||||
19 8.7500e-001 7.9900e-001 -9.5060e-001
|
||||
18 -7.3500e-001 8.1400e-001 -9.5060e-001
|
||||
17 -7.3000e-001 -5.2600e-001 -9.5060e-001
|
||||
16 2.9500e-001 -4.8100e-001 -7.8560e-001
|
||||
15 4.5000e-001 5.3400e-001 -7.8560e-001
|
||||
14 -4.8000e-001 5.3400e-001 -7.8560e-001
|
||||
13 -3.2000e-001 -4.4600e-001 -7.8560e-001
|
||||
12 4.7500e-001 -4.1900e-001 -4.2730e-001
|
||||
11 4.7500e-001 4.2400e-001 -4.2730e-001
|
||||
10 -4.6500e-001 4.0700e-001 -4.2730e-001
|
||||
9 -4.7500e-001 -4.1400e-001 -4.2730e-001
|
||||
8 3.8000e-001 -3.0000e-001 -4.1680e-001
|
||||
7 4.2000e-001 2.8000e-001 -4.1680e-001
|
||||
6 -4.2000e-001 2.8000e-001 -4.1680e-001
|
||||
5 -3.8500e-001 -3.0000e-001 -4.1680e-001
|
||||
4 6.4000e-002 -6.4000e-002 -2.7000e-001
|
||||
3 6.4000e-002 6.4000e-002 -2.7000e-001
|
||||
2 -6.4000e-002 6.4000e-002 -2.7000e-001
|
||||
1 -6.4000e-002 -6.4000e-002 -2.7000e-001
|
BIN
A3-micro-station-modal-analysis/mat/frf_com.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/frf_com.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
A3-micro-station-modal-analysis/mat/frf_matrix.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/frf_matrix.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
A3-micro-station-modal-analysis/mat/geometry.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/geometry.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
A3-micro-station-modal-analysis/mat/meas_microstation_frf.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/meas_microstation_frf.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
A3-micro-station-modal-analysis/mat/meas_raw_1.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/meas_raw_1.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
BIN
A3-micro-station-modal-analysis/mat/modal_microstation_compliance.mat
(Stored with Git LFS)
Normal file
BIN
A3-micro-station-modal-analysis/mat/modal_microstation_compliance.mat
(Stored with Git LFS)
Normal file
Binary file not shown.
16
A3-micro-station-modal-analysis/mat/mode_damps.txt
Normal file
16
A3-micro-station-modal-analysis/mat/mode_damps.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
12.20318
|
||||
11.66888
|
||||
6.19561
|
||||
2.79104
|
||||
2.76253
|
||||
4.34928
|
||||
1.25546
|
||||
3.65470
|
||||
2.94088
|
||||
3.19084
|
||||
1.55526
|
||||
3.13166
|
||||
2.76141
|
||||
1.34304
|
||||
2.43201
|
||||
1.38400
|
16
A3-micro-station-modal-analysis/mat/mode_freqs.txt
Normal file
16
A3-micro-station-modal-analysis/mat/mode_freqs.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
11.86509
|
||||
18.55747
|
||||
37.82163
|
||||
39.07850
|
||||
56.31944
|
||||
69.78452
|
||||
72.49325
|
||||
84.83446
|
||||
91.26350
|
||||
105.47266
|
||||
106.57165
|
||||
112.67669
|
||||
124.20538
|
||||
145.30034
|
||||
150.52113
|
||||
165.42632
|
16
A3-micro-station-modal-analysis/mat/mode_modal_a.txt
Normal file
16
A3-micro-station-modal-analysis/mat/mode_modal_a.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
4.13559e+003 +6.22828e+003
|
||||
2.76278e+002 +1.74197e+004
|
||||
-1.32270e+004 +2.17346e+004
|
||||
-2.48397e+005 -1.60998e+005
|
||||
-4.23967e+004 +7.06852e+004
|
||||
-7.36964e+003 +4.57024e+004
|
||||
1.37806e+005 +3.00336e+005
|
||||
-1.31109e+004 +2.81759e+004
|
||||
5.59259e+003 -4.27543e+004
|
||||
-5.28869e+004 +6.38436e+003
|
||||
3.71578e+004 +1.57745e+004
|
||||
-4.24659e+004 +7.90956e+003
|
||||
-3.57355e+004 +1.13161e+005
|
||||
5.24764e+004 -1.45211e+005
|
||||
1.97228e+005 +2.51758e+005
|
||||
-3.00273e+005 +3.27201e+005
|
16
A3-micro-station-modal-analysis/mat/mode_modal_b.txt
Normal file
16
A3-micro-station-modal-analysis/mat/mode_modal_b.txt
Normal file
@@ -0,0 +1,16 @@
|
||||
4.98475e+005 -2.49344e+005
|
||||
2.02102e+006 +2.05017e+005
|
||||
4.96035e+006 +3.45724e+006
|
||||
-4.12180e+007 +5.98638e+007
|
||||
2.45891e+007 +1.56880e+007
|
||||
1.98796e+007 +4.09986e+006
|
||||
1.37577e+008 -6.10466e+007
|
||||
1.47532e+007 +7.53272e+006
|
||||
-2.44115e+007 -3.92655e+006
|
||||
3.11045e+006 +3.51656e+007
|
||||
1.09485e+007 -2.47140e+007
|
||||
4.65546e+006 +3.02251e+007
|
||||
8.75076e+007 +3.03162e+007
|
||||
-1.31915e+008 -4.96844e+007
|
||||
2.42567e+008 -1.80683e+008
|
||||
3.35742e+008 +3.16782e+008
|
1104
A3-micro-station-modal-analysis/mat/mode_shapes.txt
Normal file
1104
A3-micro-station-modal-analysis/mat/mode_shapes.txt
Normal file
File diff suppressed because it is too large
Load Diff
18
A3-micro-station-modal-analysis/mat/model_solidworks_com.txt
Normal file
18
A3-micro-station-modal-analysis/mat/model_solidworks_com.txt
Normal file
@@ -0,0 +1,18 @@
|
||||
0.045
|
||||
0.144
|
||||
-1.251
|
||||
0.052
|
||||
0.258
|
||||
-0.778
|
||||
0.000
|
||||
0.014
|
||||
-0.600
|
||||
0.000
|
||||
-0.005
|
||||
-0.628
|
||||
0.000
|
||||
0.000
|
||||
-0.580
|
||||
-0.004
|
||||
0.006
|
||||
-0.319
|
83
A3-micro-station-modal-analysis/modal_1_meas_setup.m
Normal file
83
A3-micro-station-modal-analysis/modal_1_meas_setup.m
Normal file
@@ -0,0 +1,83 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
%% Path for functions, data and scripts
|
||||
addpath('./mat/'); % Path for data
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Load Accelerometer positions
|
||||
acc_pos = readtable('mat/acc_pos.txt', 'ReadVariableNames', false);
|
||||
acc_pos = table2array(acc_pos(:, 1:4));
|
||||
[~, i] = sort(acc_pos(:, 1));
|
||||
acc_pos = acc_pos(i, 2:4);
|
||||
|
||||
%% Load raw data
|
||||
meas1_raw = load('mat/meas_raw_1.mat');
|
||||
|
||||
% Sampling Frequency [Hz]
|
||||
Fs = 1/meas1_raw.Track1_X_Resolution;
|
||||
|
||||
% Time just before the impact occurs [s]
|
||||
impacts = [5.937, 11.228, 16.681, 22.205, 27.350, 32.714, 38.115, 43.888, 50.407]-0.01;
|
||||
|
||||
% Time vector [s]
|
||||
time = linspace(0, meas1_raw.Track1_X_Resolution*length(meas1_raw.Track1), length(meas1_raw.Track1));
|
||||
|
||||
%% Raw measurement of the Accelerometer
|
||||
figure;
|
||||
hold on;
|
||||
plot(time-22.2, meas1_raw.Track2, 'DisplayName', '$X_{1,x}$ [$m/s^2$]');
|
||||
plot(time-22.2, 1e-3*meas1_raw.Track1, 'DisplayName', '$F_{z}$ [kN]');
|
||||
hold off;
|
||||
xlabel('Time [s]');
|
||||
ylabel('Amplitude');
|
||||
xlim([0, 0.2])
|
||||
ylim([-2, 2]);
|
||||
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
%% Frequency Analysis
|
||||
Nfft = floor(5.0*Fs); % Number of frequency points
|
||||
win = hanning(Nfft); % Windowing
|
||||
Noverlap = floor(Nfft/2); % Overlap for frequency analysis
|
||||
|
||||
%% Comnpute the power spectral density of the force and acceleration
|
||||
[pxx_force, f] = pwelch(meas1_raw.Track1, win, Noverlap, Nfft, Fs);
|
||||
[pxx_acc, ~] = pwelch(meas1_raw.Track2, win, Noverlap, Nfft, Fs);
|
||||
|
||||
%% Normalized Amplitude Spectral Density of the measured force and acceleration
|
||||
figure;
|
||||
hold on;
|
||||
plot(f, sqrt(pxx_acc./max(pxx_acc(f<200))), 'DisplayName', '$\Gamma_{X_{1,x}}$');
|
||||
plot(f, sqrt(pxx_force./max(pxx_force(f<200))), 'DisplayName', '$\Gamma_{F_{z}}$');
|
||||
hold off;
|
||||
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin');
|
||||
xlabel('Frequency [Hz]'); ylabel('Normalized Spectral Density');
|
||||
xlim([0, 200]);
|
||||
xticks([0:20:200]);
|
||||
ylim([0, 1])
|
||||
legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
%% Compute the transfer function and Coherence
|
||||
[G1, f] = tfestimate(meas1_raw.Track1, meas1_raw.Track2, win, Noverlap, Nfft, Fs);
|
||||
[coh1, ~] = mscohere( meas1_raw.Track1, meas1_raw.Track2, win, Noverlap, Nfft, Fs);
|
||||
|
||||
%% Frequency Response Function between the force and the acceleration
|
||||
figure;
|
||||
plot(f, abs(G1));
|
||||
xlabel('Frequency [Hz]'); ylabel('FRF [$m/s^2/N$]')
|
||||
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'log');
|
||||
xlim([0, 200]);
|
||||
xticks([0:20:200]);
|
||||
|
||||
%% Frequency Response Function between the force and the acceleration
|
||||
figure;
|
||||
plot(f, coh1);
|
||||
xlabel('Frequency [Hz]'); ylabel('Coherence [-]')
|
||||
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'lin');
|
||||
xlim([0, 200]); ylim([0,1]);
|
||||
xticks([0:20:200]);
|
132
A3-micro-station-modal-analysis/modal_2_frf_processing.m
Normal file
132
A3-micro-station-modal-analysis/modal_2_frf_processing.m
Normal file
@@ -0,0 +1,132 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
%% Path for functions, data and scripts
|
||||
addpath('./mat/'); % Path for data
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Load frequency response matrix
|
||||
load('frf_matrix.mat', 'freqs', 'frf');
|
||||
|
||||
%% Load Accelerometer positions
|
||||
acc_pos = readtable('mat/acc_pos.txt', 'ReadVariableNames', false);
|
||||
acc_pos = table2array(acc_pos(:, 1:4));
|
||||
[~, i] = sort(acc_pos(:, 1));
|
||||
acc_pos = acc_pos(i, 2:4);
|
||||
|
||||
%% Accelerometers ID connected to each solid body
|
||||
solids = {};
|
||||
solids.gbot = [17, 18, 19, 20]; % bottom granite
|
||||
solids.gtop = [13, 14, 15, 16]; % top granite
|
||||
solids.ty = [9, 10, 11, 12]; % Ty stage
|
||||
solids.ry = [5, 6, 7, 8]; % Ry stage
|
||||
solids.rz = [21, 22, 23]; % Rz stage
|
||||
solids.hexa = [1, 2, 3, 4]; % Hexapod
|
||||
|
||||
% Names of the solid bodies
|
||||
solid_names = fields(solids);
|
||||
|
||||
%% Save the accelerometer positions are well as the solid bodies
|
||||
save('mat/geometry.mat', 'solids', 'solid_names', 'acc_pos');
|
||||
|
||||
%% Extract the CoM of considered solid bodies
|
||||
model_com = reshape(table2array(readtable('mat/model_solidworks_com.txt', 'ReadVariableNames', false)), [3, 6]);
|
||||
|
||||
%% Frequency Response Matrix - Response expressed at the CoM of the solid bodies
|
||||
frfs_CoM = zeros(length(solid_names)*6, 3, 801);
|
||||
|
||||
for solid_i = 1:length(solid_names)
|
||||
% Number of accelerometers fixed to this solid body
|
||||
solids_i = solids.(solid_names{solid_i});
|
||||
|
||||
% "Jacobian" matrix to go from accelerometer frame to CoM frame
|
||||
A = zeros(3*length(solids_i), 6);
|
||||
for i = 1:length(solids_i)
|
||||
acc_i = solids_i(i);
|
||||
|
||||
acc_pos_com = acc_pos(acc_i, :).' - model_com(:, solid_i);
|
||||
|
||||
A(3*(i-1)+1:3*i, 1:3) = eye(3);
|
||||
A(3*(i-1)+1:3*i, 4:6) = [ 0 acc_pos_com(3) -acc_pos_com(2) ;
|
||||
-acc_pos_com(3) 0 acc_pos_com(1) ;
|
||||
acc_pos_com(2) -acc_pos_com(1) 0];
|
||||
end
|
||||
|
||||
for exc_dir = 1:3
|
||||
frfs_CoM((solid_i-1)*6+1:solid_i*6, exc_dir, :) = A\squeeze(frf((solids_i(1)-1)*3+1:solids_i(end)*3, exc_dir, :));
|
||||
end
|
||||
end
|
||||
|
||||
%% Save the computed FRF at the CoM
|
||||
save('mat/frf_com.mat', 'frfs_CoM');
|
||||
|
||||
%% Compute the FRF at the accelerometer location from the CoM reponses
|
||||
frfs_A = zeros(size(frf));
|
||||
|
||||
% For each excitation direction
|
||||
for exc_dir = 1:3
|
||||
% For each solid
|
||||
for solid_i = 1:length(solid_names)
|
||||
v0 = squeeze(frfs_CoM((solid_i-1)*6+1:(solid_i-1)*6+3, exc_dir, :));
|
||||
W0 = squeeze(frfs_CoM((solid_i-1)*6+4:(solid_i-1)*6+6, exc_dir, :));
|
||||
|
||||
% For each accelerometer attached to the current solid
|
||||
for acc_i = solids.(solid_names{solid_i})
|
||||
% We get the position of the accelerometer expressed in frame O
|
||||
pos = acc_pos(acc_i, :).' - model_com(:, solid_i);
|
||||
% pos = acc_pos(acc_i, :).';
|
||||
posX = [0 pos(3) -pos(2); -pos(3) 0 pos(1) ; pos(2) -pos(1) 0];
|
||||
|
||||
frfs_A(3*(acc_i-1)+1:3*(acc_i-1)+3, exc_dir, :) = v0 + posX*W0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% Comparison of the original accelerometer response and reconstructed response from the solid body response
|
||||
exc_names = {'$F_x$', '$F_y$', '$F_z$'};
|
||||
DOFs = {'x', 'y', 'z', '\theta_x', '\theta_y', '\theta_z'};
|
||||
|
||||
solid_i = 6; % Considered solid body
|
||||
exc_dir = 1; % Excited direction
|
||||
|
||||
accs_i = solids.(solid_names{solid_i}); % Accelerometers fixed to this solid body
|
||||
|
||||
figure;
|
||||
tiledlayout(2, 2, 'TileSpacing', 'Tight', 'Padding', 'None');
|
||||
|
||||
for i = 1:length(accs_i)
|
||||
acc_i = accs_i(i);
|
||||
nexttile();
|
||||
|
||||
hold on;
|
||||
for dir_i = 1:3
|
||||
plot(freqs, abs(squeeze(frf(3*(acc_i-1)+dir_i, exc_dir, :))), '-', 'color', [colors(dir_i,:), 0.5], 'linewidth', 2.5, 'DisplayName', sprintf('$a_{%i,%s}$ - meas', acc_i, DOFs{dir_i}));
|
||||
end
|
||||
for dir_i = 1:3
|
||||
plot(freqs, abs(squeeze(frfs_A(3*(acc_i-1)+dir_i, exc_dir, :))), '-', 'color', colors(dir_i, :), 'DisplayName', sprintf('$a_{%i,%s}$ - solid body', acc_i, DOFs{dir_i}));
|
||||
end
|
||||
hold off;
|
||||
|
||||
if i > 2
|
||||
xlabel('Frequency [Hz]');
|
||||
else
|
||||
set(gca, 'XTickLabel',[]);
|
||||
end
|
||||
|
||||
if rem(i, 2) == 1
|
||||
ylabel('Amplitude [$\frac{m/s^2}{N}$]');
|
||||
else
|
||||
set(gca, 'YTickLabel',[]);
|
||||
end
|
||||
|
||||
set(gca, 'XScale', 'lin'); set(gca, 'YScale', 'log');
|
||||
xlim([0, 200]); ylim([1e-6, 3e-2]);
|
||||
xticks([0:20:200]);
|
||||
leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2);
|
||||
leg.ItemTokenSize(1) = 15;
|
||||
end
|
151
A3-micro-station-modal-analysis/modal_3_analysis.m
Normal file
151
A3-micro-station-modal-analysis/modal_3_analysis.m
Normal file
@@ -0,0 +1,151 @@
|
||||
%% Clear Workspace and Close figures
|
||||
clear; close all; clc;
|
||||
|
||||
%% Intialize Laplace variable
|
||||
s = zpk('s');
|
||||
|
||||
%% Path for functions, data and scripts
|
||||
addpath('./mat/'); % Path for data
|
||||
|
||||
%% Colors for the figures
|
||||
colors = colororder;
|
||||
|
||||
%% Load frequency response matrix
|
||||
load('frf_matrix.mat', 'freqs', 'frf');
|
||||
|
||||
%% Computation of the modal indication function
|
||||
MIF = zeros(size(frf, 2), size(frf, 2), size(frf, 3));
|
||||
|
||||
for i = 1:length(freqs)
|
||||
[~,S,~] = svd(frf(:, :, i));
|
||||
MIF(:, :, i) = S'*S;
|
||||
end
|
||||
|
||||
%% Modal Indication Function
|
||||
figure;
|
||||
hold on;
|
||||
for i = 1:size(MIF, 1)
|
||||
plot(freqs, squeeze(MIF(i, i, :)), 'DisplayName', sprintf('MIF${}_%i$', i));
|
||||
end
|
||||
hold off;
|
||||
set(gca, 'Xscale', 'lin'); set(gca, 'Yscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('CMIF Amplitude');
|
||||
xticks([0:20:200]);
|
||||
xlim([0, 200]);
|
||||
ylim([1e-6, 2e-2]);
|
||||
ldg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
|
||||
%% Load modal parameters
|
||||
shapes_m = readtable('mat/mode_shapes.txt', 'ReadVariableNames', false); % [Sign / Real / Imag]
|
||||
freqs_m = table2array(readtable('mat/mode_freqs.txt', 'ReadVariableNames', false)); % in [Hz]
|
||||
damps_m = table2array(readtable('mat/mode_damps.txt', 'ReadVariableNames', false)); % in [%]
|
||||
modal_a = table2array(readtable('mat/mode_modal_a.txt', 'ReadVariableNames', false)); % [Real / Imag]
|
||||
modal_b = table2array(readtable('mat/mode_modal_b.txt', 'ReadVariableNames', false)); % [Real / Imag]
|
||||
|
||||
%% Guess the number of modes identified from the length of the imported data.
|
||||
acc_n = 23; % Number of accelerometers
|
||||
dir_n = 3; % Number of directions
|
||||
dirs = 'XYZ';
|
||||
|
||||
mod_n = size(shapes_m,1)/acc_n/dir_n; % Number of modes
|
||||
|
||||
%% Mode shapes are split into 3 parts (direction plus sign, real part and imaginary part)
|
||||
% we aggregate them into one array of complex numbers
|
||||
T_sign = table2array(shapes_m(:, 1));
|
||||
T_real = table2array(shapes_m(:, 2));
|
||||
T_imag = table2array(shapes_m(:, 3));
|
||||
|
||||
mode_shapes = zeros(mod_n, dir_n, acc_n);
|
||||
|
||||
for mod_i = 1:mod_n
|
||||
for acc_i = 1:acc_n
|
||||
% Get the correct section of the signs
|
||||
T = T_sign(acc_n*dir_n*(mod_i-1)+1:acc_n*dir_n*mod_i);
|
||||
for dir_i = 1:dir_n
|
||||
% Get the line corresponding to the sensor
|
||||
i = find(contains(T, sprintf('%i%s',acc_i, dirs(dir_i))), 1, 'first')+acc_n*dir_n*(mod_i-1);
|
||||
mode_shapes(mod_i, dir_i, acc_i) = str2num([T_sign{i}(end-1), '1'])*complex(T_real(i),T_imag(i));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% Create the eigenvalue and eigenvector matrices
|
||||
eigen_val_M = diag(2*pi*freqs_m.*(-damps_m/100 + j*sqrt(1 - (damps_m/100).^2))); % Lambda = diagonal matrix
|
||||
eigen_vec_M = reshape(mode_shapes, [mod_n, acc_n*dir_n]).'; % Phi, vecnorm(eigen_vec_M) = 1
|
||||
|
||||
% Add complex conjugate eigenvalues and eigenvectors
|
||||
eigen_val_ext_M = blkdiag(eigen_val_M, conj(eigen_val_M));
|
||||
eigen_vec_ext_M = [eigen_vec_M, conj(eigen_vec_M)];
|
||||
|
||||
%% "Modal A" and "Modal B" matrices
|
||||
modal_a_M = diag(complex(modal_a(:, 1), modal_a(:, 2)));
|
||||
modal_b_M = diag(complex(modal_b(:, 1), modal_b(:, 2)));
|
||||
|
||||
modal_a_ext_M = blkdiag(modal_a_M, conj(modal_a_M));
|
||||
modal_b_ext_M = blkdiag(modal_b_M, conj(modal_b_M));
|
||||
|
||||
%% Synthesize the full FRF matrix from the modal model
|
||||
Hsyn = zeros(acc_n*dir_n, acc_n*dir_n, length(freqs));
|
||||
|
||||
for i = 1:length(freqs)
|
||||
Hsyn(:, :, i) = eigen_vec_ext_M*diag(1./(diag(modal_a_ext_M).*(j*2*pi*freqs(i) - diag(eigen_val_ext_M))))*eigen_vec_ext_M.';
|
||||
end
|
||||
|
||||
%% Derivate two times to have the acceleration response
|
||||
for i = 1:size(Hsyn, 1)
|
||||
Hsyn(i, :, :) = squeeze(Hsyn(i, :, :)).*(j*2*pi*freqs).^2;
|
||||
end
|
||||
|
||||
acc_o = 11; dir_o = 3;
|
||||
acc_i = 11; dir_i = 3;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(frf( 3*(acc_o-1)+dir_o, dir_i, :))), 'DisplayName', 'Measured');
|
||||
plot(freqs, abs(squeeze(Hsyn(3*(acc_o-1)+dir_o, 3*(acc_i-1)+dir_i, :))), 'DisplayName', 'Synthesized');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'lin');
|
||||
set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
ylabel('Magnitude [$\frac{m/s^2}{N}$]');
|
||||
ldg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [10, 1];
|
||||
xticks([0:40:200]);
|
||||
xlim([1, 200]);
|
||||
ylim([1e-6, 1e-1]);
|
||||
|
||||
acc_o = 15; dir_o = 3;
|
||||
acc_i = 11; dir_i = 3;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(frf( 3*(acc_o-1)+dir_o, dir_i, :))), 'DisplayName', 'Measured');
|
||||
plot(freqs, abs(squeeze(Hsyn(3*(acc_o-1)+dir_o, 3*(acc_i-1)+dir_i, :))), 'DisplayName', 'Synthesized');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'lin');
|
||||
set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
ylabel('Magnitude [$\frac{m/s^2}{N}$]');
|
||||
ldg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [10, 1];
|
||||
xticks([0:40:200]);
|
||||
xlim([1, 200]);
|
||||
ylim([1e-6, 1e-1]);
|
||||
|
||||
acc_o = 2; dir_o = 1;
|
||||
acc_i = 11; dir_i = 2;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
plot(freqs, abs(squeeze(frf( 3*(acc_o-1)+dir_o, dir_i, :))), 'DisplayName', 'Measured');
|
||||
plot(freqs, abs(squeeze(Hsyn(3*(acc_o-1)+dir_o, 3*(acc_i-1)+dir_i, :))), 'DisplayName', 'Synthesized');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'lin');
|
||||
set(gca, 'yscale', 'log');
|
||||
xlabel('Frequency [Hz]');
|
||||
ylabel('Magnitude [$\frac{m/s^2}{N}$]');
|
||||
ldg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1);
|
||||
ldg.ItemTokenSize = [10, 1];
|
||||
xticks([0:40:200]);
|
||||
xlim([1, 200]);
|
||||
ylim([1e-6, 1e-1]);
|
Reference in New Issue
Block a user