g-h Filter 详细讲解

news2024/12/23 1:07:28

g-h 过滤器

g-h 滤波器百科介绍。

之前的翻译大家,我看都没什么阅读量,可能大家都不是很想看(估计也是我英文太水)。那么这篇博客我就先暂停直接翻译原文,而是直接说一下自己的理解。

本文章背后的书的详细介绍可以查看 链接

从头开始认识 g-h 过滤器

作者通过对使用含有误差的秤(现实世界的秤都不可能百分之百准确)测量自己的体重引出了 g-h 过滤器的概念。
这也是一个相当重要的概念,对后面的要学习的各种滤波算法起到了非常关键的思想上的引导。
g-h过滤器的核心思想就是对预测值和实际的测量值找到一个比重,来使得实际的评估值更加能接近最真实的体重。
下面的图就是如何对体重进行评估的方式描述。

在这里插入图片描述
这里的 last_estimate 是值上一次的评估值, estimate 是当前的评估值,prediction 是通过上一次的评估值对当前的预测值,measurement 是当前的测量值。这里的值全部是指作者要测量的目标,也就是体重。

这时如果单纯的只考虑测量值和预测值之间的关系,选择一个系数来分配他们的关系,比如下面的式子。

在这里插入图片描述
这个式子如果用代码来实现只需要用两行,变量名字起的很好,十分易懂。

        # 预测新的重量,gain_rate 就是对体重的预测变化
        predicted_weight = estimated_weight + gain_rate * time_step

        # 对过滤器的状态进行更新 , 这里的 scale_factor 就可以理解为上面式子的 4/10
        estimated_weight = predicted_weight + scale_factor * (measurement - predicted_weight)

在这种情况下因为没有考虑预测值与前一次评估值的变化关系,导致这种办法只在我们设计滤波器的时候对变化关系做出了正确设置的时候才会产生作用。
比如假设每天我们都会增加体重1lbs(磅),如下图所示:

在这里插入图片描述
这个时候滤波器表现的很好。但是如果我们对于预测值的变化设置错误的情况下,图形看起来就不会有这种比较好的效果了。
下图就是在代码中我们假设我们的体重仍是每天增长 1 lbs(磅),但是评估值和预测值之间的关系设置为 -1 的时候的样子。

在这里插入图片描述
为什么会产生这样的效果呢~ 让我们再看看上面决定评估值的代码,当 gain_rate 为 -1 时,也就意味着,每次 prediction 也就是预测值都会比前一次的 estimation 值少 1。这样看图像看起来就像是 红色线始终大幅度落后于圆点,导致我们最终需要的评估值偏离测量值较大,而且跟随性差。

既然是对于评估值的设置出现了错误,是因为之前只是单纯的添加了变化率而没有考虑对于变化率的调整。 那么就再加入一个参数用于调整预测值与前一次测量值的权重。

在这里插入图片描述
这里对上面的式子进行一下解释,新的变化率时根据上一次的变化率进行推算得出的。 predicted weight 是根据上一次的变化率推断出的预测值,而 measurement 是本次实际的测量值,而分母 1day 则是对对应了时间上的变化量。下面就是书中的 python 代码,运行即可得到上面的图像。

weight = 160.  # initial guess
gain_rate = -1.0  # initial guess

time_step = 1.
weight_scale = 4./10
gain_scale = 1./3
estimates = [weight]
predictions = []

for z in weights:
    # prediction step
    weight = weight + gain_rate*time_step
    gain_rate = gain_rate
    predictions.append(weight)
    
    # update step    
    residual = z - weight
    
    gain_rate = gain_rate + gain_scale   * (residual/time_step)
    weight    = weight    + weight_scale * residual
  
    estimates.append(weight)

gh.plot_gh_results(weights, estimates, predictions, [160, 172])

理解 g-h 过滤器要点

作者还总结了关于 g-h 过滤器关键的四点

  1. 通过多个数据是要比单个数据整体来说更加的准确,所以说没有理由放弃任何哪怕是不准确的数据。
  2. 选择两个数据之间的值,往往能获得更加的准确性。
  3. 根据当前的估计和我们认为它会改变的程度,预测下一个预测值和变化率。
  4. 然后选择新的估计作为预测和下一个测量之间的一部分,根据每个测量的准确度进行缩放。

接下来的是对 g-h 过滤器的总结 :

在这里插入图片描述
初始化(Initilization):

  1. 为过滤器选择合适的初始化状态
  2. 初始化我们对于未来状态的信念(belief)

预测(Predict):

  1. 使用系统行为(system behaviour)来预测下一时间的状态。
  2. 调整信念(belief)以考虑在预测过程中的不确定性。

更新(Update):

  1. 获得一个测量值,以及与之相关的对其准确性的信念(belief)。
  2. 计算预测值与实际测量值之间的差值(residual)。
  3. 新的评估值在预测值和测量值的直线上选择。

这里对更新步骤中第三点再进行一些解释,这里的意思就是像下图中黄色框中一样。在 measurement, prediction之间选择 estimate的值。
在这里插入图片描述

