You can generate C/C++ code in MATLAB® from your system that contains System objects by using MATLAB Coder™. You can generate efficient and compact code for deployment in desktop and embedded systems and accelerate fixed-point algorithms.
This example shows how to use System objects to make MATLAB code suitable for code generation. The example highlights key factors to consider, such as passing property values and using extrinsic functions. It also shows that by using persistent objects, the object states are maintained between calls.
function w = lmssystem(x, d) % LMSSYSTEMIDENTIFICATION System identification using % LMS adaptive filter % #codegen % Declare System objects as persistent persistent hlms; % Initialize persistent System objects only once. % Do this with 'if isempty(persistent variable).' % This condition will be false after the first time. if isempty(hlms) % Create LMS adaptive filter used for system % identification. Pass property value arguments % as constructor arguments. Property values must % be constants during compile time. hlms = dsp.LMSFilter(11,'StepSize',0.01); end [~,~,w] = hlms(x,d); % Filter weights end
This example shows how
to compile the lmssystem
function and produce a
MEX file with the same name in the current directory.
% LMSSYSTEMIDENTIFICATION System identification using % LMS adaptive filter coefs = fir1(10,.25); hfilt = dsp.FIRFilter('Numerator', coefs); x = randn(1000,1); % Input signal hSrc = dsp.SignalSource(x,100); % Use x as input-signal with % 100 samples per frame % Generate code for lmssystem codegen lmssystem -args {ones(100,1),ones(100,1)} while ~isDone(hSrc) in = hSrc(); d = hfilt(in) + 0.01*randn(100,1); % Desired signal w = lmssystem_mex(in,d); % Call generated mex file stem([coefs.',w]); end
For another detailed code generation example, see Generate Code for MATLAB Handle Classes and System Objects in the MATLAB Coder product documentation.
The following example, using System objects, does not use the
persistent keyword because calling a persistent object with different
data types causes a data type mismatch error. This example filters
the input and then performs a discrete cosine transform on the filtered
output. Each call to the FilterAndDCTLib
function
is independent and state information is not retained between calls.
function [out] = FilterAndDCTLib(in) hFIR = dsp.FIRFilter('Numerator',fir1(10,0.5)); hDCT = dsp.DCT; % Run the objects to get the filtered spectrum firOut = hFIR(in); out = hDCT(firOut); function [out1, out2] = CompareRealInt(in1) % Call the library function, FilterAndDCTLib, which can % generate code for multiple calls each with a different data type. % Convert input data from double to int16 in2 = int16(in1); % Call the library function for both data types, double and int16 out1 = FilterAndDCTLib(in1); out2 = FilterAndDCTLib(in2); function RunDCTExample % Execute everything needed at the command line to run the example warnState = warning('off','SimulinkFixedPoint:util:fxpParameterUnderflow'); % Create vector, length 256, of data containing noise and sinusoids dataLength = 256; sampleData = rand(dataLength,1) + 3*sin(2*pi*[1:dataLength]*.085)' ... + 2*cos(2*pi*[1:dataLength]*.02)'; % Generate code and run generated file codegen CompareRealInt -args {sampleData} [out1,out2] = CompareRealInt_mex(sampleData); % Compare the floating point results, in blue % with the int16 results, in red plot(out1,'b') hold on plot(out2,'r') hold off warning(warnState.state,warnState.identifier); end
The following usage rules and limitations apply to using System objects in code generated from MATLAB.
Object Construction and Initialization
If objects are stored in persistent variables, initialize
System objects once by embedding the object handles in an if
statement
with a call to isempty()
.
Set arguments to System object™ constructors as compile-time constants.
You cannot initialize System objects properties with other MATLAB class objects as default values in code generation. You must initialize these properties in the constructor.
Inputs and Outputs
System objects accept a maximum of 1024 inputs. A maximum of 8 dimensions per input is supported.
The data type of the inputs should not change.
If you want the size of inputs to change, verify that
variable-size is enabled. Code generation support for variable-size
data also requires that the Enable variable sizing
option
is enabled, which is the default in MATLAB.
Note:
Variable-size properties in MATLAB
Function block in Simulink® are not supported. System
objects predefined in the software do not support variable-size if
their data exceeds the |
Do not set System objects to become outputs from the MATLAB Function block.
Do not use the Save and Restore Simulation State as SimState option for any System object in a MATLAB Function block.
Do not pass a System object as an example input
argument to a function being compiled with codegen
.
Do not pass a System object to functions declared
as extrinsic (functions called in interpreted mode) using the coder.extrinsic
function.
System objects returned from extrinsic functions and scope System
objects that automatically become extrinsic can be used as inputs
to another extrinsic function, but do not generate code.
Tunable and Nontunable Properties
The value assigned to a nontunable property must be a constant and there can be at most one assignment to that property (including the assignment in the constructor).
For most System objects, the only time you can set their nontunable properties during code generation is when you construct the objects.
For System objects that are predefined in the software, you can set their tunable properties at construction time or using dot notation after the object is locked.
For System objects that you define, you can change
their tunable properties at construction time or using dot notation
during code generation. For getNumInputsImpl
and getNumOutputsImpl
methods,
if you set the return argument from an object property, that object
property must have the Nontunable
attribute.
Objects cannot be used as default values for properties.
Global Variables
Global variables are allowed in a System object, unless you will be using that System object in Simulink via the MATLAB System block. To avoid syncing global variables between a MEX file and the workspace, use a coder configuration object. For example:
f = coder.MEXConfig;
f.GlobalSyncMethod = 'NoSync'
'-config
f'
in your codegen
command.Methods
Code generation support is available only for these System object methods:
get
getNumInputs
getNumOutputs
isDone
(for sources only)
isLocked
release
reset
set
(for tunable properties)
step
For System objects that you define,
Code generation support is available only for these methods:
getDiscreteStateImpl
getNumInputsImpl
getNumOutputsImpl
infoImpl
isDoneImpl
isInputDirectFeedThroughImpl
outputImpl
processTunedPropertiesImpl
releaseImpl
— Code is not
generated automatically for this method. To release an object, you
must explicitly call the release
method in your code.
resetImpl
setupImpl
stepImpl
updateImpl
validateInputsImpl
validatePropertiesImpl
You can include System objects in MATLAB code in the same
way you include any other elements. You can then compile a MEX file
from your MATLAB code by using the codegen
command,
which is available if you have a MATLAB Coder license. This compilation
process, which involves a number of optimizations, is useful for accelerating
simulations. See Getting Started with MATLAB Coder and MATLAB Classes for
more information.
Note: Most, but not all, System objects support code generation. Refer to the particular object's reference page for information. |
Using the MATLAB Function block, you can include any System object and any MATLAB language function in a Simulink model. This model can then generate embeddable code. System objects provide higher-level algorithms for code generation than do most associated blocks. For more information, see What Is a MATLAB Function Block? in the Simulink documentation.
Using the MATLAB System block, you can include in a Simulink model individual System objects that you create with a class definition file. The model can then generate embeddable code. For more information, see MATLAB System Block in the Simulink documentation.
MATLAB Compiler™ software supports System objects for use inside MATLAB functions. The compiler product does not support System objects for use in MATLAB scripts.