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 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.

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

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')
```

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')
```