很多人第一次用频谱仪看一条IQ发射链路的输出,都会被同一个现象绊住:明明只往DAC里灌了一个单音,频谱上却干干净净地出现了两个峰,一个在载频左边,一个在右边,幅度相差可能只有二三十dB。这时候大多数人会先怀疑代码里的频率字算错了,把NCO的频率前后改三遍,发现镜像纹丝不动——它根本不是算出来的,而是被模拟链路的幅度和相位失配“生成”出来的。IQ调制技术看起来只是把一路信号拆成两路再合成,但它的全部难点都藏在“正交”这两个字的实现精度里:数字域可以做到理论上的完美正交,模拟域却永远差那么一点点,而这一点点会直接变成镜像、本振泄漏和EVM恶化。
这篇内容面向的是需要真正把IQ链路跑起来的人:做软件无线电的、写数字预失真算法的、搭雷达收发前端的、玩音频单边带的,以及被导师安排去调一块射频板的同学。基础概念会讲,但重点放在三件事上:正交性为什么在数学上成立、在硬件上又为什么必然被破坏,以及用最少的两台仪器怎么把破坏点定位出来。全程只谈可复现的方法和可量化的数字,不谈玄学。
1. 为什么非要把一个信号拆成I和Q两路
1.1 一根正弦线能装下的信息量其实很有限
先退一步想一个最朴素的问题:如果我要把一个基带信号搬到一个很高的载频上去,最直接的做法是拿这个信号去乘一个余弦,也就是 s(t)=m(t)·cos(ω_c t)。这叫双边带调制,频谱上会产生上下两个对称的边带,各占一份带宽。问题在于这两个边带携带的信息完全一样,等于你用两倍的频谱资源传了一份内容。传统广播时代这无所谓,反正频谱便宜;但在今天的场景里,带宽是硬通货,浪费一半是不可接受的。
单边带调制解决的就是这个问题:想办法把其中一个边带抵消掉。数学上的做法是引入第二条支路,把原信号做90度相移后乘正弦,两路相减,其中一个边带就消掉了。这条“90度相移支路”就是Q路的起点。所以从历史上看,IQ调制并不是为了“高级”而发明的,它是为了省带宽而被逼出来的一个技巧,只是后来大家发现这个技巧的用途远不止省带宽。
关键在于:单边带能否干净地实现,完全取决于那两路信号是不是严格的90度正交,以及两路的幅度是不是严格相等。任何一点偏差,被抵消的那个边带就会漏回来一部分,这部分泄漏就是后面要反复打交道的“镜像”。
1.2 正交性成立的前提是一个积分,不是一个角度
很多人对“正交”的理解停留在“相差90度”这个几何直觉上,但真正让IQ调制在接收端可以无损分离的,是三角函数在一个周期上的积分性质:
∫cos(ωt)·cos(ωt)dt = 1/2,∫sin(ωt)·sin(ωt)dt = 1/2,而 ∫cos(ωt)·sin(ωt)dt = 0
最后这个零才是全部的秘密。接收端把收到的信号分别乘上本地恢复的cos和sin再低通,I路只留下自己那份,Q路只留下自己那份,互不干扰。这个性质对频率完全相同、相位严格相差90度的两个本振才成立。
一旦本振相位差变成85度,那个积分就不再是零,而是一个正比于cos(85°)的小量,于是I路里混进了Q路的分量,Q路里混进了I路的分量。这种串扰在星座图上的表现是整团点云被“剪切”成平行四边形,而不是均匀的圆形扩散——这是一个非常有用的诊断特征,后面还会用到。
顺便说一句,这个积分性质也解释了为什么IQ调制对相位噪声的敏感度和普通调制不一样:本振的相位噪声对I、Q两路是共模的,它会整体旋转星座,但不直接产生镜像;真正产生镜像的是两路之间的差分误差。所以调IQ链路时,先别急着怪本振相噪,那个锅通常不归它背。
1.3 复基带:把两个实数通道看成一个复数
真正让IQ调制变得好用的,是换一个视角:不要分别看I和Q,把它们当成一个复数的实部和虚部,写成 x(t)=I(t)+jQ(t)。这个复数信号就是所谓的复基带信号,它没有物理实体,只存在于算法和DSP里,但它把“幅度”和“相位”这两个概念统一成了一个东西——复数的模和辐角。
在这个视角下,整个上变频过程可以写成一行:
s(t) = Re{ x(t) · e^{jω_c t} }
展开就是 s(t) = I(t)cos(ω_c t) − Q(t)sin(ω_c t)。
这个式子的好处是它把“我要产生什么”和“我怎么产生”彻底分开了。左边是物理世界要的实信号,右边括号里是算法世界能自由操纵的复数。我想让星座点转45度,只需要把 x 乘上 e^{jπ/4};我想做频谱搬移,只需要把 x 乘上 e^{jΔωt}。所有操作都在复数域完成,最后一步才取实部交给DAC。这也是为什么现代收发机的框图里,数字部分永远画到“复基带”为止,再往右就是模拟工程师的地盘了。
生活化的类比:复基带就像一张可以任意旋转、缩放的设计图,IQ调制器则是那台把图纸打印成实物的机器。图纸可以画得无限精确,机器的机械误差却决定了最终成品的精度。所有IQ链路的调试工作,本质上都是在测量并且补偿这台机器的误差。
1.4 零中频架构为什么离不开IQ
顺带把架构选择这件事讲清楚,因为它决定了后面所有问题的形态。超外差架构用两级甚至三级变频,靠高Q值的声表或腔体滤波器把镜像滤掉,代价是体积、成本和一堆杂散的频率规划。零中频架构直接把基带搬到载频,一次变频搞定,镜像问题理论上不存在了——因为信号就在本振频率上,镜像就是它自己。
但零中频立刻带来三个新麻烦:本振泄漏会直接落在信号频带中心,直流失调会在基带产生一个固定偏移,而且I、Q两路的失配全部直接叠加在有用信号上,没有任何滤波器可以帮忙。低中频架构是折中方案,把信号放在本振旁边几MHz到几十MHz的位置,镜像虽然回来了,但距离足够远,可以用数字滤波或者复数陷波干掉。
| 架构 | 镜像位置 | 主要抑制手段 | 典型难点 |
|---|---|---|---|
| 超外差 | 距离远,可滤波 | 高Q值模拟滤波器 | 体积大、杂散规划复杂 |
| 零中频 | 与本振重合 | 无法滤波,只能靠校准 | 本振泄漏、直流失调、IQ失配 |
| 低中频 | 距离近,几十MHz内 | 数字复数滤波 | 需要更高的ADC采样率 |
选哪条路,取决于你的带宽和成本约束。宽带系统里低中频更常见,因为几十MHz的数字滤波对现代FPGA来说几乎免费;窄带低成本方案里零中频更常见,因为省掉了一整套滤波器。但无论选哪条,I、Q两路的匹配精度都是逃不掉的,区别只是误差最终表现为镜像、边带还是EVM。
2. 模拟链路上每一级都在悄悄破坏正交性
2.1 增益失配和相位失配是怎么长出镜像的
先把失配的数学模型建起来,不然后面所有测量都没有参照。假设理想情况下 I 路和 Q 路完全一致,但实际中Q路相对I路有幅度误差 ε 和相位误差 φ,那么实际输出可以写成:
s(t) = I(t)cos(ω_c t) − (1+ε)·Q(t)·sin(ω_c t + φ)
把正弦展开,用积化和差整理,你会发现输出里除了想要的那个边带,还多出了一个位于 −ω_c 附近的项,其幅度正比于 √[(ε/2)² + (φ/2)²](φ 用弧度)。这个比值就是镜像抑制比 IRR,工程上常用的近似公式是:
IRR(dB) ≈ −20·log₁₀( √[(ε/2)² + (φ/2)²] )
这个公式值得记在脑子里,因为它能让你在动任何硬件之前先估算一下目标难度。举个具体的例子:如果幅度失配做到1%(ε=0.01),相位失配做到1度(φ≈0.0175 rad),代入得 √[(0.005)²+(0.00875)²] ≈ 0.0101,IRR ≈ 39.9 dB。也就是说,1%和1度这两个数字,基本对应40dB的镜像抑制水平。
| 幅度误差 ε | 相位误差 φ | 近似 IRR |
|---|---|---|
| 0.1% | 0.1° | 约 60 dB |
| 0.5% | 0.5° | 约 46 dB |
| 1% | 1° | 约 40 dB |
| 2% | 2° | 约 34 dB |
| 5% | 5° | 约 26 dB |
这张表最实用的地方在于反向使用:如果你的系统指标要求镜像抑制优于50dB,你就知道单靠器件本身的匹配是不够的,必须上校准。市面上多数集成IQ调制器的裸指标在35~45dB这个区间,做到50dB以上基本都要靠数字预校正。
注意:这里的 ε 是相对幅度误差,不是dB值。有人在表格里填了个“0.1dB增益差”就跑来算,那要先换算:0.1dB ≈ 1.16% 的幅度误差,代入公式得到约38.7dB,比直觉上的“0.1很小”要差得多。dB坐标对小数不敏感,这是新手最容易误判的地方。
2.2 本振泄漏:零中频架构里最刺眼的那根谱线
如果说镜像是“多出来一个不该有的峰”,那本振泄漏就是“中间多了一根不该有的柱子”。它的成因非常朴素:调制器内部的晶体管存在直流失调,或者差分对不匹配,导致本振信号没有被完全抵消,直接从输出口漏了出去。在频谱仪上,它表现为一个位于载频正中心、幅度与基带信号无关的窄峰。
这根峰讨厌的地方在于,它不随你的基带信号变化,却会实实在在占用发射链路的功率余量,还会在接收端抬高底噪。更要命的是,在OFDM这类高峰均比系统里,本振泄漏正好压在直流子载波上,会直接破坏该子载波的解调。
抑制它的手段分两层。模拟侧靠器件本身的载波抑制能力,通常在30~40dBc;数字侧靠“直流补偿”,也就是在I、Q两路分别叠加一个可调的直流量,把漏出去的那部分抵消掉。校准方法很直接:把基带输出置零,此时理论上输出应该什么都没有,然后扫描 I_dc 和 Q_dc 两个补偿值,让频谱仪上的中心峰幅度最小。这是一个二维搜索问题,但实际操作中可以先固定Q扫I找到最小值,再固定I扫Q,两三轮就能收敛,因为两个维度近似解耦。
一个常见的坑:直流补偿值会随温度和本振频率漂移,尤其是本振频率改变时,调制器内部的失配量会变,之前标定的值可能完全失效。所以如果你的系统要跳频,直流补偿表必须按频点分别存储,不能只标一个点就用到底。
2.3 IQ skew:被忽略的第三个失配量
除了增益和相位,还有第三个量经常被漏掉,就是I、Q两路之间的时间偏差,行业内叫 IQ skew 或者时延失配。它的危害在于:相位误差不是一个常数,而是随频率线性增长的。因为相位 = 2πf·τ,同样的时延差在不同频率上造成的相移完全不同。
算一个具体的数:如果两路PCB走线长度差导致 100 ps 的时延偏差,在 200 MHz 处造成的相位误差是 2π × 2×10⁸ × 1×10⁻¹⁰ ≈ 0.126 rad,也就是 7.2 度。这个数字已经很致命了,单这一项就能把镜像抑制压到25dB左右。而在 20 MHz 处,同样的时延只造成0.72度的误差。
这解释了一个非常典型的现场现象:窄带测试时镜像抑制很好,一展宽带宽,频谱两端的镜像就翘起来了,中间还是干净的。很多人以为是滤波器的问题,其实是IQ skew在作怪。
处理办法有两种。一是物理上保证等长走线,DAC到调制器的两路走线要做严格的长度匹配,差分对内和差分对间都要匹配;二是在数字域做分数延迟补偿,用一个小型的分数延迟滤波器(Farrow结构或者简单的多相插值)在Q路上加一个可调的延迟量。后者的好处是可以随温度自适应,代价是要多消耗一点逻辑资源。
提示:判断是不是skew问题,有一个很省事的办法——观察镜像抑制随频率的变化趋势。如果镜像抑制在频带中心最好、两端对称变差,几乎可以确定是时延失配;如果是整个频带内均匀地差,那更可能是增益或固定相位失配。
2.4 重构滤波器和DAC的隐藏贡献
很多人调IQ链路时只盯着调制器,却忘了DAC后面的重构滤波器也是链路的一部分。这里的坑在于:如果I、Q两路用了两颗独立的滤波器芯片,哪怕型号相同,批次间的群时延和通带波动也会有差异,这种差异会直接转化成随频率变化的幅度和相位失配,而且它跟调制器的失配叠加在一起,很难区分来源。
更隐蔽的一种情况是DAC本身的输出保持特性。DAC的零阶保持会在频域产生 sinc 滚降,如果两片DAC的采样时钟相位有偏差,或者其中一路的建立时间不同,同样会在高频端引入额外的失配。
实操上的建议是:如果条件允许,尽量选双通道集成DAC,两路在同一个die上,匹配度天然好一个数量级;如果必须用分立方案,至少保证两片DAC共用同一个时钟源和同一个参考电压,并且在PCB上把两路的模拟走线做成镜像对称的布局,而不是各自就近布线。
3. 数字域的IQ:那些看起来对、实际上错的地方
3.1 NCO频率字的计算与一个常见的精度陷阱
数字上变频的核心是一个数控振荡器,结构通常是相位累加器加查找表。频率字的计算式很简单:
FTW = round( f_out × 2^N / f_clk )
其中 N 是相位累加器位宽,f_clk 是采样时钟。举个具体例子:32位累加器、100 MHz采样时钟、想产生10 MHz输出,则 FTW = 10⁷ × 2³² / 10⁸ = 429496729.6,取整后是 429496730。
这里藏着一个新手常踩的坑:取整带来的频率误差。上面这个例子里,小数部分0.6对应的频率偏差只有约 1.4×10⁻⁵ Hz,完全可以忽略。但如果你的目标频率和时钟频率之比恰好是一个分母很大的分数,比如某些非整数倍的符号率,取整误差可能累积到Hz甚至几十Hz量级。在窄带系统里,这个偏差可能导致收发两端载波不同步,表现为星座图缓慢旋转。
解决办法有两种:一是加大累加器位宽,每增加一位,频率分辨率翻倍;二是用双模分频或者分数分频的思路,在累加器里保留小数部分做抖动。对于绝大多数应用,48位累加器已经足够把误差压到10⁻⁶ Hz量级,代价只是多几个触发器。
import math def calc_ftw(f_out, f_clk, acc_bits=32): ftw = round(f_out * (1 << acc_bits) / f_clk) f_actual = ftw * f_clk / (1 << acc_bits) err = f_actual - f_out return ftw, f_actual, err ftw, fa, e = calc_ftw(10e6, 100e6, 32) print(f"FTW = {ftw} (0x{ftw:08X}), 实际输出 {fa/1e6:.9f} MHz, 误差 {e:.6f} Hz")这段代码可以直接抄去用,注意 acc_bits 要和你的硬件实现保持一致,否则算出来的频率字填进去会对不上。
3.2 下变频之后,频谱是复数的,别拿实信号的直觉去套
接收方向的坑比发射方向更多,因为多了一步“共轭”的判断。数字下变频的过程是:ADC采到的实信号乘上 e^{-jω_c n},然后低通,得到复基带。此时频谱已经被搬到了零频附近,但它是单边的——正频率分量和负频率分量不再对称,这正是复数信号的特征。
问题就出在这里:如果NCO用的是 e^{+jω_c n} 而不是 e^{-jω_c n},或者你在代码里对某一路取了反,结果就是整个频谱被镜像翻转。表现是什么呢?星座图的旋转方向反了,或者是QAM符号的I、Q顺序颠倒了,或者更隐蔽——单载波解调看起来一切正常,但OFDM的频谱是倒过来的。
判断方法很简单:在基带注入一个已知的单音,比如 +1 MHz,看它出现在频谱的哪个位置。如果出现在 +1 MHz,说明下变频方向正确;如果跑到了 −1 MHz,那就是共轭搞反了。这一步几乎是所有软件无线电入门者的必经之路,我很建议在第一次跑通链路时就把这个测试固化成脚本,每次改完代码都跑一遍,比对着星座图猜要快得多。
import numpy as np # 模拟下变频:采样率 100 MHz,本振 20 MHz,输入单音在 21 MHz fs, flo, f_sig, N = 100e6, 20e6, 21e6, 10000 n = np.arange(N) x = np.cos(2*np.pi*f_sig*n/fs) # 正确的下变频方向 lo = np.exp(-1j*2*np.pi*flo*n/fs) baseband = x * lo # 取平均频率位置 freq = np.fft.fftfreq(N, 1/fs) spec = np.abs(np.fft.fft(baseband)) peak = freq[np.argmax(spec)] print(f"下变频后单音落在 {peak/1e6:.3f} MHz") # 应输出 +1.000 MHz把 lo 的负号去掉再跑一次,你会看到峰值跑到 −1 MHz,这就是共轭错误的直观样子。
3.3 采样率、中频和带宽之间的三角制约
低中频架构下,中频频率的选择不是随便定的,它同时受三个条件约束:
第一,采样率必须满足奈奎斯特条件,即 f_s > 2(f_IF + B/2),其中 B 是信号带宽,这是为了避免混叠。第二,中频不能太低,否则镜像会落进信号带内,一般要求 f_IF > B。第三,中频也不能太高,否则对ADC的模拟输入带宽和采样率要求都会飙升。
举个具体设计:信号带宽20 MHz,中频选70 MHz,则最低采样率需要 2×(70+10) = 160 MHz。实际选型时通常留20%余量,取 200 MHz 采样。此时ADC输出的频谱上,20 MHz带宽的信号占据 60~80 MHz 的位置,数字下变频把这个块搬到零频,再用一个截止频率12 MHz的低通滤波器滤掉带外。
| 参数 | 取值 | 约束来源 |
|---|---|---|
| 信号带宽 B | 20 MHz | 系统需求 |
| 中频 f_IF | 70 MHz | 需大于 B,且镜像距离足够 |
| 最低采样率 | 160 MHz | 2×(f_IF + B/2) |
| 实际采样率 | 200 MHz | 留 25% 余量 |
| 数字低通截止 | 12 MHz | 略大于 B/2,留过渡带 |
这里有一个经常被忽略的细节:数字低通滤波器的过渡带宽度决定了它需要多少阶。如果采样率200 MHz、通带10 MHz、阻带从15 MHz开始,过渡带只有5 MHz,归一化后是 5/200 = 0.025,这个归一化过渡带很窄,需要的阶数会明显上升。降低采样率或者提高中频都可以放宽这个要求,但两者又互相制约,需要一起权衡。
3.4 宽带失配必须用频域校准,一个复数系数救不了
前面讲的增益和相位校准,如果只用一个常数去修,本质上假设失配在整个频带内是平的。这个假设在窄带(几MHz)内勉强成立,带宽一旦上到几十上百MHz,就彻底失效了——因为IQ skew和滤波器群时延波动会让失配量随频率变化。
这时候正确的做法是把失配建模成一个频域上的传递函数比。具体来说,在若干个频点上分别注入单音,测量每个频点上Q路相对I路的幅度比和相位差,得到一组 (ε(f), φ(f)) 数据,然后设计一个复数FIR滤波器去拟合这个频率响应。工程上常用的是把校正滤波器放在I路或者Q路的基带末端,用一个十几到几十阶的复数FIR,把残余镜像压到60dB以下。
校准流程大致是这样:先在频带内均匀选16到32个频点,每个频点注入一个单音,用接收端的FFT测量镜像分量与主分量的比值,反推出该频点的失配量;然后用最小二乘拟合出校正滤波器的系数;最后把系数烧进FPGA或者DSP,再复测一遍所有频点确认收敛。
import numpy as np def estimate_imbalance(freqs, irr_db): """由各频点的镜像抑制比反推幅度失配 epsilon 和相位失配 phi(rad)""" eps, phi = [], [] for f, irr in zip(freqs, irr_db): # IRR = -20log10(sqrt((eps/2)^2 + (phi/2)^2)),这里做等分假设 mag = 10 ** (-irr / 20.0) eps.append(mag) # 保守估计:全部归因于幅度 phi.append(mag) # 保守估计:全部归因于相位 return np.array(eps), np.array(phi) freqs = np.array([5e6, 10e6, 20e6, 40e6]) # 单位 Hz irr = np.array([52.0, 48.0, 43.0, 38.0]) # 镜像抑制随频率下降 eps, phi = estimate_imbalance(freqs, irr) for f, e, p in zip(freqs, eps, phi): print(f"{f/1e6:5.1f} MHz 幅度失配估计 {e*100:.3f}% 相位失配估计 {np.degrees(p):.2f} deg")注意这段代码里的估计是保守的、把误差全部归到单一来源,真实的分离需要分别测量幅度和相位,这里只用于快速判断失配随频率的增长趋势是否符合skew特征。
4. 用一台频谱仪把问题揪出来
4.1 单音测试:最简单也最容易做错的一步
调试IQ链路的第一个动作几乎永远是打单音。原因是单音的频谱最干净,镜像的位置和幅度一目了然。但这一步做错的人特别多,主要错在三个地方。
第一个错是忘了加窗或者没加对窗。如果直接用矩形窗看频谱,泄漏会把你本来想看的弱镜像糊掉。看镜像时应该用Blackman-Harris这类旁瓣低的窗,代价是主瓣变宽,但镜像测量本来就只需要看幅度不需要看频率精度。
第二个错是没有关掉基带端的其它处理模块。有些链路的数字部分默认开着削峰、预失真或者数字增益,这些模块都会改变信号幅度,导致测出来的镜像比失真。打单音之前,一定要把整条链路的“除了上变频之外的所有模块”都旁路掉。
第三个错更隐蔽:单音的幅度设得太高,DAC已经进入非线性区。这时候产生的谐波会落在镜像附近,测出来的“镜像”其实是三次谐波的产物。判断方法很简单,把单音功率降6dB再测一次,如果那个分量下降超过6dB,就不是线性镜像,而是非线性产物。
4.2 从频谱上读出镜像抑制,并且算准它
测得镜像幅度之后,IRR的计算看起来只是两个数相减,但实际有几个细节需要注意。
首先,镜像和主信号的幅度应该在同一个分辨率带宽下比较,如果扫描时RBW设置不当,两个峰的测量条件不一致,结果是不可信的。正确做法是把RBW设到足够窄(比如1kHz以下),让两个峰都完全被分辨出来,然后用峰值搜索读值。
其次,要区分“镜像抑制比”和“边带抑制比”。这两个概念在不同场景下混用得很厉害。镜像抑制比通常指在零中频或者低中频架构下,由于IQ失配产生的那个对称分量的抑制程度;边带抑制比通常指单边带调制时,不想要的那个边带被压到多低。数学上它们是同一个量,但测量方法略有差别:前者关注的是相对载频对称的那个点,后者关注的是相对信号偏移固定间隔的点。
| 指标 | 定义 | 典型目标 |
|---|---|---|
| 镜像抑制比 | 镜像分量相对主信号的抑制 | > 45 dB(未校准) |
| 边带抑制比 | 不需要的边带相对需要边带的抑制 | > 55 dB(校准后) |
| 载波泄漏 | 中心谱线相对信号峰值 | < −35 dBc |
| EVM | 误差矢量幅度 | 视调制阶数而定 |
4.3 星座图和EVM告诉你频谱看不出的东西
频谱仪只能看到功率分布,看不到调制质量。要判断IQ失配对解调的实际影响,得看星座图和EVM。
不同失配在星座图上的“指纹”是不一样的,这是排查时最有用的一张对照表:
| 星座图表现 | 对应问题 |
|---|---|
| 整团点被拉成平行四边形 | 固定相位失配(正交度不够) |
| 点云沿某个象限方向拉伸 | I/Q增益不平衡 |
| 整体偏移出中心,不落原点 | 直流失调 |
| 外围点比内侧点扩散更严重 | 幅度压缩(非线性) |
| 点云随符号率缓慢旋转 | 载波频偏 |
| 频带边缘的符号误差明显更大 | 频率相关失配(skew) |
EVM和镜像抑制之间有一个粗略的经验换算:如果失配主要来自镜像,那么 EVM(%) ≈ 100 × 10^(−IRR/20)。也就是说40dB的镜像抑制大约对应1%的EVM,这个量级对64QAM(要求EVM优于1%左右)刚好卡在临界线上,对256QAM就完全不够了。这也是为什么高阶调制必须做IQ校准,不做根本跑不起来。
提示:测EVM时一定要先确认接收端的同步是好的。频偏没锁住、定时没对齐的情况下,EVM读数会虚高好几倍,你会误以为是IQ失配严重,然后对着调制器一顿乱调。先看星座图是不是稳定不转,再谈EVM的绝对值。
4.4 一套可复现的排查顺序
调了很多次之后我总结出一个比较省时间的顺序,这里直接给出来:
第一步,基带置零,测中心谱线,做直流补偿。这一步必须在打单音之前做,否则本振泄漏会污染后续所有测量。
第二步,打低频单音(比如1MHz),测镜像。低频处skew影响最小,此时测到的镜像基本反映纯增益和固定相位失配。如果这一步就差,先修增益和相位。
第三步,扫频。在频带内选5到9个点,逐点测镜像,画出镜像抑制随频率的曲线。如果是平的,说明只有固定失配;如果是两端翘,说明有skew或滤波器失配。
第四步,根据第三步的曲线决定要不要上频域校准滤波器。如果全带内都能做到45dB以上且你的调制阶数不高,可以就此收手;如果要跑高阶QAM,继续做。
第五步,切换到真实调制信号,看EVM和星座图,确认前面几步的补偿在实际信号下没有引入新的问题(比如补偿滤波器本身的量化噪声)。
这个顺序的核心思想是“从简到繁,每步只引入一个变量”。反过来的做法——直接上真实信号然后对着EVM盲调——效率会低很多,因为你无法区分误差来源。
5. 不同场景下IQ玩法的差异
5.1 高阶QAM对失配的容忍度是断崖式下降的
同样是1%的EVM,对QPSK来说几乎无感,对1024QAM来说就是灾难。原因在于星座点之间的最小距离随阶数升高而急剧缩小。粗略地看,M阶QAM的归一化最小距离正比于 1/√M,也就是说从64QAM到256QAM,距离缩小一半,同样大小的误差矢量占最小距离的比例翻倍。
这带来一个很实际的工程结论:如果你的系统要支持多种调制阶数,IQ校准的精度应该按最高阶来设计,而不是按常用阶数。因为低阶模式下的裕量很大,多花的那点校准开销完全值得。
另外,高阶QAM对相位噪声的要求也会同步提高,这时候之前提到的“相位噪声是共模的”这个结论要打个补丁:共模相位噪声虽然不产生镜像,但它会让整个星座旋转,而高阶QAM的判决边界很近,旋转一点点就足以让边缘点越界。所以相位噪声和IQ失配是两个独立的约束,不能互相抵消。
5.2 OFDM的峰均比会把IQ链路的非线性放大
OFDM信号的峰均比通常在10dB以上,意味着功放和调制器必须留出足够的余量。在IQ链路里,这个余量问题会以两种方式表现出来。
第一种是DAC的削顶。如果I、Q两路的数字幅度没有做联合缩放,某一个瞬间I路接近满量程而Q路很小,那么合成后的矢量幅度其实还没到最大,但I路已经削顶了。正确的做法是把I、Q作为一个复数矢量来做整体缩放和削峰,而不是分别对两路做限幅——分别限幅会直接破坏相位关系,产生带外辐射。
第二种是调制器本身的压缩。集成IQ调制器的线性区通常比功放还窄,输入功率稍高就会产生三阶交调产物,落在邻近信道里。这时候测ACLR会发现指标明显恶化,但EVM可能还没崩。判断方法是做功率扫描:把基带幅度从低往高扫,画出ACLR随输出功率的曲线,找到拐点,工作点要留在这个拐点以下至少3dB。
5.3 雷达和音频这两个“非典型”场景反而把IQ用到了极致
雷达是IQ调制最纯粹的应用之一,因为它必须用复数。单通道实采样只能测出目标距离,无法区分目标是靠近还是远离——多普勒频移的正负在实信号的频谱上是共轭对称的,分不出来。用了IQ双通道之后,复频谱不再对称,速度方向立刻就能判断。这也是为什么几乎所有现代雷达前端都是IQ双通道下变频。
在雷达里,IQ失配的危害方式和通信不太一样:它会让动目标检测出现“假目标”,一个正在靠近的目标可能在对称的速度上产生一个鬼影。所以雷达系统对镜像抑制的要求往往比通信更严,通常在55dB以上,而且要求在整个瞬时带宽内都保持。
音频领域的单边带是另一个极端。业余无线电和某些专业音频设备里,用Hilbert变换产生90度相移的Q路,再做单边带调制,可以把语音带宽压缩一半。这里的难点不在射频,而在Hilbert变换器本身——它要在整个音频带(300Hz到3kHz,跨度约3.3个倍频程)内保持接近90度的相移,用IIR做相位误差会很大,通常得用FIR,而且阶数不低。数字域做这件事比模拟域容易太多,因为模拟的全通移相网络对元件精度极其敏感,温度一变相位就飘。
5.4 校准值要不要在线更新,这是个成本问题
最后一个绕不开的工程决策:IQ校准是在产线做一次就固定下来,还是运行中动态更新?
产线一次性校准的优点是简单,不需要额外的监测通路,缺点是温漂和老化会让校准值逐渐失效。对于工作在恒温环境、寿命要求不高的设备,这是合理选择。但如果设备要在−40℃到+85℃范围内工作,或者本振要跳频,静态校准几乎肯定不够。
动态更新的做法是在发射链路里耦合一小部分输出,送回接收通道做监测,实时估计残余镜像并更新补偿系数。代价是要多一路耦合器和监测接收机,成本上升明显。中间的折中方案是按温度分档存储多组校准系数,用一个温度传感器做索引,这样既不用实时监测,又能覆盖主要的工作区间。绝大多数产品最后都选了这个折中方案,因为它的性价比最高。
需要提醒的是,无论哪种方案,校准系数的存储和加载路径本身也要被测到。我见过不止一次这样的情况:校准算法本身没问题,但系数在写入flash时字节序搞反了,加载之后反而比不校准更差。所以每次改完校准流程,务必用单音复测一遍,别只看最终的EVM。
最后分享一个我个人觉得最省事的习惯:把“基带置零看中心峰、打单音看镜像、扫频看趋势”这三步写成一个自动化脚本,每次改完代码或者换完硬件就无脑跑一遍,把三条曲线存下来对比。IQ链路的问题绝大多数都能被这三张图暴露出来,而且历史曲线放在一起看,能立刻分辨出是“一直就差”还是“最近变差了”。这比凭记忆判断可靠得多,尤其是在多人协作、硬件反复迭代的项目里。