☰
QPSK接收链路实战:从星座图到比特流的相位校正、硬判决与解映射
2026/10/28 1:02:23 网站建设 项目流程

1. 从星座图上的四个点到一串比特:接收链路到底在做什么

如果你手上有一台P201Pro,或者任何一套软件无线电平台,把发射端调通之后,最兴奋的时刻往往不是看到频谱上出现一根漂亮的尖峰,而是第一次从接收端解出一串正确的比特流。但很多人卡在中间那一步:频谱看到了,星座图也出来了,四个点簇清清楚楚,可就是不知道接下来怎么把这四个点变成0和1。这篇文章就是来解决这个问题的。

QPSK(正交相移键控)是数字通信里最经典的调制方式之一,每个符号携带2个比特,星座图上只有四个点,分别对应00、01、10、11四种符号。看起来简单,但从接收端拿到基带采样,到最终输出比特流,中间要经过相位校正、硬判决、解映射三个关键环节。任何一个环节出问题,你拿到的比特流就是错的,而且错得很有规律——要么整体翻转,要么成对出错,要么随机乱跳。

这篇文章适合两类人:一类是刚接触软件无线电和数字通信的工程师或学生,手上有P201Pro这类平台,想把接收链路完整跑通;另一类是做基带算法验证的从业者,需要一套可复现的QPSK接收端处理流程作为参考基线。我会从星座图上的点簇讲起,把硬判决的判决门限怎么定、解映射的比特顺序怎么排、相位模糊怎么校正,全部拆开讲清楚,并且给出实测中会遇到的坑和对应的处理办法。

整篇内容围绕一条完整的接收链路展开:基带采样 → 相位校正 → 硬判决 → 解映射 → 比特流输出。每一步我都会说明为什么这么做、参数怎么选、实测中会看到什么现象。你跟着走一遍,应该能把自己手上的QPSK接收链路跑通,并且知道出了问题该往哪个方向排查。

2. QPSK星座图的四个点簇:理想与现实的差距

2.1 理想星座图长什么样

QPSK的星座图在理论上非常干净:四个点分别位于I-Q平面的四个象限,坐标是(1,1)、(-1,1)、(-1,-1)、(1,-1),归一化之后每个点的幅度都是1,相邻点之间的相位差是90度。每个点代表一个符号,每个符号携带2个比特。常见的映射方式是格雷码映射,相邻点之间只差一个比特,这样即使判决到相邻点,也只会错一个比特,降低误比特率。

理想情况下,接收端经过载波同步和符号定时之后,每个符号周期采样一次,得到的点应该精确落在四个理想位置上。但实际接收到的信号经过信道之后,会引入噪声、相位偏移、幅度不平衡,星座图上的点就不再是一个个理想的点,而是一簇一簇的散点。这就是所谓的“点簇”。

2.2 实测中看到的点簇形态

在P201Pro上实测,如果发射端和接收端直连或者经过短距离电缆连接,信噪比很高,你会看到四个非常紧凑的点簇,每个簇的半径很小,簇与簇之间分得很开。这时候硬判决几乎不会出错,解出来的比特流和发射端完全一致。

但随着信噪比降低,或者信道引入相位旋转,点簇会发生变化。我实测中见过几种典型形态:

第一种是点簇整体旋转。四个簇还在,但整体绕原点转了一个角度。这是因为接收端和发射端之间存在载波相位偏差,或者信道引入了相位偏移。如果不做相位校正,硬判决的判决门限就会偏,导致大量误判。

第二种是点簇扩散。每个簇的半径变大,簇与簇之间开始重叠。这是噪声引起的,信噪比越低,扩散越严重。当簇与簇之间的重叠区域大到一定程度,硬判决就会频繁出错。

第三种是I/Q不平衡导致的椭圆化。点簇不再是圆形,而是被拉成椭圆,四个簇的分布也不再对称。这是接收端I路和Q路的增益或相位不一致造成的,需要做I/Q不平衡校正。

第四种是相位模糊。QPSK有一个固有的问题:由于星座图具有90度旋转对称性,接收端可能锁定在四个相位中的任意一个上。也就是说,你解出来的星座图可能是正确的,但整体转了90度、180度或270度。这时候硬判决本身没问题,但解映射出来的比特会整体错位。

2.3 从点簇到判决:为什么不能直接取符号

有人可能会想,既然四个理想点的位置是已知的,那我直接看接收到的点离哪个理想点最近,就判成哪个符号,不就完了?这个思路本身没错,这就是硬判决的核心思想。但问题在于,实际接收到的点不是理想点,而是带有噪声和相位偏移的点簇。如果你不先做相位校正,直接用理想位置去比较,那点簇整体旋转之后,最近的理想点可能就变成了错误的那个。

