常用滤波算法简介

1. 卡尔曼滤波(Kalman Filter)
算法定义与作用

一种动态系统状态估计算法,通过递归预测和观测修正,实时融合多源数据(如传感器输入),用于导航、机器人定位、金融预测等场景。

核心原理
  1. 预测阶段‌:
  • 基于系统模型(如运动方程)预测当前状态和协方差矩阵:

                x_k^- = Ax_{k-1}, P_k^- = AP_{k-1}A^T + Q
                (A为状态转移矩阵,Q为过程噪声协方差)

  1. 更新阶段‌:
    • 计算卡尔曼增益,融合预测值与观测值:
      K_k = (P_k^- H^ T) (H P_k^- H^ T + R)^{-1}
      x_k = x_k^- + K_k (z_k - Hx_k^-)
      (H为观测矩阵,R为观测噪声协方差)
历史演进与问题驱动
  • 问题起源(1960年阿波罗登月)‌:
    • 火箭振动导致惯性导航误差累积,传统方法无法实时修正。
  • 解决思路‌:
    • 引入协方差矩阵量化不确定性,动态调整传感器权重(高频陀螺仪 vs 低频星体追踪仪)。
  • 后续演进‌:
    • 扩展卡尔曼滤波(EKF)‌:解决非线性问题(无人机姿态估计)。
    • 无迹卡尔曼滤波(UKF)‌:通过Sigma点逼近非线性分布。
优缺点

| ✅ 实时性强,适合动态系统 | ❌ 依赖精确模型,非线性场景需改进 |


2. 中值滤波(Median Filter)
算法定义与作用

非线性滤波器,通过滑动窗口取中位数消除脉冲噪声(如椒盐噪声),保护图像边缘,广泛应用于工业质检、文档扫描。

核心原理
  • 对窗口内像素排序后取中间值:
    I'(x,y) =median\{ I(x+i,y+j) | i,j \in [-k,k] \}
  • 数学本质‌:中位数对极值不敏感,直接剔除孤立噪点。
历史演进与问题驱动
  • 问题起源(1985年汽车生产线)‌:
    • 电火花干扰导致摄像头图像出现白点,掩盖零件裂纹。
  • 解决思路‌:
    • 用排序取代平均,3×3窗口处理后裂纹检出率从70%提升至95%。
  • 后续演进‌:
    • 自适应中值滤波‌:动态调整窗口大小应对高密度噪声。
    • 混合滤波‌:中值+高斯滤波处理X光金属伪影。
优缺点

| ✅ 彻底消除脉冲噪声 | ❌ 对高斯噪声无效,大窗口模糊细节 |


3. 高斯滤波(Gaussian Filter)
算法定义与作用

线性平滑滤波器,通过高斯核卷积抑制高斯噪声(类似电视雪花),常用于图像预处理、手机夜景模式。

核心原理
  • 高斯核生成:
    G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2 + y^2}{2\sigma^2}}
  • 可分离卷积优化‌:将二维卷积分解为水平+垂直一维运算,计算量从O(k^ 2 )降至O(2k)
历史演进与问题驱动
  • 问题起源(2002年诺基亚7650手机)‌:
    • 暗光拍摄产生密集噪点,传统中值滤波无效。
  • 解决思路‌:
    • 用高斯核加权平滑,5×5核(σ=1.5)使噪点减少50%。
  • 后续演进‌:
    • 双边滤波‌:引入值域权重保护边缘。
    • 导向滤波‌:结合引导图像优化权重(HDR增强)。
优缺点

| ✅ 高效抑制高斯噪声 | ❌ 边缘模糊,丢失纹理细节 |


4. 维纳滤波(Wiener Filter)
算法定义与作用

频域滤波器,基于信号和噪声的统计特性实现最小均方误差(MMSE)估计,用于图像去模糊、语音降噪。

核心原理
  • 频域修正公式:
    H(u,v) =\frac{S_f(u,v)}{S_f(u,v) + S_n(u,v)}
    S_f为信号功率谱,S_n为噪声功率谱)
