英文标题:Add intermediate parameter initialization function for Simulink Embedded Coder

一阶低通滤波器的传递函数

对于 simulink 模块,封装(mask)的初始化命令不会被包含在生成的代码中。以一阶低通滤波器为例,其拉普拉斯传递函数为

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

在时域中,
{y_n = a \cdot x_n + b \cdot y_{n-1}},其中

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

T_s 是采样间隔。

常规的 Simulink 模块实现

如果把 \omega 和 T_s 设为封装参数,我们可能希望在封装初始化命令中计算 a 和 b,即

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

模块如下

Alt

然而在生成代码时,嵌入到生成的 c 或 cpp 代码中的是参数 a 和 b,而不是我们期望的 \omega 和 T_s。原因在于代码生成器不会包含封装的初始化代码。

带参数初始化的改进实现

还有另一种办法,就是使用 Initialize Function 模块。滤波器模块可以做成这样

Alt

勾选 Low-Pass Filter 模块的 Treat as atomic unit。

Initialize Function 模块如下

Alt

这样,Embedded Coder 就会生成由 \omega 和 T_s 计算 a 和 b 的初始化代码。这段代码应在初始化阶段调用。初始化完成后,代码将 a 和 b 作为中间参数,以加快低通滤波器的运算。

注意,采用这种方法后,就无法在仿真过程中(在线)修改滤波器参数了。变通办法是用 Environment Controller 模块把代码生成和仿真分开,即:

Alt

分类: Simulink

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注