所以完整的流程必须是:先做相位校正,把点簇转回理想位置附近,再做硬判决,最后解映射。顺序不能乱。我见过有人先判决再校正,结果怎么调都不对,就是因为判决本身已经错了,后面再校正也没有意义。

3. 相位校正:把旋转的点簇转回来

3.1 相位偏差从哪里来

相位偏差的来源主要有三个。第一个是发射端和接收端的载波频率不完全一致,导致接收到的信号有一个缓慢旋转的相位。第二个是信道引入的相位偏移,比如电缆长度、滤波器群时延等。第三个是接收端下变频时本地振荡器的初始相位不确定。

在P201Pro这类平台上,如果你用的是零中频架构,相位偏差主要来自载波频偏和初始相位。频偏会导致星座图持续旋转,初始相位则是一个固定的旋转量。实测中,如果频偏没有完全校正,你会看到星座图上的点簇在慢慢转圈,这时候硬判决会时对时错。

3.2 基于判决反馈的相位校正思路

相位校正的方法有很多,这里讲一种最直观、最容易在P201Pro上实现的:基于判决反馈的相位校正。思路很简单:先用当前的相位估计值对接收符号做旋转,然后做硬判决,得到判决符号,再用判决符号和旋转后的接收符号之间的相位差来更新相位估计值。这是一个闭环跟踪的过程。

具体来说,假设接收到的第k个符号是r(k),当前的相位估计是θ(k),那么校正后的符号是r'(k) = r(k) * exp(-jθ(k))。然后对r'(k)做硬判决,得到判决符号d(k)。判决符号和r'(k)之间的相位差是e(k) = angle(d(k) * conj(r'(k)))。用这个误差去更新相位估计:θ(k+1) = θ(k) + μ * e(k),其中μ是步长因子。

这个方法的优点是简单、计算量小,适合在P201Pro上实时运行。缺点是在信噪比很低的时候,硬判决本身容易出错,导致相位跟踪失锁。所以实际使用中,通常先用一段已知的前导序列做粗相位估计,然后再切换到判决反馈模式做细跟踪。

3.3 步长因子的选择与实测效果

步长因子μ的选择很关键。μ太大,相位跟踪速度快,但稳态误差大,星座图上的点簇会抖动;μ太小,跟踪速度慢,如果频偏较大,可能跟不上。我实测下来,对于P201Pro上常见的几百赫兹到几千赫兹的残余频偏,μ取0.01到0.05之间比较合适。如果频偏更大,建议先用FFT或者相关法做粗频偏估计和校正,把残余频偏降到几百赫兹以内,再用判决反馈做细跟踪。

实测中还有一个细节:相位校正最好在符号定时之后做。如果符号定时不准,采样点没有落在最佳采样时刻,点簇本身就会扩散,相位校正的效果也会打折扣。所以完整的顺序是:符号定时 → 相位校正 → 硬判决 → 解映射。

3.4 相位模糊的处理

前面提到QPSK有90度相位模糊。判决反馈相位校正本身不能解决模糊问题,因为它只能跟踪相位变化,不能判断绝对相位。解决模糊通常有两种方法:一种是利用前导序列,在帧头放一段已知的符号,接收端通过相关或者最大似然估计来确定绝对相位;另一种是差分编码,在发射端对符号做差分处理,接收端通过相邻符号的相位差来解调,这样就不需要绝对相位信息。

在P201Pro上,如果你用的是突发模式传输,建议用前导序列做绝对相位估计。如果用的是连续模式,差分编码更省事。我实测中两种都用过,前导序列的方式误码率更低,但需要额外的帧头开销;差分编码不需要帧头,但误码率会略高一点,因为差分译码会传播错误。

4. 硬判决:怎么把点判成符号

4.1 硬判决的判决门限

硬判决的核心是判决门限。对于QPSK,四个理想点位于(1,1)、(-1,1)、(-1,-1)、(1,-1),判决门限就是I轴和Q轴。具体来说,如果接收到的点I分量大于0且Q分量大于0,就判为(1,1)对应的符号;如果I小于0且Q大于0,就判为(-1,1)对应的符号;以此类推。

这个判决规则非常简单,本质上就是看接收点在哪个象限。但前提是相位已经校正好了,点簇已经转回理想位置附近。如果相位没校正,点簇整体旋转,判决门限就不对了。

