How can I reconstruct FRFs from modal parameters from the modalfit function?

17 views (last 30 days)
Hi,
To my understanding, it should be possible to reconstruct a frequency response function (FRF) from a set of modal parameters, that is, (mass normalized) mode shapes, eigenfrequencies, and damping ratios. However, when I do that with the output of the modalfit function, I am way off my original data and the estimated FRFs by modalfit:
function [frf] = modal_paras_2_frf(f, fn, dr, ms, idxIn, idxOut)
hz2Rad = 2*pi;
omegan = hz2Rad*fn;
omega = hz2Rad*f;
frf = zeros(size(omega));
for m = 1:length(omegans)
frf = frf + ((ms(idxIn,m)*ms(idxOut,m)) ./(-omega.^2 + omegan(m).^2 + 2*1i*omega*omegan(m)*dr(m)));
end
end
Am I missing something here?
Best
Johannes

Answers (2)

Dolon Mandal
Dolon Mandal on 12 Sep 2023
In your code, you have a loop variable "m" that iterates over the modal indices, but you are using "omegans" instead of "omegan" inside the loop. This is causing the error because omegans is not defined in your code. You should replace "omegans" with "omegan" to correctly calculate the FRFs for each mode.

TomFromOOE
TomFromOOE on 30 Nov 2023
Hi Johannes,
I'm not sure whether you have overcome your problem. Anyway, since I was facing the same problem, here is my explanation:
The mode shapes coming from modalfit are normalized to modal constant Q=1, assuming non-classical damping (in the documentation, this is stated somewhat ambigious ("unity modal")). You have to provide the 'DriveIndex' argument, i.e. the index of the direct-FRF in your measurement data for this to hold.
Then, you can reconstruct the frf's in the form like
function [frf] = modal_paras_2_frf_edit(f, fn, dr, ms, idxIn, idxOut)
hz2Rad = 2*pi;
omegan = hz2Rad*fn;
omega = hz2Rad*f;
lambda = -dr.*omegan + 1i*omegan.*sqrt(1-dr.^2); % complex poles
frf = zeros(size(omega));
for m = 1:length(omegans)
frf = frf + ((ms(idxIn,m)*ms(idxOut,m)) ./(1i*omega -lambda(m)) + (conj(ms(idxIn,m)*conj(ms(idxOut,m))) ./(1i*omega -conj(lambda(m)));
% the original version assumed proportional damping and mass-normalized mode shapes, which is not what modalfit returns
% frf = frf + ((ms(idxIn,m)*ms(idxOut,m)) ./(-omega.^2 + omegan(m).^2 + 2*1i*omega*omegan(m)*dr(m)));
% you would obtain the correct result with the original version setting the modal mass accordingly, as in:
% m_mod = 1/(1i*2*omegan(m));
% frf = frf + ((ms(idxIn,m)*ms(idxOut,m)) ./(m_mod*(-omega.^2 + omegan(m).^2 + 2*1i*omega*omegan(m)*dr(m))));
end
end
The theory behind this is explained in the very good book "Noise and Vibration Analysis" by Anders Brandt, section 6.4.2.
Best,
Thomas Furtmüller
  3 Comments
TomFromOOE
TomFromOOE on 8 Aug 2024
The connection between modal constant Q_k and modal mass m_k is Q_k=1/(i*2*m_k*omega_k), omega_k begin the natural frequency of the considered mode k (strictly speaking, this is only valid for proportionally damped systems). This mean, you have to divide the mode shape vectors obtained from modalfit by 2i*omega_k to rescale them such that m_k=1. Note that this in general will still give you complex mode shapes. If you want to use real mode shapes, you might want to rotate the mode shapes onto the real axis and take the real part of it
Siti Abyad
Siti Abyad on 13 Aug 2024
When i divide the mode shape vectors by these values, I get really small mode shapes... so the reconstructed frf doesnt look the same at all.

Sign in to comment.

Categories

Find more on Vibration Analysis in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!