news 2026/10/6 4:10:34

贝叶斯滤波与随机过程:从卡尔曼滤波推导到工程避坑指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
贝叶斯滤波与随机过程:从卡尔曼滤波推导到工程避坑指南

简介:面向大数据与信号处理方向学习者的PDF讲义,聚焦贝叶斯滤波与随机过程的数学原理,系统讲解贝叶斯公式如何从先验概率与似然函数推导后验分布,并与卡尔曼滤波进行对比分析。资源为单个PDF文件,压缩包大小16.25MB,内容包含离散与连续随机变量的贝叶斯公式推导、状态空间模型下的预测步与更新步递推,以及随机游走、观测噪声等概念的可视化讲解。已有447人学习下载,适合机器学习初学者或需要夯实滤波理论基础的工程师。从节选内容看,讲义以手写笔记形式呈现,覆盖先验/后验概率、似然函数、边缘密度积分等关键步骤,并讨论了贝叶斯滤波处理非线性系统与非高斯分布的优势,以及卡尔曼滤波在线性高斯假设下的实时性特点,能帮助读者系统建立贝叶斯视角下的状态估计框架。

1. 贝叶斯滤波、随机过程与贝叶斯公式:为什么你的传感器数据从来不直接说真话

做目标跟踪或传感器融合的同行,一定有过这种经历:车载雷达、IMU 或相机输出的曲线看起来挺光滑,可真要直接拿原始观测当状态,结果往往是毛刺满天飞,严重时干脆发散。贝叶斯滤波恰恰是解决这类问题的框架——它是一族把“随机过程”对状态演化的建模和“贝叶斯公式”对观测的修正揉在一起的递归估计算法。卡尔曼滤波、扩展卡尔曼、粒子滤波,本质都是它在不同条件下的孩子。这篇文章要把三件事讲透:这三个数学零件是怎么接力工作的、怎么从随机过程建模一路写出能跑的滤波代码、以及工程落地时那些让滤波器当场翻车的细节。适合正在做定位、目标跟踪、SLAM、惯导融合的从业者,也适合考研刚上岸、想把滤波原理真正落到代码里的学生。

2. 贝叶斯公式:状态估计问题里的概率引擎到底怎么转

把贝叶斯滤波拆到最低层,其实只剩下一个动作:每来一次观测,就把“先验概率”更新成“后验概率”。这里的先验不来自拍脑袋,而来自随机过程对未来状态的预测;这里的似然不来自理想模型,而来自传感器噪声的真实特性。这一章先把贝叶斯公式在滤波中的写法展开,再讲它为什么能在一帧一帧的观测里递归运转,最后落到一个关键认识——卡尔曼滤波并不是另一套方法,它就是贝叶斯公式在线性高斯条件下的精确解。

2.1 把滤波目标写成条件概率:p(x_k | z_1...z_k) 到底在算什么

假设你在跟踪一辆直线行驶的车,状态 x_k 包含位置和速度两个量;传感器每一帧只给出一个带噪声的位置读数 z_k。你现在手里有从第 1 帧到第 k 帧的全部观测 z_1, z_2, …, z_k,真正想知道的是后验分布 p(x_k | z_{1:k})——在给定所有观测的情况下,目标状态最可能在哪。

直接用贝叶斯公式把它改写:

p(x_k | z_{1:k}) = p(z_k | x_k) * p(x_k | z_{1:k-1}) / p(z_k | z_{1:k-1})

这一条式子就是整个滤波的引擎。拆开看,每一项都有具体的工程含义:

  • p(x_k | z_{1:k-1}) 是“先验分布”,意思是还没看到这一帧观测前,按照随机过程模型猜出来的状态分布;
  • p(z_k | x_k) 是“似然”,由传感器噪声模型给出,描述“如果状态真是 x_k,那采到这个观测有多大概率”;
  • 分母 p(z_k | z_{1:k-1}) 是归一化常数,在卡尔曼滤波的线性高斯框架里它只是一个标量,不参与状态估计的结果,所以很多实现里根本不显式算它。

这里的关键认知是:这个公式和你在概率论课上背过的 p(A|B)=p(B|A)p(A)/p(B) 没有任何区别,只不过 A 换成了目标状态,B 换成了传感器观测。而那个 p(A),恰恰是上一轮滤波结果再经过随机过程外推得到的。

