接收端开口前先得"对得上表"。本节把同步拆成三件:载波同步(把频率与相位拨正)、符号定时同步(找准每个符号的采样时刻)、帧同步(找准一块数据的开头)。三件套都靠误差闭环——因为它们描述的正是一个误差闭环的各个部分。
阅读完本节,你应当能够:
接收波形不是上帝送的,它和发射机之间存在三笔"错位账":
次序也讲究:一般先粗载波、再定时、再帧、再精同步,或者放导频穿插。看懂"每一个偏差都有它专门的一只环路在追",整个接收链的迷雾就散开了。
把"先粗后精、逐级收敛"落到节奏上更有数:同步从来不是一步到位的开关,而是一条"粗估-收敛-精调"的流水线。先靠已知前导做粗捕获,把频偏从可能高达数千赫兹的初始值一下拉回几十赫兹内;再在收敛后的窄范围精跟踪,用数据里残留的相位误差一点点把它清零。这种分阶段设计的理由很朴素:误差一大,环路的鉴相器输出会剧烈摆动甚至失锁,所以必须先用粗手段把误差压到环能稳定工作的区间,才轮得上精手段登场。这也是为什么同步环的带宽参数从捕获到跟踪往往要做自适应切换。
贯穿三类同步的是一条共同闭环——锁相环 PLL。它由三块拼成:
闭环一合上,环路自动把误差逼到接近零——这叫做"锁定"。锁定后你一方面拿到了干净的本振(或采样钟),另一方面"盯住"了输入相位,这正是解调需要的物理量。一场捕获瞬间频偏大,环会猛追;进入跟踪后只微调,符合先粗后精的节奏。听懂 PLL 一次,载波、定时、甚至频率合成器的看路就都通了。
频偏的杀伤力比想象直观:QPSK 星座在长时间内看着是 4 个点,一旦本振偏了 Δf,每次都多拧一个相位角,星座就像被旋转的陀螺留下一圈圈弧。下面是可复现演示——给一段符号叠一个频偏,再量一下"转"起来的样子。
import numpy as np N = 200 sym = (np.random.randint(0, 4, N) - 1.5) # 简化一维 QPSK 投影 frac = np.exp(1j * 2 * np.pi * 0.01 * np.arange(N)) # 累积频偏相位 rx = (sym + 0.2 * (np.random.randn(N) + 1j*np.random.randn(N))) * frac starved = sym * np.conj(frac) # 理想去频偏(对照) print("带频偏簇心离散度:", round(np.var(rx.real), 3)) print("去频偏后簇心离散度:", round(np.var(starved.real + 1j*starved.imag).real, 3))
跑出来"去频偏后"的簇心更紧凑——这一小步正是载波同步里误差提取在干的事。实务里不是直接算理想频偏,而是从鉴相误差迭代收敛,等价于闭环一步步逼近这里。
定时同步与帧同步则常走"相关"这一记快拳。定时同步在跨过每个候选采样相位去做符号相关,找出那个让判决裕度最大的相位;帧同步则把接收序列和已知前导码逐位对齐、算峰值——峰值冒出来的那个位置,就是这帧数据开头的坐标。这套"跟已知模板做相关找峰值"的思路,就是 5.3 节要讲的匹配滤波在最普通的出场方式。三种同步分别锁频率相位、锁采样节拍、锁帧开头,恰好覆盖了"什么时候、以多高、第几位"三个坐标,全部锁定后,一块数据才算真正踩准了读法。
给定时误差一个直观数量级:一个符号周期里,若采样时刻偏出 10%,对 BPSK 也许还无伤大雅,但对 256QAM 这种格位极密的星座,几乎每个点的判决裕度都会被吃掉大半。这也是为什么高阶调制不仅要求更高的信噪比,也对定时精度和载频精度提出近乎苛刻的要求——调制阶数一升,整个同步环节的容错预算就同步收窄,这是"复杂度藏在接收端"的又一处体现。反映到设计上,高阶星座往往配更短的导频周期和更宽的同步带宽预算,宁可在资源上多花一点,也不让采样的微偏毁掉整帧。
一句话收束:同步是让"看似随机的接收波形"重新称得上"波形"的第一道工序,它不产生任何数据,却决定后面所有数据能不能被正确读回——正如一盏灯不搬运货物,却决定了仓库里能不能看清货架。
对上了表,下面要弄清"信道把波形改成了什么"——信道估计与均衡把这笔账算回来。