MATLAB: Use of modalfrf for operating measurements

frfmodalfrfSignal Processing Toolbox

I need to calculate the FRF for a mechanical system where the exitation has its origin from a gearbox. I generated simulation data while the mechanical systems rotates under operating conditions. I generated data of velocity an acceleration. For my acoustical analysis I need the frequency response function. So I wanted to calculate them by using the function modalfrf. But I am not sure if I can use this function due to the fact that I do not have a hammer or shaker exitation. So is it possible to calculate the FRF with this function or do I need to use another function?
Thank you very much in advance.

Best Answer

  • This is essentially a system identification problem. You have non-parametric (tfestimate, spa, spafdr, etfe) techniques and parametric techniques (ssest, tfest). MODALFRF implements both approaches. When the 'Estimator' is H1 or H2, it is doing something similar to tfestimate and producing a non-parametric estimate of frequency response using correlation analysis (e.g., H = Syy/Sxy, where Syy is output spectrum = fft(Ryy), where Ryy is auto-correlation sequence, etc). When you use 'Estimator'/'subspace', it implements a parametric subspace identification (n4sid) algorithm to first estimate a state-space model and then compute its frequency response using FREQRESP.
    If input signal is periodic, you will get much better speed by using a non-parametric technique. But the results are going to be sensitive to choice of technique (H1 or H2), frame-size, window shape and amount of overlapping. Parametric methods are much slower but less sensitive to tuning parameters (such as model order) and are more reliable IMO. You also get the additional insights into system dynamics in terms of poles/zeros, damping, I/O delays and feedthrough.
    If you have system identification toolbox, I would recommend the following:
    • If data is transient (that is, the input is a step or impulse, or a pulse) and is not very long:
    data = iddata(outputsignal, inputsignal, sampletime); %sampletime = 1/Fs
    model = tfest(data, np); % np: number of poles

    w = linspace(0,pi/sampletime,100); % an example frequency grid (you can pick something different)
    G = freqresp(model,w); % or, simply do "bode(model)"

    • If data has periodic inputs:
    data = iddata(outputsignal, inputsignal, sampletime)
    data2 = fft(data) % data in frequency domain
    model = tfest(data2, np); % np: number of poles
    w = linspace(0,pi/sampletime,100);
    G = freqresp(model,w); % or, simply do "bode(model)"
    If you have MIMO data, you could replace TFEST with SSEST (state-space estimator) and follow the steps similar to the above.