资讯动态

基于P201Pro与GNU Radio的QPSK收发系统实战:从比特到星座

发布时间:2026/10/3 7:08:30 来源:尧图企业网站定制
1. 从比特到星座这套收发系统到底在做什么软件无线电这个词刚接触的时候容易把它想得太玄乎。说白了它就是把你原来用一堆分立元器件搭出来的调制、解调、滤波、混频这些环节尽量搬到软件里去做。硬件只负责把射频信号搬进搬出、做最基本的放大和采样剩下的“怎么处理这些采样点”全部交给电脑或者嵌入式处理器。我这次阶段性总结的主角就是一套基于P201Pro和GNU Radio搭起来的简单收发系统核心目标很明确把一串比特流经过QPSK调制变成空口上的射频信号发出去再在接收端把它收回来解调成比特流并且能在星座图上看到清晰的QPSK点簇。这套东西适合谁看如果你刚学完通信原理脑子里装了一堆“星座映射”“匹配滤波”“载波同步”的概念但从来没让它们真正跑起来过那这套流程就是给你准备的。如果你已经玩过一点GNU Radio但每次看到星座图上一团糊不知道问题出在发射端还是接收端那这篇总结里的排查思路应该能帮到你。如果你手上有ad9361软件定义无线电开发板或者ad-fmcomms5-ebz这类射频前端想把它和GNU Radio打通那P201Pro这套组合的实操经验也有参考价值。我先说清楚这套系统的边界。它不是那种能跑几百兆带宽、支持高阶调制、带完整协议栈的工业级系统。它是一个教学性质的、验证性质的简单收发链路。它的价值不在于性能多强而在于链路完整、每一级都可观测、每一个参数都能自己调。你可以在GNU Radio的界面上看到发射端的比特流、调制后的符号、经过信道后的波形也能看到接收端同步前的星座、同步后的星座、判决出来的比特。这种“全链路可见”对于理解QPSK到底是怎么从比特变成点簇的比看十遍教科书都管用。整个系统的信号流向大致是这样的发射端先生成一段伪随机比特流经过QPSK星座映射变成复数符号再经过根升余弦脉冲成型滤波变成基带波形然后送到P201Pro的发射通道上变频到射频发出去。接收端从P201Pro的接收通道拿到基带采样先做匹配滤波然后做载波频偏估计和校正再做符号定时同步最后判决出比特同时把星座图画出来。听起来步骤不多但每一步都有坑下面我按模块拆开讲。2. 硬件选型与GNU Radio环境搭建的取舍2.1 为什么是P201Pro加GNU Radio这套组合选P201Pro作为射频前端最直接的理由是它和GNU Radio的生态配合得比较顺。P201Pro这类设备通常提供标准的驱动接口GNU Radio里有对应的Source和Sink模块可以直接调用不需要自己从零写驱动。对于做实验的人来说这一点很关键——你的时间应该花在通信算法上而不是花在跟USB枚举或者SPI时序较劲上。另一个原因是它的收发通道是独立的可以同时收发。这意味着你可以做环回测试也可以做真正的空口收发。环回测试的时候你用一根射频线把发射口和接收口连起来加上合适的衰减器就能在一个非常干净的通道里验证你的调制解调链路。空口收发的时候你把发射和接收分别接上天线就能看到真实信道带来的频偏、噪声和多径。这两种模式我都建议跑一遍环回用来验证算法正确性空口用来理解真实信道的脾气。GNU Radio这边我用的版本是3.10。这个版本对Python 3的支持比较完善很多老的模块也已经迁移过来了。如果你用的是3.7或者3.8有些模块的名字和参数会不太一样比如QPSK的调制解调模块在旧版本里可能是分开的新版本里有些被整合进了更通用的模块。我建议尽量用3.10因为社区里大部分新的教程和示例都是基于这个版本写的遇到问题更容易找到参考。至于ad-fmcomms5-ebz和ad9361这类开发板它们属于另一条技术路线。ad9361是一款集成度很高的射频捷变收发器ad-fmcomms5-ebz则是围绕它做的双通道开发板。这类板子的优势是通道多、带宽大、支持MIMO适合做更复杂的实验。但它的配置复杂度也更高通常需要通过IIO接口或者专门的驱动来配置和GNU Radio的对接需要额外的步骤。如果你只是想做单通道的QPSK收发验证P201Pro这种即插即用的设备会更省心。如果你后面想扩展到双通道或者做波束赋形之类的实验那ad9361平台是更合适的选择。我这次先用P201Pro把单通道链路跑通后面再考虑往ad9361平台上迁移。2.2 GNU Radio环境搭建的几个关键点GNU Radio的安装方式有好几种我试过源码编译、PyBOMBS和系统包管理器。源码编译最灵活但依赖问题能折腾你一下午。PyBOMBS曾经是官方推荐的方式但后来维护状态不太稳定。现在我更推荐用系统包管理器直接装比如在Ubuntu上直接用apt安装gnuradio和相关的gr模块。这样装出来的版本可能不是最新的但依赖关系是处理好的省心。装完之后第一件事是确认你的P201Pro能被系统识别。用lsusb或者设备管理器看一下有没有对应的设备出现。然后打开GNU Radio Companion在模块列表里搜索你的设备对应的Source和Sink。如果搜不到说明驱动或者gr模块没装好。这时候不要急着去写代码先把驱动装好确保GRC里能看到设备模块这是后面所有工作的前提。还有一个容易被忽略的点是采样率。P201Pro这类设备通常有一个支持的采样率范围你不能随便设一个值。比如设备支持的最小采样率是521kSps你设成500kSps可能就会报错或者自动被改成最近的支持值。在GRC里设置采样率的时候要看一下设备手册里标称的支持范围选一个在范围内的值。我一般会选一个稍微整一点的数比如1MSps或者2MSps这样后面做滤波和同步的时候参数计算会方便一些。提示在GRC里改采样率之后一定要检查一下其他模块里跟采样率相关的参数有没有跟着更新。比如根升余弦滤波器的采样率参数、符号定时同步的环路带宽等这些参数如果和实际采样率不匹配星座图会直接糊掉。3. QPSK调制解调链路的核心细节拆解3.1 比特到符号QPSK星座映射到底怎么选QPSK的本质是把每两个比特映射成一个复数符号。两个比特有四种组合00、01、10、11对应星座图上的四个点。这四个点怎么摆就是星座映射要决定的事。最常见的摆法是四个点均匀分布在单位圆上相位分别是45度、135度、225度、315度。这种摆法叫格雷映射相邻的点之间只有一个比特不同。为什么要用格雷映射因为如果信道噪声导致判决的时候判到了相邻的点格雷映射下只会错一个比特而不是两个比特同时错。这个细节在误码率上体现得很明显尤其是在信噪比不高的时候。在GNU Radio里QPSK的星座映射通常由Constellation Object和对应的调制模块来完成。你可以自己定义星座点的位置也可以用现成的QPSK星座。我建议先用现成的把链路跑通然后再去改星座点的位置观察误码率的变化。这样你能直观地感受到星座映射对系统性能的影响。映射之后每个符号是一个复数。这时候的符号还是“离散”的每个符号只占一个采样点。如果直接把这个离散符号序列送到射频端它的频谱会非常宽因为理想的冲激信号在频域是无限宽的。所以必须做脉冲成型把每个符号扩展成一段波形让它的频谱收敛在一个合理的带宽内。3.2 脉冲成型为什么必须用根升余弦脉冲成型滤波器有很多种但通信系统里最常用的是根升余弦滤波器。为什么是“根”升余弦而不是升余弦因为整个链路里有两个地方需要滤波发射端和接收端。如果发射端用升余弦接收端也用升余弦那整个链路的等效滤波就是两个升余弦的卷积这会引入码间干扰。正确的做法是发射端用一个根升余弦接收端也用一个根升余弦两者卷积之后正好得到一个升余弦响应满足无码间干扰的条件。这就是匹配滤波器的概念。根升余弦滤波器有两个关键参数滚降系数和符号数。滚降系数决定了滤波器的带宽和时域拖尾的衰减速度。滚降系数越小频谱越紧凑但时域拖尾越长对定时同步的要求越高。滚降系数越大频谱越宽但时域拖尾衰减越快定时同步更容易。常用的滚降系数在0.2到0.5之间。我一般先用0.35这是一个比较折中的值。符号数决定了滤波器的截断长度。符号数越多滤波器越接近理想响应但计算量也越大。在GNU Radio里根升余弦滤波器的符号数通常设成8到16个符号。我试过设成4个符号星座图上的点会明显发散因为滤波器的频响不够陡峭相邻符号之间有干扰。设成16个符号之后星座点就收得很紧。但符号数也不是越大越好太大之后计算量上去了而且实际增益有限。我一般用10个符号左右。还有一个参数是每个符号的采样数也就是samples per symbol。这个值决定了基带波形的采样率。比如符号率是100kSymbol/s每个符号采4个点那基带采样率就是400kSps。这个值不能太小太小的话定时同步的精度不够。一般至少取4取8或者16更好。但取太大也会增加计算量。我一般取8。3.3 载波同步频偏是怎么把星座图转糊的载波同步是QPSK接收链路里最容易出问题的一环。发射端和接收端的本振不可能完全同频同相总会有一个频率偏差和一个相位偏差。频率偏差会让星座图上的点绕着原点旋转旋转的速度就是频偏的大小。如果频偏是100Hz符号率是100kSymbol/s那每个符号期间星座点旋转的角度是0.36度。看起来很小但积累几十个符号之后点就转了大半圈星座图就变成一个圆环了。GNU Radio里做载波同步的模块通常是Costas环。Costas环的本质是一个锁相环它通过比较同相支路和正交支路的能量估计出相位误差然后反馈调整本地振荡器的相位。Costas环有两个关键参数环路带宽和阻尼系数。环路带宽决定了环路的跟踪速度和抗噪能力。带宽越大跟踪越快但对噪声越敏感。带宽越小跟踪越慢但抗噪能力越强。我一般先用符号率的1%作为环路带宽。比如符号率100kSymbol/s环路带宽就设1kHz。阻尼系数一般设0.707这是一个临界阻尼的值阶跃响应没有过冲。调Costas环的时候我习惯先把发射端和接收端用线连起来不加噪声看星座图能不能收住。如果收不住说明环路带宽或者阻尼系数不对。如果收住了再加噪声看环路能不能在噪声下保持锁定。如果噪声一大就失锁说明环路带宽太窄了需要适当加大。但加大之后如果星座图上的点抖动变厉害说明带宽太大了需要回调。这个调参过程需要一点耐心但调好之后你会对锁相环的行为有非常直观的理解。3.4 符号定时同步采样点没对准符号中心怎么办符号定时同步解决的是“在哪个时刻采样”的问题。接收端拿到的基带采样是连续的每个符号对应多个采样点。理想情况下你应该在每个符号的中心时刻采样因为这时候码间干扰最小。但实际上接收端的采样时钟和发射端的符号时钟是独立的采样时刻会慢慢漂移。如果不做定时同步采样点会从符号中心漂到符号边缘星座图就会发散。GNU Radio里做定时同步的模块通常是Gardner算法或者Mueller-Muller算法。Gardner算法对载波相位不敏感所以通常放在载波同步之前。它的原理是利用相邻符号的采样点之间的相关性估计出定时误差然后调整采样时刻。Gardner算法也有一个环路带宽参数一般设成符号率的0.5%到1%。这个参数和Costas环的带宽类似也是跟踪速度和抗噪能力之间的权衡。调定时同步的时候我一般先不加噪声看星座图能不能收住。如果星座图上的点沿着某个方向发散比如沿着圆弧方向发散那可能是定时同步没做好。如果点沿着径向发散那可能是载波同步或者幅度的问题。这两个问题有时候会混在一起需要分开排查。我的做法是先把载波同步的环路带宽调得很小让载波基本不跟踪然后单独调定时同步。等定时同步收住了再把载波同步的带宽调回来。这样能把两个问题解耦。4. 从GRC流图到实际收发完整实操过程4.1 发射端流图的搭建与参数设置发射端的流图相对简单主要就是比特源、星座映射、脉冲成型和射频Sink。我在GRC里搭的时候比特源用的是Random Source输出0和1的随机整数。然后经过一个Unpacked to Packed模块把每两个比特打包成一个字节。接着是Constellation Modulator选择QPSK星座输入是打包后的字节输出是复数符号。然后是Root Raised Cosine Filter做脉冲成型。最后是P201Pro的Sink把基带波形送到射频端。参数设置上采样率我设的是1MSps符号率设的是100kSymbol/s所以每个符号有10个采样点。根升余弦的滚降系数设0.35符号数设10。这些参数之间是有关系的采样率除以符号率等于每个符号的采样数这个值必须是整数否则定时同步会很难做。我试过设成非整数结果星座图怎么调都收不住后来才发现是采样数和符号率不匹配。发射端的增益设置也很关键。P201Pro的发射增益如果设得太大信号会饱和星座图会变成方形。如果设得太小接收端信噪比不够星座图会糊成一团。我一般先把发射增益设在一个中间值比如-10dB然后看接收端的信号强度再慢慢调。调的时候要注意增益每增加3dB功率大约翻一倍。不要一次调太多否则容易错过最佳点。4.2 接收端流图的搭建与同步模块的串联接收端的流图比发射端复杂因为要串联多个同步模块。我从P201Pro的Source开始拿到基带采样。然后经过一个Root Raised Cosine Filter做匹配滤波。接着是AGC模块做自动增益控制把信号幅度稳定在一个合理的范围内。然后是Gardner定时同步再是Costas环载波同步。最后是星座判决和比特打包。这里有一个顺序问题AGC、定时同步、载波同步这三个模块的先后顺序会影响性能。我试过几种顺序最后发现AGC放在最前面比较好因为后面的同步算法通常对信号幅度有一定要求。定时同步放在载波同步之前因为Gardner算法对载波相位不敏感而Costas环对定时误差比较敏感。如果反过来Costas环先跑定时误差会让Costas环的误差估计不准导致载波同步性能下降。AGC的参数主要是参考幅度和环路带宽。参考幅度我一般设1.0让信号幅度稳定在1附近。环路带宽设得比较小比如0.01让增益调整得慢一点避免和后面的同步环路互相干扰。如果AGC的带宽太大它会和Costas环抢着调整幅度导致整个环路振荡。4.3 星座图观测与误码率统计星座图观测我用的是Constellation Sink接在Costas环之后。这样能看到载波同步之后的星座。如果接在Costas环之前看到的是旋转的星座可以用来判断频偏的大小。我一般会同时放两个Constellation Sink一个在定时同步之后、载波同步之前一个在载波同步之后。这样能分开看定时同步和载波同步的效果。误码率统计我用的是Error Rate模块把发射端的比特流和接收端判决出来的比特流做对比。这里要注意发射端和接收端的比特流必须是对齐的。因为接收端有处理延迟直接对比会得到接近0.5的误码率看起来像完全没收到。我一般会在发射端加一个延时或者用Correlate Access Code模块做帧同步确保比特对齐。帧同步的做法是在发射端加一段已知的前导码接收端用相关器找到前导码的位置然后从那里开始对比比特。这样误码率统计才准确。实测下来在环回模式下不加噪声误码率可以做到0。星座图上的四个点收得很紧几乎是一个点。加噪声之后误码率会上升星座图上的点会散开。当信噪比降到某个值以下星座图上的点会开始重叠误码率会急剧上升。这个信噪比阈值和理论值比较接近说明链路的基本功能是正确的。4.4 空口收发时的额外注意事项从环回切换到空口最大的变化是信道不再是理想的。空口信道有路径损耗、多径、干扰和更大的频偏。路径损耗意味着你需要更大的发射增益或者更近的距离。多径意味着星座图上的点会拖尾因为多径信号和直达信号叠加产生了码间干扰。频偏可能达到几百赫兹甚至几千赫兹Costas环的捕获范围可能不够。我第一次做空口收发的时候星座图完全收不住点散得像一团云。后来发现是频偏太大了Costas环的环路带宽设得太小捕获范围不够。把环路带宽加大之后星座图能收住了但点还是有点散。再后来发现是多径的问题把发射和接收天线拉近并且调整方向减少反射星座图就明显改善了。空口收发还有一个问题是干扰。周围如果有其他设备在相同的频段工作接收端会收到干扰信号。我一般会先用频谱仪或者GNU Radio的FFT Sink看一下频段占用情况选一个相对干净的频点。如果找不到干净的频点那就只能接受一定的误码率或者用更复杂的抗干扰算法。注意空口收发之前一定要确认你的发射功率和频点符合当地的无线电管理规定。不要随意加大功率或者占用禁止使用的频段。这是对自己和他人负责。5. 常见问题排查与调参经验实录5.1 星座图收不住的几种典型原因星座图收不住是这套系统里最常见的问题原因可能有很多。我整理了一个排查表按可能性从高到低排列。现象可能原因排查方法解决方法星座点绕原点旋转载波频偏太大观察旋转速度估算频偏加大Costas环带宽或先用FFT估计频偏星座点沿圆弧发散定时同步没做好检查Gardner环带宽和采样数调整定时环路带宽确认采样数是整数星座点沿径向发散AGC没做好或幅度不匹配检查AGC参考幅度和环路带宽调整AGC参数确认发射和接收增益匹配星座点整体偏移直流偏置观察星座图中心是否在原点加直流消除模块或调整设备偏置星座点糊成一团信噪比太低检查发射增益和接收增益加大发射增益或减小接收增益避免饱和星座点分成多簇符号定时错位检查定时同步的采样相位调整定时同步的初始相位或环路带宽这个表是我踩了很多坑之后总结出来的。刚开始的时候我看到星座图糊了就只知道加大发射增益结果有时候是接收端饱和了越加越糊。后来学会了先看星座图的形状根据形状判断问题出在哪一级排查效率高了很多。5.2 误码率居高不下的排查思路误码率高但星座图看起来还行这种情况通常是比较隐蔽的问题。我遇到过几次最后发现是比特对齐的问题。发射端和接收端的比特流没有对齐误码率统计出来接近0.5但星座图是好的。这种情况下星座图好不代表误码率低因为误码率统计的是比特层面的错误而星座图看的是符号层面的质量。另一个可能的原因是前导码检测失败。如果接收端没有正确检测到前导码它就不会开始对比特误码率统计就会一直是0.5。这时候要检查前导码的相关峰是否明显如果相关峰不明显可能是前导码太短或者信噪比太低。加长前导码或者加大发射增益可以解决。还有一种情况是判决门限不对。QPSK的判决门限是星座图的象限边界如果星座图整体偏移了判决门限就会偏导致误码。这时候要检查星座图的中心是否在原点如果不在需要加直流消除或者调整AGC的参考幅度。5.3 调参过程中的几个实用技巧调参的时候我习惯一次只调一个参数调完观察效果再调下一个。如果同时调多个参数你根本不知道是哪个参数起了作用。这个习惯看起来简单但很多人做不到尤其是着急的时候。另一个技巧是先用仿真验证再上硬件。GNU Radio里可以用Channel Model模块模拟信道加噪声、加频偏、加多径。先在仿真里把参数调好再上硬件能省很多时间。仿真里调好了上硬件之后只需要微调不会从头开始。还有一个技巧是记录每次调参的结果。我用一个简单的表格记录每次改了哪个参数、改成多少、星座图和误码率有什么变化。这样调了一段时间之后你能看出哪些参数影响大、哪些影响小也能避免重复调同一个参数。这个习惯在调Costas环和Gardner环的时候特别有用因为这两个环路的参数互相影响不记录的话很容易调乱。5.4 从单通道到双通道的扩展思路单通道跑通之后下一步可以考虑扩展到双通道。ad-fmcomms5-ebz和ad9361平台支持双通道收发可以做MIMO或者波束赋形的实验。扩展的时候主要的变化是接收端需要处理两路信号同步模块需要同时处理两路或者用一路作为参考来同步另一路。发射端需要生成两路信号并且保证两路之间的相位关系是可控的。这个扩展的难度比单通道大不少因为两路之间的幅度和相位不一致会直接影响性能。我建议先把单通道的链路调得非常稳误码率在环回下做到0空口下做到1e-4以下再考虑扩展。否则单通道的问题还没解决双通道的问题会更多排查起来非常困难。6. 阶段性总结与后续优化方向这套基于P201Pro和GNU Radio的QPSK收发系统从比特流到星座点簇整个链路我已经跑通了。环回模式下误码率可以做到0空口模式下在合适的距离和频点上可以做到1e-4左右。星座图在载波同步和定时同步都锁定之后四个点收得比较紧能清楚地看到QPSK的星座结构。我个人在实际操作中的体会是这套系统的价值不在于它的性能有多好而在于它把通信链路里的每一个环节都暴露出来了。你可以看到脉冲成型之前的符号是什么样的可以看到匹配滤波之后的波形是什么样的可以看到载波同步之前的星座是怎么转的可以看到定时同步之前的采样点是怎么漂的。这种“全链路可见”对于理解通信系统的工作原理比任何仿真软件都直观。后续的优化方向我打算先做几件事。一是把帧同步做得更完善现在的前导码检测还比较粗糙误检率有点高。二是把信道编码加进来比如卷积码或者LDPC看看在同样的信噪比下误码率能改善多少。三是把ad9361平台搭起来做双通道的实验看看能不能实现简单的波束赋形。四是把整个流图整理成一个可复用的模块方便以后做其他调制方式的实验时直接调用。最后再分享一个小技巧在GNU Radio里调参的时候善用Variable模块和Slider控件。把关键参数做成Slider可以在运行过程中实时调整不用每次都停下来改参数再重新运行。这个功能在调Costas环和Gardner环的时候特别有用你能一边看星座图一边调带宽很快就能找到最佳值。我一开始不知道这个功能每次调参都要停流图、改参数、再启动效率很低。后来用了Slider之后调参速度快了好几倍。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