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)))。用这个误差去更新相位估计θ(k1) θ(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)对应的符号以此类推。这个判决规则非常简单本质上就是看接收点在哪个象限。但前提是相位已经校正好了点簇已经转回理想位置附近。如果相位没校正点簇整体旋转判决门限就不对了。实测中我建议在判决之前先看一下星座图确认四个点簇分别位于四个象限的中心附近。如果点簇偏了先调相位校正不要急着调判决门限。判决门限本身不需要调它就是I0和Q0两条线。4.2 硬判决与软判决的区别这里顺便说一下硬判决和软判决的区别。硬判决直接输出符号也就是四个点中的一个每个符号对应2个比特。软判决不直接输出符号而是输出每个比特的对数似然比也就是这个比特是0还是1的概率信息。软判决保留了更多的信息后续如果接信道译码性能会更好。但在P201Pro上做实时处理硬判决计算量小、实现简单适合作为第一版验证。如果你后续要接卷积码或者LDPC译码可以考虑把硬判决换成软判决但那是另一个话题了。这篇文章先把硬判决讲透。4.3 判决错误的典型表现硬判决出错的时候星座图上会看到一些点落在了判决门限的另一侧。如果只是偶尔几个点出错那是噪声引起的随机误码。如果大量点出错而且出错的方向有规律那通常是相位校正没做好或者符号定时不准。我实测中遇到过一个典型情况星座图看起来四个簇很清楚但解出来的比特流误码率很高。后来发现是符号定时偏了半个符号周期采样点落在了两个符号之间导致点簇虽然看起来清楚但实际上每个采样点都是相邻两个符号的混合。这种情况下硬判决会频繁出错而且错误模式很有规律。解决办法是重新做符号定时同步确保采样点落在符号中心。5. 解映射从符号到比特的顺序问题5.1 格雷码映射规则硬判决输出的是符号比如(1,1)这个符号但它对应哪两个比特这取决于发射端用的映射规则。最常见的映射是格雷码映射规则如下符号IQ比特对S01100S1-1101S2-1-111S31-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变成1101变成10。这是典型的符号判决错误判决到了对角线的符号上。对角线符号之间差两个比特所以会成对出错。排查思路检查相位校正是否准确点簇是否偏离了理想位置。如果点簇偏了硬判决可能判到对角线符号上。另外检查判决门限是否被意外修改门限应该就是I0和Q0。6.5 相位模糊导致整体比特翻转解出来的比特流和发射端完全一样但整体翻转了比如00变成1101变成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 幅度归一化硬判决的判决门限是I0和Q0这个门限和幅度无关。但如果接收信号的幅度太小量化噪声会变大如果幅度太大可能会饱和。实测中建议在硬判决之前做幅度归一化把接收符号的平均幅度归一化到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接收端其实不复杂核心就是相位校正、硬判决、解映射三个环节。每个环节的原理都不难难的是实测中的细节处理。把细节处理好了误码率自然就下来了。
阅读完成 · 觉得有帮助?