4. 数据帧的成帧与同步

水下声通信链路具有传播时延大、多径严重、多普勒频移明显、信噪比低且随时间起伏的特点。接收端要正确解析一帧数据,首先必须回答两个问题:帧从哪里开始、到哪里结束(成帧与帧定界),以及接收端采样时钟与发送端符号节拍如何对齐(位同步与帧同步)。本节围绕这两条主线展开,并给出同步丢失后的恢复策略。

一、帧定界方法:从“数长度”到“找标志”

帧定界解决的是比特流中帧边界的识别问题。常见方法有四类,适用场景差异明显:

  • 字符计数法:帧头用一个计数字段声明帧长。实现简单,但计数字段一旦出错,后续所有帧边界全部错位,缺乏自恢复能力,水下高误码环境下很少单独使用。
  • 首尾定界符法:用特殊比特模式(如 01111110)标识帧首尾,配合比特填充避免载荷中出现相同模式。它具备一定的重同步能力,但填充/去填充增加处理开销。
  • 长度字段 + 帧头校验:帧头包含长度与帧头 CRC,接收端先校验帧头再按长度截取。这是水下协议中最常用的折中方案,配合前导码可快速定位候选帧头。
  • 物理层前导码定界:利用已知前导序列的相关峰确定帧起点,属于“信号层定界”,对低信噪比更稳健,通常与帧头校验联合使用。

工程上常见的组合是:前导码(检测帧到达)→ 同步字(确认帧起点)→ 帧头(长度+校验)→ 载荷 → CRC。下面这张图给出了一帧的典型结构与各字段承担的同步职责:

一帧的典型结构与各级同步职责 前导码 帧到达检测 同步字 帧起点确认 帧头 长度 + 帧头CRC 载荷数据 业务比特 / 编码交织后 帧尾 CRC 整帧校验 接收信号时间 → 前导相关峰 同步字峰 判决门限 ① 前导码提供足够处理增益,用于低信噪比下的帧到达检测; ② 同步字给出精确帧起点,并用于后续帧同步跟踪;③ 帧头校验失败即判为候选帧,不进入载荷解析。

二、前导码与同步字设计

前导码的核心指标是相关旁瓣低、抗多普勒能力强、长度可控。常用序列包括 m 序列、Gold 序列、Zadoff-Chu(ZC)序列以及线性调频(LFM)信号。设计时需权衡三点:

  • 长度与处理增益:相关增益约为 10·log₁₀(N) dB。例如 N=256 时约 24 dB,可在低信噪比下检测;但前导码过长会降低有效吞吐,水下常取 128~512 个符号。
  • 多普勒容忍度:多普勒会使相关峰展宽、偏移。ZC 序列对频偏较敏感,LFM 对多普勒有天然容忍性,工程上常采用“LFM 前导 + 同步字”的组合。
  • 虚警控制:检测门限通常设为噪声相关均值的若干倍(如 6~10 倍标准差),并采用“双峰确认”——前导峰与同步字峰间隔落在预期窗口内才判定为有效帧。

同步字一般取 16~32 比特的伪随机模式,要求自相关尖锐、互相关低,且与载荷编码后的比特模式尽量不相似,以降低误同步概率。一个可参考的示例参数为:前导码 256 符号 LFM、同步字 24 比特 Gold 序列、帧头 32 比特(含 12 位长度字段与 16 位 CRC)、载荷 512~2048 比特、帧尾 CRC-16。上述数值为教学示例,实际取值需结合带宽、符号率与信道条件确定。

三、位同步与帧同步算法

位同步解决的是“每个符号在什么时刻采样”。水下接收机常用两类方法:

  1. 早迟门(Early-Late Gate):在符号周期的早、迟两个时刻分别采样,比较能量差,误差信号驱动采样相位调整。实现简单,适合中等信噪比。
  2. Gardner 算法:每符号两个采样点,利用相邻符号的定时误差检测,对载波相位不敏感,适合水下多普勒引起的缓慢定时漂移。

帧同步则是在位同步基础上确定帧边界。典型做法是对同步字做滑动相关,当相关值超过门限且与前一前导峰的时间间隔落在 [T_min, T_max] 窗口内时,锁定帧起点。锁定后进入跟踪状态,用帧头 CRC 与帧尾 CRC 双重校验确认同步是否正确。

下面用一段伪代码说明“前导检测 + 同步字确认 + 帧头校验”的判定逻辑(示例参数,非实测结果):

threshold = 8 * noise_std          # 检测门限,示例值
peak = sliding_correlate(rx, preamble)
if peak > threshold:
    t0 = peak.position
    sync_val = correlate(rx[t0+len(preamble) : t0+len(preamble)+24], sync_word)
    if sync_val > sync_threshold and in_window(t0, last_frame_time):
        header = demod(rx, t0 + len(preamble) + 24, 32)
        if header_crc_ok(header):
            frame_len = header.length
            payload = demod(rx, ..., frame_len)
            if frame_crc_ok(payload):
                accept_frame(payload)   # 同步确认
            else:
                enter_resync()          # 载荷校验失败,触发重同步
        else:
            enter_resync()              # 帧头校验失败,丢弃候选帧

四、同步丢失的恢复策略

水下信道中同步丢失是常态而非异常,常见诱因包括:强多径导致相关峰分裂、多普勒使定时漂移超出跟踪范围、突发噪声抬高虚警、长静默后时钟漂移累积。恢复策略应分层设计:

  • 短时失锁(跟踪环失锁):保持帧计数与定时估计,扩大早迟门搜索范围,用下一帧前导码重新捕获,通常 1~2 帧内恢复。
  • 帧同步丢失(连续 CRC 失败):连续 N 帧(如 N=3)帧头或帧尾校验失败,判定为帧同步丢失,清空当前帧状态,回到“搜索前导码”状态,重新执行捕获流程。
  • 长时间失步(时钟漂移):启用保护间隔与更长的前导码,或周期性插入“重同步帧”,以已知序列重新校准采样时钟与帧边界。
  • 虚警抑制:对候选帧执行“双峰确认 + 帧头 CRC + 帧尾 CRC”三级校验,任一级失败即丢弃,避免错误帧进入上层协议。
实践建议:把“同步状态”显式建模为搜索 → 捕获 → 跟踪 → 失锁 → 重捕获的状态机,并为每个状态设置明确的进入/退出条件(如连续 CRC 失败次数、相关峰间隔窗口),比隐式依赖标志位更易于调试与复现。
注意:前导码相关门限不能设得过低。水下环境噪声非平稳,门限过低会显著抬高虚警率,导致接收机频繁进入无效解析,反而拖慢有效帧的处理。建议以滑动噪声估计动态调整门限,而非使用固定值。

综上,成帧与同步是一个“检测—确认—跟踪—恢复”的闭环:帧定界方法决定边界识别的鲁棒性,前导码与同步字决定捕获灵敏度与虚警水平,位/帧同步算法决定跟踪精度,而失步恢复策略决定系统在恶劣信道下的持续可用性。四者需联合设计,任何一环的短板都会在长时通信中暴露为吞吐下降或帧丢失。