前言
在上小节基于P201Pro | 接收端基础知识------从QPSK点簇到bit流:硬判决、解映射与相位校正实测(5)中载波和定时都锁住了, 但在上一篇的最后,我们仍然遇到了QPSK星座整体旋转的问题。当时采用乘以固定常数的方式进行了校正,如下图所示。

甚至可以说不是解决方式,而是看出来而已。今天我们来解决这个问题。 现在处理这种相位旋转一般有两种方式:
-
DQPSK差分编码:不关心绝对相位,只利用相邻符号的相位差。
-
前导码辅助校正:利用已知前导码判断星座旋转了哪个象限,再自动乘以 、、、。
本文就是来讨论这两种方式的。
方法一:DQPSK------不判断绝对方向,只判断相位变化
普通QPSK把两位bit直接映射到一个绝对相位。例如我们约定右上角表示00、左上角表示01。但Costas环只能把星座锁成四个点簇,无法判断哪个点簇才是发送端规定的右上角。因此,星座即使整体旋转、或,环路仍然认为自己已经锁定。
DQPSK换了一种思路:不让当前符号的绝对方向直接表示bit,而让它相对前一个符号转过的角度表示bit。 例如可以约定:
| 输入bit | 相邻符号的相位变化 |
|---|---|
00 |
|
01 |
|
11 |
|
10 |
设第组bit对应的相位增量编号为,发送符号的相位编号为,则差分编码可以写成:
接收端再用相邻两个符号相减:
假设Costas环产生了个的固定旋转,那么接收端看到的是:
代入差分解码公式可得:
前后两个符号携带了相同的旋转,相减后它自然被抵消。用复数形式表示更加直接。若接收符号为,则:
这里与相消,所以无论四个点簇整体转到哪个象限,相邻符号的相位差都没有改变。

上图中,右图的两个符号相对左图整体旋转了,但"前一符号到当前符号"的相位变化仍然是。DQPSK正是利用这个不变量恢复bit。
不过,DQPSK并没有真的把星座转回原来的方向,它只是绕开了绝对相位问题。因此它有三个需要注意的地方:
-
收发两端都要增加差分编码和差分解码,系统使用的不再是普通QPSK映射;
-
一个符号同时参与前后两次差分,某个符号判错时可能影响相邻两组bit;
-
它只能抵消相邻符号间近似不变的公共相位,不能代替FLL和Costas环去纠正持续变化的频偏。
差分编码的GNU Radio验证

在gnuradio中有我们需要的差分编码模块,直接拖动就行,得到的效果如下:

至于中间为啥会空一段,这是因为我先加了前导码字,这里搜索的是不包含前导码字的部分。
-
星座整体旋转是仍然存在;
-
差分解码后的bit恢复正确;
-
DQPSK并没有把星座转正,却依然能够正确恢复bit。
方法二:前导码辅助校正------主动找回QPSK的绝对方向
DQPSK选择忽略绝对方向,前导码方法则相反:发送一段收发双方都知道的符号,让接收机根据这段"标准答案"判断星座到底转了多少。
例如,在每帧有效数据前加入固定前导码:

接收端保存同一组本地前导符号。Costas环输出已经形成四个点簇,只是可能存在的整体旋转。此时在接收序列上滑动计算复相关:
这个式子同时提供两类信息:
-
表示接收片段与前导码有多相似,用来寻找前导码位置;
-
表示接收前导码相对本地前导码旋转了多少,用来估计相位。
如果窗口正好对准前导码,并暂时忽略噪声,则,所以:
单位幅度QPSK符号满足,因此:
也就是说,正确位置上的相关结果会形成一根很长的向量:它的长度接近,方向就是待校正的相位。如果窗口没有对准前导码,各项方向杂乱,相加后就会相互抵消。

为了避免接收幅度变化直接影响门限,实际判断时可以使用归一化相关值:
的范围约为。当它超过门限时,可以认为前导码被找到;随后将相关相位量化到最近的:
最后让前导码之后的符号统一乘以:
四种象限模糊对应的校正系数如下:
| 检测到的整体旋转 | 接收端乘数 |
|---|---|

图中接收信号整体旋转了。相关值在前导码位置出现明显峰值,同时给出接近的相位估计;接收端从此处开始乘以,四个点簇便恢复到发送端约定的方向。之后再进行硬判决和bit解映射,得到的bit顺序才与发送端一致。
这里有一个容易混淆的地方:前导码相关并不是直接替代Costas环。在本文的处理顺序中,Costas环先消除连续变化的残余频偏和相位误差,使星座稳定为四个点簇;前导码模块再解决Costas环无法区分的、、和象限模糊。因此当前接收链可以写成:

前导码方法也有代价:它会占用一部分发送时间,而且接收机必须先完整收到前导码才能得到可靠的相关结果。通常让校正系数作用于前导码之后的有效载荷;下一帧到来时再重新检测和更新,从而跟踪可能发生的重新锁定或相位跳变。
前导辅助的GNU Radio验证
设计一个简单的帧结构如下:

发射端不变,发出信号如下图:

搜索部分是前导码:
11100001010110101110100010010011
接收端根据上面理论写了个模块:

用于估计这个QPSK的相位,并且做出旋转,流图和运行结果如下图:

两种方法怎么选择
| 对比项 | DQPSK差分方式 | 前导码辅助校正 |
|---|---|---|
| 基本思路 | 只判断相邻符号的相位变化 | 用已知符号找回绝对方向 |
| 是否恢复星座绝对方向 | 否 | 是 |
| 是否改变数据编码方式 | 是,收发两端都要差分处理 | 否,仍可保留原QPSK映射 |
| 额外开销 | 需要参考符号或初始状态 | 每帧需要发送前导码 |
| 判错影响 | 可能影响相邻两次差分 | 一般不产生差分式误差传播 |
| 能否提供帧位置 | 不能 | 可以 |
| 后续扩展 | 主要解决相位模糊 | 可继续辅助载波同步和定时同步 |
如果只希望避开QPSK象限模糊,且不关心绝对相位,DQPSK结构更直接;对于本文正在搭建的分帧QPSK收发系统,前导码更合适。它不仅能纠正当前的相位旋转,还给接收机提供了一个明确的帧起点。
实验环境介绍
收发设备还是下面这个结构:

设备如下:

总结:前导码的作用还没有结束
面对Costas环锁定后仍可能出现的整数倍旋转,DQPSK和前导码代表了两种不同思路:前者让信息只依赖相位变化,从而绕开绝对方向;后者利用已知符号估计旋转角度,再把星座主动转回发送端的映射方向。
本文暂时只把前导码用在Costas环之后,用于帧检测和象限校正。但前导码既然是一段已知波形,就不只能回答"这一帧在哪里、星座转了哪个象限",还可以进一步参与频偏估计、载波捕获和定时位置估计。下一篇将继续讨论:怎样让前导码从"相位校正依据"进一步变成接收机的同步辅助信号。