实测中,我建议在判决之前先看一下星座图,确认四个点簇分别位于四个象限的中心附近。如果点簇偏了,先调相位校正,不要急着调判决门限。判决门限本身不需要调,它就是I=0和Q=0两条线。

4.2 硬判决与软判决的区别

这里顺便说一下硬判决和软判决的区别。硬判决直接输出符号,也就是四个点中的一个,每个符号对应2个比特。软判决不直接输出符号,而是输出每个比特的对数似然比,也就是这个比特是0还是1的概率信息。软判决保留了更多的信息,后续如果接信道译码,性能会更好。

但在P201Pro上做实时处理,硬判决计算量小、实现简单,适合作为第一版验证。如果你后续要接卷积码或者LDPC译码,可以考虑把硬判决换成软判决,但那是另一个话题了。这篇文章先把硬判决讲透。

4.3 判决错误的典型表现

硬判决出错的时候,星座图上会看到一些点落在了判决门限的另一侧。如果只是偶尔几个点出错,那是噪声引起的随机误码。如果大量点出错,而且出错的方向有规律,那通常是相位校正没做好,或者符号定时不准。

我实测中遇到过一个典型情况:星座图看起来四个簇很清楚,但解出来的比特流误码率很高。后来发现是符号定时偏了半个符号周期,采样点落在了两个符号之间,导致点簇虽然看起来清楚,但实际上每个采样点都是相邻两个符号的混合。这种情况下,硬判决会频繁出错,而且错误模式很有规律。解决办法是重新做符号定时同步,确保采样点落在符号中心。

5. 解映射:从符号到比特的顺序问题

5.1 格雷码映射规则

硬判决输出的是符号,比如(1,1)这个符号,但它对应哪两个比特?这取决于发射端用的映射规则。最常见的映射是格雷码映射,规则如下:

符号IQ比特对
S01100
S1-1101
S2-1-111
S31-110

这个表的意思是:如果判决到符号(1,1),输出比特00;如果判决到(-1,1),输出比特01;以此类推。注意格雷码的特点是相邻符号之间只差一个比特,比如S0(00)和S1(01)只差第二个比特,S1(01)和S2(11)只差第一个比特。这样即使判决到相邻符号,也只会错一个比特。

5.2 比特顺序:MSB先还是LSB先

解映射的时候有一个很容易踩的坑:比特顺序。上面的表里,比特对是“第一个比特,第二个比特”,但实际传输的时候,哪个比特先传?是I路对应的比特先,还是Q路对应的比特先?这个顺序如果搞反了,解出来的比特流就会成对交换,误码率看起来很高,但其实只是顺序问题。

在P201Pro上,我建议先用一段已知的测试序列来验证比特顺序。比如发射端发送比特序列00 01 10 11,接收端解出来看看是不是这个顺序。如果不是,调整解映射的比特顺序,直到对上为止。这个步骤看起来简单,但实测中很多人卡在这里,因为误码率很高的时候,很难判断是判决错了还是顺序错了。

5.3 解映射的代码实现

在P201Pro上,解映射通常用一段简单的查表或者条件判断来实现。下面是一个Python示例,假设已经完成了硬判决,得到了符号索引:

# 假设 symbols 是硬判决后的符号索引,0对应(1,1),1对应(-1,1),2对应(-1,-1),3对应(1,-1) # 格雷码映射表 gray_map = { 0: (0, 0), # (1,1) -> 00 1: (0, 1), # (-1,1) -> 01 2: (1, 1), # (-1,-1) -> 11 3: (1, 0), # (1,-1) -> 10 } bits = [] for s in symbols: b1, b2 = gray_map[s] bits.append(b1) bits.append(b2)

这段代码的逻辑很直接:先硬判决得到符号索引,然后查表得到对应的两个比特,按顺序拼成比特流。实测中,这段代码在P201Pro上跑起来毫无压力,计算量可以忽略不计。

5.4 解映射后的比特流验证

解映射得到比特流之后,怎么验证对不对?最直接的方法是和发射端的原始比特流做对比,统计误码率。如果误码率是0,说明整条链路都对了。如果误码率很高,但星座图看起来没问题,那就要检查比特顺序和映射规则。

我实测中遇到过一个情况:星座图四个簇很清楚,硬判决也没问题,但误码率一直在25%左右。后来发现是解映射的比特顺序反了,把I路和Q路的比特交换了。交换回来之后,误码率直接降到0。这个坑很隐蔽,因为25%的误码率看起来像是噪声引起的,但实际上只是顺序问题。

6. 实测中的典型问题与排查链路