对于 g & h 的选择

通过上面的章节,我们可以知道所谓的 g 和 h 就是对预测值的调整和对评估值的调整。在这里作者给出了一个 g-h filter 的python 的代码实现,并且可以使用这个函数来验证 g 和 h 的变化对过滤器实际表现的影响。

def g_h_filter(data, x0, dx, g, h, dt=1.):
    x_est = x0
    results = []
    for z in data:
        # prediction step
        x_pred = x_est + (dx*dt)
        dx = dx

        # update step
        residual = z - x_pred
        dx = dx + h * (residual) / dt
        x_est = x_pred + g * residual
        results.append(x_est)
    return np.array(results)

这个函数参数 data 是用来输入需要过滤的数据, x0 是我们选取的初始化的值,dx 则是对开始信念(belief)也可以理解为开始时的变化率。g 和 g 就是这个过滤器需要根据不同的数据特省进行调整参数。dt 是产生变化的单位时间。

对于这个实现的 g-h 过滤器,作者还给出了几种不同情况下的例子:

不合适的初始化值

在这里插入图片描述

从这个图里面本该将过滤器的初始化值设置为 0 左右,实际上却设置为了 100,能看到在 20 左右出现了比较大的振铃现象(Ringing)。振铃现象的含义是,信号不断地在过冲(Overshoot)和下冲(Undershoot)。

比较极端的噪声

在这里插入图片描述
在这种情况下,由于噪声太大了导致过滤器得到的最终结果和一条平滑的线相距甚远。

加速度不匹配

在这里插入图片描述
再上图中,看起来过滤器的自傲过很好,但是实际上产生的曲线一直实在测量值之下。

改变参数 g

在这里插入图片描述
上面的例子可以看出当 g 的值越大,通过滤波后的曲线就越接近测量值。当 g=0.8 时几乎就是直接追着测量值在跑,几乎没有忽略掉任何的噪声。但是当 g=0.1时,滤波出来的数据看起来非常的平滑,但是几乎没有考虑测量值的变化信息。

在这里插入图片描述
这里也是可以看出当g越小的情况下对于测量值的跟踪越好。

改变参数 h

在这里插入图片描述
到这里感觉调整 g 和 h 参数的效果有点像啊,看起来都是改变滤波器对测量值的跟随性。但是实际上并不是这样的,可以再看一下前面对于 g 和 h 含义的代码。

在这里插入图片描述
h 决定了对于预测值的变化,g 决定了预测值和测量值的权重。所以此处更改 h 的值,就是在修改对于预测值的改变速度。所以上图中橙色线所代表较小的 h 值,就导致了橙色线变化的速度并不快,或者说时比较滞后。而绿色线拥有较大的 h 值,现象是变化非常快速,但是相较于橙色线却产生了比较多次的振铃现象。

不要为了好看的数据写入错误的 g & h 的值

如果单纯的为了过滤出来的曲线好看,不考虑实际需求,将 g 和 h 设置的都非常小,就会得到一根非常平滑的线,但是这并没有实际的意义。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机原理及技术(二)—— AT89S51单片机(一)(C51编程)

