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 噪声强,应优先排查环境振动、电源纹波或探测器偏置。
曲线形态与噪声成分的对应关系
排障判断与常见陷阱
- 簇数不足导致长 τ 段失真:当 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 以内,并对长于该尺度的漂移建立周期性校准或趋势补偿机制。