网站开发 附加协议,wordpress 后台搜索,装潢设计专业就业前景,山西 旅游 英文 网站建设目录
一、前言
二、滤波算法介绍
1、GF#xff08;高斯滤波#xff09;
2、KF#xff08;卡尔曼滤波#xff09;
3、EKF#xff08;可扩展卡尔曼滤波#xff09;
4、UKF#xff08;无迹卡尔曼滤波#xff09;
5、PF#xff08;粒子滤波#xff09;
三、不同滤…目录
一、前言
二、滤波算法介绍
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 TransformUT巧妙地避免了线性化所带来的误差同时减少了算法的复杂度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*n1);
weights(1) lambda / (n lambda);
X zeros(n, 2*n1);
X(:,1) x0;
P_sqrt chol(P0, lower);
for i 1:nX(:,i1) x0 sqrt(n lambda) * P_sqrt(:,i);X(:,ni1) x0 - sqrt(n lambda) * P_sqrt(:,i);
end
for k 1:100% 预测步骤X_pred zeros(size(X));for i 1:2*n1X_pred(:,i) f(X(:,i));endx_pred X_pred * weights;P_pred zeros(size(P0));for i 1:2*n1P_pred P_pred weights(i) * (X_pred(:,i) - x_pred) * (X_pred(:,i) - x_pred);end% 更新步骤Z zeros(1, 2*n1);for i 1:2*n1Z(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*n1Pzz 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;效果 博主的每篇博文都是用心去写的喜欢的可以多多支持和收藏创作不易未经作者允许请勿转载或者抄袭。因为抄袭风气盛行故一些细节或者代码没有展示敬请谅解如有疑问可以加入我们的室内定位大家庭