Update modal extraction
This commit is contained in:
parent
c0641f7865
commit
e4d8712c94
Binary file not shown.
Before Width: | Height: | Size: 136 KiB After Width: | Height: | Size: 114 KiB |
BIN
modal-analysis/img/modal_software/from11xto1x.jpg
Normal file
BIN
modal-analysis/img/modal_software/from11xto1x.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 52 KiB |
Binary file not shown.
@ -43,6 +43,29 @@ Theses matrices will be used to tune the Simscape (multi-body) model.
|
||||
|
||||
The modes we want to identify are those in the frequency range between 0Hz and 150Hz.
|
||||
|
||||
#+name: tab:terminology_numbers
|
||||
#+caption: Terminology for further analysis
|
||||
| <c> | <l> | <c> |
|
||||
| Symbol | Meaning | Value |
|
||||
|--------+---------------------------------+-------|
|
||||
| $p$ | Number of solid body considered | 6 |
|
||||
| $m$ | Number of accelerometers | 23 |
|
||||
| $n$ | Number of identified modes | 21 |
|
||||
| $q$ | Number of frequency points | 801 |
|
||||
| $s$ | Number of excitation | 3 |
|
||||
|
||||
#+name: tab:terminology_elements
|
||||
#+caption: Terminology for further analysis
|
||||
| <c> | <l> |
|
||||
| Symbol | Meaning |
|
||||
|-----------------+--------------------------------------|
|
||||
| $[\Lambda]$ | Complex eigen value matrix |
|
||||
| $[\Psi]$ | Complex eigen vector matrix |
|
||||
| $\omega_r$ | Eigen frequency of mode $r$ [rad/s] |
|
||||
| $\xi_r$ | Modal damping for mode $r$ |
|
||||
| $\{\psi\}_r$ | Complex mode shape of mode $r$ |
|
||||
| $[M], [C], [K]$ | Mass, damping and stiffness matrices |
|
||||
| $a_r$ | "Modal A" for mode $r$ |
|
||||
|
||||
The modal analysis of the ID31 Micro-station thus consists of several parts:
|
||||
- [[file:measurement.org][Frequency Response Measurements]]
|
||||
|
Binary file not shown.
@ -41,6 +41,9 @@
|
||||
#+PROPERTY: header-args:latex+ :output-dir figs
|
||||
:END:
|
||||
|
||||
* Introduction :ignore:
|
||||
The goal is to measure the dynamic of the Micro-Station and to extract Frequency Response Functions.
|
||||
|
||||
* ZIP file containing the data and matlab files :ignore:
|
||||
#+begin_src bash :exports none :results none
|
||||
if [ matlab/modal_frf_coh.m -nt data/modal_frf_coh.zip ]; then
|
||||
@ -67,9 +70,6 @@
|
||||
<<matlab-init>>
|
||||
#+end_src
|
||||
|
||||
* Goal
|
||||
The goal is to measure the dynamic of the Micro-Station and to extract Frequency Response Functions.
|
||||
|
||||
* Instrumentation Used
|
||||
In order to perform to *Modal Analysis* and to obtain first a *Response Model*, the following devices are used:
|
||||
- An *acquisition system* (OROS) with 24bits ADCs (figure [[fig:oros]])
|
||||
@ -956,3 +956,7 @@ Below, it could be due to:
|
||||
As it is usually very important to measure point response $\frac{X_j}{F_j}$, that is to say exciting and measuring the *same* DOF, should the measurements be redone?
|
||||
On the modal software that is used to extract modal parameters, it is suppose that we are exciting the *exact* same DOF as the one measured by the accelerometer 11. As is it not the case in practice, could this induce large errors in the modal model?
|
||||
#+end_warning
|
||||
|
||||
* Bibliography :ignore:
|
||||
bibliographystyle:unsrt
|
||||
bibliography:ref.bib
|
||||
|
Binary file not shown.
@ -273,41 +273,41 @@ They are all exported in a text file named =modes.asc=.
|
||||
Its first 20 lines as shown below.
|
||||
|
||||
#+begin_src bash :results output :exports results :eval no-export
|
||||
sed 20q mat/modes.asc | sed $'s/\r//'
|
||||
sed 20q mat/modes_2019_07_16.asc | sed $'s/\r//'
|
||||
#+end_src
|
||||
|
||||
#+RESULTS:
|
||||
#+begin_example
|
||||
Created by N-Modal
|
||||
Estimator: bbfd
|
||||
01-Jul-19 16:44:11
|
||||
16-Jul-19 09:35:42
|
||||
|
||||
|
||||
Mode 1
|
||||
freq = 11.41275Hz
|
||||
damp = 8.72664%
|
||||
modal A = -4.50556e+003-9.41744e+003i
|
||||
modal B = -7.00928e+005+2.62922e+005i
|
||||
freq = 11.86509Hz
|
||||
damp = 12.20318%
|
||||
modal A = 4.13559e+003+6.22828e+003i
|
||||
modal B = 4.98475e+005-2.49344e+005i
|
||||
Mode matrix of local coordinate [DOF: Re IM]
|
||||
1X-: -1.04114e-001 3.50664e-002
|
||||
1Y-: 2.34008e-001 5.04273e-004
|
||||
1Z+: -1.93303e-002 5.08614e-003
|
||||
2X-: -8.38439e-002 3.45978e-002
|
||||
2Y-: 2.42440e-001 0.00000e+000
|
||||
2Z+: -7.40734e-003 5.17734e-003
|
||||
3Y-: 2.17655e-001 6.10802e-003
|
||||
3X+: 1.18685e-001 -3.54602e-002
|
||||
3Z+: -2.37725e-002 -1.61649e-003
|
||||
1X+: -1.08546e-001 3.17769e-002
|
||||
1Y+: 2.32355e-001 1.71539e-003
|
||||
1Z+: -1.98455e-002 5.79676e-003
|
||||
2X+: -8.59861e-002 2.84442e-002
|
||||
2Y+: 2.40594e-001 0.00000e+000
|
||||
2Z+: -7.65144e-003 4.22952e-003
|
||||
3Y+: 2.14274e-001 7.53040e-003
|
||||
3X-: 1.22352e-001 -2.90328e-002
|
||||
3Z+: -2.12103e-002 -3.81368e-003
|
||||
#+end_example
|
||||
|
||||
We split this big =modes.asc= file into sub text files using =bash=. The obtained files are described one table [[tab:modes_files]].
|
||||
|
||||
#+begin_src bash :results none
|
||||
sed '/^\s*[0-9]*[XYZ][+-]:/!d' mat/modes.asc > mat/mode_shapes.txt
|
||||
sed '/freq/!d' mat/modes.asc | sed 's/.* = \(.*\)Hz/\1/' > mat/mode_freqs.txt
|
||||
sed '/damp/!d' mat/modes.asc | sed 's/.* = \(.*\)\%/\1/' > mat/mode_damps.txt
|
||||
sed '/modal A/!d' mat/modes.asc | sed 's/.* =\s\+\([-0-9.e]\++[0-9]\+\)\([-+0-9.e]\+\)i/\1 \2/' > mat/mode_modal_a.txt
|
||||
sed '/modal B/!d' mat/modes.asc | sed 's/.* =\s\+\([-0-9.e]\++[0-9]\+\)\([-+0-9.e]\+\)i/\1 \2/' > mat/mode_modal_b.txt
|
||||
sed '/^\s*[0-9]*[XYZ][+-]:/!d' mat/modes_2019_07_16.asc > mat/mode_shapes.txt
|
||||
sed '/freq/!d' mat/modes_2019_07_16.asc | sed 's/.* = \(.*\)Hz/\1/' > mat/mode_freqs.txt
|
||||
sed '/damp/!d' mat/modes_2019_07_16.asc | sed 's/.* = \(.*\)\%/\1/' > mat/mode_damps.txt
|
||||
sed '/modal A/!d' mat/modes_2019_07_16.asc | sed 's/.* =\s\+\([-0-9.e]\++[0-9]\+\)\([-+0-9.e]\+\)i/\1 \2/' > mat/mode_modal_a.txt
|
||||
sed '/modal B/!d' mat/modes_2019_07_16.asc | sed 's/.* =\s\+\([-0-9.e]\++[0-9]\+\)\([-+0-9.e]\+\)i/\1 \2/' > mat/mode_modal_b.txt
|
||||
#+end_src
|
||||
|
||||
#+name: tab:modes_files
|
||||
@ -366,32 +366,29 @@ The obtained mode frequencies and damping are shown below.
|
||||
data2orgtable([(1:length(freqs_m))', freqs_m, damps_m], {}, {'Mode number', 'Frequency [Hz]', 'Damping [%]'}, ' %.1f ');
|
||||
#+end_src
|
||||
|
||||
#+name: tab:obtained_modes_freqs_damps
|
||||
#+caption: Obtained eigen frequencies and modal damping
|
||||
#+RESULTS:
|
||||
| Mode number | Frequency [Hz] | Damping [%] |
|
||||
|-------------+----------------+-------------|
|
||||
| 1.0 | 11.4 | 8.7 |
|
||||
| 2.0 | 18.5 | 11.8 |
|
||||
| 3.0 | 37.6 | 6.4 |
|
||||
| 4.0 | 39.4 | 3.6 |
|
||||
| 5.0 | 54.0 | 0.2 |
|
||||
| 6.0 | 56.1 | 2.8 |
|
||||
| 7.0 | 69.7 | 4.6 |
|
||||
| 8.0 | 71.6 | 0.6 |
|
||||
| 9.0 | 72.4 | 1.6 |
|
||||
| 10.0 | 84.9 | 3.6 |
|
||||
| 11.0 | 90.6 | 0.3 |
|
||||
| 12.0 | 91.0 | 2.9 |
|
||||
| 13.0 | 95.8 | 3.3 |
|
||||
| 14.0 | 105.4 | 3.3 |
|
||||
| 15.0 | 106.8 | 1.9 |
|
||||
| 16.0 | 112.6 | 3.0 |
|
||||
| 17.0 | 116.8 | 2.7 |
|
||||
| 18.0 | 124.1 | 0.6 |
|
||||
| 19.0 | 145.4 | 1.6 |
|
||||
| 20.0 | 150.1 | 2.2 |
|
||||
| 21.0 | 164.7 | 1.4 |
|
||||
| 1.0 | 11.9 | 12.2 |
|
||||
| 2.0 | 18.6 | 11.7 |
|
||||
| 3.0 | 37.8 | 6.2 |
|
||||
| 4.0 | 39.1 | 2.8 |
|
||||
| 5.0 | 56.3 | 2.8 |
|
||||
| 6.0 | 69.8 | 4.3 |
|
||||
| 7.0 | 72.5 | 1.3 |
|
||||
| 8.0 | 84.8 | 3.7 |
|
||||
| 9.0 | 91.3 | 2.9 |
|
||||
| 10.0 | 105.5 | 3.2 |
|
||||
| 11.0 | 106.6 | 1.6 |
|
||||
| 12.0 | 112.7 | 3.1 |
|
||||
| 13.0 | 124.2 | 2.8 |
|
||||
| 14.0 | 145.3 | 1.3 |
|
||||
| 15.0 | 150.5 | 2.4 |
|
||||
| 16.0 | 165.4 | 1.4 |
|
||||
|
||||
#+name: tab:obtained_modes_freqs_damps
|
||||
#+caption: Obtained eigen frequencies and modal damping
|
||||
#+RESULTS:
|
||||
|
||||
** Theory
|
||||
It seems that the modal analysis software makes the *assumption* of viscous damping for the model with which it tries to fit the FRF measurements.
|
||||
@ -472,6 +469,9 @@ With $a_i$ is the "Modal A" parameter linked to mode i.
|
||||
modal_b_ext_M = blkdiag(modal_b_M, conj(modal_b_M));
|
||||
#+end_src
|
||||
|
||||
"Modal A" and "modal B" are linked through the following formula:
|
||||
\[ B = - A \Lambda \]
|
||||
|
||||
* Obtained Mode Shapes animations
|
||||
<<sec:mode_shape_display>>
|
||||
From the modal parameters, it is possible to show the modal shapes with an animation.
|
||||
@ -511,8 +511,8 @@ There are two main ways to verify the validity of the modal model
|
||||
From the modal model, we want to synthesize the Frequency Response Functions that has been used to build the modal model.
|
||||
|
||||
Let's recall that:
|
||||
- $M$ is the number of measured DOFs ($23 \times 3 = 69$)
|
||||
- $N$ is the number of modes identified ($21$)
|
||||
- $M$ is the number of measured DOFs ($3 \times n_\text{acc}$)
|
||||
- $N$ is the number of modes identified
|
||||
|
||||
We then have that the FRF matrix $[H_{\text{syn}}]$ can be synthesize using the following formula:
|
||||
#+begin_important
|
||||
@ -529,12 +529,34 @@ with:
|
||||
- $\psi_{pr}$: scaled modal coefficient for output DOF $p$, mode $r$
|
||||
- $\lambda_r$: complex modal frequency
|
||||
|
||||
From the modal software documentation:
|
||||
#+begin_quote
|
||||
*Modal A*
|
||||
Scaling constant for a complex mode. It has the same properties as modal mass for normal modes (undamped or proportionally damped cases). Assuming
|
||||
- $\psi_{pr}$ = Modal coefficient for measured degree of freedom p and mode r
|
||||
- $\psi_{qr}$ = Modal coefficient for measured degree of freedom q and mode r
|
||||
- $A_{pqr}$ = Residue for measured degree of freedom p, measured degree of q and mode r
|
||||
- $M_{Ar}$ = Modal A of mode r
|
||||
|
||||
Then
|
||||
\[ A_{pqr} = \frac{\psi_{pr}\psi_{qr}}{M_{Ar}} \]
|
||||
|
||||
|
||||
*Modal B*
|
||||
Scaling constant for a complex mode. It has the same properties as modal stiffness for normal modes (undamped or proportionally damped cases). Assuming
|
||||
- $M_{Ar}$ = Modal A of mode r
|
||||
- $\lambda_r$ = System pole of mode r
|
||||
|
||||
Then
|
||||
\[ M_{Br} = - \lambda_r M_{Ar} \]
|
||||
#+end_quote
|
||||
|
||||
** Matlab Implementation
|
||||
#+begin_src matlab
|
||||
Hsyn = zeros(69, 69, 801);
|
||||
Hsyn = zeros(acc_n*dir_n, acc_n*dir_n, length(freqs));
|
||||
|
||||
for i = 1:length(freqs)
|
||||
Hsyn(:, :, i) = eigen_vec_ext_M*(inv(modal_a_ext_M)/(diag(j*2*pi*freqs(i) - diag(eigen_val_ext_M))))*eigen_vec_ext_M.';
|
||||
Hsyn(:, :, i) = eigen_vec_ext_M*((j*2*pi*freqs(i)).^2*inv(modal_a_ext_M)/(diag(j*2*pi*freqs(i) - diag(eigen_val_ext_M))))*eigen_vec_ext_M.';
|
||||
end
|
||||
#+end_src
|
||||
|
||||
@ -542,13 +564,13 @@ Because the synthesize frequency response functions are representing the displac
|
||||
|
||||
#+begin_src matlab
|
||||
for i = 1:size(Hsyn, 1)
|
||||
Hsyn(i, :, :) = squeeze(-Hsyn(i, :, :)).*(j*2*pi*freqs).^2;
|
||||
Hsyn(i, :, :) = squeeze(Hsyn(i, :, :)).*(j*2*pi*freqs).^2;
|
||||
end
|
||||
#+end_src
|
||||
|
||||
** Original and Synthesize FRF matrix comparison
|
||||
#+begin_src matlab :exports none
|
||||
acc_o = 15; dir_o = 1; dir_i = 1;
|
||||
acc_o = 1; dir_o = 1; dir_i = 1;
|
||||
|
||||
figure;
|
||||
ax1 = subplot(2, 1, 1);
|
||||
@ -556,9 +578,10 @@ Because the synthesize frequency response functions are representing the displac
|
||||
plot(freqs, abs(squeeze(FRFs(3*(acc_o-1)+dir_o, dir_i, :))), 'DisplayName', 'Original');
|
||||
plot(freqs, abs(squeeze(Hsyn(3*(acc_o-1)+dir_o, 3*(11-1)+dir_i, :))), 'DisplayName', 'Synthesize');
|
||||
hold off;
|
||||
set(gca, 'xscale', 'log'); set(gca, 'yscale', 'log');
|
||||
set(gca, 'yscale', 'log');
|
||||
set(gca, 'XTickLabel',[]);
|
||||
ylabel('Magnitude [$\frac{m/s^2}{N}$]');
|
||||
title(sprintf('From acc %i %s to acc %i %s', 11, dirs(dir_i), acc_o, dirs(dir_o)))
|
||||
legend('location', 'northwest');
|
||||
|
||||
ax2 = subplot(2, 1, 2);
|
||||
@ -567,7 +590,6 @@ Because the synthesize frequency response functions are representing the displac
|
||||
plot(freqs, mod(180/pi*phase(squeeze(Hsyn(3*(acc_o-1)+dir_o, 3*(11-1)+dir_i, :)))+180, 360)-180);
|
||||
hold off;
|
||||
yticks(-360:90:360); ylim([-180, 180]);
|
||||
set(gca, 'xscale', 'log');
|
||||
xlabel('Frequency [Hz]'); ylabel('Phase [deg]');
|
||||
|
||||
linkaxes([ax1,ax2],'x');
|
||||
@ -583,10 +605,17 @@ Because the synthesize frequency response functions are representing the displac
|
||||
#+CAPTION: Comparison of the Original and Synthesize FRF matrix element
|
||||
[[file:figs/compare_synthesize_original_frf.png]]
|
||||
|
||||
#+name: fig:from11xto1x
|
||||
#+caption: Original FRF and synthesize FRF using the modal software. From force applied in the X direction to the acceleration of accelerometer 11 in the X direction
|
||||
[[file:img/modal_software/from11xto1x.jpg]]
|
||||
|
||||
#+begin_warning
|
||||
The synthesize FRFs from the modal software do not match the synthesize FRFs computed here.
|
||||
It is possible that it uses residues that are not exported? Nothing is said about that in the documentation.
|
||||
#+end_warning
|
||||
|
||||
** Synthesize FRF that has not yet been measured
|
||||
#+begin_src matlab :exports none
|
||||
dir_names = {'X', 'Y', 'Z'};
|
||||
|
||||
accs = [1]; dirs = [1:3];
|
||||
|
||||
figure;
|
||||
@ -594,7 +623,7 @@ Because the synthesize frequency response functions are representing the displac
|
||||
hold on;
|
||||
for acc_i = accs
|
||||
for dir_i = dirs
|
||||
plot(freqs, abs((1./(j*2*pi*freqs').^2).*squeeze(Hsyn(3*(acc_i-1)+dir_i, 3*(acc_i-1)+dir_i, :))), 'DisplayName', sprintf('Acc %i - %s', acc_i, dir_names{dir_i}));
|
||||
plot(freqs, abs((1./(j*2*pi*freqs').^2).*squeeze(Hsyn(3*(acc_i-1)+dir_i, 3*(acc_i-1)+dir_i, :))), 'DisplayName', sprintf('Acc %i - %s', acc_i, dirs(dir_i)));
|
||||
end
|
||||
end
|
||||
hold off;
|
||||
@ -846,9 +875,9 @@ This inversion is equivalent to a mean square problem.
|
||||
|
||||
** Matlab Implementation
|
||||
The obtained mode shapes matrix that gives the mode shapes of each solid bodies with respect to the fixed frame $\{O\}$, =mode_shapes_O=, is an $n \times p \times q$ with:
|
||||
- $n$ is the number of modes: 21
|
||||
- $p$ is the number of DOFs for each solid body: 6
|
||||
- $q$ is the number of solid bodies: 6
|
||||
- $n$ is the number of identified modes
|
||||
- $p$ is the number of DOFs for each solid body (6)
|
||||
- $q$ is the number of solid bodies
|
||||
|
||||
#+begin_src matlab
|
||||
mode_shapes_O = zeros(mod_n, 6, length(solid_names));
|
||||
@ -885,7 +914,7 @@ with
|
||||
\psi_{1, x} & \psi_{1, y} & \psi_{1, z} & \psi_{1, \theta_x} & \psi_{1, \theta_y} & \psi_{1, \theta_z} & \psi_{2, x} & \dots & \psi_{6, \theta_z}
|
||||
\end{Bmatrix}^T \]
|
||||
|
||||
With $M = 6 \times 6$ is the new number of DOFs and $N=21$ is the number of modes.
|
||||
With $M = 6 \times n_\text{solid}$ is the new number of DOFs and $N$ is the number of modes.
|
||||
|
||||
#+begin_src matlab
|
||||
eigen_vec_O = reshape(mode_shapes_O, [mod_n, 6*length(solid_names)]).';
|
||||
@ -1013,7 +1042,7 @@ Because the synthesize frequency response functions are representing the displac
|
||||
We want to have the two eigen matrices.
|
||||
|
||||
They should have the same size $n \times n$ where $n$ is the number of mode_shapes as well as the number of degrees of freedom.
|
||||
Thus, if we consider 21 modes, we should restrict our system to have only 21 DOFs.
|
||||
Thus, if we consider $N$ modes, we should restrict our system to have only $N$ DOFs.
|
||||
|
||||
Actually, we are measured 6 DOFs of 6 solids, thus we have 36 DOFs.
|
||||
|
||||
@ -1140,7 +1169,7 @@ with
|
||||
\psi_{1, x} & \psi_{1, y} & \psi_{1, z} & \psi_{1, \theta_x} & \psi_{1, \theta_y} & \psi_{1, \theta_z} & \psi_{2, x} & \dots & \psi_{6, \theta_z}
|
||||
\end{Bmatrix}^T \]
|
||||
|
||||
With $M = 6 \times 6$ is the new number of DOFs and $N=21$ is the number of modes.
|
||||
With $M = 6 \times n_\text{solids}$ is the new number of DOFs and $N$ is the number of modes.
|
||||
|
||||
Each eigen vector is normalized.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user