滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波

article/2025/10/19 6:46:49

滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波

因工作涉及到数据滤波(滤噪)处理,汇总了一些网上简单的滤波算法,方便日后查看。

滤波算法包括:均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波。

本文主要是处理线性数据y=ax+b,对于非线性数据,简单的滤波算法效果有限。滤波算法都有自己的局限,针对不同问题需要选择合适的方法。

以下使用python实现简单demo,主要是方便画图。

为了方便,本文使用jupyter notebook直接导出markdown生成。

建立测试数据

真值y = 0.003*x
观测值加上随机白噪声

import random
import math
import numpy as np
import matplotlib.pyplot as pltn = 500
real = [] # 真值
mear = [] # 观测值
pred = [] # 滤波值# 建立真值和观测值
for i in range(n):num = 0.003 * i real.append(num)num += 0.1 * np.random.standard_normal()  # 本身的不确定性num += 0.5 * np.random.standard_normal()  # 观测的不确定性mear.append(num)plt.plot(range(n), mear)
plt.plot(range(n), real)
plt.show()

在这里插入图片描述

均值滤波

均值滤波是典型的线性滤波算法,在图像中应用比较多,原理是以该像素点周围的八个像素点取平均操作,然后替代该像素点,也就是卷积操作。对于处理简单的线性数据y=ax+b,原理也是类似的,取该点周围的n个点取平均即可,n可以看为是一个滑窗。因此,可以取该点的前后n个数据的平均值,也可以取前n个数据的平均值,根据不同场景数据设计即可。
如下代码比较适合离线数据处理,是对原始观测的数据中取某点的前后滑窗大小的均值,好比图像中应用中就是对原始图片滤波。如果对于在线数据,一个不断增加数据的数组,建议使用一阶滤波器或者kalman滤波器。

# window滑窗越大,滤波效果越明显,结果越滞后
# 设置了该点的左右滑窗大小,可根据实际情况选取参数
def average_filter(window_left, window_right, arr):size = len(arr)result = []for i in range(window_left, size-window_right):sum = 0# 滑窗for j in range(-window_left, window_right+1):sum += arr[i+j]sum /= (window_left + window_right + 1)result.append(sum)return resultpred = [] # 滤波值# 前后5个,总共11个点求平均值
pred = average_filter(5, 5, mear)# 前5个数,总共6个点求平均值
# pred = average_filter(5, 0, mear)plt.plot(range(n), mear)
plt.plot(range(n), real)
# 会牺牲掉前后window大小的数据,可以作相应改进
plt.plot(range(len(pred)), pred)
print(len(pred))
490

在这里插入图片描述

中值滤波

和均值滤波相似,同样是选取固定大小滑窗,然后选取滑窗内的中位数作为滤波结果。或者选取中位数平均数,类似比赛中去掉最高最低分,对其余比分求平均,这种可以叫做中位值平均滤波法。思路都是差不多的,都是需要做一遍排序。
中值滤波能有效克服偶然因素引起的波动噪声。

# window滑窗越大,滤波效果越明显,结果越滞后
# 设置了该点的左右滑窗大小,可根据实际情况选取参数
def Median_Filter(window_left, window_right, arr):size = len(arr)result = []for i in range(window_left, size-window_right):# 滑窗temp = []for j in range(-window_left, window_right+1):temp.append(arr[i+j])temp.sort()point = temp[(int)(len(temp)/2)]result.append(point)return result# 中值平均值滤波
def MedianAvg_Filter(window_left, window_right, arr):size = len(arr)result = []for i in range(window_left, size-window_right):# 滑窗temp = []for j in range(-window_left, window_right+1):temp.append(arr[i+j])temp.sort()# 可以去掉最大值后,取中位数的平均值median_mean = []for m in range(1, len(temp)-1):median_mean.append(temp[m])result.append(np.mean(median_mean))return resultpred = [] # 滤波值
# 前后5个,总共11个点求中值
pred = Median_Filter(5, 5, mear)
# pred = MedianAvg_Filter(5, 5, mear)# 前5个数,总共6个点求中值
# pred = Median_filter(5, 0, mear)plt.plot(range(n), mear)
plt.plot(range(n), real)
# 会牺牲掉前后window大小的数据,可以作相应改进
plt.plot(range(len(pred)), pred)
[<matplotlib.lines.Line2D at 0x7efd2c841978>]

在这里插入图片描述

一阶(αβ)滤波

一阶滤波是比较常用简单的滤波方法,就是当前采样结果和上一个滤波结果加权求和,权重和为1。对周期干扰噪声有良好的抑制作用,但同样会产生相位滞后,权重是固定值也是其缺点之一。

