This example shows how to estimate a transfer function from frequency response data. You use Simulink® Control Design™ to collect frequency response data from a Simulink model and the
tfest command to estimate a transfer function from the measured data. To run the example with previously saved frequency response data start from the Estimating a Transfer Function section.
Open the Simulink model.
mdl = 'iddemo_boost_converter'; open_system(mdl);
The model is of a Boost Converter circuit that converts a DC voltage to another DC voltage (typically a higher voltage) by controlled chopping or switching of the source voltage. In this model an IGBT driven by a PWM signal is used for switching.
For this example we are interested in the transfer function from the PWM duty cycle set-point to the load voltage, Uout.
We use the
frestimate command to perturb the duty cycle set-point with sinusoids of different frequencies and log the resulting load voltage. From these we find how the system modifies the magnitude and phase of the injected sinusoids giving us discrete points on the frequency response.
frestimate requires two preliminary steps
Specifying the frequency response input and output points
Defining the sinusoids to inject at the input point
The frequency response input and output points are created using the
linio command and for this example are the outputs of the
Voltage Measurement blocks.
ios = [... linio([mdl,'/DutyCycle'],1,'input'); ... linio([mdl,'/PS-Simulink Converter'],1,'output')];
We use the
frest.Sinestream command to define the sinusoids to inject at the input point. We are interested in the frequency range 200 to 20k rad/s, and want to perturb the duty cycle by 0.03.
f = logspace(log10(200),log10(20000),10); in = frest.Sinestream('Frequency',f,'Amplitude',0.03);
The simulation time required to simulate the model with this sine-stream signal is determined using the
getSimulationTime command and as we know the simulation end time used by the model we can get an idea of how much longer the sine-stream simulation will take over simply running the model.
ans = 15.5933
We use the defined inputs and sine-stream with
frestimate to compute discrete points on the frequency response.
[sysData,simlog] = frestimate(mdl,ios,in); bopt = bodeoptions; bopt.Grid = 'on'; bopt.PhaseMatching = 'on'; figure, bode(sysData,'*r',bopt)
The Bode response shows a system with a 56db gain, some minor resonance around 2500 rad/s and a high frequency roll off of around 20 db/decade matching what we would expect for this circuit.
frest.simView command allows us to inspect the frestimate process showing the injected signal, measured output, and frequency response in one graphical interface.
The figure shows the model response to injected sinusoids and the FFT of the model response. Notice that the injected sinusoids result in signals with a dominant frequency and limited harmonics indicating a linear model and successful frequency response data collection.
In the previous step we collected frequency response data. This data describes the system as discrete frequency points and we now fit a transfer function to the data.
We generated the frequency response data using Simulink Control Design, if Simulink Control Design is not installed use the following command to load the saved frequency response data
Inspecting the frequency response data we expect that the system can be described by a second order system.
sysA = tfest(sysData,2) figure, bode(sysData,'r*',sysA,bopt)
sysA = From input "DutyCycle" to output "PS-Simulink Converter": -4.456e06 s + 6.175e09 ----------------------- s^2 + 6995 s + 9.834e06 Continuous-time identified transfer function. Parameterization: Number of poles: 2 Number of zeros: 1 Number of free coefficients: 4 Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties. Status: Estimated using TFEST on frequency response data "sysData". Fit to estimation data: 98.04% FPE: 281.4, MSE: 120.6
The estimated transfer function is accurate over the provided frequency range.