Main Content

Frequency Response Estimation Using Simulation-Based Techniques

This example shows how to obtain the frequency response of Simulink models when analytical block-by-block linearization does not provide and accurate answer due to event-based dynamics in the linearization path. Examples of such systems are models with triggered subsystems or models using Pulse Width Modulation (PWM) input signals.

Open the Model

Open the Simulink model for engine timing.

mdl = 'scdengine';
open_system(mdl)

Analytical block-by-block linearization of this model from the throttle angle to engine speed gives a linearization result of zero due to the triggered Compression subsystem in the linearization path.

io = getlinio(mdl);
linsys = linearize(mdl,io)
linsys =
 
  D = 
                ThrottleAngl
   EngineSpeed             0
 
Static gain.

Estimate Frequency Response Using Sinestream Input Signal

Sinestream input signals are the most reliable input signals for estimating an accurate frequency response of a Simulink model using the frestimate function. A sinestream signal is composed of individual sinusoidal signals that are appended to each other. The frestimate function simulates the model for each frequency in the sinestream input signal, as specified using the Frequency parameter, for the corresponding amount of periods, as specified using the NumPeriods parameter. After the simulation, frestimate uses the output signal to compute the response at each frequency. frestimate uses only the periods after the system reaches a steady state for that input frequency, that is, after a number of settling periods as specified using the SettlingPeriods parameter.

Create a sinestream signal with 50 logarithmically spaced distinct frequencies between 0.1 and 10 rad/s.

in = frest.Sinestream('Frequency',logspace(-1,1,50),'Amplitude',1e-3)
 
The sinestream input signal:
 
      Frequency           : [0.1 0.10985 0.12068 0.13257 ...] (rad/s)
      Amplitude           : 0.001
      SamplesPerPeriod    : 40
      NumPeriods          : 4
      RampPeriods         : 0
      FreqUnits (rad/s,Hz): rad/s
      SettlingPeriods     : 1
      ApplyFilteringInFRESTIMATE (on/off)    : on
      SimulationOrder (Sequential/OneAtATime): Sequential
 

By default, each frequency in a sinestream input signal is simulated for 4 periods, that is, NumPeriods is 4 for all frequencies, and the end of first period is specified to be where the system reaches to steady state, that is, SettlingPeriods is 1 for all frequencies. Therefore, frestimate uses the last 3 periods of the output signals.

Using this sinestream input signal, perform the frequency response estimation using the frestimate function, and plot the resulting frequency response data.

[sys,simout] = frestimate(mdl,io,in);
bode(sys)

You can inspect the estimation results using the Simulation Results Viewer. The viewer shows time-domain and frequency-domain simulation results for the selected frequencies and a summary bode plot where you can interactively switch between frequencies.

frest.simView(simout,in,sys);

You can use the viewer as a tool to diagnose issues that impact the accuracy of the frequency response estimation, such as:

  • Not reaching steady state

  • Excitation of nonlinearities

  • Running into instabilities

Estimate Frequency Response Using Chirp Input Signal

Another input signal you can use when estimating frequency response data from a Simulink model is a frequency chirp. Frequency chirp differs from sinestream in that the frequency is instantaneously varied.

You can use chirp input signals to obtain faster frequency response estimation. However, frequency estimation results obtained using chirp input signals can be less reliable than those obtained using sinestream inputs, since each frequency is not simulated long enough to drive the system to steady state at that frequency.

Create a chirp signal that sweeps between the frequencies 0.1 and 10 rad/s logarithmically.

in_chirp = frest.Chirp('FreqRange',[0.1 10],'Amplitude',1e-3,...
    'SweepMethod','logarithmic','NumSamples',3000);

Using the chirp signal, perform the frequency response estimation.

sys_chirp = frestimate(mdl,io,in_chirp);

Plot the results obtained from both the sinestream and chirp input signals together.

bode(sys,sys_chirp,'r')

Estimate Frequency Response Using PRBS Input Signal

Another input signal you can use when estimating frequency response data from a Simulink model is a pseudorandom binary sequence (PRBS). A PRBS is a periodic, deterministic signal with white-noise-like properties that shifts between two values.

You can use PRBS input signals to obtain faster frequency response estimation with a higher frequency resolution than the chirp signal.

Create PRBS signal with an order of 12 and one period in the signal. Using a single period produces a nonperiodic PRBS. The length of the generated PRBS is 4095 (2^12 - 1). To obtain an accurate frequency response estimation, the length of the PRBS needs to be sufficiently large. To ensure that the system is properly excited, specify the perturbation amplitude of the PRBS as 0.01.

in_PRBS = frest.PRBS('Order',12,'NumPeriods',1,'Amplitude',1e-2,'Ts',0.1);

Using the PRBS signal, perform the frequency response estimation.

sys_PRBS = frestimate(mdl,io,in_PRBS);

Plot the results obtained with both PRBS and sinestream input signals together.

bode(sys_PRBS,sys,'r',{0.1 10})

Close the model.

bdclose('scdengine')

See Also

Related Topics