通信系统收发变频使用不同正负频率的影响
做通信系统调试这几年,我遇到过一个特别折磨人的问题:发射链路明明已经调通了,频谱仪上看波形也正常,可一到接收端解调,数据就是不对。星座图要么像陀螺一样转圈,要么干脆一团乱麻。后来查来查去,问题居然出在“正负频率”这个看似不起眼的概念上。发射端用了正的载波频率配置,接收端却用了负的,结果整个信号频谱被翻转过来,所有数据全废了。
这个坑不只是新手会踩,很多做过多年射频或者FPGA开发的人,遇到收发变频的符号配置时也容易犯迷糊。今天我就把正负频率、收发本振符号配置、以及它们到底怎么影响整个通信链路这件事,从头到尾拆开讲清楚。这篇文章适合正在做射频收发机、软件无线电、FPGA信号处理,或者刚接触零中频/低中频架构的工程师朋友,看完你能少走不少弯路。
1. 正负频率的本质:它不是一个数学游戏
1.1 实信号里的“正负频率”为什么看不见
很多人第一次接触正负频率,都是在学傅里叶变换的时候。教材里说,一个实信号的频谱是关于零频对称的,负频率是正频率的镜像。这句话背下来容易,但真到工程里就懵了:我示波器上看到的正弦波明明是正着扫的,哪来的负频率?
问题出在“实信号”这三个字上。一个余弦信号cos(2πft),它的傅里叶变换是两个冲激,一个在+f,一个在-f。但从时域波形上看,你根本分不清它是在正着转还是倒着转。直到引入复信号,也就是用I/Q两路来表示信号,情况才变得直观:正频率对应着复平面上的逆时针旋转,负频率对应着顺时针旋转,你只需要看I路和Q路的相位关系——Q路超前I路90度就是正频率,Q路滞后就是负频率。
1.2 通信系统为什么几乎处处都用复数信号
大部分做基带算法的人天天跟I/Q打交道,发射端把比特映射成正交的I/Q符号,接收端也按I/Q去解调。这里有个很自然的疑问:既然实际物理信道里传的都是实信号,为什么基带要非用复信号不可?
因为复信号能区分正负频率,能承载更多的信息维度。一个实信道里面,我们在某个载波频率附近能传的正频率分量和负频率分量其实是对称的,信息量其实是减半的。而用I/Q两路构成一个复基带信号之后,正负频率就变成不对称的了,你可以把信息同时放在正频率段和负频率段,频谱效率能翻一倍。而且复信号还带来一个额外的好处:下变频的时候,本振用正频率还是负频率,直接决定了你是把频谱搬下来还是给它翻个个儿。这也就是收发链路里频符号选择出问题时候,影响那么大的根本原因。
2. 收发变频的架构与符号选择逻辑
2.1 超外差架构里的混频符号到底怎么定
传统超外差接收机,天线收到的射频信号先进低噪声放大器,然后和一个本振信号做乘法,得到中频信号。假设射频信号是cos(2πf_RF t),本振信号是cos(2πf_LO t),乘出来的结果用积化和差展开:
cos(2πf_RF t)·cos(2πf_LO t) = 0.5·cos[2π(f_RF-f_LO)t] + 0.5·cos[2π(f_RF+f_LO)t]
后面那个高频和项被滤波器滤掉了,前面这个差项就是你想要的中频。这里你注意一下,本振到底取正f_LO还是负f_LO,看起来好像只是一个符号问题,但实际工程里,你如果用复本振e^(j2πf_LO t)去混频,和用e^(-j2πf_LO t)去混频,出来的结果是把射频信号的频谱搬到正频率方向,还是搬到负频率方向,完全是两码事。
我见过不少人在SystemVue或者Matlab里仿真超外差接收机,本振就用一个简单的cos函数,频谱上怎么看都是对的。但一到接真实IQ下变频器,就不对劲了。原因就是真实IQ混频器里面的本振是复信号,它可以把频谱向一个方向搬移,而如果射频信号落在本振上方和落下方,中频信号的频谱方向是不一致的。
2.2 零中频和低中频架构里的正负频率影响
到了零中频接收机,情况更有意思。零中频接收机的本振频率和射频信号频率相同,射频信号直接变到基带。射频信号如果有两个边带,一个在LO上方,一个在LO下方,那么上边带会搬到正频率方向,下边带会搬到负频率方向。如果基带信号的正负频率都各有用处,比如OFDM信号,正负子载波都要承载数据,那么就要求I/Q两路的幅相一致性非常好,否则正负频率会互相串扰。
低中频接收机则是故意引入一个低中频,让信号避开DC附近的闪烁噪声和直流偏置。在这种架构下,你要的是把射频信号的一个边带搬到正的中频上,同时抑制掉另一个边带的镜像。这时候本振用e^(j2πf_LO t)还是e^(-j2πf_LO t),决定了你想保留的是上边带还是下边带,镜像落在正频率还是负频率。如果本振符号选错,你想要的信号会被搬进负频率,而镜像落进正频率,后级滤波器如果按正频率的镜像设计去抑制,那就全乱套了。
2.3 发射机这边的正负频率选择
发射端的情况其实和接收端是镜像对称的。你在基带生成一个复信号,它的频谱可以是单边带的,比如只在正频率有分量,然后用一个复混频器乘以本振e^(j2πf_LO t),整体搬移到射频。这时候基带的正频率分量会搬到射频载波的上边带,负频率分量会跑到下边带。如果你做的是单边带发射,只希望保留上边带或者下边带,那基带信号就必须是单边带的复信号,而本振的正负符号也决定了你最终能用哪个边带。
这里有个特别容易犯的错误就是,发射链路明明配置的是USB上边带,你却在基带滤波的时候把下边带留下了,结果发射出去以后,接收机按上边带解调,频谱是反的,语音信号听起来像倒放,数字信号完全解不出来。这个问题的本质就是基带的正负频率分布和本振变频符号之间没有配合好。
3. 收发正负频率不一致带来的典型故障
3.1 频谱翻转:所有数据倒着走的灾难
收发变频使用不同的正负频率,最直接的后果就是频谱翻转,也叫Spectrum Inversion。发射端基带符号经过成型滤波,呈现出一定的频谱形状,比如QPSK信号在正频率端和负频率端都有分量,但这些分量是有特定相对关系的。接收端如果本振符号和发射端相反,那接收到的复基带信号频谱就被左右交换了一次,相当于把原来的正频率部分映射到了负频率端,负频率部分映射到了正频率端。
对于单载波系统,频谱翻转带来的后果是符号顺序出现镜像,尤其在使用复数均衡器的时候,均衡器会尝试去适配这个被翻转的信道,但如果你训练序列的方向不对,均衡器可能直接收敛不到正确解。对OFDM系统来说就更是灾难了,子载波的顺序会整个反转,第一个子载波的数据跑到了最后一个子载波位置上,导频位置全错,信道估计彻底失效。
我曾在调试一个OFDM收发机的时候遇到过这种问题:发射端基带我用了NCO正频率上变频,接收端为了省事直接用了同一个NCO配置但符号没对齐,结果接收数据的频谱被翻过来了,检测到所有子载波星座点都在镜像位置,接收到的数据看起来非常痛苦。后来确认是NCO的frequency word 符号取反,导致本振从正频率变成了负频率。
3.2 载波频偏:从“有点偏”到“完全对不上”
收发变频使用不同正负频率,除了镜像翻转,还常伴随载波频偏的问题。这里的频偏不是指晶振偏差那一类微小偏移,而是频率符号方向不一致导致的“大频偏”,比如发射本振从+100MHz变成了-100MHz,那接收端看到信号相当于偏移了200MHz。虽然这种问题通常一下子就能发现,但在某些低中频系统中,发射端本振是正f_LO,接收端本振也是正f_LO,但接收端把信号搬移到了负中频,然后数字下变频又用一个正频率去搬,几层叠加下来,等效频偏可能是两倍中频,也可能是一些更奇怪的组合。
载波频偏对解调的影响,我相信做通信的人都有体会。频偏会导致星座点持续旋转,旋转速度和频偏大小成正比。QPSK符号率如果是1Msps,频偏100Hz看起来问题不大,但如果是NBIoT这种子载波间隔只有15kHz的系统,100Hz频偏已经会让相邻子载波严重干扰了。而收发符号不一致导致的“等效频偏”往往是MHz级别的,中间没有任何容错空间。
3.3 镜像干扰和镜像抑制比恶化
在接收机里,正负频率符号选错还会带来一个隐藏问题:镜像干扰会直接落在有用信号频带上,而且没法靠滤波器滤除。超外差接收机的中频滤波器有镜像抑制功能,但滤波器只能抑制某一个频率范围的镜像,它不能区分“正频率镜像”和“负频率镜像”。
举个例子,你做一个低中频接收机,中频是10.7MHz,射频信号在900MHz,本振在910.7MHz。这时候射频信号搬到-10.7MHz(负中频),镜像信号在921.4MHz会搬到+10.7MHz(正中频)。如果你的基带信号处理是围绕正频率设计的,比如只有正频率通路,那负中频的有用信号就没了,镜像信号反而成了主角,系统解调出来的全是干扰。这种情况下,你需要的是IQ混频器的镜频抑制能力,但前提是I/Q两路幅相完全一致,实际器件不可能做到完美,通常也就抑制几十分贝,镜像信号如果比较强,还是会残留在信号里面。
3.4 对不同调制方式的差异化影响
正负频率错乱对不同调制格式的伤害程度是不一样的。对BPSK来说,频谱翻转可能只是把符号序列反过来,如果一帧数据格式本身是对称的,有时候甚至不会造成严重后果,这也是为什么有些系统在调试初期一直被这个问题蒙混过关。对QPSK来说,频谱翻转会让I/Q两路的映射关系互换,解调出来的硬判决比特经常是错的,但如果你用Differential QPSK,相邻符号之间的相位差还能保留一些信息,误码率不一定高到完全不可用。
到了QAM高阶调制,尤其是16QAM以上,频谱翻转几乎就是致命的,因为星座点的相位和幅度都承载着信息,翻转之后的星座映射关系完全错位,解调器无论怎么做判决,错误率都居高不下。OFDM的情况我已经说了,所有子载波的位置和导频信息全部错位,系统基本瘫痪。
4. 工程实现中的正负频率配置实操
4.1 在FPGA和软件无线电中配置NCO的正负频率
很多FPGA工程师在做数字上变频、下变频的时候,都绕不开NCO(数控振荡器)。Xilinx和Intel的FPGA都有现成的DDS/NCO IP核,你需要输入一个频率控制字(Frequency Control Word),这个频率字的最高位就决定了输出本振的正负频率。
以Xilinx DDS IP核为例,相位累加器的位宽N,系统时钟f_clk,想要输出的频率是f_out,对应频率控制字是:
FCW = round(f_out / f_clk * 2^N)
如果f_out是一个正数,那么FCW就是正的累加步进,输出为正向旋转的复指数信号;如果f_out是负数,则输入频率字用2的补码表示,对应负向旋转信号。很多人在写Verilog或者VHDL的时候,直接用一个有符号数给NCO的Phase Increment赋值,符号没检查清楚,就悄悄把正负频率搞反了。
在ADI的AD9361、ADRV9002这类射频收发器里面,同样存在这个问题。你配置本振频率的时候,有些API直接给了你一个带符号的频率值,有些则给了你一个绝对频率和一个上下边带选择位。如果你只用默认配置而没有仔细检查方向,收发两边的本振方向就可能不一致。
我自己的习惯是,在FPGA内部做数字变频之前,先用Matlab生成一个单音信号仿真整个链路,确认本振符号和下变频方向是否一致。跑一个复数单音,比如发射端的基带是正频率的1kHz单音,接收端下变频之后看FFT结果应该还是在+1kHz处。如果看到的是-1kHz,说明符号配反了。
4.2 串口、I2C、485等低速总线协议里的“正负频率”类比
有意思的是,“收发方向不一致”这个坑不仅出现在射频通信里,在很多低速总线调试中也能看到类似的影子。前阵子有人在群里问RS485自动收发电路的收发切换问题,说接收和发送数据总是会丢字节或者乱码。我一看他画的电路,发送和接收方向的控制逻辑反了,发送的时候接收器还在占用总线,这不就是一个“收发方向不一致”的低速版本嘛。
I2C的收发也有类似的坑,SDA线上数据的方向切换时机如果没掌握好,主设备发送地址后马上切到接收模式,但从设备还没释放总线,读出来的数据就是全FF或者全00。这些低速总线虽然没有“正负频率”的概念,但收发切换的时序、方向控制、字节顺序,本质上都是在处理同一个问题:链路两端对“方向”的理解必须一致,否则数据就是乱的。
Verilog做多字节收发的时候,同样会碰上字节序的问题,大端和小端不匹配就相当于把字节序列镜像翻转了,和射频信号频谱翻转有着非常形似的后果:数据还在,但全乱了。这些低速协议的调试经验,其实对理解高速射频链路的正负频率问题很有帮助,因为底层都是同一套逻辑——方向、顺序、极性,任何一个不一致,链路就废了。
4.3 如何在设计阶段避免收发正负频率不一致
避免这个问题的第一原则是,建立一张明确的变频配置文件表。在我的项目里,每个收发链路都会画一张类似下面这样的表:
| 环节 | 本振频率/符号 | 等效输出频率 | 备注 |
|---|---|---|---|
| 发射基带→中频 | +125MHz | 把基带正频率搬到+125MHz | 使用上边带 |
| 中频→射频 | -1800MHz | 把信号从+125MHz搬到+1675MHz | 用差频方式 |
| 接收射频→中频 | +1800MHz | 把射频信号下变频到-125MHz | 镜像落在-2075MHz |
| 接收中频→基带 | -125MHz | 把-125MHz搬回基带正频率 | 与发射端方向一致 |
这张表最关键的是最后一列“备注”,要明确写出信号经过每一级变频之后,原来在正频率方向的信号,最终落到了正频率还是负频率。每一级都做一次这样的标定,整个链路下来,信号方向是否一致就一目了然了。
第二个原则是,在链路联调之前,先做单音测试。发射端发一个+1kHz的复单音,接收端看FFT峰值位置。如果接收端看到的是-1kHz,那就查每一级变频的方向,用二分法定位到底是哪一级把符号搞反了。这个方法能快速把问题缩小到某个模块,效率非常高。
第三个原则是,在代码和配置脚本里,给所有本振符号、边带选择位、频谱方向相关的参数加上清晰的注释。有些工程师嫌麻烦,NCO频率字直接写一个十进制数,不加任何解释。等过几个月你自己回来看代码,根本分不清那个数值代表的是正频率还是负频率。我现在的习惯是,所有跟频率方向相关的常量,都用宏定义命名,比如#define TX_LO_FREQ_PLUS_125MHz 0x12345678,一眼就能看出这个配置是正125MHz方向。
5. 典型问题的排查方法与经验总结
5.1 快速判断频谱是否翻转的几种实测技巧
判断接收信号是不是被频谱翻转了,有几个很实用的土办法。最直接的方法是发射一个线性调频信号,也就是发射频率随时间线性上升的信号。接收端如果频谱方向一致,解调出来的频率应该也是线性上升的;如果方向反了,你看到的就是频率在下降。这个方法不需要其它复杂仪器,一个信号源加一个频谱仪就能测出来。
如果是数字调制信号,比如QPSK,你可以在发射端发一个已知的PN序列,接收端解调后用PN序列做相关,看相关峰是在正方向还是负方向。如果相关峰出现在负延迟方向上,基本可以断定频谱被翻转了。
还有一个小技巧是看接收信号的星座图。频谱翻转在星座图上的表现虽然不是固定的,但通常会出现符号序列前后反向,如果你在示波器上看到解调出来的差分符号序列有规律地错位,那大概率就是频谱翻转问题。
5.2 我踩过的三个频符号配置坑
说几个我实际踩过的坑,希望能帮你避开。
第一个坑是AD9361的LO配置。这个芯片的LO频率配置寄存器只接受正频率,那怎么实现负频率本振呢?其实是在后级的数字下变频里实现的。如果我没搞清楚模拟前端的混频方向和数字下变频的NCO符号,很容易把方向搞反。我调试那时的问题是接收信号反了,但射频前端的LO频率明明是对的。查到最后发现,数字下变频的NCO配置成了一个负的频率,等于又反了一次,完美地掩盖了真正的问题。
第二个坑是FPGA里面NCO IP核的无符号和有符号配置。有些NCO IP核的phase increment端口是无符号数,不仅是正频率,你给它赋一个有符号负数值,它会把补码解释成一个很大的正数,输出频率就变成了一个奇怪的数值。这种情况下你很难一下子想到是符号问题,还以为频率控制字的计算有误。
第三个坑是多级变频链路里的符号叠加。我做过一个两级上变频的发射机,第一级基带搬到中频用正频率,第二级中频搬到射频也用了正频率,结果实际测出来整个发射信号是反的。原因是第一级和第二级之间有个中频滤波器,它把中频信号的边带选择了一下,等效于把频谱方向又反转了一次。这个靠纯数学推演容易漏,最好就是在仿真里直接看每一级的频谱方向,或者实际测试每一级的群时延方向。
5.3 通过半双工收发场景理解正负频率的影响
很多对讲机、无线数传模块都在用半双工通信,比如XN297LBW这类芯片或者RS485总线。半双工模式下,同一个信道既要发也要收,切换的时候如果收发两端的频率配置方向不一致,尤其容易出现奇怪的偶发问题。
在RS485总线里,自动收发切换电路的原理是通过检测发送数据的状态来控制收发器的方向引脚。如果这个方向控制信号和发送数据的边沿没有对齐,接收端在切换瞬间可能收到自己发送的信号残影,造成帧同步失败。这和射频收发机里正负频率不一致的问题很相似:链路本身是通的,但方向控制一乱,数据就乱了。
我在做低功耗无线模块时遇到过一个问题:模块在发射模式下配置成上变频,接收模式下为了省功耗用了另一个简化的接收链路,本振符号和发射时不一致,导致模块发射自己测试正常,但两个模块之间通信就失败。后来把收发链路统一成同一个本振方向配置才解决。从那以后,我在设计任何半双工系统时,都会画一张收发链路方向对照表,确保两个方向在“正负频率”这个维度上完全一致。
5.4 关于正负频率问题的最终建议
如果你正在做一个新通信系统的集成或调试,我建议你在项目启动第一天就建立一个“频率规划表”,把每一级模拟和数字变频的理论频率、本振符号、输出边带方向全部列清楚,然后在联调前用单音信号验证每一级的实际输出方向。这个方法看起来老套,但真的能帮你省掉后面大量查问题的时间。
如果你已经遇到了信号解调失败、星座图乱转、OFDM子载波错位这类问题,别急着怀疑硬件或者算法,先检查一下收发变频的正负频率方向是否一致。这通常是最容易被忽视、但也最容易解决的问题。拿频谱仪看一眼中频信号的频谱方向,对照一下发射端基带信号的频谱方向,十有八九能定位问题。
另外,在调试过程中建议多用Matlab和Python做离线数据分析。把接收端的I/Q数据存下来,在电脑上做FFT、画星座图、看子载波分布,比你在测试仪器上反复猜测要高效得多。很多正负频率引出的问题,在离线数据分析中一眼就能看出来。
正负频率这个事,说到底就是一个“方向感”问题。通信链路里发射端和接收端的所有变频级,必须对“信号该往哪个方向走”有一致的理解。任何一级的符号如果配反了,整个链路就乱套,而且这种乱套经常不会以明显崩溃的形式出现,更多的是一种隐蔽的误码、偶发的失步、不明原因的灵敏度下降。希望这篇文章能帮你建立这个“方向感”,在下一次调试时少走几条弯路。