Tips for Making Generated Code More Efficient
fimath Settings for Efficient Code
The default settings of the fimath object offer the smallest
rounding error and prevent overflows. However, they can result in extra logic in
generated code. These default settings are:
RoundingMethod: NearestOverflowAction: SaturateProductMode: FullPrecisionSumMode: FullPrecision
For leaner code, it is recommended that you match the
fimath settings to the settings of your processor.
The
KeepLSBsetting forProductModeandSumModemodels the behavior of integer operations in the C language.KeepMSBforProductModemodels the behavior of many DSP devices.Different rounding methods require different amounts of overhead code. Setting the
RoundingMethodproperty toFloor, which is equivalent to two’s complement truncation, provides the most efficient rounding implementation for most operations. For the divide function, the most efficientRoundingMethodisZero.The standard method for handling overflows is to wrap using modulo arithmetic. Other overflow handling methods create costly logic. It is recommended that you set the
OverflowActionproperty toWrapwhen possible.
Replace Functions with More Efficient Fixed-Point Implementations
CORDIC
The CORDIC-based algorithms are among the most hardware friendly because they require only iterative shift-add operations. Replacing functions with one of the CORDIC implementations can make your generated code more efficient. For a list of the CORDIC functions, and examples of them being implemented, see Fixed-Point Math Operations in MATLAB and Simulink.
Lookup tables
You can implement some functions more efficiently by using a lookup table approach. For an example, see Implement Fixed-Point Log2 Using Lookup Table.
Division
Division is often not supported by hardware. When possible, it is best to avoid division operations.
When the denominator is a power of two, you can rewrite the division as a bit shift operation.
x/8
can be rewritten as
bitsra(x,3)
Other times it is more efficient to implement division as a multiplication by a reciprocal.
x/5
can be rewritten as
x*0.2