Engee 文档
Notebook

通过滑动平均对噪声信号进行滤波

此示例演示如何使用该块 Moving RMS 执行移动平均滤波(简单和指数)。 通过更改块设置,我们得到了四种不同类型的过滤器行为。

模型和过滤器的描述

Pulse Generator 产生每个长度为512个时间采样的矩形脉冲。 座 Switch 控制蜿蜒的上下水平之间的切换(在0.5和1.5之间)。 我们将噪声添加到该信号中,数学期望为0,方差为0.001。

对于使用滑动窗口方法(移动平均(MA))或FIR滤波器进行平滑,我们实现了两种窗口重叠系数不同的模式。 在一种情况下,过滤器将跳过1个维度,在另一个跳过4个维度。 这些滤波器的结果在输出值的值上几乎不会有差异,然而,重叠为4的滤波器的采样将比跳跃为1的滤波器的采样低4倍。

我们还实现了一组具有指数平滑(指数移动平均线(EMA))的IIR滤波器。),为此我们将设置不同的权重系数:0.9和0.99。 它们会显着影响输出信号:平滑系数较低(0.9)的图形会对电平之间的干扰和信号切换做出更动态的反应。

有关这些平滑方法及其参数的操作的详细信息,请参阅[移动RMS]块的帮助(https://engee.com/helpcenter/stable/dsp-statistics/moving-rms.html )。

image.png

使用包含SVG标记的注释突出显示模型的各个区域。

模型的采样率

由于需要在Engee中指定模型的步长,因此使用多速模型需要仔细注意不同块的离散化。 我们来看一个情况。 噪声发生器的触发频率是脉冲发生器的512倍。 该模型配置为每秒进行44,100次测量。

如果第一个平滑滤波器具有等于4的平滑窗口的跳跃大小,那么在这个滤波器之后信号的采样频率将是(512/4)/44100,即128/44100*(我们可以说128个采样)*。

但是,如果我们想使跳跃大小等于5,我们将不得不改变模型的基本采样率。 实际上,在这种滤波器的输出处,信号将具有(512/5)/44100的采样率,即102.4/44100(小数采样数)。 在这种情况下,模型的基本采样率不再是画布上所有信号采样率的公约数。 要恢复模型的性能,需要增加5倍(5*44100).

启动模型

让我们使用软件控件运行模型,并比较不同过滤器的结果。

In [ ]:
modelName = "mvgRMSNoisyStep";
model = modelName in [m.name for m in engee.get_all_models()] ? engee.open( modelName ) : engee.load( "$(@__DIR__)/$(modelName).engee");
engee.set_param!( modelName, "StopTime"=>8 );
data = engee.run( modelName, verbose=false )

Out[0]:
SimulationResult(
    "MA - Размер скачка 1" => WorkspaceArray{Float64}("mvgRMSNoisyStep/MA - Размер скачка 1")
,
    "MA - Размер скачка 4" => WorkspaceArray{Float64}("mvgRMSNoisyStep/MA - Размер скачка 4")
,
    "EMA - Показатель сглаживания 0.9" => WorkspaceArray{Float64}("mvgRMSNoisyStep/EMA - Показатель сглаживания 0.9")
,
    "EMA - Показатель сглаживания 0.99" => WorkspaceArray{Float64}("mvgRMSNoisyStep/EMA - Показатель сглаживания 0.99")
,
    "Зашумленные импульсы" => WorkspaceArray{Float64}("mvgRMSNoisyStep/Зашумленные импульсы")

)

让我们建立一个大致的时间表:

In [ ]:
plot( data["Зашумленные импульсы"].time[1:16:end], data["Зашумленные импульсы"].value[1:16:end],
    c=5, label="Зашумленные импульсы" )
plot!( data["MA - Размер скачка 4"].time[1:16:end], data["MA - Размер скачка 4"].value[1:16:end],
    c=1, label="Размер скачка 4" )
plot!( data["MA - Размер скачка 1"].time[1:16:end], data["MA - Размер скачка 1"].value[1:16:end],
    c=2, label="Размер скачка 1" )
plot!( data["EMA - Показатель сглаживания 0.9"].time[1:16:end], data["EMA - Показатель сглаживания 0.9"].value[1:16:end],
    c=3, label="Показатель сглаживания 0.9" )
plot!( data["EMA - Показатель сглаживания 0.99"].time[1:16:end], data["EMA - Показатель сглаживания 0.99"].value[1:16:end],
    c=4, label="Показатель сглаживания 0.99" )
Out[0]:

让我们放大图表,看看不同的平滑算法如何解决信号强度的急剧变化。

In [ ]:
r1 = 65500:2:65800
r2 = (4*r1.start):2:(4*r1.stop)

plot( data["Зашумленные импульсы"].time[r2], data["Зашумленные импульсы"].value[r2],
       c=5, label="Зашумленные импульсы" )
plot!( data["MA - Размер скачка 4"].time[r1], data["MA - Размер скачка 4"].value[r1],
        c=1, label="Размер скачка 4" )
plot!( data["MA - Размер скачка 1"].time[r2], data["MA - Размер скачка 1"].value[r2],
        c=2, label="Размер скачка 1" )
plot!( data["EMA - Показатель сглаживания 0.9"].time[r2], data["EMA - Показатель сглаживания 0.9"].value[r2],
        c=3, label="Показатель сглаживания 0.9" )
plot!( data["EMA - Показатель сглаживания 0.99"].time[r2], data["EMA - Показатель сглаживания 0.99"].value[r2],
        c=4, label="Показатель сглаживания 0.99" )
Out[0]:

结论

我们比较了使用该块执行的几种信号平均方法 Moving RMS 通过不同的设置,我们可以实现我们需要的算法,以及客观地选择最佳的过滤方法。