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

13 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

Products


Release

R2020b

Community Treasure Hunt

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

Start Hunting!