6.1 星座图旋转但点簇清晰

这是最常见的问题。星座图上四个簇很清楚,但整体转了一个角度。这时候硬判决会大量出错,因为判决门限偏了。排查思路:先检查相位校正模块是否开启,步长因子是否合适。如果相位校正开了但还是转,检查频偏是否太大,判决反馈跟踪不上。解决办法:先用前导序列做粗相位估计,把初始相位偏差消掉,再开判决反馈做细跟踪。

6.2 点簇扩散严重

点簇半径很大,簇与簇之间开始重叠。这是信噪比太低的表现。排查思路:先确认发射功率是否足够,信道衰减是否太大。如果信噪比确实低,可以考虑增加发射功率,或者换用更低的码率。如果信噪比不低但点簇还是扩散,检查符号定时是否准确,采样点是否落在符号中心。符号定时偏了会导致点簇扩散,看起来像噪声,但实际上是定时问题。

6.3 误码率随相位缓慢变化

误码率不是固定的,而是随着时间缓慢变化,有时候好有时候坏。这通常是残余频偏引起的。频偏导致星座图缓慢旋转,相位校正跟踪不上的时候误码率就高,跟踪上了误码率就低。排查思路:用FFT或者相关法估计频偏,把频偏校正到几百赫兹以内。如果频偏本身就在几百赫兹以内,检查相位校正的步长因子是否太小,跟踪速度不够。

6.4 解映射后比特成对出错

误码率统计显示,错误总是成对出现,比如00变成11,01变成10。这是典型的符号判决错误,判决到了对角线的符号上。对角线符号之间差两个比特,所以会成对出错。排查思路:检查相位校正是否准确,点簇是否偏离了理想位置。如果点簇偏了,硬判决可能判到对角线符号上。另外检查判决门限是否被意外修改,门限应该就是I=0和Q=0。

6.5 相位模糊导致整体比特翻转

解出来的比特流和发射端完全一样,但整体翻转了,比如00变成11,01变成10。这是相位模糊引起的,接收端锁定了错误的相位。排查思路:检查前导序列的相位估计是否正确,或者检查差分编码是否开启。如果是前导序列方式,确认前导序列在接收端被正确识别;如果是差分编码,确认差分译码的逻辑是否正确。

7. 在P201Pro上跑通整条链路的实操建议

7.1 先用仿真验证算法

在P201Pro上跑之前,建议先在Python或者MATLAB上做仿真。仿真的时候可以精确控制信噪比、频偏、相位偏差,观察每个环节的输出。仿真跑通了,再到P201Pro上做实测,这样排查问题的时候心里有底。我自己的习惯是先在Python上把整条链路写一遍,包括相位校正、硬判决、解映射,然后用仿真数据验证误码率曲线。仿真误码率和理论值对上了,再上硬件。

7.2 分步验证,不要一次跑通

实测的时候不要想着一次把整条链路跑通。建议分步验证:先看星座图,确认点簇形态正常;再看相位校正后的星座图,确认点簇转回了理想位置;然后看硬判决输出的符号,和发射端对比;最后看解映射后的比特流,统计误码率。每一步都确认对了,再走下一步。这样出问题的时候,很容易定位到是哪个环节的问题。

7.3 保存中间数据便于分析

P201Pro上跑实时处理的时候,建议把中间数据保存下来,比如相位校正前的符号、相位校正后的符号、硬判决输出的符号、解映射后的比特流。这样出问题的时候可以离线分析,不用反复跑实时。我实测中习惯把每个环节的数据存成文件,然后用Python脚本做误码率统计和星座图绘制。这样效率高很多。

7.4 注意采样率和符号率的匹配

P201Pro的采样率和符号率要匹配好。如果采样率是符号率的整数倍,符号定时会简单很多。比如采样率是符号率的4倍,那每个符号有4个采样点,符号定时只需要在这4个点里选一个最佳采样点。如果采样率和符号率不是整数倍关系,就需要做插值,复杂度会高一些。实测中建议先用整数倍关系跑通,再考虑非整数倍的情况。

7.5 相位校正和符号定时的顺序

前面提到过,相位校正最好在符号定时之后做。但实测中,如果符号定时本身依赖相位信息,那可能需要联合处理。在P201Pro上,我建议先用非数据辅助的符号定时算法(比如Gardner算法)做定时,然后再做相位校正。Gardner算法不依赖相位信息,适合在相位未校正的时候使用。定时做好了,相位校正会容易很多。

8. 几个容易被忽略的细节

8.1 直流偏移的影响