# a值越小,越不相信观测,滤波效果越明显,结果越滞后
def ab_filter(a, now):global lastreturn a * now + (1 - a) * lastpred = []
last = mear[0]
pred.append(last)for i in range(1, n):last = ab_filter(0.4, mear[i])pred.append(last)plt.plot(range(n), mear)
plt.plot(range(n), real)
plt.plot(range(n), pred)
[<matplotlib.lines.Line2D at 0x7efd2c7a9588>]

在这里插入图片描述

卡尔曼滤波

关于卡尔曼滤波器的原理这里就不多做介绍了,可以查看我之前的文章卡尔曼滤波算法原理(KF,EKF,AKF,UKF)。
因为之前都是用kf处理带有运动模型的运动目标数据,一时还没有反应过来可以用它来处理简单的二维线性数据,惭愧。

# 滤波效果主要调整参数:
# 过程噪声方差q(越小越相信预测,反之亦然), 观测噪声方差r(越小越相信观测,反之亦然)
q, r = 0.1, 2
# 状态均值x, 过程噪声均值w,方差p
x, w, p = 0, 0, 0
def kalman_filter(z):global x, p# 预测x_ = x + wp_ = p + qk = p_ / (p_ + r)# 更新x = x_ + k * (z - x_)p = (1-k) * p_return xpred = [] # 滤波值
for i in range(n):pred.append(kalman_filter(mear[i]))plt.plot(range(n), mear)
plt.plot(range(n), real)
plt.plot(range(n), pred)
[<matplotlib.lines.Line2D at 0x7efd2c78ee10>]

在这里插入图片描述

总结

以上对简单的线性数据处理完之后,就可以使用最小二乘法来拟合出一个比较好的结果,关于最小二乘法可以查看我之前的文章最小二乘法拟合线条的C++实现
因各个滤波器取的参数不一,结果对比起来没有意义,而且因为采样点比较多,没有具体分析细节,建议应用时测试充分选取合适的方法。
水平有限,有错误的地方希望大佬多加指正!

参考文章

  1. 无人驾驶基本功专栏
  2. 卡尔曼滤波器的深入理解与可视化
  3. 中位值滤波
  4. C#/.NET 波形滤波——中位值平均滤波法(防脉冲干扰平均滤波法)

http://chatgpt.dhexx.cn/article/FqHBuX6P.shtml

相关文章

一阶滤波器

1. 一阶滤波算法的原理 一阶滤波&#xff0c;又叫一阶惯性滤波&#xff0c;或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为&#xff1a; Y(n)αX(n) (1-α)Y(n-1) 式中&#xff1a;α滤波系数&#xff1b;X(n)本次采样值&…

FIR数字滤波器设计

今天给大侠带来FIR数字滤波器设计&#xff0c;由于篇幅较长&#xff0c;分三篇。今天带来第三篇&#xff0c;FIR数字滤波器设计&#xff0c;包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于firls函数和remez函数的最优化方法设计FIR滤波器。话不多说&#xff0c;上…

一阶二阶数字滤波器笔记

数字滤波器 一阶数字滤波器时域分析频域分析数字化代码示例 二阶巴特沃斯低通滤波器S域和Z域的频率关系分析巴特沃斯滤波器举例说明代码示例 声明&#xff1a;感谢知乎大佬的文章&#xff0c;原文链接 数字滤波器实现方法是把滤波器所要完成的运算编成程序并让计算机执行,也就…

简单二阶滤波器截止频率的计算

最近刚好学习到这了&#xff0c;而我在网上查资料的时候却非常难找&#xff0c;不少资料讲解不够详细&#xff0c;所以经过我努力也为了为大家做点贡献的想法&#xff0c;以自己的见解写下这篇文章。废话不多说&#xff0c;先从一阶滤波器讲起。 一阶低通滤波器&#xff1a; …

如何确定插值滤波器的阶数

在信号处理中&#xff0c;滤波器的系数我们往往都是通过MATLAB来设计&#xff0c;只要我们知道滤波器的通带截止频率和阻带起始频率&#xff0c;就可以通过MATLAB中的fdatool&#xff08;在MATLAB2020中使用filterDesigner&#xff09;来设计滤波器了。 我们使用归一化的参数来…

标识符无效

表中存在该列&#xff0c;插入的时候却显示 标识符无效&#xff0c;使用dbsql插入报错&#xff0c;自己写入数据没有问题&#xff01; 查资料发现可能和列的大小写有关。这里强调sql一定用全大写来写避免不必要的麻烦&#xff01;但是我改过后发现并不是这个问题…… 问题已解…

ORA-00904 ID 标识符无效 解决方案