很多初学者写滤波代码,喜欢直接背卡尔曼的五条公式,却不知道它们各自对应贝叶斯公式里的哪一项。一旦滤波发散,只能对着 Q 和 R 瞎试,越调越乱。先把这一节的关系刻在脑子里,后面所有代码中的矩阵操作都能对号入座。

2.2 预测步和更新步:贝叶斯滤波的递推骨架

贝叶斯滤波之所以叫“滤波”,是因为它把上面那条贝叶斯公式拆成两步,并在每一帧观测到达时循环执行。

预测步(先验传播): p(x_k | z_{1:k-1}) = ∫ p(x_k | x_{k-1}) * p(x_{k-1} | z_{1:k-1}) dx_{k-1}

这一步负责的是“状态在时间上往前推一步”。p(x_k | x_{k-1}) 来自随机过程提供的状态转移模型,它描述的是从上一时刻状态到当前时刻状态的随机演化规则。你把上一帧的后验分布喂进去,输出的就是当前帧的先验分布。

更新步(观测修正): p(x_k | z_{1:k}) = p(z_k | x_k) * p(x_k | z_{1:k-1}) / p(z_k | z_{1:k-1})

这一步负责把新到的观测 z_k 揉进先验里,得到这一帧的后验分布。然后 k 变成 k+1,这个后验又会被当作下一帧预测步的输入,如此周而复始。

所以“贝叶斯滤波”这个名字,本质就是“反复用贝叶斯公式做递推更新”的缩写。不管你是写卡尔曼滤波还是粒子滤波,不管你是解析求解还是用蒙特卡洛近似,跑的都是这两段结构。区别只是在“用什么形式表达分布”和“用什么数学工具做那个积分”上。

这个视角很重要,因为当你碰到一个看起来高端的问题,比如非线性系统、非高斯噪声,先别慌——你先确认自己能不能写出预测步里的积分、更新步里的似然,能写出来,剩下的只是选数值近似手段的问题。

2.3 线性高斯假设:卡尔曼滤波为什么是贝叶斯公式的精确解

上一节那个积分,在高斯分布里是有闭式解的。条件有三条:

  • 状态转移是线性的:x_k = F * x_{k-1} + w_k,其中 w_k 是高斯噪声;
  • 观测模型是线性的:z_k = H * x_k + v_k,其中 v_k 是高斯噪声;
  • 过程噪声 w_k 与观测噪声 v_k 互不相关。

在这三个条件下,高斯分布经过线性变换依然是高斯分布,乘上另一个高斯似然也依然是高斯分布。于是整个滤波过程中,每个时刻的后验都只需要均值向量和协方差矩阵两个量就能完整描述。贝叶斯公式中的积分变成矩阵乘法,归一化常数变成一个可以忽略的标量,最后得到的就是卡尔曼滤波那五条公式。

注意这句话:卡尔曼滤波不是“另一种滤波方法”,它就是贝叶斯滤波在线性高斯条件下的精确结果,没有做任何近似。如果你从贝叶斯公式出发,手动用高斯分布代入推导,最后得到的矩阵递推和卡尔曼滤波完全一致。

这个结论解释了一个常见的困惑:为什么有些系统明明是非线性的,却非要把模型线性化了用卡尔曼滤波?因为只有在线性高斯下才能白嫖这个精确解。一旦模型非线性,你就得走 EKF 的雅可比线性化或者粒子滤波的数值采样,误差和计算量都上去了。后面第四章会专门讲这个权衡。

3. 随机过程:怎么把“状态接下来怎么动”写成可计算的矩阵

如果说贝叶斯公式是滤波的心脏,那随机过程就是给心脏供血的血管。贝叶斯公式解决了“看到观测后怎么修正”,但它完全没告诉你“观测没来之前,状态应该往哪儿猜”。这个先验外推,是随机过程的活。这一章从工程建模的角度,把随机过程在滤波里的角色拆开:先讲马尔可夫假设为什么是滤波的基石,再讲状态转移矩阵和过程噪声矩阵分别控制什么,最后讲为什么高斯随机过程在工程里这么“扛造”。

3.1 一阶马尔可夫假设:滤波器为什么只需要“上一帧”的信息

