Chinese Title: 为 Simulink Embedded Coder 增加模块中间变量的初始化功能

Transfer Function of First-Order LPF

For a simulink block, the mask’s initialization commands is not included in the generated code. Take a first-order low-pass filter for example, the Laplace transfer function

{ Y(s) = \cfrac{\omega}{s+\omega}}

In the time domain,
{y_n = a \cdot x_n + b \cdot y_{n-1}}, where

a = \cfrac{\omega\cdot T_s}{1+\omega\cdot T_s}, \quad b=\cfrac{1}{1+\omega\cdot T_s}

and T_s is the sampling interval.

Conventional Simulink Block Implementation

If we set \omega and T_s as mask parameters, we may want to calculate a and b in the mask initialization commands, i.e.

a = omega * T_s / ( 1 + omega * T_s );
b = 1 / ( 1 + omega * T_s );

and the block is


However, when using code generation, the parameters a and b are embedded in the generated c or cpp code, rather than the expected parameters \omega and T_s. That’s because the mask initialization code is not included for coder.

Improved Implementation with Parameter Initialization

There’s another approach, by using Initialize Function block. The filter block can be like this


Check the Treat as atomic unit of the Low-Pass Filter block.

The Initialize Function block is


By this, the Embedded Coder will generate the initialization code calculating a and b from \omega and T_s. The initialization code should be called during initialization. After initialization, the code uses a and b as intermediate parameter to speed up low-pass filter calculation.

Note that, by using this approach, you will not be able to change the filter parameter during simulation (on the fly). The workaround is, try to use an Environment Controller block to separate coder and simulation, i.e.


Categories: Simulink


Leave a Reply

Your email address will not be published.