目录 一、AT89S51单片机的片内硬件结构 二、AT89S51的引脚功能 2.1 电源及时钟引脚 2.2 控制引脚 2.3 并行 I/O口引脚 三、AT89S51的CPU 3.1 运算器 3.1.1 算术逻辑单元(ALU) 3.1.2 累加器A 3.1.3 程序状态字寄存器(PSW&#xff09…

Linux-应用编程学习笔记(三、文件属性和目录)

一、文件类型 1、普通文件(ls -l 文件,权限前边第一个"-"代表普通文件;stat 文件) 文本文件:ASCII字符 二进制文件:数字0/1 2、目录文件(‘’d):文件夹 3…

声压级越大,STIPA 越好,公共广播就越清晰吗?

在公共广播中,有些朋友经常问到是不是声压越大,广播清晰度就越高,下面我从搜集了一些专业技术资料,供大家参考。 一、声压级越大,STIPA 越好吗? 不完全是。最初,人们认为当声压级达到 60 dBA 以…

STL源码刨析:序列式容器之vector

目录 1.序列式容器和关联式容器 2.vector的定义和结构 3.vector的构造函数和析构函数的实现 4.vector的数据结构以及实现源码 5.vector的元素操作 前言 本系列将重点对STL中的容器进行讲解,而在容器的分类中,我们将容器分为序列式容器和关联式容器。本章…

氢燃料电池汽车行业发展

文章目录 前言 市场分布 整车销售 发动机配套 氢气供应 发展动能 参考文献 前言 见《氢燃料电池技术综述》 见《燃料电池工作原理详解》 见《燃料电池发电系统详解》 见《燃料电池电动汽车详解》 市场分布 纵观全球的燃料电池汽车市场,截至2022年底&#xff…

关于Iterator 和ListIterator的详解

1.Iterator Iterator的定义如下&#xff1a; public interface Iterator<E> {} Iterator是一个接口&#xff0c;它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口如下&#xff1a; forEachRemaining(Consumer<? super E> act…

阿里架构师整理:100套Java经典实战项目+源码!拿走玩去,练不会我直接退出IT

技术学习的目的是进行项目开发&#xff0c;但是很多同学苦于自学没有项目练手&#xff0c;被面试官问到项目经验&#xff0c;项目就成了自己的短板。小编特地收集了阿里架构师整理的java实战项目来满足大家的需求&#xff0c;让大家在实战中不断成长&#xff01; 话不多说了&…

软件web化的趋势

引言 在信息技术飞速发展的今天&#xff0c;软件Web化已成为一个不可忽视的趋势。所谓软件Web化&#xff0c;即将传统的桌面应用软件转变为基于Web的应用程序&#xff0c;使用户能够通过浏览器进行访问和使用。传统软件通常需要在用户的计算机上进行安装和运行&#xff0c;而W…

浅谈网络通信(1)

文章目录 一、认识一些网络基础概念1.1、ip地址1.2、端口号1.3、协议1.4、协议分层1.5、协议分层的2种方式1.5.1、OSI七层模型1.5.2、TCP/IP五层模型[!]1.5.2.1、TCP/IP五层协议各层的含义及功能 二、网络中数据传输的基本流程——封装、分用2.1、封装2.2、分用2.2.1、5元组 三…

中科蓝讯AB32VG1中文寄存器说明GPIO端口操作

1 GPIO管理 1.1 GPIO通用控制寄存器 寄存器 1- 1 GPIOA&#xff1a;端口 A 数据寄存器 位寄存器名模式缺省描述31:8---未使用7:0GPIOA写0x00PAx 数据。当 PAx 用作 GPIO 时有效 0&#xff1a;读取时PAx为输入低电平状态&#xff0c;写入时PAx为输出低电平; 1&#xff1a;PAx…

Exel 求某行数最大值

方法1 MAX&#xff08; 选中比较数回车

visual studio code生成代码模板

编写需要生成代码片段的代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

基于深度学习的入侵检测系统综述文献概述

好长时间不发博客了&#xff0c;不是因为我摆烂了&#xff0c;是我换研究方向了&#xff0c;以后我就要搞科研了。使用博客记录我的科研故事&#xff0c;邀诸君共同见证我的科研之路。 1、研究方向的背景是什么&#xff1f; &#xff08;1&#xff09;互联网发展迅速&#xff…

基础IO用户缓冲区 、inode、硬软链接【Linux】

文章目录 用户缓冲区磁盘磁盘分区EXT2文件系统的存储方案 inode软链接硬链接 用户缓冲区 代码一&#xff1a; 1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h> 4 int main()5 {6 const char * fstr &…

从XPS迁移到IP Integrator

从XPS迁移到IP Integrator 概述 AMD Vivado™设计套件IP集成器可让您将包含AMD的设计缝合在一起 IP或您的自定义IP在相对较短的时间内&#xff0c;在GUI环境中工作。 就像在Xilinx Platform Studio中一样&#xff0c;您可以快速创建嵌入式处理器设计&#xff08;使用&#xff0…

中兴通讯助力中国移动,推动SPN AI节能技术于23省规模部署

SPN作为中国移动自主创新的新一代综合承载网络&#xff0c;相比PTN设备&#xff0c;SPN的单机容量及性能有大幅提升&#xff0c;整机功耗也相应变大。在当前国家双碳政策的目标下&#xff0c;SPN设备的节能降耗也日益成为中国移动关注的焦点。因此&#xff0c;中国移动选择与中…

Crafty - hackthebox

简介 靶场&#xff1a;hackmyvm 靶机&#xff1a;Crafty(10.10.11.254) 难度&#xff1a;Easy 靶机链接:https://app.hackthebox.com/machines/Crafty 攻击机1&#xff1a;ubuntu22.04 (10.10.16.16) 攻击机2&#xff1a;windows11(10.10.14.33) 扫描 fscan扫描http服务…

graspnet+Astra2相机实现部署

graspnetAstra2相机实现部署 &#x1f680; 环境配置 &#x1f680; ubuntu 20.04Astra2相机cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0numpy 1.23.5 1. graspnet的复现 具体的复现流程可以参考这篇文章&#xff1a;Ubuntu20.04下GraspNet复现流程 这里就不再详细…

贪心-leetcode402.移掉 K 位数字-XMUOJ符文序列

题目 思路 话不多说&#xff0c;直接上代码 代码 /*leetcode402.移掉 K 位数字-XMUOJ符文序列--JinlongW-2024/05/26单调栈贪心*/ #include<bits/stdc.h> const int N1010; char num[N],result[N],numStack[N]; int k; using namespace std;void removeKdigits( int k…

Excel 多行表头的列转行

Excel中A3:F6是带表头的典型表格&#xff0c;但上面多了额外的两行表头&#xff1a; ABCDEF1ActualsActualsPlanPlan2FY20FY21FY20FY213CountryOwner1/1/20201/1/20201/1/20201/1/20204FranceRichard100150801605FranceMartin1201401301406FrancePierre501005080 现在要将典型…