现实运动轨迹当然复杂:行人有走走停停,车辆有加减速,无人机有急转弯。要想精确建模每一帧的动态,几乎不可能,也没有必要。贝叶斯滤波背后最核心的假设是:当前状态的条件分布只取决于上一时刻的状态,与更早的历史无关。写成公式就是:

p(x_k | x_{k-1}, x_{k-2}, ..., x_0) = p(x_k | x_{k-1})

这就是一阶马尔可夫假设。在随机过程的语言里,这对应连续状态空间上的马尔可夫链。它是个工程妥协,但也是极大简化:我们可以把整个运动历史压缩成“上一帧状态”这一个变量,预测步只需要做一步转移计算。

代价也很明显:如果目标运动带强机动,比如突然大幅转弯,一阶假设会让滤波器出现系统性滞后,状态估计总是慢半拍。遇到这种情况,较真的做法不是把马尔可夫阶次提到二阶、三阶,而是在状态空间里显式建模机动模态,比如把“加速度”加进状态变量里,或者用交互多模型算法并行跑几个不同运动模型的滤波器,再用概率加权融合输出。这是随机过程建模层面的取舍,不是贝叶斯公式能帮你修正的。

3.2 状态转移矩阵和过程噪声矩阵:随机过程的两个旋钮

一旦认定状态满足一阶马尔可夫,下一步是把“一步转移”写成一个确定性部分加一个随机部分。最常用的是高斯线性模型:

x_k = F * x_{k-1} + w_k

这里的 F 就是状态转移矩阵。它描述在没有随机扰动时,状态如何演化的均值部分。w_k 是零均值高斯随机向量,它的协方差矩阵记为 Q,称为过程噪声矩阵,刻画状态演化中所有没法用模型预测的部分——路面颠簸、空气扰动、转向带来的侧向滑移、发动机推力波动,全都在这一项里吸收。

这两个矩阵不是凭空拍出来的,而是从运动学或动力学模型推出来的。拿最常用的恒速模型举例。设状态向量为 x = [p, v],p 是位置、v 是速度,采样间隔为 dt。如果完全没有扰动,下一时刻位置是 p + dt*v,速度不变:

F = [[1, dt], [0, 1]]

这里每一步计算都很直观。真正容易迷糊的是 Q 的推导。工程上常用“连续白噪声加速度模型”来做离散化:假设加速度是零均值白噪声,功率谱密度为 q,则速度是带噪积分、位置是二次积分。按采样间隔 dt 离散化后:

Q = q * [[dt³/3, dt²/2], [dt²/2, dt]]

注意这个矩阵不是随便填的。右上角的 dt²/2 对应速度噪声对位置的耦合项——因为位置是速度的积分,速度上的一点噪声会按 dt 比例累积到位置上。如果把这个交叉项写成 0,你会丢掉状态量之间的相关性信息,滤波性能明显变差。

参数 q 的物理单位是“加速度噪声的功率谱密度”,工程上你可以先按实际场景里最大加速度变化的方差去估一个量级,再结合观测数据微调。它的数值大小直接决定滤波器对观测的信任程度:q 越大,预测越“虚”,滤波越偏向观测;q 越小,模型越自信,滤波越倾向把观测当噪声滤掉。

3.3 从白噪声到布朗运动:为什么高斯假设这么“扛造”

应用随机过程教材里有一个非常经典的推导脉络:白噪声经过单次积分得到布朗运动,布朗运动的差分对应离散随机游走,而位置加速度的状态模型,相当于是对白噪声做了两次积分。你在滤波器里用的 F 和 Q,本质上是把这条连续时间随机过程按采样周期离散化后的结果。

我刚接触滤波时,读 Sheldon Ross 那本《应用随机过程导论》时最大的体会是:高斯随机过程被用得这么普遍,不单纯因为数学上好处理,而是真实传感器噪声和大量未被建模的扰动,在中心极限定理意义上,就是一堆独立小扰动叠加出来的,近似高斯往往站得住。工程里最常见的非高斯场景,一般是传感器出现粗大误差或数据跳变,那已经不属于 Q 能表达的范畴,得在前面接一个异常值检测模块。

所以随机过程从来不是一个可以跳过的“数学前置课”,它就是滤波模型里决定先验分布长什么样的那一环。模型定错了,贝叶斯公式再正确也没有办法补救——后验是从先验修正来的,先验错到离谱,后验只会跟着错。

4. 贝叶斯滤波落地:用卡尔曼滤波跑通一个最小目标跟踪

