4. 频率数据采集与预处理

Allan方差分析的质量,首先取决于输入数据的质量。无论后续计算多么严谨,如果采集环节存在计数器死区、相位跳变、数据格式错位或未处理的异常值,最终得到的稳定度曲线都会失真。本章围绕频率计数器原理、相位与频率数据关系、数据格式规范、去趋势与异常值处理四个环节,建立从硬件采集到可分析数据集的完整链路。

一、频率计数器原理与采集链路

频率计数器通过测量被测信号在已知闸门时间内的周期数或相位累积量,换算出频率值。常见方案包括直接计数式、倒数计数式和相位比较式。直接计数式在低频段分辨率不足;倒数计数式通过测量多个周期的时间总和,显著提升低频分辨率;相位比较式则利用参考源与被测源的相位差随时间累积,适合高稳定度源之间的比对。

采集链路通常由被测源、参考源、计数器、时基、数据接口和上位机组成。参考源的稳定度必须优于被测源至少一个数量级,否则测量结果反映的是参考源而非被测源。时基若由普通晶振提供,其老化与温度漂移会直接叠加到测量数据中,因此高精度场景应使用铷钟或GPS驯服晶振作为时基。

频率数据采集链路与相位—频率转换关系 被测频率源 DUT / OCXO 参考频率源 铷钟 / GPSDO 频率计数器 闸门 / 倒数计数 相位比较 时基单元 10 MHz 参考 数据接口 GPIB / USB / LAN 时间戳 + 频率值 上位机 存储 / 预处理 Allan 方差计算 相位—频率关系: y(t) = [φ(t) − φ(t−τ)] / (2πν₀τ) 频率偏差: y(t) = [f(t) − f₀] / f₀

二、相位数据与频率数据的关系

频率计数器输出的原始量可能是频率值,也可能是相位差累积值。两者可以互相转换,但转换会引入不同的噪声特性。设标称频率为 f₀,瞬时频率为 f(t),则归一化频率偏差为 y(t) = [f(t) − f₀] / f₀。相位时间偏差 x(t) 与频率偏差的关系为 y(t) = dx(t)/dt,离散形式下 y_k = (x_{k+1} − x_k) / τ,其中 τ 为采样间隔。

反过来,若已知频率数据,相位可由累积求和得到:x_k = τ · Σ y_i。这一关系决定了两种数据的噪声处理方式不同。频率数据中的白噪声在积分后变为随机游走,相位数据中的白噪声在差分后仍为白噪声。因此,若采集到的是相位数据,直接计算Allan方差前通常不需要再差分;若采集到的是频率数据,则直接使用即可。混淆两者会导致斜率判断错误。

相位数据适合分析长稳和漂移,频率数据适合分析短稳和噪声类型。实际工程中建议同时保存原始相位差和换算后的频率值,便于交叉验证。

三、数据格式与采集参数规范

采集数据应至少包含时间戳、频率值或相位值、采样间隔、单位、参考源标识和环境温度。推荐使用两列或三列文本格式,便于脚本解析。以下是一个典型的数据文件示例:

# timestamp(s)  frequency(Hz)  temperature(C)
0.000000        10000000.0021   25.1
1.000000        10000000.0018   25.2
2.000000        10000000.0025   25.1
3.000000        10000000.0019   25.3
4.000000        10000000.0022   25.2

采样间隔 τ 的选择直接影响Allan方差可分析的 τ 范围。若总采样点数为 N,则最大可分析 τ 约为 Nτ/10。采样间隔过大会丢失短稳信息,过小则数据量激增且相邻点相关性增强。常见做法是选择 τ 使数据覆盖目标应用的时间尺度,例如守时应用关注 1 s 到 10⁵ s,通信同步关注 1 ms 到 100 s。

参数推荐值/范围说明
采样间隔 τ1 ms ~ 100 s根据目标 τ 范围选择
总点数 N≥ 10⁴保证统计置信度
参考源稳定度优于被测源 10 倍避免参考源噪声主导
时基铷钟 / GPSDO降低时基漂移影响
环境记录温度、湿度辅助异常值归因

四、去趋势与异常值处理

原始频率数据通常包含确定性趋势,如线性漂移、温度引起的周期性波动和老化引起的缓慢变化。Allan方差主要分析随机噪声,因此需要在计算前去除确定性趋势。常用方法包括线性拟合去趋势、多项式拟合去趋势和差分去趋势。线性去趋势适用于老化主导的场景,多项式去趋势适用于存在加速度漂移的场景。

异常值处理是预处理中最容易被忽视的环节。计数器偶尔会出现相位跳变、数据丢包或接口误码,表现为频率值突然偏离均值数十倍标准差。若不剔除,这些点会显著抬高Allan方差在高 τ 处的值,造成“稳定度变差”的假象。推荐使用中位数绝对偏差法进行稳健检测:

import numpy as np

def remove_outliers(y, k=5):
    med = np.median(y)
    mad = np.median(np.abs(y - med))
    sigma = 1.4826 * mad
    mask = np.abs(y - med) < k * sigma
    return y[mask], mask

y_clean, mask = remove_outliers(y_raw, k=5)
print("剔除点数:", np.sum(~mask))
不要用均值±3σ直接剔除异常值,因为均值和标准差本身会被异常值污染。中位数绝对偏差法对异常值更稳健,适合频率稳定度数据。

五、案例与复盘

某次OCXO稳定度测试中,采集了 86400 个频率点,采样间隔 1 s。直接计算Allan方差时,τ=1000 s 处出现异常抬升。检查原始数据发现第 32000 点附近有连续 5 个点频率跳变约 2 Hz,对应计数器接口误码。剔除这 5 个点并重新线性去趋势后,Allan方差曲线恢复平滑,τ=1000 s 处稳定度从 3.2×10⁻¹¹ 改善到 8.5×10⁻¹²,与器件手册一致。

复盘要点:第一,采集时同步记录计数器状态字,便于识别丢包;第二,预处理脚本应保留剔除标记,便于追溯;第三,去趋势和异常值处理的顺序应先剔除异常值再去趋势,避免异常值影响拟合系数;第四,所有预处理步骤应记录参数,保证结果可复现。

预处理的目标不是“让曲线好看”,而是让数据尽可能只保留被测源的随机噪声特性。任何去趋势和剔除操作都应有明确依据,并在报告中说明。