Main Content

Floating-Point Multiplication to Handle a Net Slope Correction

This example shows how to use floating-point multiplication to handle a net slope correction. When converting floating-point data types to fixed-point data types in the generated code, a net slope correction is one method of scaling fixed-point data types. Scaling the fixed-point data types avoids overflow conditions and minimizes quantization errors.

For processors that support efficient multiplication, using floating-point multiplication to handle a net slope correction improves code efficiency. If the net slope correction has a value that is not a power of two, using division improves precision.

Note: This example requires a Fixed-Point Designer™ license.

Example

In the model FloatMultiplicationNetSlope, a Convert block converts an input signal from a floating-point data type to a fixed-point data type. The net slope correction has a value of 3.

model = 'FloatMultiplicationNetSlope';
open_system(model);

Generate Code

Build the model.

slbuild(model)
### Starting build procedure for: FloatMultiplicationNetSlope
### Successful completion of build procedure for: FloatMultiplicationNetSlope

Build Summary

Top model targets:

Model                        Build Reason                                         Status                        Build Duration
==============================================================================================================================
FloatMultiplicationNetSlope  Information cache folder or artifacts were missing.  Code generated and compiled.  0h 0m 11.497s 

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 12.651s

In these lines of FloatMultiplicationNetSlope.c code, the code generator divides the input signal by 3.0F.

cfile = fullfile('FloatMultiplicationNetSlope_grt_rtw',...
    'FloatMultiplicationNetSlope.c');
coder.example.extractLines(cfile,'/* Model step', '/* Model initialize function */', 1, 0);
/* Model step function */
void FloatMultiplicationNetSlope_step(void)
{
  /* Outport: '<Root>/Output' incorporates:
   *  DataTypeConversion: '<Root>/Data Type Conversion'
   *  Inport: '<Root>/Input'
   */
  FloatMultiplicationNetSlope_Y.Output = (int16_T)(real32_T)floor
    (FloatMultiplicationNetSlope_U.Input / 3.0F);
}

Enable Optimization

  1. Open the Configuration Parameters dialog box.

  2. On the Math and Data Types pane, select Use floating-point multiplication to handle net slope corrections. This optimization is on by default.

Alternatively, you can use the command-line API to enable the optimization.

set_param(model, 'UseFloatMulNetSlope', 'on');

Generate Code with Optimization

slbuild(model)
### Starting build procedure for: FloatMultiplicationNetSlope
### Successful completion of build procedure for: FloatMultiplicationNetSlope

Build Summary

Top model targets:

Model                        Build Reason                     Status                        Build Duration
==========================================================================================================
FloatMultiplicationNetSlope  Generated code was out of date.  Code generated and compiled.  0h 0m 10.186s 

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 11.02s

In the optimized code, the code generator multiplies the input signal by the reciprocal of 3.0F , that is 0.333333343F.

coder.example.extractLines(cfile,'/* Model step', '/* Model initialize function */', 1, 0);
/* Model step function */
void FloatMultiplicationNetSlope_step(void)
{
  /* Outport: '<Root>/Output' incorporates:
   *  DataTypeConversion: '<Root>/Data Type Conversion'
   *  Inport: '<Root>/Input'
   */
  FloatMultiplicationNetSlope_Y.Output = (int16_T)(real32_T)floor
    (FloatMultiplicationNetSlope_U.Input * 0.333333343F);
}

Close the model and the code generation report.

bdclose(model)

See Also

Related Topics