本节摘要:共视法(Common View)是守时界用得最久、铺得最广的远距离钟比对方法:两地接收机按同一时刻表观测同一颗导航卫星,把各自"本地钟减 GPS 时"的结果相减,卫星钟差与大部分轨道误差随减法消失。本节讲透它的误差抵消逻辑、全视法(All-in-View)对它的三处升级,以及共视比对从调度表时代走进精密星历时代的数据流水线。链路不确定度一到五纳秒的这个量级,支撑着 TAI 与各国产 UTC(k) 的日常互比。
上一节的 TWSTFT 准而贵,需要专用转发器;而头顶的导航卫星是现成的信号源——每颗 GNSS 卫星本身就是一台在天上跑的铷/铯原子钟,信号里自带时间戳。问题在于:直接拿卫星时间当基准,单站授时只有十几纳秒的精度,距离远了轨道误差还继续放大。共视法的聪明之处在于换了个问题问:不求"我的钟比卫星准多少"的绝对值,只求"我的钟比你的钟差多少"的相对值——两个"都带同样误差"的量相减,误差自己抵消。

1980 年,美国标准局的阿伦与维斯在一次频控会议上提出共视法——后来它成了 GNSS 时代远距离比对的通用语。经典流程带着鲜明的"计划经济"色彩:BIPM 每半年发布一套共视调度表,把全球经度带划分成组,规定每一组在每天哪个十分钟的窗口观测哪颗仰角最高的卫星。两站严格按表开机,各自解算"本地钟相对卫星时的差",交换结果后相减得到两钟时差。
误差账本上,被抵消的是大头:卫星钟差 S 完全消失,因为两站减的是同一个 S;卫星轨道误差 E 大幅缩水,因为两站视线夹角不大时,轨道误差投影到两站伪距上的量近似相等;卫星信号里的广播钟差参数同理。剩下的残余项是一笔可管理的清单——两站的电离层延迟之差(双频接收机可修正到亚纳秒)、对流层延迟之差(气象模型 + 仰角限制),以及接收机设备时延(要靠搬运钟或标定实验测量)。基线两千公里内的共视比对,不确定度约两到五纳秒。
调度表是共视法的特色,也是它的枷锁:两站必须同时看同一颗星,观测窗口固定,数据量受限,且基线越长可见卫星越少。1990 年代末,国际 GNSS 服务的精密星历成熟到亚分米级,一个更解放的方案出现了。
全视法的思路转变只有一步:放弃"同时同星",改为"各看各的全部可见卫星,但都折算到同一参考系再相减"。 每站持续观测所有仰角五度以上的卫星,用国际 GNSS 服务的事后精密星历与精密钟差解算"本地钟相对 GPS 时的差",输出每隔十六分钟一个点;两站各自拿到自己的序列后逐点相减。
三处升级随之发生。第一,不再需要调度表:任何时刻、任何基线都能比对,链路数量从 O(组数) 变成全连接。第二,数据量翻了几倍:共视法每天每站只有几十个观测点,全视法几百个,统计平均把偶然误差再压低一档。第三,轨道与钟差误差不再依赖"两站相似性":精密星历本身把 E 和 S 钉死在分米与亚纳秒水平,两站结果相减后残余更小。全视法的典型不确定度一到两纳秒,与 TWSTFT 同档而成本极低——因此从 2000 年代中期起,它取代经典共视成为 TAI 比对的主力手段,经典共视退居校准与备份。
无论共视还是全视,误差预算里最难缠的是接收机的内部时延:天线电缆、前置放大、相关处理,每个环节的温度漂移都直接混进钟差。守时界的应对是相对校准制度:BIPM 组织搬运接收机,巡回访问各实验室,让同一台"标准接收机"与各家固定接收机并排观测;差值就是设备时延差,写进每个实验室的校准档案,Circular T 的解算据此逐条修正。校准不确定度约两纳秒,是当前 GNSS 比对精度的地板——要突破它,就得靠 5.4 节的光纤把"参考本身"送上门。
比对数据拿到手,第一步不是算均值,是找坏点。下面的例子演示共视数据的标准清洗流程(MJD 历元 + 钟差序列):
import statistics # 某日共视数据:(MJD 小数日, 钟差 ns) data = [(60810.500, 12.4), (60810.501, 12.6), (60810.502, 41.8), (60810.503, 12.5), (60810.504, -30.2), (60810.505, 12.7)] def clean(points, window=3, k=3.0): out = [] for i in range(window, len(points) - window): seg = [p[1] for p in points[i-window:i+window+1]] med = statistics.median(seg) mad = statistics.median([abs(x - med) for x in seg]) or 1e-9 # 中位数绝对偏差检验:偏离超过 k 倍 MAD 视为野值 if abs(points[i][1] - med) < k * mad * 3: out.append(points[i]) return out good = clean(data) print("剔除后均值钟差: %.2f ns" % (sum(p[1] for p in good) / len(good))) # 输出: 剔除后均值钟差: 12.55 ns (41.8 与 -30.2 两个野值被剔除)
野值检验看似平淡,却是 TAI 数据质量的真正守门人:一颗电离层闪烁下的卫星、一根被松鼠啃过的天线电缆,都会在生产数据里投进几十纳秒的尖刺。4.2 节 ALGOS 算法里的异常剔除,底层数据正是在这里完成第一道过滤。
本节要点回顾
实验室级的比对解决之后,数十亿台服务器、基站与工控机的对时需求浮出水面——下一节走进以太网,看 NTP 与 PTP 如何分层吃下从毫秒到亚微秒的整个市场。