各种滤波算法的比较(GF、KF、EKF、UKF、PF)

目录

一、前言

二、滤波算法介绍

1、GF(高斯滤波)

2、KF(卡尔曼滤波)

3、EKF(可扩展卡尔曼滤波)

4、UKF(无迹卡尔曼滤波)

5、PF(粒子滤波)

三、不同滤波算法对比

四、不同滤波算法的表现

五、简单实现


一、前言

为了使基于RSSI/CSI等室内定位的结果更加地稳定,让滤波后的RSSI/CSI值更接近真实值,针对不同场景引入合适的滤波算法是很有必要的。当然文章并非只针对室内定位这个领域,其它领域,特别是信号或者通信领域,了解各种滤波算法也是非常重要的!

二、滤波算法介绍

1、GF(高斯滤波)

高斯滤波是一种根据高斯函数的形状来选择权值的线性平滑滤波器,它对抑制服从正态分布的噪声非常有效,从而达到平滑数据的目的。

2、KF(卡尔曼滤波)

卡尔曼滤波算法是一种抑制高斯噪声有效的最优化自回归数据处理算法,对于系统过程的滤波比较好,能够有效滤除信号发生的突变。并且对于变化快速、实时更新的线性系统有着非常好的寻优及滤波效果。

卡尔曼滤波原理的详细解释可参考下面文章:

CSI数据预处理之卡尔曼滤波、高斯滤波、简单平均-CSDN博客

