第1章:Allan方差分析法——原理简介、方差曲线解读、噪声项分离

各位工程师朋友,咱们今天聊聊Allan方差。说实话,我刚入行那会儿,看到这个名词就觉得头大——一堆数学公式,看着就劝退。但后来我发现,这玩意儿其实就是个“噪声显微镜”,能把陀螺仪里那些乱七八糟的噪声一个个揪出来。

你想想看,我们做惯导的,最怕什么?怕陀螺仪飘。但飘的原因有很多种,你得知道是哪种噪声在作怪,才能对症下药。Allan方差就是干这个的。

1.1 原理简介:它到底在算什么?

Allan方差的思路其实很朴素。它不直接看原始数据,而是看数据的“平均值”在不同时间尺度下的变化情况。

具体怎么做的?我给你拆解一下:

  1. 拿一段陀螺仪静态数据,比如采样率100Hz,采了1小时。
  2. 选一个时间窗口τ,比如τ=1秒。把数据切成一段段,每段1秒长,算每段的平均值。
  3. 看相邻两段平均值的差,算这个差的方差。这就是τ=1秒时的Allan方差。
  4. 换一个τ,比如τ=10秒、100秒……重复上面步骤。
  5. 最后,把不同τ对应的Allan方差画成曲线,就是Allan方差曲线。

用公式表达就是:

σ²(τ) = ½ * ⟨(θ̄_{k+1} - θ̄_k)²⟩

其中θ̄_k是第k段数据的平均值,⟨ ⟩表示取平均。前面那个½,是Allan方差定义里自带的,别问为什么,记住就行。

我的小习惯: 实际计算时,我一般用重叠式Allan方差(Overlapping Allan Variance),数据利用率更高,曲线更平滑。非重叠式虽然计算快,但噪声大的时候曲线跟狗啃似的,不好看。

1.2 方差曲线解读:一条曲线,五种噪声

Allan方差曲线长什么样?横轴是时间τ(对数坐标),纵轴是Allan标准差σ(τ)(也是对数坐标)。典型的曲线像个“V”字,或者更准确地说,像个不对称的浴盆。

为什么会有这种形状?因为不同的噪声在不同的时间尺度上占主导。我习惯把曲线分成五个区域来看:

噪声类型 斜率(对数坐标) 物理来源 典型τ范围
量化噪声 -1 AD转换分辨率有限 极短τ(<0.1s)
角度随机游走 -1/2 白噪声积分 短τ(0.1s~10s)
偏置不稳定性 0(平坦区) 1/f噪声 中τ(10s~100s)
速率随机游走 +1/2 低频漂移 长τ(100s~1000s)
速率斜坡 +1 温度线性漂移 极长τ(>1000s)

嗯,这里要注意:实际曲线不一定五个区域都完整出现。比如好的光纤陀螺,量化噪声可能被淹没在ARW里,根本看不见。而MEMS陀螺的偏置不稳定性区域往往很窄,甚至没有明显的平坦区。

核心要点: 曲线的最低点对应的τ值,就是陀螺仪的最佳积分时间。在这个时间窗口下积分,角度误差最小。我选陀螺仪时,第一件事就是看这个最低点在哪。

1.3 噪声项分离:怎么把噪声一个个揪出来?

曲线看懂了,接下来就是算。说白了,就是把Allan方差表达式写成各噪声项的线性叠加:

σ²(τ) = σ²_Q(τ) + σ²_ARW(τ) + σ²_BI(τ) + σ²_RRW(τ) + σ²_RR(τ)

每一项都有明确的数学形式。我直接给结论,你们拿去用:

  • 量化噪声: σ_Q(τ) = √3 · Q / τ,Q是量化系数,单位弧度。
  • 角度随机游走: σ_ARW(τ) = N / √τ,N是ARW系数,单位°/√h。
  • 偏置不稳定性: σ_BI(τ) = B · √(2ln2/π),B是BI系数,单位°/h。注意,这个值在平坦区直接读。
  • 速率随机游走: σ_RRW(τ) = K · √(τ/3),K是RRW系数,单位°/h/√h。
  • 速率斜坡: σ_RR(τ) = R · τ / √2,R是斜坡系数,单位°/h²。

实际怎么操作?我一般用最小二乘法拟合。把曲线取对数,然后分段拟合斜率。比如在短τ区,斜率接近-0.5,我就用ARW模型去拟合,反算出N值。

我曾经踩过的坑: 千万别直接拿原始数据去拟合!一定要先做预处理——去趋势项、去野点。有一次我忘了去温度漂移,结果速率斜坡的系数算出来大得离谱,差点把陀螺仪判了死刑。后来发现是测试台没恒温。

给你看一段我常用的Python代码,用Allan方差分析一个实际陀螺仪数据:

import numpy as np
import allantools

# 假设data是陀螺仪静态数据,采样率fs=100Hz
fs = 100.0
tau, adev, adev_err, rate = allantools.oadev(data, rate=fs, data_type='freq')

# 找曲线最低点
min_idx = np.argmin(adev)
best_tau = tau[min_idx]
best_adev = adev[min_idx]

print(f"最佳积分时间: {best_tau:.2f} 秒")
print(f"对应的Allan标准差: {best_adev:.6f} °/s")

# 拟合ARW(取τ在0.1~1秒之间的点)
mask_arw = (tau > 0.1) & (tau < 1.0)
# 用最小二乘拟合 log(adev) = log(N) - 0.5*log(tau)
# 具体拟合代码略,你们懂的

拟合完,你就能得到一份完整的噪声清单。这份清单有什么用?我举个例子:

  • 如果ARW太大,说明陀螺仪的本底噪声高,可能是光源或电路问题。
  • 如果BI太大,说明低频1/f噪声严重,可能是封装应力或电路1/f噪声。
  • 如果RRW明显,说明有缓慢的漂移,可能是温度或磁场影响。

有了这些信息,你就能针对性地改进设计,而不是瞎猜。

我的经验: 做Allan方差分析时,数据长度至少要达到最大τ的100倍。比如你想看到τ=1000秒处的噪声,至少需要采100000秒(约28小时)的数据。别嫌长,噪声分析就是个慢工出细活的活儿。

好了,Allan方差的基本原理和操作方法就这些。说白了,它就是一把尺子,帮你量清楚陀螺仪噪声的“成分”。下一节我们会聊怎么用这把尺子去校准零偏稳定性,到时候再细说。


公众号:蓝海资料掘金营,微信deep3321