前面的理论铺垫现在有了用处。这一章直接落地:用 Python 写一个一维匀速目标跟踪的卡尔曼滤波器,代码控制在几十行以内,跑完你就能在终端里看到滤波输出和真值的对比。然后再从这个最小实现出发,讲清 Q、R、P 三个矩阵各自控制什么、改错了会是什么后果,最后把视野拉开到非线性场景,说明 EKF 和粒子滤波和这是同一个贝叶斯公式的不同近似路线。

4.1 最小算例:CV 模型的目标跟踪代码

以下代码生成一条带过程噪声的匀速直线运动轨迹,叠加高斯观测噪声,再用卡尔曼滤波做状态估计。复制到本地直接就能跑。

import numpy as np # 状态向量: [位置, 速度] dt = 0.1 # 采样间隔,秒 F = np.array([[1.0, dt], [0.0, 1.0]]) # 恒速模型的状态转移矩阵 H = np.array([[1.0, 0.0]]) # 观测矩阵:只测位置 q = 0.5 # 过程噪声功率谱密度 Q = q * np.array([[dt**3 / 3, dt**2 / 2], [dt**2 / 2, dt]]) # 离散化过程噪声矩阵 R = np.array([[0.3]]) # 位置观测噪声方差 np.random.seed(0) steps = 200 # 1. 生成“真实轨迹”和观测序列 x_true = np.zeros((2, steps)) x_true[0, 0] = 0.0 x_true[1, 0] = 1.0 # 初始位置 0m,速度 1m/s for k in range(1, steps): w = np.random.multivariate_normal([0, 0], Q) x_true[:, k] = F @ x_true[:, k-1] + w # 2. 运行卡尔曼滤波 x = np.array([0.0, 1.0]) # 初始状态估计 P = np.eye(2) * 1.0 # 初始协方差矩阵 x_est = np.zeros((2, steps)) for k in range(steps): z = H @ x_true[:, k] + np.random.normal(0, np.sqrt(R[0, 0])) # 预测步 x = F @ x P = F @ P @ F.T + Q # 更新步 y = z - (H @ x)[0] # 新息(innovation) S = (H @ P @ H.T)[0, 0] + R[0, 0] # 新息方差 K = (P @ H.T) / S # 卡尔曼增益,shape (2,) x = x + K * y P = (np.eye(2) - np.outer(K, H[0])) @ P x_est[:, k] = x.copy() # 3. 对比几个时刻的真值与估计值 for k in [0, 50, 100, 150, 199]: print(f"t={k*dt:.1f}s 真值位置={x_true[0, k]:.3f} 估计位置={x_est[0, k]:.3f} 真值速度={x_true[1, k]:.3f} 估计速度={x_est[1, k]:.3f}")

这段代码的逻辑分成三块。第一块生成真值轨迹:每一步用 F 做确定性外推,再加一个由 Q 决定的高斯扰动,这模拟的就是随机过程模型中的“过程噪声”。第二块是滤波主循环,顺序严格执行“预测步 → 更新步”。第三块只是打印对比,方便你直观看到滤波结果。

卡尔曼增益 K 是这段代码里最值得盯住的一个量。它表示“预测值和观测值之间差距有多少比例要分给状态修正”。当观测噪声 R 远大于过程噪声 Q 时,K 变小,滤波更信任预测;反过来当 Q 远大于 R 时,K 趋近于 1,滤波几乎直接采信观测。你不需要手动去调 K,它是由 Q、R、P 层层计算出来的,但如果你发现滤波行为异常,先看 K 的数值——它往往会告诉你问题出在谁的头上。

4.2 核心参数 Q、R、P:三个旋钮各自的职责和调法

滤波器的参数配置,本质上就是选三个矩阵:Q、R、P。很多人把它们混在一起瞎调,其实分工非常明确。

R 是“传感器属性”。它描述观测噪声的方差,应该通过标定得到,而不是拍脑袋。常见做法是让传感器静止采集一段数据,算样本方差,那就是 R 的起点。这个值一般不太需要动,除非你换了传感器或者改了工作距离。

Q 是“模型属性”。它描述你建立的随机过程模型有多大把握。Q 设得越小,说明你越信任自己的运动学模型。但实际场景里,目标不可能严格按恒速走,Q 设得太小会让滤波器过度自信,出现“协方差趋零但实际误差很大”的假收敛。我一般先按 4.1 节离散化公式算出一个量级,再根据残差序列做小幅调整,具体方法放在第六章讲。