接收端的I路和Q路可能存在直流偏移,导致星座图整体平移。直流偏移会让点簇偏离理想位置,硬判决出错。实测中,建议在相位校正之前先做直流偏移估计和去除。方法很简单:计算接收符号的均值,然后减去这个均值。注意要在相位校正之前做,因为相位校正会改变符号的分布。

8.2 幅度归一化

硬判决的判决门限是I=0和Q=0,这个门限和幅度无关。但如果接收信号的幅度太小,量化噪声会变大;如果幅度太大,可能会饱和。实测中建议在硬判决之前做幅度归一化,把接收符号的平均幅度归一化到1附近。这样判决门限不变,但量化噪声最小。

8.3 符号定时误差的累积

如果符号定时有固定误差,比如采样点总是偏后半个符号周期,那点簇会扩散,硬判决会出错。这种误差不会自己消失,需要显式校正。实测中,建议用早迟门或者Gardner算法做定时误差检测和校正,确保采样点落在符号中心。

8.4 解映射的比特顺序验证

前面提到过比特顺序的问题,这里再强调一下。解映射的比特顺序一定要用已知序列验证。我实测中习惯在发射端发送一段固定的测试序列,比如00011011,接收端解出来看看是不是这个序列。如果不是,调整比特顺序。这个步骤花不了几分钟,但能避免后面大量的排查时间。

8.5 误码率统计的样本量

统计误码率的时候,样本量要足够大。如果只统计几百个比特,误码率的随机性很大,可能这一秒是0,下一秒是10%。建议至少统计10万个比特以上,这样误码率才有统计意义。P201Pro上跑实时处理的时候,可以连续跑几分钟,累计足够的样本再统计。

9. 从硬判决到软判决的扩展思路

硬判决跑通之后,如果你后续要接信道译码,可以考虑把硬判决换成软判决。软判决不直接输出符号,而是输出每个比特的对数似然比。对于QPSK,每个符号对应2个比特,软判决需要计算每个比特为0和为1的概率比。

具体来说,假设接收到的符号是r,噪声方差是σ²,那么比特b1为0的对数似然比是:

LLR(b1) = (2/σ²) * Re(r)

比特b2为0的对数似然比是:

LLR(b2) = (2/σ²) * Im(r)

这个公式的推导这里不展开,但结论很直观:软判决的信息就是接收符号的实部和虚部,乘以一个缩放因子。硬判决相当于对LLR取符号,软判决保留了幅度信息。

在P201Pro上实现软判决,计算量比硬判决大一些,但也不算复杂。如果你后续要接卷积码或者LDPC译码,软判决能带来明显的性能提升。不过这是另一个话题了,这篇文章先把硬判决讲透,软判决可以作为下一步的扩展方向。

10. 个人实操中的几点体会

我在P201Pro上跑QPSK接收链路,前后踩了不少坑,这里分享几点体会。

第一,星座图是最好的调试工具。不管哪个环节出问题,先看星座图。点簇清晰不清晰、旋转没旋转、扩散没扩散,一眼就能看出来。我习惯在相位校正前后都画星座图,对比着看,很容易判断相位校正有没有生效。

第二,已知序列是最好的验证手段。发射端发一段已知的比特序列,接收端解出来对比,误码率是0就说明链路通了。如果误码率不是0,再逐步排查。这个方法比盲调高效得多。

第三,分步验证比一次跑通更省时间。很多人想一次把整条链路跑通,结果出了问题不知道是哪个环节。分步验证虽然看起来慢,但每一步都确认对了,后面出问题的概率小很多,总体反而更快。

第四,保存中间数据。P201Pro上跑实时处理的时候,中间数据转瞬即逝,出问题了很难复现。把中间数据存下来,离线分析,效率高很多。

第五,相位校正的步长因子要调。不同的频偏和信噪比,最优步长因子不一样。实测中建议多试几个值,看星座图和误码率的变化。步长因子调好了,相位跟踪又稳又快。

第六,不要忽略直流偏移和幅度归一化。这两个步骤看起来简单,但不做的话,星座图会偏,硬判决会出错。实测中建议把这两个步骤作为标准流程的一部分。

第七,比特顺序一定要验证。这个坑很隐蔽,误码率看起来很高,但其实就是顺序问题。用已知序列验证一下,几分钟的事,能省很多排查时间。

整条链路跑通之后,你会发现QPSK接收端其实不复杂,核心就是相位校正、硬判决、解映射三个环节。每个环节的原理都不难,难的是实测中的细节处理。把细节处理好了,误码率自然就下来了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询