历史演进与问题驱动
  • 问题起源(1940年雷达信号处理)‌:
    • 雷达回波被大气噪声干扰,传统滤波无法恢复目标信号。
  • 解决思路‌:
    • 引入功率谱估计,在频域自适应抑制噪声。
  • 后续演进‌:
    • 自适应维纳滤波‌:实时更新噪声统计特性(如监控视频修复)。
优缺点

| ✅ 理论最优(MMSE准则) | ❌ 需已知噪声统计特性 |


5. 粒子滤波(Particle Filter)
算法定义与作用

基于蒙特卡洛采样的非线性/非高斯状态估计方法,用于目标跟踪(如自动驾驶多目标追踪)、金融波动预测。

核心原理
  1. 粒子采样‌:生成一组随机样本(粒子)表示状态分布。
  2. 权重更新‌:根据观测值调整粒子权重。
  3. 重采样‌:淘汰低权重粒子,复制高权重粒子。
历史演进与问题驱动
  • 问题起源(1993年机器人SLAM)‌:
    • 传统卡尔曼滤波无法处理非高斯噪声(如复杂环境中的定位)。
  • 解决思路‌:
    • 用粒子群逼近后验概率分布,实现非线性跟踪。
  • 后续演进‌:
    • Rao-Blackwellized粒子滤波‌:分离线性和非线性状态(如无人机同时定位与建图)。
优缺点

| ✅ 处理非线性/非高斯问题 | ❌ 计算量大,粒子退化问题 |


6. 引导滤波(Guided Filter)
算法定义与作用

基于引导图像的边缘保护滤波器,用于图像去雾、细节增强、联合上采样。

核心原理
  • 假设输出图像是引导图像的线性变换:
    q_i = a_k I_i + b_k \ \ \ \ (i \in \omega_k)
  • 最小化输出与输入图像的均方误差,得到局部线性系数a_k,b_k​。
历史演进与问题驱动
  • 问题起源(2013年图像去雾)‌:
    • 传统方法导致光晕伪影,边缘过渡不自然。
  • 解决思路‌:
    • 利用引导图像(如原图)保留结构信息,实现无光晕去雾。
  • 后续演进‌:
    • 快速引导滤波‌:通过下采样加速计算(移动端实时处理)。
优缺点

| ✅ 边缘保护强,计算高效 | ❌ 依赖引导图像质量 |


7. 形态学滤波(Morphological Filter)
算法定义与作用

基于几何结构分析的滤波器,通过腐蚀、膨胀等操作处理二值图像(如指纹增强、细胞分割)。

核心原理
  • 腐蚀(Erosion)‌:消除细小物体,平滑边界。
    A\ominus B = \{z | (B)_z \subseteq A \}
  • 膨胀(Dilation)‌:填充孔洞,连接断裂区域。
    A \bigoplus B = \{z | (B)_z \bigcap A \neq \phi \}
历史演进与问题驱动
  • 问题起源(1970年卫星地图处理)‌:
    • 山脉轮廓断裂,河流网络难以提取。
  • 解决思路‌:
    • 定义结构元素(如3×3十字形)进行形态学操作。
  • 后续演进‌:
    • 开运算(先腐蚀后膨胀)‌:去除小物体。
    • 闭运算(先膨胀后腐蚀)‌:填充小孔洞。
优缺点

| ✅ 处理二值图像高效 | ❌ 灰度图像需改进 |


滤波算法演进的核心逻辑

  1. 噪声类型驱动算法创新‌:

    • 高斯噪声 → 高斯滤波(1960s) → 维纳滤波(1940s) → 小波变换(1990s)
    • 脉冲噪声 → 中值滤波(1980s) → 自适应中值滤波(2000s)
    • 复杂噪声 → 粒子滤波(1990s) → 非局部均值(2010s) → 深度学习(2020s)
  2. 硬件进步推动落地‌:

    • 早期中值滤波(8位单片机) → 引导滤波(手机GPU) → 非局部均值(服务器GPU集群)
  3. 数学工具迭代‌:

    • 线性代数(卡尔曼滤波) → 概率统计(粒子滤波) → 几何拓扑(形态学滤波) → 深度学习(CNN去噪)

总结:滤波算法选择指南

