Main Content

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.

Related Topics