P 是“初始认知”。它描述你对初始状态估计的不确定程度。P 初始设得大一点没关系,滤波器会在前几步通过观测快速收敛;但设得太小会很危险,比如你明明不确认真实初始速度,却把 P 的初速度分量设成 0.001,滤波器就会认为初始速度非常可靠,后续观测要花很长时间才能把它“掰回来”,启动阶段就会出现明显的跟踪滞后。

三个矩阵的相对大小,直接决定卡尔曼增益的变化路径。如果你看到滤波结果比原始观测还震荡,那几乎可以断定是 Q 相对 R 过大;如果你看到估计值温和得毫无反应,大概率是 Q 相对 R 过小。这两个极端在第五章的避坑环节会再次出现。

4.3 非线性场景:EKF 和粒子滤波其实是同一个公式的两种近似

现实世界很少像 4.1 那样规整。目标跟踪里常见的雷达量测是距离和方位角,位置状态和量测之间是三角函数关系,不是线性映射;无人机姿态估计里的状态转移也可能带旋转矩阵,不是简单的矩阵乘法。这个时候线性高斯假设不再成立,你只有两条路:把非线性模型线性化,或者用数值采样近似后验分布。

扩展卡尔曼滤波 EKF 走的是第一条路。它在每个时刻把非线性函数在当前状态估计处做一阶泰勒展开,用雅可比矩阵代替 F 和 H,然后继续套卡尔曼滤波的五条公式。好处是计算量增加很小,工程改造成本低;坏处是一阶近似在强非线性场景下误差会被放大,甚至导致滤波发散。

粒子滤波走的是第二条路。它直接用一大组带权重的随机样本(粒子)来表示后验分布,其中每个粒子的状态转移和权重更新都严格对应贝叶斯公式的预测步和更新步,只是用蒙特卡洛积分来代替那个闭式解。非线性、非高斯都能处理,代价是计算量大一个量级,并且粒子数不够时会出现“粒子退化”。

这两条路线看上去天差地别,但从贝叶斯滤波的角度看,它们跑的是完全相同的骨架:预测步往前推分布,更新步用观测修正分布。区别只在表达分布的形式和做积分的方式。你在选型时,先判断系统非线性和非高斯有多严重,再决定是用 EKF 白嫖线性化,还是上粒子滤波。

5. 避坑:贝叶斯滤波在工程现场最常见的 5 个翻车点

这一章写的是我在实际项目里踩过的坑,以及带新人时反复见到的错法。每一个都按“现象 → 原因 → 解决”展开。这些坑单独看都不难,难的是它们往往同时出现,让你误以为是代码 bug,实际是参数和模型问题。

5.1 现象:滤波结果比原始观测还震荡

滤波滤波,理应把噪声压下去。结果滤波输出曲线抖动得比传感器的原始读数还剧烈,这是最容易让人怀疑人生的情况。

原因:Q 相对于 R 设得过大。过程噪声协方差 Q 过大意味着模型自己都承认预测非常不可信,于是卡尔曼增益 K 会偏向观测,滤波器几乎原样采信每一帧带噪声的量测。这时候所谓的滤波,本质就是x = x + 1.0 * (z - x),直接把观测搬进了状态。

解决:先把 R 按传感器标定值固定住,然后从小的 q 值开始试。比如 4.1 节里 q=0.5 你觉得震荡得厉害,就先降到 0.01,看滤波曲线是不是变得平滑了。记得同时观察卡尔曼增益 K 的变化——正常收敛后 K 应该是一个稳定的小数,而不是长期贴近 1。

5.2 现象:协方差越走越小,但估计位置明显偏离真值

这是最隐蔽的坑,因为滤波器的自检结果看起来“非常健康”——协方差矩阵 P 单调下降,卡尔曼增益越来越小,每一步都似乎信心满满。可是和真值一对比,误差比观测噪声还大。

原因:Q 设得太小,甚至设成 0。过程噪声为零意味着滤波器认为随机过程模型完美无缺,预测步永远自信,新息带来的修正量会越来越被边缘化。系统一旦出现模型未覆盖的扰动——比如恒速模型里目标悄悄加了速——滤波器完全没有办法纠正,只能沿着错误的预测轨迹一路走下去,还自我感觉很良好。

