# 使用系统对象创建移动平均滤波器模块


# 引言

本示例演示了如何使用 Sysblock 系统创建一个移动平均滤波器模块。通过集成 JuliaFunction 模块,实现动态窗口大小的移动平均滤波算法。该滤波器可以对输入信号进行平滑处理,有效减少噪声干扰,广泛应用于信号处理、数据滤波等领域。

单击右侧打开示例按钮,在 Sysplorer 中打开示例文件。

# 软件环境配置

本次仿真因为需要 JuliaFunction 模块,所以需要从 Syslab 中打开 Sysplorer。

提示

若出现 "MWORKS.Sysplorer 可执行文件路径不存在",则需要重新设置 Sysplorer 的文件路径,单击 Syslab 主页 > 首选项 > MWORKS.Sysplorer 可执行文件路径 > 浏览…


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

# 模型搭建

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


  2. 在库浏览器中搜索 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
  3. 在库浏览器中找到上述元器件,并且将它们拖到模型视图中,按照如下位置进行摆放。

# 模块参数设置

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

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

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

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

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

  6. 双击打开 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
    
    

    提示

    这段代码实现了一个可动态调整窗口大小的移动平均滤波器。它通过维护一个全局状态数组来存储历史数据,当有新数据输入时,函数会更新这个数组并保持其长度等于当前设定的窗口大小。具体来说,它会将最新数据添加到数组末尾,如果数组长度超过窗口大小则移除最旧的数据点,然后计算并返回当前窗口内所有数据的算术平均值。这种滤波器常用于信号处理中消除随机噪声,使数据曲线更加平滑。

  7. 完成后回到 Sysplorer,juliaFunction 模块变为两个输入端口。第一个输入端口 x1(当前输入数据)和第二个输入端口 window_size_input(当前设定的窗口大小)。

# 连接模块

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

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

# 封装模块

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


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

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

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


# 仿真设置

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

# 仿真运行

单击主页 > 仿真,等待仿真运行结束,双击打开 scope 模块查看仿真结果。