diff --git a/modal-analysis/figs/compare_synthesize_original_frf.png b/modal-analysis/figs/compare_synthesize_original_frf.png index 6a149ae..b85fc2f 100644 Binary files a/modal-analysis/figs/compare_synthesize_original_frf.png and b/modal-analysis/figs/compare_synthesize_original_frf.png differ diff --git a/modal-analysis/img/modal_software/from11xto1x.jpg b/modal-analysis/img/modal_software/from11xto1x.jpg new file mode 100644 index 0000000..cd70587 Binary files /dev/null and b/modal-analysis/img/modal_software/from11xto1x.jpg differ diff --git a/modal-analysis/index.html b/modal-analysis/index.html index b7d936e..0386e08 100644 Binary files a/modal-analysis/index.html and b/modal-analysis/index.html differ diff --git a/modal-analysis/index.org b/modal-analysis/index.org index 848a533..e797cfe 100644 --- a/modal-analysis/index.org +++ b/modal-analysis/index.org @@ -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 +| | | | +| 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 +| | | +| 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]] diff --git a/modal-analysis/measurement.html b/modal-analysis/measurement.html index dd58193..449b7f1 100644 Binary files a/modal-analysis/measurement.html and b/modal-analysis/measurement.html differ diff --git a/modal-analysis/measurement.org b/modal-analysis/measurement.org index 0c670b1..d323376 100644 --- a/modal-analysis/measurement.org +++ b/modal-analysis/measurement.org @@ -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 @@ <> #+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 diff --git a/modal-analysis/modal_extraction.html b/modal-analysis/modal_extraction.html index 1f794da..eb53323 100644 Binary files a/modal-analysis/modal_extraction.html and b/modal-analysis/modal_extraction.html differ diff --git a/modal-analysis/modal_extraction.org b/modal-analysis/modal_extraction.org index cdd27a9..a39caa8 100644 --- a/modal-analysis/modal_extraction.org +++ b/modal-analysis/modal_extraction.org @@ -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 <> 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.