ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

载波相位同步详解:从锁相环原理到QPSK/QAM工程实践

载波相位同步详解:从锁相环原理到QPSK/QAM工程实践 如果你做过QPSK或者更高阶QAM的接收机一定有过这种经历明明匹配滤波器和定时同步都调好了眼图张开得也不错星座图却老是像坐在转盘上一样慢慢打转或者四个簇旋转成一个模糊的圆圈。这时候老工程师通常会瞄一眼然后丢给你一句话“你该做载波相位同步了。”这个系列聊到第四篇前几次讲匹配滤波和定时同步的时候我都尽量把数学压到最低用工程直觉把事情讲清楚。今天轮到载波相位同步这绝对是接收机同步链路里最容易让人“血压升高”的一环因为它往往不是单点问题而是和频率同步、定时同步、环路带宽、调制阶数全部纠缠在一起。这篇文章我会从“相位到底是怎么丢的”说起然后拆一拆锁相环的基本原理再把平方环、Costas环、判决反馈环和数据辅助这些常用结构放在一起做一次工程选型对比最后用我实际调试一个小型QPSK链路的排障记录把那些课堂上不会明说、但会让星座图瞬间“翻车”的细节都过一遍。不管你是刚接触调制解调器的小白还是已经在FPGA/软件无线电上被相位同步折磨过的开发应该都能在里面找到点有用的东西。1. 为什么接收机要专门去“补”相位1.1 载波相位是从哪一步开始丢的很多初学者会把“载波相位”理解成一个固定角度偏差觉得只要在接收端做一次旋转补偿就行。但实际情况要麻烦得多。发射端本振和接收端本振是两个完全独立的振荡器哪怕标称频率都是2.4GHz实际频率也不可能完全一致频率差个几十赫兹到几百赫兹都很正常。这就要命了。频率误差在基带看起来不是简单的固定偏角而是一个随时间不断增长的相位偏移。举个最直白的例子发射端发了一个相角为0的符号接收端下变频后看到的是这个相位加上一个随时间变化的偏移量比如每秒转过多少个角度。于是星座图就会匀速打转而不是静止偏转。这个等效相位可以用一个简单模型写出来[ \theta(t) 2\pi \Delta f \cdot t \theta_0 ]其中 (\Delta f) 是收发本振之间的频率残差(\theta_0) 是初始随机相位。换句话说载波相位同步要干的事不仅仅是“掰正一个角度”还得“追上一个正在变化的角度”。另外信道本身也会给载波相位添乱。信号经过多径传播、反射、折射最后叠加出来的相位是路径时延和幅度共同作用的结果。移动场景下还有多普勒频移相位变化更快也更猛。这些都会让星座图从理想格点变成一团不断旋转的“星系”。1.2 相位误差到底会造成多大的影响我见过不少新手觉得“反正有判决器差一点点应该没关系”。这个想法在BPSK下勉强成立到了QPSK就开始危险到了16QAM、64QAM基本就是噩梦。可以做一个非常粗略的容忍度估计。QPSK相邻星座点之间的相位差是90度判决边界在45度理论上只要相位误差不超过45度就不会错判。但实际上符号点还叠加了噪声一旦相位误差超过十几二十度误码率就会迅速抬头。64QAM更夸张相邻星座点之间的最小角度可能只有几度相位抖动稍微大一点误差矢量幅度EVM就会超出指标解调出来的比特错误率直接崩掉。我这里列一个经验参考值注意不是理论极限而是工程上做链路预算时常用的“手感”数值调制方式可容忍的残余相位误差经验值说明BPSK约30度误码率恶化不明显甚至不一定要载波相位同步QPSK约10度1% EVM附近开始明显恶化16QAM约5度需要较好的环路跟踪64QAM约2-3度相位噪声和环路抖动都必须严格约束所以相位的坑不是“有没有同步”的问题而是“同步到什么精度”的问题。低阶调制可能靠差分编码硬扛高阶QAM则必须把残余相位压得很低否则后续的均衡器和译码器全都会跟着遭殃。1.3 相位同步在接收机链路里的位置现在的数字接收机中载波同步一般不会单独出现它和自动增益控制AGC、定时同步、均衡器、帧同步往往是联动的。最常见的链路顺序是射频前端 - ADC - 数字下变频 - 匹配滤波 - 定时同步 - 载波同步 - 均衡/解映射 - 信道译码。但这不是绝对的。有些系统把载波同步放在定时同步前面先做粗频率校正再定符号也有些系统把两者放在同一个迭代环路里。我个人的习惯是如果有较大的残余频偏先做一次粗频偏估计把频偏压到符号速率的1%以下再交给锁相环做精细的相位跟踪。这样会比让锁相环直接去拉一个大频偏可靠得多。2. 锁相环这个“老古董”仍是相位同步的绝对主力2.1 一个最小锁相环里都有什么载波相位同步的核心几乎都是锁相环不管是模拟的还是数字的。最小闭环由三部分组成鉴相器、环路滤波器、压控/数控振荡器。你可以把它想成开车时调整方向盘的过程鉴相器负责看“车头偏了没”环路滤波器决定“偏这么大该用多大力度回方向盘”振荡器就是那台执行“回方向”的车。在数字实现里鉴相器计算当前接收符号和本地参考之间的相位差输出一个误差信号环路滤波器把这个误差信号积分、滤波控制数控振荡器NCO的相位或频率NCO再给出一个本地载波相位去旋转接收信号。只要环路极性正确、增益合适误差信号会一点点被压小最后锁在一个相对稳定的工作点上。这个闭环看起来简单但真正设计起来问题全在三个部分之间怎么“配合”。2.2 为什么一阶环不够至少得上二阶这里的关键概念是“稳态相位误差”。一阶锁相环里环路滤波器只是一个纯比例增益它对固定相位偏差能收敛但对固定频率偏差很吃力。因为一阶环对于频率阶跃输入会有残余相位误差残留大小取决于增益压不下去就会导致星座图始终“歪”着一个角度。如果我们把环路滤波器改成“比例积分”也就是经典二阶环那么情况就不同了。积分项可以把过去所有误差慢慢累积起来最终把频率阶跃引起的稳态相位误差压到零。这就是工程中绝大多数载波同步环路都选二阶甚至更高阶的原因。二阶环路的动态行为由两个参数决定自然角频率 (\omega_n) 和阻尼系数 (\zeta)。环路等效噪声带宽为[ B_L \frac{\omega_n}{2} \left( \zeta \frac{1}{4\zeta} \right) ]阻尼系数取0.707附近时环路收敛速度和过冲之间比较平衡。这个值不是玄学而是二阶系统数学上的最优折中很多工程实现就直接固定用0.707。2.3 从模拟参数到数字系数一个可以照抄的作业到了数字域环路滤波器一般是一个比例积分结构用两个系数 (C_1)、(C_2) 来控制。很多书上直接给出公式但真正落地时还要考虑鉴相器增益和NCO增益。这里我给一个我在仿真里常用的设计流程假设环路更新周期是符号周期 (T_s)鉴相器增益是 (K_d)NCO增益是 (K_0)一般取 (2\pi) 弧度/单位控制字根据链路需求确定环路等效噪声带宽 (B_L)比如符号速率的 (10^{-3}) 量级。给定阻尼系数 (\zeta)反推 (\omega_n \frac{2B_L}{\zeta 1/(4\zeta)})。计算环路滤波器系数(C_1 \frac{2\zeta \omega_n T_s}{K_d K_0})(C_2 \frac{(\omega_n T_s)^2}{K_d K_0})。用Python写出来也就几行import math def pll_coeffs(BL, Ts, zeta0.707, Kd1.0, K02*math.pi): omega_n 2 * BL / (zeta 0.25 / zeta) C1 2 * zeta * omega_n * Ts / (Kd * K0) C2 (omega_n * Ts) ** 2 / (Kd * K0) return C1, C2 # 例子符号速率 1 Msps环路带宽 1 kHz Ts 1e-6 C1, C2 pll_coeffs(BL1e3, TsTs) print(C1, C2)有个很重要的经验(C_1) 和 (C_2) 不是随便填进去就能工作得先确定好鉴相器增益 (K_d)。比如一个最简单的反正切鉴相器输出单位是弧度那么 (K_d1)如果用“Q路乘以符号位”这类简化的鉴相器S曲线斜率可能不再是1就要通过仿真重新标定。忽略这个增益往往是锁相环实际行为和书本计算对不上的第一原因。3. 几种载波恢复结构工程上怎么选3.1 平方环和Costas环低阶PSK的经典方案对于BPSK相位调制把信息编码在0和180度之间。直接用它来驱动锁相环会遇到一个问题180度对称的星座点在鉴相器眼里并不区分环路可能锁在0度也可能锁在180度。经典做法是先对信号做非线性变换把调制信息“去掉”。平方环的做法是把接收信号做平方BPSK信号平方之后原本0/180度的相位差变成0/360度也就是同相了于是可以被普通的PLL跟踪。得到二倍频相位后再除以2恢复出载波相位。QPSK则需要四次方环因为QPSK有四个可能的相位。Costas环则是在基带直接实现类似的“去调制”操作用两个支路分别做I/Q判决然后利用某种误差组合去调整本地载波。它本质上和平方环等价但避免了载波频点的平方分量在数字域里更容易和后续的解调模块集成。这类结构的优点是结构简单捕获能力不错适合BPSK/QPSK以及恒包络调制。但它们的鉴相器在星座点靠近原点附近时误差信号很不稳定而且对高阶QAM并没有天然适配所以到了1616QAM以上大家更常用的是下一节说的判决反馈环。3.2 判决反馈环DD-PLL高阶QAM的默认选项所谓“判决反馈”就是利用接收符号经过切片器slicer得到的判决值作为参考和接收值做比较。因为已经去掉了调制信息误差信号可以直接反映残余相位误差。最常用的QAM误差检测器可以写成[ e I \cdot \hat{Q} - Q \cdot \hat{I} ]其中 (\hat{I})、(\hat{Q}) 是判决得到的星座点坐标(I)、(Q) 是接收符号。这个式子很有意思如果接收点和判决点对齐误差为零如果相位有偏差误差的大小和极性就代表偏差方向。对于QPSK它退化成非常简单的情况只要判断I/Q符号就用 (\hat{I} \operatorname{sgn}(I))(\hat{Q} \operatorname{sgn}(Q))乘法器都省了。DD-PLL的优势是工作点附近噪声比非线性结构更小因为判决值已经剥离了大部分调制信息环路实际上在做“只跟踪残余相位”这件事。但它有一个前提判决必须可靠。如果初始相位误差太大或信噪比太低判决本身就是错的误差信号就会把环路往错误方向推导致失锁。这就是为什么很多接收机会先用Costas环或数据辅助完成粗捕获再切到DD-PLL做细跟踪。3.3 数据辅助同步用已知序列“一口吃个胖”前面两种都是盲同步也就是不管信息内容是什么直接从信号特性里挖相位。但很多时候系统协议里带了前导字、独特字或导频符号这些已知序列能让相位估计变得又快又准。用已知序列做相位估计的核心是最大似然估计。假设接收到的第k个符号是 (r_k a_k e^{j\theta} n_k)其中 (a_k) 是已知发送符号(n_k) 是高斯白噪声。把接收符号旋回发送符号的方向然后求平均相位[ \hat{\theta} \arg \left( \sum_{k1}^{N} r_k \cdot a_k^* \right) ]这个式子背后的直觉是如果相位估计正确(r_k \cdot a_k^*) 的整体方向应该和真实相位一致所有符号同向相加可以把噪声平均掉。N越大估计越准但也意味着需要更长的时隙开销。工程上经常用连续导频或者块状导频做前馈估计先把相位粗略拉回再交给锁相环慢慢修。这种做法在突发通信里尤其常见因为突发包短等环路收敛会浪费太多时间不如用几微秒的前导字直接算个初相。3.4 三种结构的选型对比我把几种方法的工程特点放到一张表里方便你对着自己的系统选方案复杂度调制适应性捕获速度典型场景平方环/Costas环中BPSK/QPSK/恒包络快卫星通信、低阶PSK判决反馈环 DD-PLL低BPSK~256QAM依赖初始误差高阶QAM、宽带调制解调器数据辅助同步低-中任意调制极快突发通信、帧头同步这里要特别提醒一点不要把结构和算法对立起来。成熟接收机几乎都是几种方法混着用。比如帧头来了先用数据辅助估计相位切换条件满足后再切到一个带宽更窄的判决反馈环同时用Costas环做个备份来防止判决错误。你在硬件资源有限的时候可以先从DD-PLL起步因为它又简单又通用遇到问题再按需加辅助捕获模块。4. 实现相位同步时反复踩到的几个坑4.1 相位模糊环锁上了星座却转了个身这是我见过新手最容易懵的问题。明明环路锁定指示正常环路误差也趋近于零解出来的数据却全是翻转的、错位的或者星座图看起来“挺漂亮但就是不对”。这大概率是相位模糊。根源在于鉴相器的周期性。BPSK的Constellation有两个稳定锁点0度和180度QPSK有四个稳定锁点0、90、180、270度。锁相环无法区分这些锁点到底哪个才对应真正的发射星座因为鉴相器在所有这些点附近都是一个稳定的零点。环路只保证星座图不乱转不保证转到的位置和发射端一致。解决相位模糊有三条路。第一条是用差分编码/差分译码信息调制在相邻符号的相位差中这样即使整体旋转了90度差分关系也能恢复。第二条是在帧里放独特字unique word收到独特字后和本地副本比对判断旋转了哪个倍数然后做反向旋转。第三条是用导频单独发一个已知相位符号系统自动校准。我用得最多的是独特字方案因为不需要改变编码方式代价也只是每帧多几十个符号开销而已。4.2 环路带宽与收敛速度鱼和熊掌真难兼得环路带宽 (B_L) 是个永远在权衡的参数。带宽宽收敛快、能容忍的频偏大但带进的噪声也大锁相环输出相位抖动大星座图会看到杂散和弥散。带宽窄噪声小了、稳态性能好了但捕获慢甚至可能在低信噪比下根本拉不回来。我自己做的一个经验准则是对于纯相位跟踪环路的等效噪声带宽大概取符号速率的千分之一到万分之一如果要做频偏捕获则可能需要取到百分之一甚至更高。但硬件板卡上一般不会只做单一带宽更常见的做法是双模式切换开始用一个宽带宽快速拉锁定后用窄带宽保持低抖动。这个切换阈值怎么定可以盯着环路滤波器的误差信号当误差信号持续一段时间低于某个门限就认为粗捕完成切换到窄带。另一种思路是自适应环路滤波器根据误差信号幅度动态调整 (C_1) 和 (C_2)。我在软件无线电项目里试过效果不错但参数调起来确实要花时间。如果你刚入门建议先用固定的双带宽切换等结构跑稳了再考虑自适应。4.3 鉴相器S曲线与增益归一化最容易被忽略的“单位问题”鉴相器设计里有一个术语叫S曲线就是平均误差输出和真实相位差的关系曲线。理想情况下S曲线在零点附近应该是线性的斜率就是鉴相器增益 (K_d)。但实际中S曲线往往只在一个有限的相位范围内保持线性超出范围后会变平甚至反过来。更麻烦的是对于高阶QAM误差信号大小还会和符号幅度有关。靠外圈的星座点幅度大误差信号也大靠内圈的难度低误差信号也小。如果算法里没有做归一化环路增益会随着当前符号变化而抖动轻则EVM恶化重则失锁。处理办法是每个符号估计幅度 (A)然后把误差信号除以 (A^2) 或类似比例因子。对QPSK这种恒幅情况影响不大但16QAM及以上一定要加。我见过不少FPGA实现把误差信号直接丢给环路滤波器结果星座图中间的点稳定、外圈的点抖动查了半天才发现是归一化没做。另外就算系数算得再准PLD? 实际硬件里的鉴相器增益也可能因为定点化精度、过采样率等因素发生偏移。靠谱的做法是在仿真里直接扫相位差画出S曲线把斜率测出来再回头校正系数。4.4 低信噪比下的跳周和失锁最后一个大坑是跳周cycle slip。即使环路已经锁定在低信噪比下噪声尖峰可能突然把相位误差推过一个“分水岭”导致环路从一个稳定锁点跳到另一个锁点。表现出来就是星座图突然不动了但整体旋转了一个固定角度或者偶尔出现一段误码“爆雷”。跳周本质上是信噪比和环路带宽之间的博弈。降低环路带宽可以抑制噪声引起的跳周概率但会牺牲动态响应。更好的办法是配合FEC译码的信息辅助比如LDPC译码之后把译码结果反馈给载波同步环路让“判决”变成“几乎无误的判决”把跳周概率压到一个极低的量级。这种思想和判决反馈环一脉相承只是参考信号的可靠性更高。如果不方便做译码反馈也可以在前导字阶段通过多次估计平均来降低初始相位方差让环路一开始就处于一个远离分水岭的工作点。前面说的数据辅助同步在这里就能派上大用场。5. 一个QPSK链路同步实例与排障记录5.1 基带仿真参数与环路启动流程这部分我拿一个实际做过的基带仿真来复盘。链路参数是这样的调制方式QPSK符号速率 100 kSps脉冲成型根升余弦滚降系数 0.35残余频偏80 Hz残余相偏任意初相信噪比20 dB环路结构DD-PLL符号率更新(B_L 100) Hz阻尼系数 0.707先用前面的公式算环路系数。(T_s 10 \mu s)(B_L100) Hz算出的 (C_1)、(C_2) 看起来很小但这很正常因为环路在符号率下以每次很小的步长修正相位。启动流程按下面这个顺序来模拟接收信号经过匹配滤波得到过采样序列。先做定时同步找到最佳采样点输出每个符号的I/Q值。用DD-PLL做相位跟踪误差信号按“(I\cdot\hat{Q} - Q\cdot\hat{I})”计算。观察星座图和误差信号曲线确认收敛。这里有个顺序问题要啰嗦一句定时同步和载波同步谁先谁后不同系统有不同答案。我在这个仿真里是先做定时再做相位因为QPSK在20dB信噪比下定时同步对相位误差不算太敏感。但如果相位偏差大到星座图转成圈定时同步的性能也会退化所以更稳妥的做法是先做一个粗相位校正把频偏压到几十赫兹以内再定时、再细同步。5.2 从打转到锁定收敛过程里会看到什么如果你把相位误差曲线拉出来看会经历三个阶段。初始阶段误差信号很大环路滤波器开始积分NCO频率被拉向残余频偏这个过程中星座图从“一团转圈”慢慢变成一个缓慢旋转的弧然后误差信号快速下降星座图突然“定住”但可能锁在错误象限最后独特字判决发现旋转量做一次固定的相位归零星座图完全定格。我调试时习惯同时看两样东西一样是环路的误差信号另一样是星座图上连续几百个符号的“尾巴”。看到误差信号从几百赫兹级别的牵引状态降到一个很小的抖动量才说明环路真的咬住信号了。收敛时间大概在几十个毫秒量级和 (B_L) 直接相关。如果要更快需要放宽带宽如果不着急窄带会稳很多。5.3 上板后EVM下不去问题出在NCO字长仿真没问题不代表上板没问题。有一块FPGA板卡我移植这套环路后发现EVM始终比仿真高二到三个百分点星座图外圈总是有一圈“毛刺”。查了好几天最后定位到NCO的相位累加器字长太短。数字NCO本质上是一个相位累加器累加器溢出代表相位走完一圈。FPGA里很多老工程为了省资源相位累加器只用了32位然后取高16位做正余弦查找表。结果量子化误差以相位噪声的形式落在星座图上尤其在高阶调制下特别明显。解决方案当然不是一刀切加长到64位——虽然现在FPGA资源也没那么紧张了但更聪明的做法是保留一个高精度累加器输出到查找表前做随机抖动或噪声整形把量化噪声推到带外。还有一个隐蔽的坑是环路滤波器里的积分器饱和。定点化实现时积分器很容易被大误差信号顶到整型上限一旦饱和环路要花很长时间才能“爬”回来。我的检查清单很粗暴给环路一个大的频率阶跃看误差信号是不是能干净地收敛如果出现长尾巴或者来回震荡先怀疑积分器饱和把变量位宽加宽或者做一个限幅范围可配置的饱和处理。5.4 验收指标与调试习惯载波相位同步做得好不好最终还是要用指标说话。我最常用的验收指标是剩余相位误差和EVM。可以用接收符号减去判决点把所有剩余误差做统计算出标准差的度数。对QPSK剩余相位误差稳定在1-2度以内EVM通常在3%以下就算过关对64QAM这个要求会严得多。调试过程建议做个完整的数据记录表把每次修改的参数项环路带宽、阻尼系数、NCO字长、归一化方式和对应EVM、收敛时间、失锁概率全部记下来。不要嫌麻烦因为这类同步环路的参数相互牵扯没有记录很容易改了这头忘了那头。我个人的习惯是固定一个调制方式先单独调环路把所有可能的组合跑一遍做成一张二维表格再回头看哪个参数对系统鲁棒性影响最大。做同步这种事情最忌讳的就是对着公式盲目硬调参数。公式只能给你一个起点真正有用的经验是知道每个旋钮拧下去之后会发生什么。上面这些坑我基本都在仿真或者板卡上踩过一遍。你如果正在做调制解调器建议先把QPSK的DD-PLL跑通再看其他结构QPSK都调稳了QAM只是把误差检测器换掉再加归一化而已。载波相位同步不是数字通信链路里最出彩的一环但绝对是最让人头疼的一环。希望这篇能帮你少走一点弯路。
返回列表