通过滑动窗口平滑信号¶
让我们考虑用滑动窗口从低到高平滑信号的 4 种方法。
信号平滑的不同方法¶
在不同的应用中,工程师可能需要多种信号滤波方法,我们将对四种方法(工作原理相同)进行细分,并讨论它们的优缺点。
延迟链(显式 FIR)¶
首先,实现滑动窗口的最低级方法是在信号到达时记住一定数量的信号点,例如 100 个。结果将是所有这些 "延迟测量 "的总和除以它们的数量(100)。
滤波器内部有 10 个相同的模块,其输出相加除以 100。
每个区块内都有 10 个延迟区块Unit Delay
,这些区块会记住下一个值,然后再把前一步接收到的值传递给下一个区块。
我们为什么要创建这样层次分明的区块呢?通过这样安排延迟块,我们避免了创建一行 100 个延迟块的需要。
这种方法不是很灵活,因为我们仍然需要手动创建延迟块。用掩码对这样的滤波器进行参数化设置是很困难的。
使用现成的 FIR 滤波器块¶
在电路图上放置滤波器块要容易得多Discrete FIR filter
我们将为测量块指定相同的系数权重,以便每次测量对最终信号的贡献相同。
通过 CIC 滤波器进行平滑处理¶
使用下图所示的更简单、更优雅的设计,可以创建等权重的 CIC 滤波器。
在这里,通过 100 的延迟长度和几个简单的模块,我们创建了一个 BICH 型级联积分梳状滤波器(具有无限脉冲响应)。这里完全没有乘法运算,因此滤波器的速度非常快。
滑动平均 "模块¶
如果在设置中指定了 "滑动窗口 "方法,标准程序库中另一个名为Moving Average
的程序块将执行与前述程序块相同的操作。
该程序块需要接收一个值向量作为输入,因此我们向输入端口输入一个缓冲信号(长度为100
的程序块Buffer
,重叠99
)。在输出端,它将返回一个单独的值,并将其打包成一个大小为1х1
的矩阵。我们使用块Demux
将其转换为标量。
运行模型¶
让我们运行模型 2500 个样本。输入信号由以下子系统生成:
这是常数1
与振幅为0.01
的均匀分布噪声矢量相加的结果。模型采样 500 次后,在信号中加入振幅为1
的阶跃。
# Если модель еще не открыта, загрузим из файла
if "moving_average" ∉ getfield.(engee.get_all_models(), :name)
engee.load( "$(@__DIR__)/moving_average.engee");
end;
data = engee.run( "moving_average" )
让我们将结果相互比较一下。它们应该是相同的,但由于信号缓冲的实现方式,后一种方法会带来一个采样延迟。
plot( data["Сглаженный явным FIR"].time, data["Сглаженный явным FIR"].value, label="Сглаженный явным FIR" )
plot!( data["Сглаженный блоком FIR"].time, data["Сглаженный блоком FIR"].value, label="Сглаженный блоком FIR" )
plot!( data["Сглаженный CIC фильтром"].time, data["Сглаженный CIC фильтром"].value, label="Сглаженный CIC фильтром" )
plot!( data["Сглаженный через блок MA"].time, data["Сглаженный через блок MA"].value, label="Сглаженный через блок MA" )
plot!( legend=:bottomright )
结论¶
如果您在工作中经常需要过滤信号,您会发现使用本示例中介绍的模型非常有用。
滤波器的选择取决于是否需要分配权重(例如,实现指数滤波器)、输入信号的类型(标量或矢量)以及是否需要将模型转化为代码。