各种滤波算法的比较(GF、KF、EKF、UKF、PF),内附简单实现代码

news2024/11/24 8:25:49

目录

一、前言

二、滤波算法介绍

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:n
    X(:,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+1
        X_pred(:,i) = f(X(:,i));
    end
    x_pred = X_pred * weights';
    P_pred = zeros(size(P0));
    for i = 1:2*n+1
        P_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+1
        Z(i) = h(X_pred(:,i));
    end
    z_pred = Z * weights';
    Pzz = zeros(size(H*P_pred*H'));
    Pxz = zeros(size(P_pred));
    for i = 1:2*n+1
        Pzz = Pzz + weights(i) * (Z(i) - z_pred) * (Z(i) - z_pred)';
        Pxz = Pxz + weights(i) * (X_pred(:,i) - x_pred) * (Z(i) - z_pred)';
    end
    K = 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.coloradmin.cn/o/1292731.html

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

相关文章

zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程

1.前言 我的zabbix的版本是5.0版本,5.0的官方文档没有使用bash接收器的示例,6.0的官方文档有使用bash接收器的示例,但是,下载文件的链接失效?! 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

Day04 Liunx高级系统设计4-信号

进程间通讯 引入 如何将 A 进程中的数据传入 B 进程呢 ? 我们要使用进程间通讯 概述 中文名 : 进程间通讯 英文名 :IPC 英文全称 :Inter Processes Communication 作用: 数据传输:一个进程需要将他的数据发送给另一个进程】 资源共享:多个进程可以…

排序:直接选择排序

直接选择排序: 本质: 直接选择排序的本质就是在数组中进行遍历挑选出最大的元素,讲最大的元素放到对应的位置后,再次选出次大的位置,而后又放到对应的位置..........................直到数组成为一个有序序列。 优…

二叉树的层平均值[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,1…

解决:AttributeError: module ‘copy’ has no attribute ‘copy’

解决:AttributeError: module ‘copy’ has no attribute ‘copy’ 文章目录 解决:AttributeError: module copy has no attribute copy背景报错问题报错翻译报错位置代码报错原因解决方法方法一方法二方法三今天的分享就到此结束了 背景 在使用之前的代…

C语言指针详解上

1 野指针 int main01(){//野指针就是没有初始化的指针,指针的指向是随机的,不可以 操作野指针//int a 0;//指针p保存的地址一定是定义过的(向系统申请过的)int *p;//野指针*p 200;printf("%d\n",*p);system("pause");return 0;}2 空指针 空指针的作用…

Unity 关于Ray、RaycastHit、Raycast及其使用

Unity中,我们要进行物理模拟和碰撞检测时,有三个重要的概念Ray、RaycastHit、Raycast。 其中,Ray可以理解为射线,它是一条从起点沿着特定方向延伸的无限长线段。 它的语法是: Ray(Vector3 origin, Vector3 directio…

使用阿里巴巴同步工具DataX实现Mysql与ElasticSearch(ES)数据同步

一、Linux环境要求 二、准备工作 2.1 Linux安装jdk 2.2 linux安装python 2.3 下载DataX: 三、DataX压缩包导入,解压缩 四、编写同步Job 五、执行Job 六、定时更新 6.1 创建定时任务 6.2 提交定时任务 6.3 查看定时任务 七、增量更新思路 一、Linux环境要…

el-table操作栏按钮过多 增加展开/收起功能

是的 如图所示有那么一条数据 列表操作栏的按钮七八个 小屏笔记本啥数据项也别看了 就剩下个固定列大刺刺的占着整个页面 解决方法&#xff1a; <el-table-column :width"tableToggle ? 600 : 300" label"操作栏" align"center" header-ali…

类和对象,this指针

一、类的引入&#xff1a; 如下&#xff0c;在C中&#xff0c;我们可以在结构体中定义函数&#xff0c;如下&#xff0c;之前我们学习C中中一直是在结构体中定义变量。 struct student{void studentinfo(const char* name,const char* gener,int age){ strcpy(_name,name);st…

前端css面试题(四)

文章目录 对一些 CSS 默认值的考察css选择器说一下z-indexz-index的值大的dom一定能覆盖z-index值小的dom吗如果一个第三方组件的z-index与我们现有业务的页面有冲突&#xff0c;怎么处理关于浮动元素样式引入权重问题链接引入&#xff08;Link&#xff09;和 import注入的区别…

理解输出电压纹波和噪声:来源与抑制

医疗设备、测试测量仪器等很多应用对电源的纹波和噪声极其敏感。理解输出电压纹波和噪声的产生机制以及测量技术是优化改进电路性能的基础。 1&#xff1a;输出电压纹波 以Buck电路为例&#xff0c;由于寄生参数的影响&#xff0c;实际Buck电路的输出电压并非是稳定干净的直流…

【wvp】测试记录

ffmpeg 这是个莫名其妙的报错&#xff0c;通过排查&#xff0c;应该是zlm哪个进程引起的 会议室的性能 网络IO也就20M

【分布式微服务专题】从单体到分布式(二、SpringCloud整合Nacos)

目录 前言阅读对象阅读导航前置知识笔记正文一、下载安装二、项目整合2.1 服务注册与发现2.2 动态配置管理 三、其他实验四、服务之间的调用 学习总结感谢 前言 本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现&#xff0c;以及分布式配置管理。关于Nacos&a…

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

测试文档---消息驿站

文章目录 项目背景测试计划服务器模块设计测试用例进行单元测试/黑盒测试 客户端模块设计测试用例进行单元测试/黑盒测试 转发规则模块设计测试用例进行单元测试/黑盒测试 测试总结 项目背景 在高并发量的情况下&#xff0c;针对某一台服务器的访问量激增就可能导致该服务器“…

关于最长上升子序列的动态规划问题的优化算法(二分搜索)

最长递增子序列 暴力解法&#xff1a; 思路&#xff1a;使用动态规划的思想&#xff0c;判断当前元素之前的所有元素&#xff0c;如果比当前元素小&#xff0c;则修改当前元素的最长递增子序列&#xff08;需判断是否需要修改&#xff09;。 时间复杂度&#xff1a;O(n^2) im…

leetcode做题笔记1466. 重新规划路线

n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况。 路…

C#winform根据选择的Excel文件在数据库中创建数据表

C#winform根据选择的Excel文件在数据库中创建数据表 需求&#xff1a;根据选择的Excel文件在数据库中创建数据表&#xff1b;可以实现特殊字段&#xff08;比如字段中含有数字、下划线、特殊字符等&#xff09;以及表名创建 C#实现 using System; using System.Data; using S…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…