3、EKF(可扩展卡尔曼滤波

扩展卡尔曼滤波器是对KF的改进衍生,它将非线性函数进行泰勒展开,然后省略高阶项,保留展开项的一阶项,以此来实现非线性函数线性化,最后通过卡尔曼滤波算法近似计算系统的状态估计值和方差估计值。

4、UKF(无迹卡尔曼滤波

无迹卡尔曼滤波算法也是对KF的改进衍生,它舍弃了EKF算法的线性化过程,采用无迹变换(Unscented Transform,UT)巧妙地避免了线性化所带来的误差,同时减少了算法的复杂度UKF不需要在每个实例中计算雅可比矩阵),克服了EKF算法的估计精度低、稳定性差的缺陷。

5、PF(粒子滤波

粒子滤波法是指通过寻找一组在状态空间传播的随机样本对概率密度函数进行近似,以样本均值代替积分运算,从而获得状态最小方差分布的过程。和其它非线性滤波方法相同,它也是一种次优的滤波方法

三、不同滤波算法对比

四、不同滤波算法的表现

五、简单实现

本文就是做一个简单实现,其中高斯滤波和卡尔曼滤波比较基础,就不再展示。首先,定义一个简单的非线性状态空间模型,例如一个带有噪声的一维运动模型:

% 非线性状态空间模型
A = 1;  % 状态转移矩阵
B = 0;  % 控制输入矩阵
H = 1;  % 观测矩阵
% 状态转移方程
f = @(x) A*x + B*randn;
% 观测方程
h = @(x) H*x + randn;

可扩展卡尔曼滤波:

% 初始状态和协方差
x0 = 0;
P0 = 1;
% EKF算法
x_EKF = zeros(1, 100);  % 存储估计状态
P_EKF = zeros(1, 100);  % 存储估计协方差
x_pred = x0;
P_pred = P0;
for k = 1:100% 预测步骤x_pred = f(x_pred);P_pred = A*P_pred*A';% 更新步骤K = P_pred*H'/(H*P_pred*H' + 1);z = h(x_pred);x_pred = x_pred + K*(z - H*x_pred);P_pred = (1 - K*H)*P_pred;x_EKF(k) = x_pred;P_EKF(k) = P_pred;
end

无迹卡尔曼滤波:

% UKF算法
x_UKF = zeros(1, 100);  % 存储估计状态
P_UKF = zeros(1, 100);  % 存储估计协方差
% 参数设置
alpha = 1e-3;
beta = 2;
kappa = 0;
% 初始化Sigma点
n = numel(x0);
lambda = alpha^2 * (n + kappa) - n;
weights = 1 / (2 * (n + lambda)) * ones(1, 2*n+1);
weights(1) = lambda / (n + lambda);
X = zeros(n, 2*n+1);
X(:,1) = x0;
P_sqrt = chol(P0, 'lower');
for i = 1:nX(:,i+1) = x0 + sqrt(n + lambda) * P_sqrt(:,i);X(:,n+i+1) = x0 - sqrt(n + lambda) * P_sqrt(:,i);
end
for k = 1:100% 预测步骤X_pred = zeros(size(X));for i = 1:2*n+1X_pred(:,i) = f(X(:,i));endx_pred = X_pred * weights';P_pred = zeros(size(P0));for i = 1:2*n+1P_pred = P_pred + weights(i) * (X_pred(:,i) - x_pred) * (X_pred(:,i) - x_pred)';end% 更新步骤Z = zeros(1, 2*n+1);for i = 1:2*n+1Z(i) = h(X_pred(:,i));endz_pred = Z * weights';Pzz = zeros(size(H*P_pred*H'));Pxz = zeros(size(P_pred));for i = 1:2*n+1Pzz = Pzz + weights(i) * (Z(i) - z_pred) * (Z(i) - z_pred)';Pxz = Pxz + weights(i) * (X_pred(:,i) - x_pred) * (Z(i) - z_pred)';endK = Pxz / Pzz;x_pred = x_pred + K * (h(x_pred) - z_pred);P_pred = P_pred - K * Pzz * K';x_UKF(k) = x_pred;P_UKF(k) = P_pred;
end

 粒子滤波:

% PF算法
x_PF = zeros(1, 100);  % 存储估计状态
P_PF = zeros(1, 100);  % 存储估计协方差
% 参数设置
num_particles = 1000;
% 初始化粒子
particles = randn(1, num_particles);
for k = 1:100% 预测步骤particles = f(particles);% 更新步骤weights_PF = exp(-(h(particles) - 1).^2 / (2 * 1^2));  % 高斯权重函数% 归一化权重weights_PF = weights_PF / sum(weights_PF);% 重采样indices = randsample(1:num_particles, num_particles, 'true', weights_PF);particles = particles(indices);% 估计状态和协方差x_PF(k) = mean(particles);P_PF(k) = var(particles);
end

生成符合高斯分布的状态和观测值:

% 生成符合高斯分布的状态和观测值
true_states = zeros(1, 100);
observations = zeros(1, 100);
true_states(1) = randn();  % 初始状态符合高斯分布
observations(1) = true_states(1) + 0.5*randn();  % 初始观测值加入噪声
for k = 2:100% 状态转移模型true_states(k) = 0.9 * true_states(k-1) + 0.1 * randn();% 观测模型observations(k) = true_states(k) + 0.5*randn(); % 添加观测噪声
end

三种滤波算法可视化:

% 画图
figure;
subplot(3,1,1);
plot(1:100, true_states, 'LineWidth', 1.2, 'DisplayName', 'True State');
hold on;
plot(1:100, x_EKF, 'LineWidth', 1.2, 'DisplayName', 'EKF');
title('Extended Kalman Filter (EKF)');
xlabel('Time step');
ylabel('State');
legend;
subplot(3,1,2);
plot(1:100, true_states, 'LineWidth', 1.2, 'DisplayName', 'True State');
hold on;
plot(1:100, x_UKF,  'LineWidth', 2, 'DisplayName', 'UKF');
title('Unscented Kalman Filter (UKF)');
xlabel('Time step');
ylabel('State');
legend;
subplot(3,1,3);
plot(1:100, true_states, 'LineWidth', 1.2, 'DisplayName', 'True State');
hold on;
plot(1:100, x_PF, 'LineWidth', 2, 'DisplayName', 'PF');
title('Particle Filter (PF)');
xlabel('Time step');
ylabel('State');
legend;

 效果:

博主的每篇博文都是用心去写的,喜欢的可以多多支持和收藏,创作不易,未经作者允许,请勿转载或者抄袭。因为抄袭风气盛行,故一些细节或者代码没有展示,敬请谅解,如有疑问,可以加入我们的室内定位大家庭!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows MYSQL下载和自定路径安装,以及解决中文乱码问题。

文章讲的很详细,请耐心往下看。 一、mysql下载 下载网址:https://www.mysql.com/downloads/ 表示不登录,直接下载。 以上就把安装包下载完了。下载是8.0.35版本。 二、接下来看怎么安装 1.双击安装包,进行安装。 注意&#x…

零容忍泄露:掌握上海迅软DLP企业加密系统的数据安全秘诀

由于企事业单位内部数据呈暴发式增长,且数据类型日益繁杂,企业对数据的安全管控难度也在不断增大。这其中包括研发的设计文档、代码、图纸,以及业务运营的详细收支情况、招商投标的详细信息等,这些涉及到企业核心数据资产的信息需…

情怀阿拉德【弑神大陆】linux服务端+双端+GM后台+详细搭建教程

搭建资源下载:情怀阿拉德【弑神大陆】linux服务端双端GM后台详细搭建教程-海盗空间

idea开发环境配置

idea重新安装后,配置的东西还挺多的,这里简单记录一下。 1、基础配置 1.1、主题、背景、主题字体大小 1.2、默认字体设置 控制台默认编码设置: 全局文件默认编码设置: 2、构建、编译、部署配置 说明:本地装了JD…

MPU6050姿态解算2-欧拉角旋转矩阵 -->相关推导

IMU姿态解算 IMU,即惯性测量单元,一般包含三轴陀螺仪与三轴加速度计。之前的文章 MPU6050姿态解算1-DMP方式已将对MPU6050这款IMU作了简单的介绍,并通过其内部的DMP处理单元直接得到姿态解算的四元数结果。本篇将通过软件解算的方式&#xff…

Vector Quantized Diffusion Model for Text-to-Image Synthesis

Vector Quantized Diffusion Model for Text-to-Image Synthesis Shuyang Gu, University of Science and Technology of China, Microsoft, CVPR2022, Cited: 340, Code, Paper 1. 前言 我们提出了用于文本到图像生成的矢量量化扩散(Vector Quantized Diffusion Model&…

由于找不到xinput1_3.dll,无法继续执行代码的多种解决方法指南,xinput1_3.dll文件修复

当玩家或用户在启动某些游戏和应用程序时,可能会遭遇到一个系统错误提示:“由于找不到xinput1_3.dll,无法继续执行代码l”。这种情况通常指出系统中DirectX组件存在问题。以下我们将介绍几种常用的解决方法,并提供详细的操作步骤。 一.找不到…

ROS 动态坐标变换

在ROS 中,坐标变换是一个重要的概念,因为它允许系统中的不同节点和模块以统一的方式描述物体的位置和方向。 动态坐标变换指的是当机器人或其环境中物体的位姿(位置和姿态)发生变化时,能够实时更新这些信息的过程。 …

【React Hooks】useReducer()

useReducer 的三个参数是可选的,默认就是initialState,如果在调用的时候传递第三个参数那么他就会改变为你传递的参数,实际开发不建议这样写。会增加代码的不可读性。 使用方法: 必须将 useReducer 的第一个参数(函数…

分享一个基础面试题---手写call

分享一个基础面试题---手写call 手写call笔记第一步第二步第三步 手写call笔记 call():在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。 let foo {value:1 }; function bar(){console.log(this.value); } bar.call(foo);//1注意两点&…

微信小程序开发之原生小程序开发和uniapp开发的区别,两种开发方式语法上的区别

目前小程序开发有两种形式,分别是原生小程序开发和使用uniapp开发, uniapp和小程序原生开发都有各自的优缺点,开发者可以根据具体需求选择合适的开发方式。 一、两者区别如下: 编程语言:uniapp使用Vue语法编写应用程序…

内测分发平台支持应用的异地容灾的重要性

大家好,我是咕噜-凯撒,随着网络社会的发展,人们对于应用程序的依赖程度越来越高。无论是企业用户还是个人用户,都希望能够随时随地访问到需要使用的应用。所以对于内测分发平台来说保证应用的连续性和可靠性是非常的关键。内侧分发…