场景推荐算法核心优势
自动驾驶多传感器融合卡尔曼滤波/粒子滤波动态系统建模,处理非线性噪声
工业零件裂纹检测中值滤波/形态学滤波消除脉冲噪声,增强几何结构
医学影像(CT/MRI)非局部均值/引导滤波保护纹理细节,抑制复杂噪声
语音信号降噪维纳滤波/小波变换频域局部化处理,保留语音特征
手机夜景拍摄高斯滤波/双边滤波平衡速度与效果,边缘自然过渡

终极建议‌:理解噪声特性(类型、分布、相关性)是选择滤波算法的第一原则,硬件资源(算力、内存)和实时性需求则是落地关键。

1、限幅滤波法(又称程序判断滤波法) A、方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差A,则本次值无效,放弃本次值,用上次值代替本次值 B、优点: 能有效克服因偶然因素引起的脉冲干扰 C、缺点 无法抑制那种周期性的干扰 平滑度差 2、中位值滤波法 A、方法: 连续采样N次(N取奇数) 把N次采样值按大小排列 取中间值为本次有效值 B、优点: 能有效克服因偶然因素引起的波动干扰 对温度、液位的变化缓慢的被测参数有良好的滤波效果 C、缺点: 对流量、速度等快速变化的参数不宜 3、算术平均滤波法 A、方法: 连续取N个采样值进行算术平均运算 N值较大时:信号平滑度较高,但灵敏度较低 N值较小时:信号平滑度较低,但灵敏度较高 N值的选取:一般流量,N=12;压力:N=4 B、优点: 适用于对一般具有随机干扰的信号进行滤波 这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动 C、缺点: 对于测量速度较慢或要求数据计算速度较快的实时控制不适用 比较浪费RAM 4、递推平均滤波法(又称滑动平均滤波法) A、方法: 把连续取N个采样值看成一个队列 队列的长度固定为N 每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则) 把队列中的N个数据进行算术平均运算,就可获得新的滤波结果 N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4 B、优点: 对周期性干扰有良好的抑制作用,平滑度高 适用于高频振荡的系统 C、缺点: 灵敏度低 对偶然出现的脉冲性干扰的抑制作用较差 不易消除由于脉冲干扰所引起的采样值偏差 不适用于脉冲干扰比较严重的场合 比较浪费RAM 5、中位值平均滤波法(又称防脉冲干扰平均滤波法) A、方法: 相当于“中位值滤波法”+“算术平均滤波法” 连续采样N个数据,去掉一个最大值和一个最小值 然后计算N-2个数据的算术平均值 N值的选取:3~14 B、优点: 融合了两种滤波法的优点 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差 C、缺点: 测量速度较慢,和算术平均滤波法一样 比较浪费RAM 6、限幅平均滤波法 A、方法: 相当于“限幅滤波法”+“递推平均滤波法” 每次采样到的新数据先进行限幅处理, 再送入队列进行递推平均滤波处理 B、优点: 融合了两种滤波法的优点 对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差 C、缺点: 比较浪费RAM 7、一阶滞后滤波法 A、方法: 取a=0~1 本次滤波结果=(1-a)*本次采样值+a*上次滤波结果 B、优点: 对周期性干扰具有良好的抑制作用 适用于波动频率较高的场合 C、缺点: 相位滞后,灵敏度低 滞后程度取决于a值大小 不能消除滤波频率高于采样频率的1/2的干扰信号 8、加权递推平均滤波法 A、方法: 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权 通常是,越接近现时刻的数据,权取得越大。 给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低 B、优点: 适用于有较大纯滞后时间常数的对象 和采样周期较短的系统 C、缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号 不能迅速反应系统当前所受干扰的严重程度,滤波效果差 9、消抖滤波法 A、方法: 设置一个滤波计数器 将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零 如果采样值当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出) 如果计数器溢出,则将本次值替换当前有效值,并清计数器 B、优点: 对于变化缓慢的被测参数有较好的滤波效果, 可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动 C、缺点: 对于快速变化的参数不宜 如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统 10、限幅消抖滤波法 A、方法: 相当于“限幅滤波法”+“消抖滤波法” 先限幅,后消抖 B、优点: 继承了“限幅”和“消抖”的优点 改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统 C、缺点: 对于快速变化的参数不宜
### 自适应滤波算法的实现原理 自适应滤波器的核心目标是动态调整其权重系数,使得输出尽可能接近期望信号。LMS(Least Mean Squares)算法作为最常用的自适应滤波算法之一,基于梯度下降法来优化误差平方和的目标函数[^1]。 #### 数学模型 假设输入信号为 \( x(n) \),期望响应为 \( d(n) \),则实际输出可表示为: \[ y(n) = w^T(n)x(n) \] 其中 \( w(n) \) 是当前时刻的权值向量。定义误差信号为: \[ e(n) = d(n) - y(n) \] LMS算法通过以下公式更新权值: \[ w(n+1) = w(n) + 2\mu e(n)x(n) \] 这里,\( \mu \) 表示步长参数,控制收敛速度与稳定性之间的平衡。 --- ### MATLAB中的实现方法 在MATLAB中可以通过内置函数 `adaptfilt.lms` 或者手动编写代码来实现LMS算法[^2]。以下是两种方式的具体说明: #### 使用MATLAB自带函数 MATLAB提供了专门用于LMS算法的工具箱支持。下面是一个简单的例子: ```matlab % 参数设置 N = 10; % 滤波器阶数 stepSize = 0.01; % 步长μ nIter = 1000; % 迭代次数 % 初始化 d = randn(1, nIter); % 随机期望信号 x = randn(N, nIter); % 输入信号矩阵 lmsFilter = adaptfilt.lms(N, stepSize); % 执行自适应滤波 [y, e, w] = filter(lmsFilter, x, d); ``` 上述代码利用了MATLAB的 `adaptfilt.lms` 函数创建了一个长度为10的LMS滤波器,并对其进行了训练。 #### 手动编写的LMS算法 如果希望更深入地理解其实现细节,则可以自己编写核心逻辑如下所示: ```matlab function [w, err] = lms_manual(x, d, N, mu) % 初始化变量 w = zeros(N, 1); % 初始权值设为零 X = buffer(x', N, 1); % 构造延迟线缓冲区 (每列代表一个窗口) L = size(X, 2); % 数据帧数量 err = zeros(L, 1); % 存储误差序列 for i = 1:L xi = X(:,i); % 当前输入样本 yi = w' * xi; % 计算输出 ei = d(i) - yi; % 更新误差 w = w + 2*mu*ei*xi; % 权重更新 err(i) = abs(ei); % 保存绝对误差 end end ``` 此版本允许用户完全掌控每一部分操作过程并观察中间状态变化情况。 --- ### RLS算法简介及其Python实现 除了LMS之外,还有另一种高效的自适应滤波方案——RLS(Recursive Least Squares)。它通过对协方差矩阵进行递推估计从而获得更高的精度。下面是该算法的一个基本框架[^3]: ```python import numpy as np def rls_filter(x, d, delta=0.9, lamda=0.98): """ :param x: 输入信号数组 :param d: 期望响应数组 :param delta: P初始值缩放因子 :param lamda: 忘却因子 """ M = len(x[0]) # 滤波器阶数 I = np.eye(M) # 单位阵 w = np.zeros((M,)) # 初始化权值向量 P = delta ** (-2)*I # 初始化P矩阵 errors = [] for k in range(len(d)): u = x[k].reshape(-1, 1) # 当前输入样例转置成列向量形式 v = np.dot(P,u)/(lamda + np.dot(np.dot(u.T,P),u)) f = np.squeeze(v.flatten()) # Kalman增益计算结果简化表达 e_k = d[k]-np.inner(w,x[k]) # 输出预测残差e(k)=d(k)-y^(k) w += f*e_k # 调整后的新的权值矢量W(k+1) P = (P-lamda*np.outer(f,v))/lamda # 更新P矩阵完成一次循环迭代运算 errors.append(abs(e_k)) return w,np.array(errors) ``` 这段程序实现了标准型RLS算法,能够快速追踪时间域内的非平稳特性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墨顿

唵嘛呢叭咪吽

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值