前言
上一篇已经通过P201Pro双机QPSK实测看到:当初始频偏增大、Costas环带宽又较窄时,环路需要较长时间才能建立正确校正,甚至可能无法稳定锁定。
这一篇只解决其中的载波捕获问题。发送端在帧头放入两段完全相同的训练序列A|A;接收端利用两段之间累积的相位差估计粗频偏,先把快速旋转的星座拉回接近静止的状态,再交给Costas环跟踪残余误差。
实验环境介绍
收发都采用P201Pro设备,大致的收发框图如下所示:
设备连接实物图如下所示:
本文采用的帧头结构
把原来的“已知前导码 + 有效载荷”具体化为:
A|A 有效载荷其中,A是一段 N个QPSK符号组成的训练序列,第二段与第一段完全相同;有效载荷格式不变。载波捕获模块只利用重复间隔 进行延迟相关,不需要输入A的具体符号值;如果接收端也保存了 A,同一段前导码还可以供后级相位/象限校正复用。
在Costas环锁定后为何仍会错?DQPSK与前导码相位校正中其实已经给了一个用于相位矫正的前导码:
11100001010110101110100010010011现在就用这个作为A,重复两次得到A|A:
preambleText = '11100001010110101110100010010011'; preambleBits = uint8(preambleText(:) - '0'); info = 'Hello,World'; bitsM = int2bit(double(info), 8); bits = reshape(bitsM, [], 1); frameBits = [preambleBits; preambleBits; bits];一、为什么重复前导码能够测出频偏
1.1 重复间隔决定频偏捕获范围
这里的限制来自相位读数:相关结果的相位只能表示在(-Π,Π ] 内。固定采样率 Fs后,重复间隔L越长,同一频偏累积的相位越大;一旦超过半圈,读数就会折返,无法仅凭这一次测量区分不同的频偏。因此,单一重复间隔的无歧义范围是:
本例取 L=64:模块输入采样率为4MS/s 时,范围为±31.25kHz若输入采样率改为 2.084MS/s,范围则缩小到约±16.28kHz。这里应与范围比较的是进入本模块时的残余频偏,而不是一定要用发射机与接收机之间的原始频差。
缩短L可以扩大范围,但用于相关检测的样本也会减少,抗噪性可能下降。调整L时,发送端每段A的实际长度也必须同步改变。
二、接收端怎样找到重复段
接收端并不知道 A|A从哪一个采样点开始。因此,它用长度为2L的窗口在连续采样流上滑动,并计算前后两段的延迟相关:
为避免接收幅度变化影响判断,同时计算两段能量:
归一化后的检测指标为:
动画中的检测过程可以概括为:
- 窗口尚未覆盖A|A 时,前后两段内容不同,M[n]较小;
- 窗口逐渐进入重复段时,两段越来越相似,M[n]上升;
- 窗口完整覆盖重复段时,相关值形成峰值或高平台。
因此,接收端可取:
得到重复前导码的粗位置。这里的结果只用于定位A|A 所在区域;受噪声、成型滤波和平台宽度影响,精确帧起点仍可在后续用完整前导码互相关进一步确定。
从波形角度看,接收端并不需要先恢复bit。它只需将当前窗口与延迟L点的副本逐点共轭相乘并累加:相关强度用于判断“是否进入重复段”,复数相关结果的角度则保留了两段之间的载波相位。
三、由相关相位估计粗频偏
在A|A区域内,两段的发送数据相同。进行共轭相乘后,数据本身被抵消,主要保留下来的就是间隔L个采样点积累的频偏相位:
于是可得到粗频偏估计:
再利用NCO对接收流实施反向旋转:
图中设置\(F_s = 4\ \text{MS/s}\)、\(SPS = 4\)、\(L = 64\),并人为加入 18 kHz 频偏。两段相同训练序列之间累积约\(103.5^\circ\)相位;由\(P[n]\)角度得到的估计值约为 17.97 kHz。反向旋转后,原本持续转动的星座重新回到接近稳定的四个点簇。
这里解决的是持续旋转的频偏。它不同于上一篇中由1、\(-1\)、j、\(-j\)处理的 QPSK 象限模糊:后者是星座已经稳定后,仍可能整体相差\(90^\circ\)的映射问题。
四、前导码粗捕获与Costas精跟踪
前导码估计只使用帧头的有限训练样本,适合一次性消除大部分初始频偏;但本振漂移、噪声以及估计误差仍会留下残余。因此更合理的接收链不是替换Costas环,而是分工:
Matched Filter> Preamble Carrier Sync > Costas Loop
| 模块 | 主要职责 | 工作时段 |
|---|---|---|
| Preamble Carrier Sync | 检测A|A | 估计并校正大部分初始频偏帧开始处 |
| Costas Loop | 跟踪残余频偏与后续相位扰动 | 整个有效载荷 |
前导码把环路的起点送到接近正确频率的位置;Costas环则以较窄的Loop Bandwidth维持较低的稳态相位抖动。这正是“先捕获、再跟踪”的分工。
五、GNU Radio中的模块与验证计划
1. 发射端结构
首先看看发射端发送的帧结构是:
A|A 有效载荷如图:
下面那个滑动框是用来控制中心频率的,我的频偏正是在这里加的。
2. 接收端结构
首先我设计了一个前导码辅助同步的模块,其主要是检测 A|A 结构,然后估算出频偏,并进行粗频偏补偿的模块,如图:
- 模块的输入采样率设为实际输入的 2.084 MS/s;
- 重复间隔 (L=64),对应每段 (A) 的 16 个 QPSK 符号、每符号 4 个采样点。
- 归一化相关阈值 0.7用于判断两段是否足够相似,最小连续命中点数 8可减少偶然误触发。重新搜索等待点数设为 0,表示本次运行只进行一次捕获。
corr、freq和detect输出可分别用来观察相关指标、频偏估计和检测结果。
然后看看接收端连接图:
这里costasLoop 的loop BandWdith 设置为0.035用于对照两组测试链路。 AGC之后分出两条线路:一条是没有添加前导辅助同步的链路;一条是添加了前导辅助同步的链路。我们同样设置几组参数来进行测试:
为什么这样设计参数,因为6-8k是否有前导辅助同步变化点,14-16k是否前导码的变化点,其他都是对照。运行流图得到下列对照图:
从上图中的对照我们可以看到,拥有前导辅助粗同步的链路,可以捕获更大的频偏,并且其跟踪的时候环路更加稳定,但是其也受重复长度影响,实际中设计这部分需要考虑前导长度占用资源和粗频偏范围等因素。
这里为什么有前导码粗同步还是在16kHz部分失效,因为我们用的Fs是2.084M,重复间隔L=64,所以计算出来的能捕获的最大频偏是16.28kHz,本身也带有一定误差,所以在这里就捕获失败了。
总结
重复前导码A|A同时提供了两类信息:相关强度|[P]n]|帮助找到训练段,相关相位<P[n]估计频偏。接收端据此先完成粗频偏校正,再将残余误差交给Costas环精细跟踪。
下一步可以继续利用已知前导码寻找最佳采样相位,让它在载波捕获之外,再辅助Gardner完成定时恢复。