ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从比特到星座图:基于GNU Radio与AD9361的QPSK收发链路详解

从比特到星座图:基于GNU Radio与AD9361的QPSK收发链路详解 把随机比特送进流图经过QPSK映射、脉冲成型、上变频最后从P201Pro的天线口发出去接收端再一路解调回来在屏幕上看到四个清晰分开的点簇——这一瞬间数字通信前面几章教材突然就活了。这是软件无线电系列实验的第四篇也是一次阶段性总结。前三篇我们分别啃下了环境搭建、基带模块验证和频谱观测这次不再只盯单个模块而是把“bit流到QPSK点簇”这条完整链路串起来。这篇文章写给两类人一类是刚接触GNU Radio和AD9361平台、想跑通端到端收发但不知道从哪下手的同学另一类是已经能看见星座图、但点簇不收敛或者总在转圈、想系统排查问题的实践者。全文围绕P201Pro在GNU Radio里的发射链路、接收链路、参数计算和实测踩坑展开所有内容都基于AD9361方案的通用行为换成同族硬件也能平移。1. P201Pro与AD9361先搞清楚硬件在链路里的位置软件无线电实验最容易翻车的地方不是GNU Radio流图画不对而是压根没搞懂板卡在“比特到空中”这条链路里承担了什么角色。P201Pro这类板子核心是一颗AD9361射频收发芯片加上一片Zynq负责控制和数据搬运对外提供以太网/USB接口给上位机。把它想成“一台可编程对讲机加一张高速声卡再配一块FPGA”可能更贴近实际。1.1 射频收发芯片不是“一次做完所有事”AD9361把混频器、滤波器、AGC、ADC/DAC都集成进去了但基带调制解调仍然要靠GNU Radio在CPU里完成。也就是说GNU Radio负责的是“0和1变成IQ波形、IQ波形变成0和1”的数学过程AD9361负责的是“IQ波形搬到某个频率发出去、把空中的信号搬下来变成IQ”。这个分工一旦想清楚很多流图配置就不会再纠结。我在实验里习惯先画一张信号流向草图bit → symbol → 基带IQ波形 → DAC → 混频 → 天线接收反过来天线 → 混频 → ADC → 基带IQ → 同步 → symbol → bit。P201Pro只负责中间的射频模拟部分剩下的都是GNU Radio流图的事。这也是“软件无线电”这个概念的真正含义——硬件尽量通用功能靠软件定义。1.2 AD9361的关键参数与配置约束用GNU Radio对接P201Pro时你迟早要面对这几个参数中心频率、采样率、信道带宽、TX增益/衰减、RX增益。AD9361的工作频率范围是70MHz到6GHz信道带宽支持200kHz到56MHzADC/DAC是12位。具体到实验里最常用的配置逻辑是这样的中心频率选一个合法且干扰少的频段实验常用2.45GHz附近的ISM频段采样率GNU Radio流图的采样率要和板卡ADC/DAC采样率对齐通常设为符号速率的整数倍信道带宽设成略大于信号实际占用带宽别太宽宽了把带外噪声和干扰都收进来TX增益通过衰减值控制AD9361的TX衰减范围0~89.75dB步进0.25dBRX增益手动或AGC都行短距离实验建议手动方便排查问题。下面这组参数是我在P201Pro上跑通QPSK收发时用的基准配置后面所有计算都围绕它展开参数数值说明中心频率2.45 GHzISM频段天线和功放都好找符号速率 Rs1 Msps低速利于观察和排查采样率 Fs10 MHz每符号10个采样点滚降系数 α0.35常用折中值信号占用带宽1.35 MHz双边带宽 (1α)×RsAD9361信道带宽2 MHz略大于信号带宽即可1.3 和AD-FMCOMMS5-EBZ这类评估板的关系如果你手头正好是ADI官方的ad-fmcomms5-ebz评估板或者别的AD9361方案板卡这篇实验的结论基本都能平移过去。区别只在于驱动入口P201Pro通常通过厂商适配的SoapySDR或IIO接口接入GNU RadioFMCOMMS5用gr-iio但流图里你看到的模块名字、参数含义、同步环路的调法都是一样的。我自己的体会是不要被板卡型号带偏思路。AD9361方案有一套“通用脾气”采样率要匹配、增益不能贪、本振锁定需要时间、频率误差要靠同步环拉回。把这些脾气摸熟换板子只是改改设备名和接口参数的事。2. 发射端流图从随机bit到基带IQ波形这一节是整条链路里最好验证、也最容易理解的部分。因为发射端不需要面对同步问题你给什么比特它就老老实实映射成什么IQ点再按脉冲成型滤波送出去。在GNU Radio里搭这条链路能让“比特到符号到波形”的每一步都看得见摸得着。2.1 为什么要从“比特”开始讲故事通信系统最底层的输入是二进制比特但物理层不能直接传输比特它只能传输波形。QPSK做的事情就是把每2个比特映射成4个相位之一然后把这4个相位编码成同相和正交两路电压。一句话比特是“语义”符号是“物理层的字母”。实验里我用随机比特源而不是固定图案原因很简单——随机比特能让星座图上的四个点均匀出现便于观察统计特性。如果你用固定序列星座图上可能长时间只有一两个点看起来像没调好。随机源加足够长的观测时间四个点簇才会稳定呈现。2.2 流图的模块组成与参数设置在GNU Radio Companion里发射端我习惯这样搭模块链Random SourceByte输出产生随机比特Throttle限制流图速率防止CPU空转把CPU跑满Chunks to Symbols把比特按QPSK映射成复数符号Root Raised Cosine Filter脉冲成型限制信号带宽Multiply Const调整幅度到合适范围板卡Sink模块SoapySDR Sink或IIO Sink设置中心频率、采样率、TX增益。重点说Chunks to Symbols这一步。它本质是一个查表器2个bit查一个复数符号。QPSK的Gray映射表我这样定义00 → 1 1j45度01 → -1 1j135度11 → -1 - 1j225度10 → 1 - 1j315度用Gray映射的好处是相邻相位只差1个bit即便误判到邻居符号也只错1个bit而不是2个。这个细节在实验里看不出差别但如果你后面做BER测试Gray映射能让误码率直接减半。2.3 脉冲成型为什么不能直接发方波符号很多人第一次搭发射端想省掉Root Raised Cosine Filter直接把符号电平送进DAC。结果就是频谱占用很宽、相邻符号互相干扰接收端星座图全部糊在一起。这就是码间串扰ISI——符号波形拖尾窜到相邻符号的时间槽里。奈奎斯特第一准则告诉我们要无ISI传输脉冲的频域特性要满足特定的滚降条件。根升余弦RRC滤波器就是为此设计的。发送端用RRC成型接收端再用一个同样的RRC做匹配滤波两个级联起来等效于升余弦脉冲在最佳采样点上正好做到“自己不拖尾、不踩邻居”。滚降系数α影响带宽和拖尾衰减速度。α越大带宽越宽但拖尾衰减越快对定时误差越不敏感α越小带宽越窄但拖尾衰减越慢定时稍微偏一点点簇就散。我用0.35作为折中。信号双边带宽按(1α)×Rs计算也就是1.35MHz。AD9361的信道带宽设2MHz留出约0.65MHz的过渡带余量。RRC滤波器的抽头数也很关键。在GNU Radio里我设Number of Taps为符号周期的整数倍例如每个符号10个采样抽头数设6×11意思是在符号两侧各留6个符号周期的拖尾余量。抽头太少滤波器的频响不够“方”带外抑制差抽头太多延迟和CPU开销都上去了实验里没必要追求极致。2.4 发射端最后一个细节幅度控制基带IQ波形在进DAC之前要乘一个幅度因子。这步很多人忽略直接默认1.0结果AD9361的DAC可能饱和或者发射链路增益余量不够。我通常会先用波形观察一下基带IQ的峰值幅度再调整Multiply Const确保信号峰值不超过DAC满量程的60%~70%。后面在射频端还有独立的TX衰减控制。这两个旋钮要配合用基带幅度管“波形本身有多大”TX衰减管“射频放大器给多少增益”。实验里常见错误是基带幅度拉满、TX衰减又设为0结果发射链路过驱动星座图外围出现奇怪的卷曲或毛刺。3. 从基带到射频P201Pro发射链路真正“出门”之前基带IQ波形在GNU Radio里是完美的数学对象一旦经过P201Pro的DAC、混频器和功放就会遇到现实世界的所有麻烦本振泄漏、IQ不平衡、增益非线性、频率偏移。这一节说的是把信号送进射频前端时需要考虑哪些实际问题。3.1 LO频率与信道带宽规划中心频率选2.45GHz不是随便拍的。这个频段设备多、干扰也杂但优势是天线、衰减器、功放这些配件最容易找到而且我的经验是2.4G WiFi频段虽然拥挤但做1MHz符号率的窄带信号只要挑个相对干净的频率点影响有限。选频时在GNU Radio里用Freq Sink先扫一遍底噪挑一个没有明显强信号的频点。AD9361的信道带宽设置会影响接收端的抗干扰能力。太宽会把带外噪声收进来降低信噪比太窄会切掉信号边缘。我按信号占用带宽的1.3~1.5倍来设QPSK 1Msps、α0.35时设2MHz就够。这个配置在P201Pro上实测星座图的点簇扩散程度和理论值基本吻合。3.2 TX增益不是越大越好AD9361的发射功率是通过“衰减量”来控制的范围0到89.75dB。很多人以为衰减越小信号越强越好实则不然。我踩过的坑是把TX衰减设为0短距离对着接收板发结果接收端星座图非但没更清晰反而边缘出现一圈扩散。查了半天才明白是发射链路末级放大器进入了饱和区产生非线性失真。实验里我习惯从衰减20dB左右开始看接收端星座图能锁住、点簇收敛再逐步减小衰减找最优。判断标准不是“信号最强”而是“星座图散点半径最小”。这中间通常存在一个甜点区继续加大TX增益星座图开始变坏说明非线性已经压过信噪比收益。3.3 先别急着上天线发射-接收自环验证把发射端流图和接收端流图都搭好后第一件事不是把信号发到空中而是用射频线缆把TX口和RX口直接连起来中间加30dB衰减器。这一步能单独验证“射频链路是否正常”把空间信道这个变量彻底排除。自环验证通过的标准有三个星座图出现四个清晰点簇、点簇不旋转、接收比特和发送比特基本一致。我在P201Pro上做自环时如果连这些都达不到问题基本锁定在GNU Radio流图本身或者参数配置上跟天线、多径、干扰都无关。等自环完全通过再拆掉线缆换成天线才能把新出现的问题归因于空间信道。3.4 收发时钟要不要共源这是个问题P201Pro板卡内部有晶振两块板卡各自独立工作时发射板的10MHz参考和接收板的10MHz参考并不完全一致会带来约±几ppm的载波频率误差。对QPSK来说这个误差落在Costas环的捕获范围内时问题不大但如果误差太大或者符号速率很低导致相位旋转速度可观点簇就会转圈。实验里最省事的办法是让两块板子共用一个10MHz参考时钟把P201Pro的参考时钟输入用功分器接同一个源。没有条件共源时就把接收端的载波粗同步模块Frequency Xlating FIR Filter加上先手动找频偏再交给Costas环细调。共源这个细节真的能让你少排查半小时。4. 接收端流图把四个点簇从噪声和频偏里“捞”出来接收端是整个实验里模块最多、调试经验最密集的部分。信号到了接收端经历了信道衰减、多径、频偏、采样钟偏差已经面目全非。GNU Radio接收链路的任务就是一步步把这些“脏东西”清理掉让星座图重新显出本来面目。4.1 接收链路的模块顺序与理由我搭的接收链路是这种顺序板卡SourceSoapySDR Source或IIO Source设置中心频率2.45GHz、采样率10MHz、RX增益Frequency Xlating FIR Filter用于粗频偏校正把信号频谱搬到零频附近Root Raised Cosine Filter作为匹配滤波和发射端的成型滤波配对Polyphase Clock Sync或Symbol Sync做符号定时同步Costas Loop做载波同步消除残余频偏和相位偏移Constellation Sink观察星座图。这个顺序不是随便排的。匹配滤波要在定时同步之前因为定时同步需要“干净”的符号波形来计算最佳采样点Costas环放在定时同步之后是因为符号级定时恢复后相位误差更接近恒定值环路更容易锁定。粗频偏校正放在最前面是为了减轻后面Costas环的负担——它只能捕获一定范围内的频偏超了就转圈。4.2 两个同步环在暗地里替你做的事把定时同步和载波同步讲清楚是理解接收端的关键。定时同步解决的是“什么时候采样”。发射端每个符号等间隔发出去但接收端采样时钟和发射端有偏差而且信号经过信道延迟后符号边界的位置是未知的。Polyphase Clock Sync模块用一组多相滤波器插值实时估计最佳采样时刻在每个符号的“峰尖”上采样。这个模块在GNU Radio里的参数要设对Symbol Rate设1MSamples per Symbol设10Loop Bandwidth别太大太大抖动太小锁定慢。Costas环解决的是“载波相位到底是多少”。QPSK信号在接收端经过混频后本地振荡和发射振荡的频率、相位都有误差星座点整体会旋转。Costas环用余弦鉴相器估计相位误差通过环路滤波器反馈给NCO持续修正。它的输出特性是相位模糊为90度整数倍也就是解调出的符号可能整体旋转了0、90、180或270度。这是QPSK载波恢复的固有问题后面用差分编码或者已知帧头来消除。4.3 星座图用什么参数看以及“点簇合格”的标准Constellation Sink看起来只是画点但参数设置影响你能否看出问题。我习惯把Samples per Symbol设成10这样每个符号只画一个点如果你不设置默认每个采样都画星座图上全是点与点之间的过渡轨迹看起来就像一坨混乱的云。想看眼图风格的过渡线时再临时关掉符号采样。判定QPSK点簇合格的标准我总结了三条能看到四个彼此分离的簇而不是一个圆环或一团云每个簇的形状接近圆形而不是拖着长长的尾巴或旋转成弧簇半径相对簇间距离足够小目测不会发生误判。任何一条不满足都说明链路里有一个具体环节出了问题排查方向在第5章展开。4.4 90度相位模糊一个绕不开的坑当你第一次看到完美的四个点簇并且锁得很稳还没来得及高兴可能会发现解调出的比特和发送端完全对不上——好像整体旋转了一个象限。这就是Costas环的90度相位模糊。GNU Radio自带的Costas环模块有一个相位模糊处理选项但QPSK本质上是四相调制任意旋转90度都落在合法星座点上环路无法区分。工程上最常用的解法是差分编码发送端把绝对相位换成相邻符号的相位差来编码接收端比对相邻符号的相位变化而非绝对相位。GNU Radio的DQPSK解调器就是这么干的。我这次实验为了保留“观察四点簇”的直观性用了绝对QPSK加一个已知PN序列做相位估计在离线数据处理里把旋转纠正回来。严格讲这是一条偷懒路径但它适合教学场景——让你在星座图上直观看到QPSK的本质。如果只想要一个“能跑通且不出错”的演示直接用DQPSK更省心。接受少量噪声代价换来绝对相位无关对刚上手的项目来说是很划算的取舍。4.5 想做BER测试一个Python脚本就够了星座图只能看趋势要量化链路质量还得算误码率。简单做法是发射端和接收端各自把符号流存成文件在Python里对齐后比对。下面是简化版的比对脚本思路import numpy as np tx_syms np.load(tx_symbols.npy) # 发射端符号序列 rx_syms np.load(rx_symbols.npy) # 接收端判决后的符号序列 # 去掉延迟和保护段粗略对齐 n min(len(tx_syms), len(rx_syms)) - 100 tx tx_syms[100:100n] rx rx_syms[100:100n] errors np.sum(tx ! rx) ber errors / n print(f符号错误数: {errors}, 误符号率: {ber:.6f})真正做BER实验时还有个细节接收端判决前要让发送端连续发固定数量的随机比特并在数据里插入帧头和长度字段否则离线对齐时会因为一两个符号的偏移导致错误率飙升。4.6 先别上Costas环接收端的“裸奔”调试法我的调试习惯是分阶段往接收链路里加同步模块。第一次搭接收流图先不加定时同步和Costas环直接在Constellation Sink上看原始采样点。这时候你会看到一堆乱跑的点或者旋转的轨迹——不要慌这是正常的。然后逐步打开先开匹配滤波点会略聚拢再开定时同步点会聚成四个条带最后开Costas环条带锁定成四个点簇。每加一级就停下来观察变化而不是把所有模块全堆上去之后才看结果。这样做的好处是一旦点簇不收敛你能马上判断是哪一级没工作。5. 实测问题排查链路星座图不漂亮时按顺序查到了这一步你已经有了完整的收发链路。接下来是实验最有价值的阶段星座图出各种幺蛾子然后你一行一行找到原因。下面是我在P201Pro上实测时反复遇到的四类问题按出现频率排序。5.1 星座图整体转圈形成一条环形轨迹这是最经典的QPSK接收故障。现象四个点簇看不见取而代之的是由离散点连成的一个圆环旋转速度还比较均匀。根因几乎都是载波频偏没有被消除Costas环没锁定或频偏超出了它的捕获范围。排查链路是这样的先确认是从发射到接收的全程链路都正常换用射频线缆自环测试排除空间信道干扰看频谱用Freq Sink观察接收信号的中心频率是否精确落在预设频率上偏差大就证明频偏存在如果频偏大于Costas环的捕获范围在流图最前面加Frequency Xlating FIR Filter手动设置一个负频偏把信号拉回零频检查两块板卡是否共参考时钟不共源时先外接10MHz共源从源头消灭大部分频偏。Costas环的Loop Bandwidth也要检查。太大了环路噪声大点簇抖太小了锁不住快频偏。我一般从0.02起步视情况在0.005到0.05之间调节。5.2 点簇之间全是轨迹线四个点聚不拢现象星座图能看到四个方向上有“密度堆积”但点与点之间布满连线的轨迹整体看起来像风车或十字形。根因九成是符号定时同步没有生效导致采样点落在符号跳变沿上而不是符号稳定区。排查方向确认Polyphase Clock Sync或Symbol Sync的Samples per Symbol参数和实际采样率一致不一致时模块按错误的速率插值点自然散确认RRC匹配滤波器的滚降系数和发射端一致α不匹配会让符号波形失真检查定时同步的环路带宽太窄会锁定很慢观察时间不够时会误以为没工作最简单的一种情况Constellation Sink没设Samples per Symbol所有采样点都画出来过渡轨迹当然全在。先检查这个能省半小时。5.3 点簇明显但边缘毛刺粗、外圈扩散现象四个点簇能分辨但每个簇的轮廓不是规则的圆而是带一圈毛刺甚至向远离原点的方向拖出尾巴。这通常是射频链路非线性或者增益过大的表现。排查链路先降低接收端RX增益P201Pro的RX增益从30dB往下调观察毛刺是否减少。如果少了说明接收链路进入饱和区信号超出ADC满量程削顶失真再降低发射端TX增益增大衰减排除发射功放非线性检查天线是否贴得太近两个天线距离小于半米时发射信号可能把接收前端直接“堵”到饱和加20dB衰减或拉远距离再试还有一个容易被忽略的供电电压不稳或USB供电不足时板卡增益会漂点簇边缘也会散。换独立电源再观察。把“增益往低调”这条放在第一位是因为新手实验最容易犯的错就是觉得增益越大信号越好。实际上SDR接收链路的最佳增益点永远在“足够大”和“不过载”之间。5.4 点簇一开始正常几分钟后慢慢漂移散开现象刚锁定星座图很漂亮放着不动十几分钟后点簇缓慢旋转或扩散。原因主要是热漂移和本振失锁。AD9361的本振频率由PLL产生温度变化会导致频率缓慢漂移两块板卡各自漂移的方向还不一致。处理办法让板卡上电预热10分钟再开始实验多数漂移会在预热后明显减小检查PLL锁定状态P201Pro的驱动日志里通常有锁相指示如果不锁定检查参考时钟的连接和电平不共源时给接收端加更大幅度范围的粗频偏校正让Costas环持续能拉回来如果漂移严重到同步环跟不上降低符号速率或缩短单次观测时间用“短突发”方式做实验。这四类问题占了我实验调试时间的八成。你可以发现排查套路高度一致先回到自环排除信道再逐级检查基带和射频参数最后考虑硬件层面的时钟和热稳定性。不需要依赖高端仪器星座图本身就是最好的示波器。动手做这个实验时我最大的体会是不要追求一次把所有模块接对。先把发射端流图完成用频谱仪或Freq Sink确认信号带宽和中心频率符合预期再把接收端流图只接匹配滤波和星座图不做任何同步观察原始点的运动轨迹最后一级一级加入同步模块。每加一级都停下来确认现象是否符合预期。这套流程下来你对Costas环、定时同步、脉冲成型这些概念的理解会比看十遍教材都深刻。下一步可以沿着同样的链路去推BPSK、16QAM甚至OFDM——星座图变成4个点只是起点。
返回列表