2. 噪声特性分析:Allan方差原理、随机游走、速率随机游走、量化噪声、零偏不稳定性
各位好,我是老张。今天咱们聊聊IMU噪声分析里最核心的工具——Allan方差。说实话,我刚入行那会儿,看到一堆噪声术语头都大了。什么随机游走、量化噪声,感觉像在学量子物理。后来做项目多了才发现,这些东西说白了就是告诉你:你的IMU到底有多「脏」。
嗯,咱们先搞清楚一件事:为什么要分析噪声特性?
你想想看,IMU输出的数据里,哪些是真实运动,哪些是传感器自己「抖」出来的?如果不分清楚,你后面做滤波、做导航,全白搭。Allan方差就是一把尺子,帮你量出每种噪声的「分量」。
2.1 Allan方差原理——噪声的「光谱分析仪」
Allan方差最早是搞原子钟的人发明的,用来分析频率稳定度。后来被我们做惯导的「借」过来,发现分析IMU噪声特别好使。
它的核心思想很简单:把一段长时间的静态数据切成很多小段,每段算一个平均值,然后看这些平均值之间的差异。差异越大,说明噪声越厉害。
具体怎么算?我直接给公式:
σ²(τ) = (1/2) * ⟨(θ̄(t+τ) - θ̄(t))²⟩
其中τ是相关时间,θ̄是每段数据的平均值。⟨·⟩表示取期望(其实就是平均)。
我个人习惯用对数坐标画Allan方差曲线。横轴是τ(时间),纵轴是σ(τ)(噪声幅度)。不同噪声在曲线上会呈现不同的斜率,一眼就能认出来。
关键点:Allan方差曲线是双对数坐标下的折线。每种噪声对应一个特定的斜率段。
我给大家画了一张图,把整个噪声分析框架串起来:
这张图把五种主要噪声在Allan方差曲线上的位置和斜率都标出来了。你拿到一个IMU的数据,画个Allan方差图,对照这张图就能知道你的传感器噪声「成分」是什么。
2.2 五种噪声的「真面目」
下面我一个一个讲。每种噪声我都会说清楚它的物理含义、在Allan方差曲线上的表现,以及我实际项目中踩过的坑。
2.2.1 量化噪声
量化噪声是ADC采样时产生的。说白了,就是模拟信号变成数字信号时,精度不够导致的「四舍五入」误差。
举个例子:你的ADC是16位的,量程是±10V,那么最小分辨率就是20V/65536 ≈ 0.3mV。任何小于0.3mV的变化都测不到,这就是量化噪声的来源。
在Allan方差曲线上,量化噪声的斜率是-1。也就是说,在短时间尺度上(τ很小),它占主导地位。
我的经验:量化噪声通常在高精度IMU中不太明显,但在低成本MEMS里很常见。我曾经测过一款消费级IMU,短时间内的Allan方差曲线斜率接近-1,一看就是量化噪声太大。后来换了更高分辨率的ADC,问题就解决了。
2.2.2 角度/速度随机游走
这个噪声是陀螺仪和加速度计最核心的指标之一。它代表的是角速度或加速度的白噪声积分后产生的角度或速度误差。
你想想看:如果陀螺仪输出有白噪声,积分一次就变成了随机游走。这就是为什么IMU不能长时间纯积分定位——误差会随时间发散。
在Allan方差曲线上,随机游走的斜率是-1/2。它通常出现在中等时间尺度上。
| 噪声类型 | Allan方差斜率 | 物理单位 | 典型来源 |
|---|---|---|---|
| 量化噪声 | -1 | °/s 或 m/s² | ADC量化 |
| 角度/速度随机游走 | -1/2 | °/√h 或 m/s/√h | 白噪声积分 |
| 零偏不稳定性 | 0(谷底) | °/h 或 mg | 1/f 噪声 |
| 速率随机游走 | +1/2 | °/h/√h 或 m/s²/√h | 角加速度噪声 |
| 速率斜坡 | +1 | °/h² 或 m/s²/h | 温度漂移 |
2.2.3 零偏不稳定性
这是我最关心的指标之一。零偏不稳定性代表的是传感器零偏在长时间内的波动幅度。说白了,就是你的IMU「静止时输出值」到底稳不稳。
在Allan方差曲线上,它表现为一个「谷底」——曲线的最低点。这个谷底对应的τ值,就是传感器最稳定的时间尺度。
注意:零偏不稳定性不是零偏本身!零偏是固定偏差,可以标定补偿。零偏不稳定性是零偏随时间的变化量,是随机过程,没法完全补偿。
我记得有一次做高精度导航项目,客户要求零偏不稳定性低于0.01°/h。我们测了好几款光纤陀螺,只有一款能达到。后来发现,温度控制是关键——温度波动1°C,零偏不稳定性可能翻倍。
2.2.4 速率随机游走
这个噪声比随机游走「高一级」。它是角加速度的白噪声积分产生的。在Allan方差曲线上,斜率是+1/2。
实际中,速率随机游走通常来自传感器内部的机械谐振或电路噪声。它出现在长时间尺度上,说明你的IMU在「慢变」方面有问题。
嗯,这里要注意:速率随机游走和随机游走容易搞混。我刚开始也分不清,后来记住一句话:随机游走是速度/角速度的积分,速率随机游走是加速度/角加速度的积分。
2.2.5 量化噪声(再补充一点)
前面说了量化噪声的基本概念。这里补充一个实际案例。
我曾经调试一个无人机飞控,发现悬停时高度一直在抖。查了半天,发现是加速度计的量化噪声太大,导致垂直通道的积分误差累积。后来在软件里加了一个小技巧:对原始数据进行过采样,等效提高了ADC分辨率。效果立竿见影。
避坑指南:量化噪声在低动态场景下影响尤其明显。如果你的应用是静态或准静态测量,务必关注ADC的有效位数(ENOB),不要只看标称位数。
2.3 如何用Allan方差分析实际数据
理论讲完了,咱们来点实操。我一般用Python做Allan方差分析,代码不长,但很实用。
import numpy as np
import matplotlib.pyplot as plt
def allan_variance(data, fs):
"""
计算Allan方差
data: 输入数据(一维数组)
fs: 采样频率(Hz)
"""
n = len(data)
max_m = int(np.log2(n))
tau = np.zeros(max_m)
avar = np.zeros(max_m)
for m in range(1, max_m + 1):
# 计算每个时间段的平均值
n_segments = n // (2**m)
if n_segments < 2:
break
# 分组求平均
segments = data[:n_segments * 2**m].reshape(-1, 2**m)
means = np.mean(segments, axis=1)
# 计算Allan方差
diff = means[1:] - means[:-1]
avar[m-1] = 0.5 * np.mean(diff**2)
tau[m-1] = 2**m / fs
return tau, np.sqrt(avar)
# 使用示例
fs = 100 # 100Hz采样
data = np.random.randn(10000) # 模拟数据
tau, adev = allan_variance(data, fs)
# 画图
plt.loglog(tau, adev, 'b-', linewidth=2)
plt.xlabel('相关时间 τ (s)')
plt.ylabel('Allan标准差 σ(τ)')
plt.grid(True, which='both', linestyle='--', alpha=0.6)
plt.show()
这段代码的核心逻辑就是前面说的:分段求平均,然后算相邻段平均值的差异。代码里我用了2的幂次来分段,这样计算效率高,而且τ值在对数坐标上均匀分布。
我的习惯:实际分析时,我会采集至少1小时的静态数据。采样率100Hz的话,就是36万个数据点。这样Allan方差曲线能覆盖从0.01秒到1000秒的时间范围,五种噪声都能看清楚。
2.4 噪声参数提取——从曲线到数字
画完Allan方差曲线,下一步就是提取具体的噪声参数。方法很简单:对曲线的不同斜率段做线性拟合,然后反推噪声系数。
举个例子,随机游走的系数怎么算?
在斜率-1/2的段上,取一个τ值,对应的Allan标准差σ(τ),那么随机游走系数就是:
ARW = σ(τ) * √τ
单位是°/√h(陀螺)或 m/s/√h(加速度计)。
零偏不稳定性的提取更直接:找到曲线的最低点,那个σ值就是零偏不稳定性。
我一般会写一个自动提取脚本,把五种噪声参数一次性算出来。但刚开始学习时,我建议你手动在曲线上标出各段,然后分段拟合。这样对噪声的「感觉」会更直观。
核心要点:Allan方差分析不是目的,目的是提取噪声参数,用于后续的滤波设计。比如卡尔曼滤波的噪声协方差矩阵,就需要这些参数作为输入。
好了,关于噪声特性分析就讲到这里。Allan方差这个工具,你用得越多,对IMU的理解就越深。下次拿到一个新IMU,别急着上板子,先采一段静态数据,画个Allan方差曲线看看——你会发现很多有意思的东西。
公众号:蓝海资料掘金营,微信deep3321