解决:把 Q 恢复到合理量级,至少保证协方差矩阵 P 在稳态时不收敛到零。一个实用的经验法则是:当滤波进入稳态后,P 的对角元如果比 R 低两个数量级,基本可以判定 Q 设得偏小了。你可以把 Q 放大到 P 保持在 R 同量级的位置,再观察残差。

5.3 现象:启动阶段滤波跟踪慢半拍,怎么调参数都跟不上

滤波器稳态表现还行,但每次从静止开始跟踪一段运动目标时,位置估计总是滞后目标真实位置好几帧。有些同学会去拼命增大 R,以为滤波太“灵敏”了,结果稳态精度反而变差。

原因:初始协方差 P 设得过于乐观。如果你把初始位置设对了、但初始速度设成 0,同时 P 的速度分量又设成很小的数值,滤波器就认为“初始速度 0 非常可靠”,要经过很多帧观测才能慢慢纠正这个错觉。这个过程在视觉上就是启动阶段的系统滞后。

解决:把初始 P 设得保守一些。我一般会把 P 的初始位置分量设为 R 的 10 倍量级,速度分量按“目标可能出现的最大速度差”的平方来给。比如目标最高速度 10 m/s,那速度分量初始方差给到 100,宁可前几步抖动大一点,也不要让滤波器被错误的初始信心锁死。

5.4 现象:调参变成玄学,每个值都试过但滤波还是不稳定

有人会把 Q、R、P 做成可调参数,然后对着界面上拉下拖,直到曲线“看起来好了”。这本质上是在过拟合某一段数据。换一组场景或换一个传感器,参数马上就崩。这时候你会觉得滤波调参就是门“玄学”。

原因:没有用残差和运行指标来指导调参,而是用肉眼盯曲线。滤波器的输出曲线平滑不等于滤波健康,拿输出曲线当调参依据,容易进入盲目搜索。

解决:把新息序列(innovation sequence)记录下来。它应该满足零均值、不相关、方差与 S 矩阵一致这三个统计特性。具体怎么检验放到第六章,这里只说结论:新息序列才是滤波器的真实体检报告,比任何输出曲线的观感都可靠。用这份报告判断是哪个矩阵出了问题,调参就从玄学变成了排查。

5.5 现象:状态维度一高,程序报矩阵奇异或者滤波直接发散

用卡尔曼滤波做多传感器融合,状态向量动辄 15 到 20 维,代码跑着跑着突然报“Singular matrix”或者LinAlgError,甚至干脆给你吐出一堆 nan。

原因:高维状态里很容易出现可观测性不足。比如你同时估计位置、速度和加速度,但传感器只给位置观测,加速度这个维度全靠预测撑,它的对应协方差分量在更新步中得不到有效修正,数值长期累积后可能导致 S 矩阵奇异。另一个常见原因是连续做高维矩阵运算时,P 失去了对称正定性——浮点数值误差会让 P 微小地不对称,矩阵求逆直接爆炸。

解决:公式层加懒人保护,代码层用数值稳健写法。更新步改用 Joseph 形式更新 P 而不是简化式(I - K H) P,可以显著提升数值稳定性;每次更新后强制 P = (P + P.T) / 2 保持对称;实在不行,退化到平方根卡尔曼滤波,它是专为这类数值病态场景设计的。先保证数值健壮性,再去谈模型精度。

6. 用新息序列判断滤波是否健康:一个十分钟上手的验证技巧

这一章不讲新理论,给一个我每次做滤波落地都会先跑一遍的验证技巧。它不依赖外部工具,只需要把滤波循环里的新息序列存下来,做一次统计检验,就能告诉你是该调 Q、该调 R、还是模型根本建错了。如果你现在手里就有滤波代码,建议直接照着改。

6.1 新息序列的三条判据

在 4.1 节的代码里,更新步的第一行算的就是新息:

y = z - H @ x_pred

它表示“观测值减预测值”,也就是传感器实际看到的东西和滤波器预测看到的东西之差。如果滤波器模型和参数设置都合理,新息序列应该满足三条性质:

  • 均值接近零:说明滤波没有系统性偏差,预测和观测在平均意义上一致;
  • 时间上互不相关:说明滤波已经把该提取的信息都提取完了,剩下的只是纯噪声;
  • 实际方差与理论方差 S 一致:S 是代码里算出来的新息理论方差,如果实际残差的方差远大于 S,说明 R 被低估了。

