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

조회 수: 11 (최근 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 CenterFile Exchange에서 Vibration Analysis에 대해 자세히 알아보기

제품


릴리스

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by