# 使用系统对象创建移动平均滤波器模块
# 引言
本示例演示了如何使用 Sysblock 系统创建一个移动平均滤波器模块。通过集成 JuliaFunction 模块,实现动态窗口大小的移动平均滤波算法。该滤波器可以对输入信号进行平滑处理,有效减少噪声干扰,广泛应用于信号处理、数据滤波等领域。
单击右侧打开示例按钮,在 Sysplorer 中打开示例文件。
# 软件环境配置
本次仿真因为需要 JuliaFunction 模块,所以需要从 Syslab 中打开 Sysplorer。
提示
若出现 "MWORKS.Sysplorer 可执行文件路径不存在",则需要重新设置 Sysplorer 的文件路径,单击 Syslab 主页 > 首选项 > MWORKS.Sysplorer 可执行文件路径 > 浏览…。

找到本地安装 Sysplorer 2025b 文件夹的位置,单击打开,找到 MWORKS.Sysplorer 2025b(x64)。由于安装位置和版本的不同,文件后缀可能不同。完成设置后重新从 Syslab 中打开 Sysplorer 即可。

# 模型搭建
单击文件 > 新建 Sysblock 模型 > 创建新 Sysblock 模型,然后输入控制器模型名 Demo_FilterBlock。


在库浏览器中搜索 Constant(产生不定类型常量信号)、JuliaFunction(编辑和调用 Julia 脚本函数)、Scope(显示输入值)、Switch(当输入 2 满足所选条件时,输入 1 通过;否则,输入 3 通过)、UniformRandomNumber(输出均匀分布的随机信号)、Sum(对输入执行加法或减法)。各组件对应的模型库路径如下表所示。
组件名 组件对应的模型库路径 Constant Sysblock.Sources(信号源模型库).Constant JuliaFunction Sysblock.Utilities(实用工具模型库).JuliaFunction Scope Sysblock.Utilities(实用工具模型库).Scope Switch Sysblock.SignalRouting(信号路由模型库).Switch UniformRandomNumber Sysblock.Sources(信号源模型库).UniformRandomNumber Sum Sysblock.MathOperation(数学运算模型库).Sum 在库浏览器中找到上述元器件,并且将它们拖到模型视图中,按照如下位置进行摆放。

# 模块参数设置
双击打开 constant1 模块,设置常量值 1,采样时间 1,单击确定保存设置。

双击打开 constant2 模块,设置常量值 -1,采样时间 1,单击确定保存设置。

双击打开 constant3 模块,设置常量值 5,采样时间 1,单击确定保存设置。

双击打开 switch 模块,设置首个输入传递条件: 大于,阈值: 0,单击确定保存设置。

双击打开 scope 示波器模块,单击配置属性,将输入端口数设置为 2,单击确定保存设置,最后关闭 scope 模块。

双击打开 juliaFunction 模块,输入以下代码。
# 全局状态 global_state = Float64[] current_window_size = 5 function fcn(x1, window_size_input) # 声明使用全局变量 global global_state, current_window_size # 更新窗口大小(如果需要) if window_size_input != current_window_size current_window_size = window_size_input # 如果窗口大小变小,需要截断历史数据 if length(global_state) > current_window_size global_state = global_state[end-current_window_size+1:end] end end # 将当前输入添加到全局状态 push!(global_state, x1) # 如果全局状态长度超过窗口大小,删除最旧的数据 if length(global_state) > current_window_size popfirst!(global_state) end # 计算平均值 y = sum(global_state) / length(global_state) return y end
提示
这段代码实现了一个可动态调整窗口大小的移动平均滤波器。它通过维护一个全局状态数组来存储历史数据,当有新数据输入时,函数会更新这个数组并保持其长度等于当前设定的窗口大小。具体来说,它会将最新数据添加到数组末尾,如果数组长度超过窗口大小则移除最旧的数据点,然后计算并返回当前窗口内所有数据的算术平均值。这种滤波器常用于信号处理中消除随机噪声,使数据曲线更加平滑。
完成后回到 Sysplorer,juliaFunction 模块变为两个输入端口。第一个输入端口 x1(当前输入数据)和第二个输入端口 window_size_input(当前设定的窗口大小)。

# 连接模块
分别将 constant1 和 constant2 模块的输出端口连接到 switch 模块的第一和第三输入端口。uniformRandomNumber 模块的输出端口连接到 switch 模块的第二输入端口。switch 模块和 uniformRandomNumber1 模块的输出端口分别连接到 sum1 模块的第一和第二输入端口。

sum1 模块的输出端口连接到 juliaFunction 模块的第一输入端口和 scope 模块的第一输入端口。constant3 模块的输出端口连接到 juliaFunction 模块的第二输入端口。juliaFunction 模块的输出端口连接到 scope 模块的第二输入端口。

# 封装模块
单击并长按 constant3 模块和 juliaFunction 模块下方空白处,拖拽覆盖这两个模块,将鼠标移动到 juliaFunction 模块上方再右击选择创建子系统。


将新建的子系统名称修改为 movingAverageFilter,并且调整至合理大小。

双击打开 movingAverageFilter 子系统,右击空白处选择编辑封装。

单击参数提升右边符号 ^, 勾选 Value,再单击提升,将文本修改为图窗大小,单击确定保存设置。完成设置后双击用户模型 Demo_FilterBlock 回到主系统。此时双击 movingAverageFilter 子系统便可在弹出页面修改滤波图窗大小。


# 仿真设置
在进行仿真之前需要进行仿真设置,在软件上方功能区,单击主页 > 仿真设置按钮,打开仿真设置界面。在该界面设置开始时间 0,终止时间 250,输出区间步长 0.02。积分算法的类型设置为定步长,算法为 Euler(Runge-Kutta, 1 阶, 非刚性),容差 0.0001,积分步数 1,单击确定并保存到模型。
# 仿真运行
单击主页 > 仿真,等待仿真运行结束,双击打开 scope 模块查看仿真结果。