6.2 具体做法和判读表

还在滤波主循环里,把每次的 y 和 S 存进列表,滤波结束后做三件事:算 y 的样本均值;对 y 做自相关检验;对比 y 的样本方差与 S 的均值。

现象判定处理方向
y 均值明显不为零状态转移模型有偏检查 F,或改用带加速度的状态模型
y 自相关系数显著非零过程噪声 Q 被低估增大 q,让模型吸收更多未建模扰动
y 样本方差 > S 均值量测噪声 R 被低估增大 R,或检查传感器数据是否有粗差
y 样本方差 < S 均值R 被高估或 Q 偏小减小 R 或增大 Q,视其他指标综合判断

这个方法我用了很多年。我的习惯是:拿到一段真实数据先跑一版最保守的滤波,把新息序列画出来,看到均值偏移就去查状态模型,看到自相关就去调 Q,看到方差不对就去查 R。大多数情况下,十分钟以内能定位出问题,比拿着一堆参数在界面上反复拖滑条效率高得多。这套习惯帮我避开了无数无效调参,也让我在处理别人的“滤波玄学”问题时,能直接指出不对的地方。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 4:10:00

.NET源码BS版MES系统实战:从搭建到上线全流程解析

前些天有个做工厂信息化的朋友跟我聊&#xff0c;说客户那边已经拍板要上一套基于**.net源码的BS版MES**&#xff0c;团队里却没有一个人真正从头到尾搭过这个玩意儿。他那句话我印象很深&#xff1a;“都说源码在手&#xff0c;天下我有&#xff0c;真拿到手才发现连登录页面都…

作者头像 李华
网站建设 2026/10/6 4:09:57

深度优先搜索(DFS)全解析:从递归迭代到拓扑排序与环检测

做图遍历需求的时候&#xff0c;我见过不少同事一上来就写个三层嵌套循环硬塞“访问标记”&#xff0c;结果数据一上量就出问题。深度优先搜索&#xff08;DFS&#xff09;听起来是算法课的入门概念&#xff0c;但真正要把它用对、用好、用出性能边界&#xff0c;里面其实有一堆…

作者头像 李华
网站建设 2026/10/6 4:09:51

OpenShell:打造可一键拉取复现的终端环境框架

最近我把用了三年的笔记本重装了系统&#xff0c;等所有软件装完&#xff0c;我又坐回终端前开始重写 .zshrc。这种事情我干过太多次了&#xff0c;每次换电脑都要把零散的配置重新拼一遍&#xff0c;直到某个瞬间我突然冒出个想法&#xff1a;为什么不能把整个终端环境变成一套…

作者头像 李华
网站建设 2026/10/6 4:09:22

一文搞懂AOP:切面、通知与动态代理原理

最近好几个准备跳槽的同行跑来问我同一个问题&#xff1a;到底什么是AOP&#xff1f;有些人已经背过了“面向切面编程”这个定义&#xff0c;但真把一段业务代码放到他面前&#xff0c;让他说清楚切面应该切哪里、底层又是怎么把通知织进去的&#xff0c;就含糊了。AOP&#xf…

作者头像 李华
网站建设 2026/10/6 4:08:54

C语言数制转换实战:栈与除基取余的完整实现

简介&#xff1a;针对初学数据结构的C语言学习者&#xff0c;这份资源以顺序栈为核心&#xff0c;演示如何将十进制数转换为八进制等任意进制&#xff0c;正好补足严蔚敏教材中伪代码不易直接运行的痛点&#xff0c;给出可直接调试的完整实例。压缩包内仅1个PDF文件&#xff0c…

作者头像 李华
网站建设 2026/10/6 4:08:12

OpenShell完全指南:从安装配置到故障排查,找回Windows经典开始菜单

Windows 11 发布后&#xff0c;我身边几乎每周都有人抱怨那个新版开始菜单&#xff1a;磁贴没了、分组逻辑变了、搜索结果混着网页推荐&#xff0c;想快速打开一个控制面板得先想一下图标长什么样。我给人重装系统时最常做的事&#xff0c;就是在装完驱动之后顺手装一个叫 Open…

作者头像 李华