【20210728】【信号处理】Alpha-Beta滤波——一种状态估计的方法

一、背景

        目前较为熟悉的状态估计方法有:卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波、粒子滤波、交互式多模型粒子滤波算法,工作中遇到一个杂波估计方法,使用了 α 滤波,一时感到陌生,所以记录了这篇学习笔记。

        卡尔曼滤波算法分为预测、更新两步,有五大公式,我常参考:卡尔曼滤波五个公式各个参数的意义

        卡尔曼滤波只适用于线性、高斯系统。扩展卡尔曼滤波、无迹卡尔曼滤波旨在解决 KF 算法不能用在非线性系统中的问题。粒子滤波算法没有系统限制,可以适用于任何系统。

        EKF 算法是对系统动态方程进行一阶泰勒展开,并保留一阶项,这样就实现了非线性到线性的转变。EKF 算法需要计算动态方程转移函数的雅可比矩阵,计算较复杂;

        UKF 算法是对一系列离散点进行无迹变换,再将样本点带入到状态方程、观测方程,以此实现非线性到线性的转换;

        PF 算法首先在检测空间中随即撒点,基于后验分布对粒子的权重进行动态调整,所有粒子的加权和是最终的状态估计结果。

        (参考:KF与无迹卡尔曼滤波详解

        (参考:概率机器人——扩展卡尔曼滤波、无迹卡尔曼滤波


二、α-β 滤波

        (参考:alpha-beta filter αβ滤波器

1. α-β 滤波

        α-β 滤波也是一种用于状态估计、数据平滑的滤波器,相较于 KF 算法,α-β 滤波最突出的优势是它不依赖于系统的具体模型,因此使用起来更加简单。α-β 滤波最大的缺点是滤波性能十分依赖于α、β 参数。好在,α-β 滤波的稳定性比较好,虽然有时得不到很好的滤波效果,但是不至于导致发散。

        α、β 参数需要花一定的时间调试, α、β 参数越大,滤波会更快,但噪声也会增大; α、β 参数越小,滤波后的值更平滑,但更耗时。为了保证系统的稳定性, α、β 参数的值必须是一个正值且很小,一般情况下满足下式:

 滤波步骤:

        假设一个二阶状态模型,例如进行匀速直线运动的车辆的速度 v,位置 p,观测与一阶对应,即位置 p。那么,小车的状态方程是:

        测量值和预测值之间的残差(或新息)为:

         α-β 滤波选定 α、β 参数,使用残差 r 的 α 倍来校正位置估计,使用残差 r 的 β/T 倍来校正速度估计。其中,  β/T 是归一化后的  β,即:

         这样理解:可以将上述的校正视为沿着梯度下降方向调整的一小步,随着不断调整,误差会逐渐减小。

        滤波参数的选择:使用下式计算 α、β 参数,会使误差的方差最小化。

   2. 滤波器的其他变种 —— α 滤波

        α 滤波器只有一个状态量:

        最优参数为:

以下是一个简单的无迹卡尔曼滤波的 Matlab 程序: ```matlab % 状态转移矩阵 F = [1 1; 0 1]; % 测量矩阵 H = [1 0]; % 过程噪声协方差矩阵 Q = [0.1 0; 0 0.1]; % 测量噪声协方差矩阵 R = 1; % 初始状态和协方差矩阵 x_0 = [0; 0]; P_0 = [1 0; 0 1]; % 生成随机数种子 rng(0); % 生成状态和测量噪声 v = mvnrnd([0 0], Q, 100); w = mvnrnd(0, R, 100); % 生成模拟数据 x = zeros(2, 100); y = zeros(1, 100); x(:, 1) = x_0; y(1) = H * x_0 + w(1); for k = 2:100 x(:, k) = F * x(:, k-1) + v(k, :)'; y(k) = H * x(:, k) + w(k); end % 无迹卡尔曼滤波 n = 2; m = 1; alpha = 1e-3; beta = 2; kappa = 0; lambda = alpha^2 * (n + kappa) - n; c = n + lambda; W_m = [lambda/c 0.5/c*ones(1,2*n)]; W_c = W_m; W_c(1) = W_c(1) + (1 - alpha^2 + beta); X = zeros(n, 2*n+1); Y = zeros(m, 2*n+1); X(:, 1) = x_0; P = P_0; for k = 2:100 % 预测 X_ = F * X; P_ = F * P * F' + Q; % 采样 X_s = chol(P_,'lower') * [zeros(n,1) sqrt(c)*eye(n) -sqrt(c)*eye(n)]; X_s = X_s + X_*ones(1,2*n+1); % 加权平均 X_m = X_s * W_m'; P_m = zeros(n, n); for j = 1:2*n+1 P_m = P_m + W_c(j) * (X_s(:,j)-X_m)*(X_s(:,j)-X_m)'; end P_m = P_m + R; % 更新 K = P_m * H' / (H * P_m * H' + R); X = X_m + K * (y(k) - H * X_m); P = P_m - K * H * P_m; end % 画图 t = 1:100; figure; plot(t, x(1,:), 'b', t, X(1,:), 'r'); xlabel('时间'); ylabel('状态'); legend('真实状态', '估计状态'); ``` 程序中使用了一个一维的状态和一个一维的测量,状态转移矩阵 `F` 是一个 $2 \times 2$ 的矩阵,其中第一行表示状态的位置和速度,第二行表示状态的速度。测量矩阵 `H` 是一个 $1 \times 2$ 的矩阵,表示测量结果只包含状态的位置信息。 程序中使用了一个随机数种子,以便多次运行程序时生成相同的随机数序列。程序首先生成状态和测量噪声,然后生成模拟数据。接下来使用无迹卡尔曼滤波对模拟数据进行估计,并将真实状态和估计状态画在同一个图中进行比较。 关于卡尔曼滤波原理及应用,可以参考《统计信号处理》一书。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值