资讯动态

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

发布时间:2026/10/3 13:17:02 来源:尧图企业网站定制
1. 从比特流到星座图这套收发链路到底在做什么软件无线电这个东西刚上手的时候最容易陷入一个误区以为把两块板子连上电脑装好GNU Radio拖几个模块连起来就能通信了。我一开始也是这么想的结果光是让接收端出现一个像样的QPSK星座图就折腾了整整两个周末。这套基于P201Pro和GNU Radio的简单收发系统说白了就是干一件事把一串0和1经过调制、上变频、发射、接收、下变频、解调最终在接收端还原出原始比特流同时能在星座图上看到四个清晰的点簇。听起来简单但中间涉及的知识点其实相当密集。你需要理解数字调制的基本原理知道QPSK为什么能把两个比特映射到一个符号上明白脉冲成型滤波器的作用搞清楚帧同步和符号同步的区别还要会看星座图判断信号质量。P201Pro这块板子在这个过程里扮演的是射频前端的角色它负责把基带信号搬到射频频段发出去再把接收到的射频信号搬回基带。GNU Radio则是整个系统的“大脑”所有的信号处理流程都在里面用模块搭出来。这套系统适合谁呢如果你正在学通信原理或者软件无线电课程需要做一个能跑通的收发实验那这套方案非常合适。如果你已经有一定GNU Radio基础想从简单的FM接收扩展到数字通信这也是一个很好的进阶项目。但如果你连GNU Radio的流图都没搭过建议先花时间把官方教程过一遍不然直接上手这个会非常痛苦。我之所以要做这个阶段性总结是因为从bit流到QPSK点簇这个过程涉及到的坑实在太多了。有些坑是GNU Radio模块配置的问题有些是P201Pro硬件参数设置的问题还有些是对通信原理理解不到位导致的问题。把这些东西整理出来一方面给自己做个记录另一方面也希望能帮到正在踩同样坑的人。2. QPSK调制在GNU Radio里的实现逻辑与参数选择2.1 为什么选QPSK而不是BPSK或8PSK在数字调制方式的选择上BPSK、QPSK、8PSK是最常见的几个选项。BPSK每个符号只携带1个比特抗噪性能最好但频谱效率最低。8PSK每个符号携带3个比特频谱效率高但星座点之间距离近对信噪比要求高。QPSK每个符号携带2个比特在频谱效率和抗噪性能之间取了一个比较好的平衡点。对于P201Pro这种级别的硬件来说QPSK是一个比较稳妥的选择。它的星座点分布在四个象限相邻点之间的相位差是90度即使有一定的相位噪声和幅度不平衡也不容易发生符号判决错误。我在实验初期试过8PSK结果星座图上的点簇糊成一团根本分不清八个点。后来换回QPSK稍微调一下增益四个点簇就清清楚楚了。从实现角度来说GNU Radio里QPSK的调制和解调模块都非常成熟。Constellation QPSK这个对象直接定义了QPSK的星座图Constellation Modulator和Constellation Demodulator分别负责调制和解调。你不需要自己去写映射表这些底层的东西GNU Radio已经帮你封装好了。2.2 星座图对象与差分编码的取舍在GNU Radio里搭建QPSK调制链路第一步是创建一个QPSK星座图对象。这个对象本质上就是一个查找表定义了每个符号对应的复数坐标。标准QPSK的四个点是(11j)/sqrt(2)、(-11j)/sqrt(2)、(-1-1j)/sqrt(2)、(1-1j)/sqrt(2)除以sqrt(2)是为了归一化功率。接下来要决定是否使用差分编码。差分编码的好处是接收端不需要知道绝对的相位参考只需要知道相邻符号之间的相位变化就能解调。这在存在相位模糊的情况下非常有用比如接收端锁相环可能锁定在四个相位中的任意一个。但差分编码的代价是误码率会略微升高因为一个符号的错误会影响两个符号的解码。我的建议是如果你的接收端有可靠的相位同步机制可以不用差分编码。如果相位模糊问题比较严重那就加上差分编码。在GNU Radio里Constellation Modulator模块有一个Differential Encoding选项勾上就行。我一开始没勾结果接收端解出来的比特流总是有固定的错误模式后来加上差分编码就正常了。2.3 脉冲成型滤波器的参数计算脉冲成型滤波器是QPSK调制链路里最容易被忽视但又极其重要的一个环节。它的作用是限制信号带宽减少码间干扰。如果不加脉冲成型直接让符号以矩形脉冲的形式发送频谱会非常宽相邻信道之间会严重干扰。GNU Radio里常用的脉冲成型滤波器是Root Raised Cosine Filter简称RRC滤波器。它的关键参数有两个滚降系数Excess BW和滤波器长度Num Taps。滚降系数决定了滤波器的带宽典型值在0.2到0.5之间。滚降系数越小频谱效率越高但滤波器的实现难度越大对定时同步的要求也越高。滤波器长度的计算稍微复杂一点。一般来说滤波器长度应该覆盖至少6到10个符号周期。假设每个符号的采样点数是sps那么滤波器长度大约是sps乘以符号数再加1。比如sps4覆盖8个符号那滤波器长度就是33。在GNU Radio里Root Raised Cosine Filter模块的Num Taps参数就是填这个值。我实测下来滚降系数取0.35sps取4滤波器长度取33这个组合在P201Pro上跑起来效果比较稳定。滚降系数再小的话接收端的定时同步会变得很敏感稍微有一点采样偏差星座图就开始发散。3. 从GNU Radio流图到P201Pro射频前端的完整链路搭建3.1 发射链路的模块连接顺序发射链路的逻辑顺序是比特流生成、符号映射、脉冲成型、上变频、射频发射。在GNU Radio里对应的模块连接是这样的Random Source或者File Source产生比特流Constellation Modulator把比特映射成QPSK符号Root Raised Cosine Filter做脉冲成型Multiply Const调整幅度Rational Resampler做采样率变换UHD: USRP Sink通过P201Pro发射出去这里有一个很容易搞错的地方采样率的匹配。GNU Radio内部的采样率和你实际想要的符号率之间需要通过sps来换算。比如你想要100k的符号率sps设为4那GNU Radio内部的采样率就是400k。但P201Pro的射频采样率通常是固定的或者只能取特定值所以中间需要一个Rational Resampler来做分数倍采样率变换。我在第一次搭建的时候直接把符号率设成了P201Pro的采样率结果sps变成1脉冲成型滤波器完全失效频谱宽得离谱。后来才明白必须让GNU Radio内部的采样率等于符号率乘以sps然后再通过重采样模块匹配到硬件的采样率。3.2 接收链路的同步模块配置接收链路比发射链路复杂得多因为要处理各种非理想因素。基本的模块顺序是UHD: USRP Source从P201Pro接收信号Root Raised Cosine Filter做匹配滤波Polyphase Clock Sync做符号定时同步Costas Loop做载波相位同步Constellation Demodulator做符号判决Constellation Decoder还原比特流Polyphase Clock Sync这个模块是接收链路里最难调的。它的作用是找到最佳的采样时刻让每个符号都在信噪比最高的点上被采样。关键参数包括环路带宽Loop BW、阻尼因子Damping Factor和滤波器长度。环路带宽决定了同步环路的收敛速度值越大收敛越快但稳态误差也越大。我一般从0.01开始试如果星座图转得厉害就加大到0.05。Costas Loop负责消除载波频率和相位偏差。它的环路带宽也需要仔细调整。带宽太窄的话频率偏差稍微大一点就锁不住带宽太宽的话噪声抑制效果不好星座图上的点簇会变胖。我通常把Costas Loop的带宽设在符号率的0.5%到1%之间。3.3 P201Pro的增益与天线配置P201Pro的射频参数配置直接影响接收信号的质量。最重要的两个参数是发射增益和接收增益。发射增益太高会导致信号失真太低则接收端信噪比不够。接收增益太高会把噪声也放大太低则信号太弱无法解调。我的经验是先用一个适中的发射增益比如20dB然后在接收端慢慢增加增益同时观察星座图。当星座图上的四个点簇开始变得清晰时再微调发射增益。如果接收增益加到很大星座图还是糊的那可能是发射增益不够或者天线没接好。天线方面P201Pro通常配的是小型的宽带天线。在实验环境下发射和接收天线之间的距离不要太远1到2米就够了。太远的话信号衰减太大太近的话又可能因为信号太强导致接收端饱和。我一般把两块板子放在桌子两端中间隔个一两米效果比较理想。4. 星座图诊断从点簇形态反推链路问题4.1 四个点簇清晰且稳定链路正常当你看到星座图上四个点簇清晰、稳定、对称地分布在四个象限每个点簇的方差很小那说明整个链路工作正常。这时候你可以进一步观察点簇的位置是否准确落在理论坐标上。如果点簇整体偏移说明有固定的相位偏差如果点簇围绕原点旋转说明有频率偏差没有完全消除。我第一次看到清晰的QPSK星座图时那种成就感是非常强烈的。但要注意星座图好看不代表误码率就一定低。有时候星座图看起来不错但误码率测试结果却很差这可能是帧同步或者比特映射的问题。所以星座图只是一个直观的诊断工具最终还是要看误码率。4.2 点簇模糊成一团信噪比不足或同步失败星座图上的点簇如果糊成一团分不清四个象限最常见的原因是信噪比不够。这时候你需要检查发射增益和接收增益是否合适天线连接是否正常周围是否有干扰源。如果增益已经加得很大了还是糊那可能是脉冲成型滤波器的参数不对导致码间干扰严重。另一个常见原因是符号定时同步没有收敛。Polyphase Clock Sync模块的环路带宽如果设得太小或者初始采样相位偏差太大同步环路可能根本锁不住。这时候你可以试着加大环路带宽或者换用Symbol Sync模块它的鲁棒性更好一些。还有一种情况是载波相位没有锁定。Costas Loop如果带宽设得太窄而发射端和接收端之间的频率偏差又比较大那相位会一直旋转星座图上的点簇会形成一个圆环。这时候需要加大Costas Loop的带宽或者先用FFT模块估计一下频率偏差手动补偿一部分。4.3 点簇分裂成八个或更多符号映射或滤波问题如果你在星座图上看到八个点簇而不是四个那说明符号映射出了问题。可能是调制端用了8PSK而解调端用了QPSK或者差分编码的配置不一致。检查一下Constellation Modulator和Constellation Demodulator是否使用了同一个星座图对象。还有一种可能是脉冲成型滤波器的滚降系数太小导致符号间干扰严重每个符号的能量泄漏到了相邻符号上。这时候星座图上的点簇会分裂成多个小簇。解决办法是加大滚降系数或者增加滤波器的长度。4.4 点簇围绕原点旋转载波频偏未消除星座图上的点簇如果围绕原点缓慢旋转说明载波频率偏差没有被完全消除。Costas Loop虽然能跟踪一定的频率偏差但如果偏差超过了它的捕获范围就锁不住了。你可以用Frequency Xlating FIR Filter或者FFT模块先估计一个粗略的频率偏差然后在Costas Loop之前补偿掉大部分剩下的细小偏差再由Costas Loop来跟踪。我遇到过一次比较诡异的情况星座图上的点簇旋转速度时快时慢后来发现是P201Pro的参考时钟没有锁定导致采样时钟和载波频率都在漂移。解决办法是确保P201Pro的时钟源设置正确如果条件允许的话用外部参考时钟会更稳定。5. 那些让我熬夜的坑帧同步、采样率与增益的连环问题5.1 帧同步头检测不到相关器阈值和序列长度的权衡帧同步是数字通信里非常关键的一步。接收端需要知道一帧数据从哪里开始才能正确地解调后面的符号。GNU Radio里常用的帧同步方法是发送一个已知的同步序列比如Zadoff-Chu序列或者Barker码接收端用相关器去检测这个序列。我一开始用的同步序列太短只有16个符号结果相关器的峰值不够明显经常误检测或者漏检测。后来把序列加长到64个符号相关峰值就非常突出了。但序列太长也有问题它会占用额外的带宽和发射时间。所以需要在检测可靠性和开销之间做一个权衡。相关器的阈值设置也很关键。阈值设得太高同步头检测不到设得太低噪声也会被误认为是同步头。我一般先把阈值设在0.8左右然后根据实际的信噪比情况微调。如果误检测太多就提高阈值如果漏检测太多就降低阈值。5.2 采样率不匹配导致的符号滑动采样率不匹配是一个很隐蔽的问题。表面上看星座图可能还行但误码率就是下不去。原因在于发射端和接收端的采样时钟不完全一致导致接收端的采样点相对于符号边界在缓慢滑动。虽然Polyphase Clock Sync能跟踪这种滑动但如果滑动速度太快同步环路就跟不上了。解决这个问题的根本办法是让发射端和接收端的采样时钟同源。如果P201Pro支持外部时钟输入可以用同一个时钟源驱动两块板子。如果不支持那就只能靠接收端的同步环路来跟踪这时候需要把环路带宽适当加大但代价是噪声抑制效果会变差。我在实验中发现即使两块P201Pro都用内部时钟只要采样率不是特别高Polyphase Clock Sync还是能跟上的。但如果采样率超过1M符号滑动就会变得很明显星座图会周期性地变糊再变清晰。5.3 发射增益过大导致的非线性失真发射增益过大会让功率放大器进入非线性区产生谐波失真和互调失真。这种失真在星座图上的表现是点簇向外扩散而且扩散的方向不是随机的而是沿着星座图的径向。如果你看到点簇呈放射状扩散那多半是发射增益太大了。我一开始为了追求接收端的信噪比把发射增益开到了最大结果星座图上的点簇虽然很大但形状很奇怪。后来把发射增益降下来同时提高接收增益星座图反而变得更清晰了。这个经验告诉我增益的分配比总增益的大小更重要。5.4 直流偏移和IQ不平衡的校正P201Pro这类射频前端不可避免地存在直流偏移和IQ不平衡。直流偏移会在星座图的中心产生一个亮点IQ不平衡会让星座图上的点簇变成椭圆形而不是圆形。GNU Radio里有专门的模块来校正这些问题比如DC Blocker和IQ Balance。我一般会在接收链路的最前面加上DC Blocker把直流分量去掉。IQ不平衡的校正稍微复杂一点需要先估计不平衡参数然后再补偿。如果对性能要求不是特别高可以跳过这一步QPSK对IQ不平衡的容忍度还是比较高的。6. 实测数据与性能评估误码率、EVM和星座图质量6.1 误码率测试的完整流程误码率是衡量通信系统性能的最直接指标。测试方法很简单发射端发送已知的比特序列接收端解调后和原始序列对比统计错误的比特数除以总比特数。但在实际操作中有几个细节需要注意。首先要确保收发两端的比特序列是同步的。如果接收端不知道从哪里开始对比那误码率会高得离谱。这就是帧同步的作用。其次要发送足够多的比特才能得到统计上可靠的误码率。一般来说至少需要发送10万个比特如果误码率很低的话甚至需要上百万个比特。我在实验中用File Source读取一个预先准备好的比特文件接收端把解调后的比特写入另一个文件然后用Python脚本对比两个文件计算误码率。在信噪比比较好的情况下误码率可以做到1e-4以下。如果误码率在1e-2左右那说明链路还有问题需要回去检查星座图。6.2 EVM作为星座图质量的量化指标EVM误差向量幅度是衡量星座图质量的一个量化指标。它定义为实际星座点与理想星座点之间的误差向量的均方根值通常用百分比表示。EVM越小说明星座图越清晰信号质量越好。在GNU Radio里你可以用Constellation Display模块观察星座图但EVM需要自己计算。一个简单的方法是在接收端把解调后的符号和理想符号对比计算误差向量的均方根。我写了一个简单的Python脚本来做这件事在信噪比20dB的时候EVM大约在10%左右信噪比30dB的时候EVM可以降到5%以下。EVM和误码率之间有相关性但不完全对应。有时候EVM看起来不错但误码率很高这可能是符号映射或者帧同步的问题。所以EVM和误码率要结合起来看不能只看其中一个。6.3 不同信噪比下的星座图对比为了直观地展示信噪比对星座图的影响我做了几组对比实验。在信噪比很低比如5dB的时候星座图上的四个点簇完全糊在一起根本分不清象限。信噪比10dB的时候点簇开始有了雏形但方差很大相邻点簇之间有明显的重叠。信噪比20dB的时候四个点簇已经比较清晰了但每个点簇还是有一定的扩散。信噪比30dB以上的时候点簇非常紧凑几乎就是四个小圆点。这个对比实验让我对信噪比和星座图质量的关系有了直观的认识。也让我明白为什么在实际通信系统里功率控制如此重要。发射功率每增加3dB信噪比就提高3dB星座图的质量就会有明显的改善。7. 从这套系统还能延伸出什么这套基于P201Pro和GNU Radio的QPSK收发系统虽然只是一个简单的实验平台但它是一个非常好的起点。你可以在这个基础上做很多扩展。比如把QPSK换成16QAM或者64QAM观察高阶调制对信噪比的要求有多高。或者加入信道编码比如卷积码或者LDPC码看看编码增益能带来多少性能提升。还可以加入OFDM调制把单载波系统变成多载波系统体验一下OFDM在频率选择性信道下的优势。如果你想更深入地研究射频前端可以尝试用AD9361或者AD-FMCOMMS5这类更专业的软件定义无线电开发板。它们提供了更宽的带宽和更灵活的射频配置适合做更复杂的通信系统实验。但相应的配置也会更复杂需要你对射频电路和通信原理有更深的理解。我个人在实际操作中的体会是软件无线电这个东西理论看再多不如动手搭一次。很多问题只有在你真正去调的时候才会暴露出来比如采样率不匹配、增益分配不合理、同步环路参数不对。每一次调试都是一次对通信原理的重新理解。这套系统我前后调了大概一个月中间经历了无数次星座图糊掉、误码率居高不下、帧同步检测不到的情况。但正是这些踩坑的经历让我对QPSK调制解调的全过程有了非常扎实的掌握。最后再分享一个小技巧在调试接收链路的时候可以先把发射端和接收端用线缆直连跳过无线信道。这样信噪比会非常高星座图很容易就出来了。等有线链路调通了再换成天线做无线传输。这样可以排除掉很多无线信道带来的不确定性让调试过程更有针对性。

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

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

免费获取报价 →
↑