Effacer les filtres
Effacer les filtres

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

4 vues (au cours des 30 derniers jours)
Johannes Ellinger
Johannes Ellinger le 21 Sep 2022
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

Réponses (2)

Dolon Mandal
Dolon Mandal le 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 le 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

Produits


Version

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by