4. Allan方差识别测量漂移与白噪声

为什么用 Allan 方差而不是普通标准差

普通标准差把一段长序列的所有起伏压成一个数,无法回答“误差在哪个时间尺度上占主导”。Allan 方差的核心是把时间序列按不同簇时长 τ 分组,计算相邻簇均值之差,再对差值平方取平均。不同噪声类型在双对数 Allan 偏差曲线上呈现不同斜率,因此斜率就是噪声类型的“指纹”。

设采样间隔为 τ₀,原始序列为 y₁…y_N,簇内平均为 ȳ_k(τ),则重叠式 Allan 方差估计为:

σ²_A(τ) = 1 / (2(M-1)) · Σ_{k=1}^{M-1} [ ȳ_{k+1}(τ) − ȳ_k(τ) ]²
M = N − m + 1,  m = τ / τ₀(簇内点数)

斜率判读约定(双对数坐标,横轴 τ,纵轴 Allan 偏差 σ_A):

斜率主导噪声物理含义排障动作
−1/2白噪声(频率/相位)独立随机抖动,平均可抑制增加平均时间或重复次数
0闪烁噪声(1/f)平台区,平均不再改善寻找环境/器件 1/f 源
+1/2随机游走累积型漂移缩短单次测量间隔、加闭环
+1线性漂移确定性趋势(温漂、老化)建模扣除或重新校准

实操:从长序列到斜率判读

下面用一段可运行的 Python 脚本完成全流程。数据为教学示例:合成一段含白噪声、闪烁噪声与线性漂移的序列,便于验证算法能否正确分离三种成分;实际排障时把 y 换成真实测量序列即可。

import numpy as np

rng = np.random.default_rng(7)
tau0 = 1.0            # 采样间隔 (s)
N = 20000
t = np.arange(N) * tau0

# 教学示例:白噪声 + 闪烁噪声(1/f) + 线性漂移
white = rng.normal(0, 1.0, N)
flicker = np.cumsum(rng.normal(0, 0.02, N)) * 0  # 占位,下面用频域生成
f = np.fft.rfftfreq(N, d=tau0)
amp = np.zeros_like(f); amp[1:] = 1/np.sqrt(f[1:])
phase = rng.uniform(0, 2*np.pi, f.size)
flicker = np.fft.irfft(amp*np.exp(1j*phase), n=N)
flicker = flicker / flicker.std() * 0.5
drift = 0.0008 * t          # 线性漂移速率 0.8e-3 /s
y = white + flicker + drift

def allan_dev(y, tau0, m_list):
    out = []
    for m in m_list:
        M = len(y)//m
        if M < 3: continue
        yc = y[:M*m].reshape(M, m).mean(axis=1)
        d = np.diff(yc)
        sigma2 = np.sum(d**2) / (2*(M-1))
        out.append((m*tau0, np.sqrt(sigma2)))
    return np.array(out)

m_list = np.unique(np.logspace(0, np.log10(N//4), 40).astype(int))
res = allan_dev(y, tau0, m_list)
tau, adev = res[:,0], res[:,1]

# 分段斜率:用相邻点的 log-log 差分估计局部斜率
slope = np.diff(np.log(adev)) / np.diff(np.log(tau))
for i in range(0, len(tau)-1, 6):
    print(f"tau={tau[i]:8.1f}s  adev={adev[i]:.4e}  slope={slope[i]:+.2f}")

运行后观察 slope 列:短 τ 段斜率接近 −0.5(白噪声主导);中段斜率趋近 0(闪烁噪声平台);长 τ 段斜率趋近 +1(线性漂移主导)。斜率由负转正、穿过 0 的拐点,就是漂移开始压过随机噪声的时间尺度,也是“最长可用平均时间”的工程判据。

判读要点:Allan 偏差曲线的最低点对应最优平均时间 τ_opt;τ_opt 之后曲线上升,说明继续平均只会引入漂移误差。若曲线在短 τ 就出现平台,说明 1/f 噪声强,应优先排查环境振动、电源纹波或探测器偏置。

曲线形态与噪声成分的对应关系

Allan 偏差曲线:斜率分段识别噪声类型 簇时长 τ(对数坐标) Allan 偏差 σ_A(τ)(对数) τ_opt(最优平均时间) 斜率 −1/2 白噪声主导 斜率 ≈ 0 闪烁噪声平台 斜率 +1 线性漂移主导 短 τ:平均有效,σ_A 随 τ 下降 中 τ:平均失效,进入平台 长 τ:漂移累积,σ_A 上升

排障判断与常见陷阱

  • 簇数不足导致长 τ 段失真:当 m 接近 N/4 时,参与平均的簇数 M 太少,Allan 方差估计的置信区间急剧变宽,长 τ 段出现虚假上升。建议只信任 M ≥ 10 的 τ 点,或改用重叠式估计提高有效样本数。
  • 把线性漂移误判为随机游走:两者斜率都为正,但随机游走斜率约 +1/2,线性漂移约 +1。若斜率明显大于 0.7,优先怀疑确定性趋势(温漂、老化、零点缓慢偏移),可先做线性拟合扣除趋势再重算 Allan 方差验证。
  • 采样间隔与簇时长单位不一致:τ 必须以秒为单位且与 τ₀ 同量纲,否则斜率不变但 τ_opt 的物理含义错误。
  • 未去除均值不影响结果:Allan 方差基于相邻簇均值之差,常数偏置自动抵消,无需先去均值;但去除线性趋势会改变长 τ 段斜率,属于有意的诊断操作,需在报告中注明。
斜率判读只在双对数坐标下成立。若用线性坐标绘图,白噪声段看起来像曲线而非直线,容易误判。绘图时务必对 τ 和 σ_A 同时取对数。

结果验证清单

检查项通过条件不通过时的处理
短 τ 段斜率接近 −0.5检查采样是否过疏、是否存在量化噪声
平台段是否存在斜率绝对值 < 0.2若不存在,说明 1/f 噪声弱,可直接进入漂移段
长 τ 段斜率0.4 ~ 1.1>1.1 检查是否混入阶跃或数据缺口
τ_opt 位置M(τ_opt) ≥ 10增加数据长度或降低最长 τ
趋势扣除前后对比扣除后长 τ 斜率回落确认漂移为确定性成分,可建模补偿

完成上述检查后,即可给出结论:漂移主导的时间尺度为 τ_opt 之后,工程上应把单次平均时间限制在 τ_opt 以内,并对长于该尺度的漂移建立周期性校准或趋势补偿机制。