msg&#xff1a;"数据访问异常" dev&#xff1a;"ORA-00904&#xff1a;"ID"&#xff1a;标识符无效 ORA&#xff1a;即 Oracle 报错。 标识符无效是因为&#xff1a;SQL语句中&#xff0c;列名&#xff08;ID&#xff09;不在表中。解决方案&#x…

PLSQL ORA-00904 标识符无效

问题在于“COMPONET_ID” 是字符串&#xff0c;无法识别&#xff0c;如果不是字符串&#xff0c;就可以识别

Oracle标识符无效

Oracle在创建表的时候提示“ORA-00904&#xff1a;标识符无效” 原因为最后一行列定义多了一个逗号&#xff0c;去掉即可。

【Oracle相关】坑!使用oracle时,发生标识符无效解决办法

–真是个大坑 使用oracle时,发生标识符无效解决办法 一般出现该错误的原因&#xff1a; 1、列名写错导致 2、使用了关键字作为了列名 但是这次遇到的情况有点奇葩 通过dblink直接查询该表&#xff0c;并没有报出问题&#xff0c;但在存储过程中通过dblink访问就一直报标识符…

ORA-00904 标识符无效 解决方案

ORA&#xff1a;即Oracle报错。 标识符无效&#xff1a;SQL语句中&#xff0c;这个字段名不在表中。 解决方案&#xff1a;修改SQL语句中对应的字段或者修改表里面对应的列名。 在这里我想说一下&#xff0c;因为我用的是hibernate内部封装好的save方法&#xff0c;咱也不能去改…

HQL 标识符无效

这是报错 因为刚学HIbernate&#xff0c;很多小问题其实挺折磨人的 这是代码&#xff08;我根据网上搜索的答案还有自己的判断测试&#xff0c;感觉应该可能是字段没有" "的问题&#xff09; Configuration configuration new Configuration().configure();Session…

ORA-00904:标识符无效(太坑了!!)

ORA-00904:标识符无效 解决办法(Oracle字段名区分大小写的坑) 问题描述 我在使用jpa或者mybatis集成Oracle进行where查询的时候发现一直出现&#xff1a; java.sql.SQLSyntaxErrorException: ORA-00904: “USER0_”.“PWD”: 标识符无效 下面是问题代码&#xff1a; Testvoid…

Unity⭐️VideoPlayer

文章目录 &#x1f6a9; 解决安卓视频播放模糊 &#x1f6a9; 解决安卓视频播放模糊 1️⃣ 设置RawImage的size跟原视频一致 2️⃣ RawImage的抗锯齿Anti-Aliasing改为8 3️⃣ 勾选sRGB 4️⃣ 视频编码设为H264 大家还有什么问题&#xff0c;欢迎在下方留言&#xff01; 如…

ᑋᵉᑊᑊᵒ ᵕ̈ᰔᩚ

** ** 第一章 大数据概述 ** ** 1.大数据技术的产生 2.大数据的基本概念 什么是大数据&#xff1f; 定义&#xff1a;大数据是指无法在一定时间内用常规软件工具进行抓取&#xff0c;管理和处理的数据集合 经典案例&#xff1a; (1)啤酒与尿布 (2)谷歌与流感 大数据的范…

linux shell中 '' ``的区别

环境:ubuntu 10 符号:"" / / 相信很多linux初学者都会被这三个符号迷惑&#xff0c;我将用一个例子说明他们的区别 现在我按照替换执行灵活度排个序: &#xff1a;大笨蛋&#xff0c;你给他什么他就显示什么&#xff0c;不动脑子 " ":勉强吧&#xff…

【shell】``和$()作用与区别

和$()的作用 将一条命令的执行结果赋给一个变量&#xff0c;有两种方法 1、使用反引号 (数字键1左边的键&#xff0c;tab键上面&#xff0c;英文方式输入) 如&#xff1a;aecho "hello world"; 即将命令 echo "hello world"的输出赋给变量a 2、可以使用…

获取流媒体地址

流媒体地址大搜捕-网上视频“本地”看 http://www.sina.com.cn 2003/08/22 14:05 赛迪网--中国电脑教育报   文/巧克力   由于带宽的限制&#xff0c;要想流畅地观看网上视频节目&#xff0c;对于多数网友来说并不是件容易的事情。因此不少朋友选择了利用下载工具将这些流…

流媒体相关介绍

流媒体相关介绍 一、流媒体主要实现方式二、流媒体技术2.1 流媒体2.2 直播2.3 流协议2.3.1 HLS 协议2.3.2 RTMP 协议2.3.3 RTSP 协议2.3.4 MPEG-DASH2.3.5 WebRTC 协议 2.4 服务器端技术2.4.1 GStreamer2.4.2 Live5552.4.3 其它 三、HTML5媒体标签3.1 audio3.2 video3.3 canvas…