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

17 ビュー (過去 30 日間)
Johannes Ellinger
Johannes Ellinger 2022 年 9 月 21 日
コメント済み: Siti Abyad 2024 年 8 月 13 日
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

回答 (2 件)

Dolon Mandal
Dolon Mandal 2023 年 9 月 12 日
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 2023 年 11 月 30 日
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 件のコメント
TomFromOOE
TomFromOOE 2024 年 8 月 8 日
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 2024 年 8 月 13 日
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.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeVibration Analysis についてさらに検索

製品


リリース

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by