Optimize Generated Code for Fixed-Point Data Operations
This example shows how the code generator optimizes fixed-point operations by replacing expensive division operations with highly efficient product operations. This optimization improves execution speed.
Example Model
In the model FixedPointOperations
, two fixed point signals connect to a Divide block. The Number of inputs parameter has the value /*
.
model='FixedPointOperations'; load_system(model) set_param(model,'HideAutomaticNames','off','SimulationCommand','Update') open_system(model);
Generate Code
Build the model.
set_param(model,'GenCodeOnly','on'); slbuild(model);
### Starting build procedure for: FixedPointOperations ### Successful completion of code generation for: FixedPointOperations Build Summary Top model targets: Model Build Reason Status Build Duration ========================================================================================================== FixedPointOperations Information cache folder or artifacts were missing. Code generated. 0h 0m 9.2248s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 9.9734s
View the generated code. Here is a portion of FixedPointOperations.c
.
cfile = fullfile('FixedPointOperations_ert_rtw','FixedPointOperations.c'); coder.example.extractLines(cfile,'/* Model step','/* Model initialize', 1, 0);
/* Model step function */ void FixedPointOperations_step(void) { /* Outport: '<Root>/Out1' incorporates: * Inport: '<Root>/In1' * Product: '<Root>/Divide' */ rtY.Out1 = (int16_T)(rtU.In1 >> 3); }
The generated code contains a highly efficient right shift operation instead of an expensive division operation. The generated code also contains the precomputed value for the constant input to the Product block.
Note that the resulting operation also includes the adjustment in signal scaling from 2^-3 to 2^-5.