
1. 从比特到星座这套收发系统到底在做什么软件无线电这个词听起来挺唬人但拆开看它干的事情其实很朴素把原来靠一堆模拟电路硬扛的调制解调、滤波、混频尽量搬到数字域里用软件去定义无线电的行为。我这次阶段性总结的主角是一套基于P201Pro和GNU Radio搭起来的简单收发系统链路走的是QPSK调制最终目标是把一串比特流经过编码、映射、脉冲成型、上变频发出去再在接收端把点簇还原出来看星座图能不能对上。如果你刚接触软件无线电可能会觉得从bit流到QPSK点簇这句话有点抽象。换个说法你手里有一串0和1比如10110010这串东西本身没法直接扔到空中得先把它两个一组打包映射成四个相位状态之一这就是QPSK。然后把这些相位状态变成波形通过射频前端发出去。接收端反过来把收到的波形采样、下变频、匹配滤波最后在复平面上画出一个个点理想情况下它们应该聚成四团这就是所谓的点簇。这套系统适合谁看我觉得有三类人。第一类是通信、电子相关专业的学生正在做软件无线电实验需要一份能跑通的参考第二类是想入门GNU Radio的工程师想找个完整链路练手而不是只跑官方那个FM接收例子第三类是做原型验证的开发者手头有P201Pro这类板子想快速搭个收发链路验证想法。不管你是哪一类这篇总结都会把关键环节、参数选择、踩过的坑讲清楚让你能照着复现。P201Pro这块板子在这套系统里扮演的是射频前端的角色它负责把基带信号搬到射频频段发出去也负责把空中的信号收下来变回基带。GNU Radio则是跑在主机上的软件部分负责所有的数字信号处理。两者之间通过高速接口传IQ采样数据。整个链路的核心矛盾就一个采样率、带宽、处理能力三者要平衡任何一环拖后腿星座图就会糊成一团。2. 整体链路设计与方案选型思路2.1 为什么选QPSK作为切入点通信调制方式一大堆从最简单的OOK、BPSK到QPSK、8PSK再到16QAM、64QAM复杂度递增频谱效率也递增。我选QPSK作为这套收发系统的调制方式理由很实在。QPSK每个符号携带2个比特频谱效率是BPSK的两倍但抗噪性能只比BPSK差一点点。它的星座图只有四个点分布在复平面的四个象限相位分别是45度、135度、225度、315度。四个点两两之间最小相位差是90度这个间隔足够大即使有噪声、有相位偏移也不容易判错。相比之下16QAM有16个点点与点之间挤得近对信噪比和同步精度的要求高得多。对于一套实验性质的收发系统QPSK是性价比最高的选择实现难度适中能覆盖调制映射、脉冲成型、载波同步、符号同步这些核心知识点又不至于一上来就被高阶调制的同步问题劝退。我个人的经验是把QPSK这条链路彻底跑通、星座图收干净再往上做16QAM心里就有底了。2.2 P201Pro与GNU Radio的分工逻辑这套系统里P201Pro和GNU Radio的分工必须想清楚否则很容易出现到底该在哪边做处理的纠结。P201Pro本质是一块软件定义无线电前端核心是射频收发芯片加高速数据接口。它负责的事情包括数模转换把GNU Radio送来的数字IQ样本变成模拟信号上变频把基带信号搬到射频频段功率放大把信号推到足够电平发出去接收方向则反过来低噪放、下变频、模数转换把射频信号变回数字IQ样本。GNU Radio负责的是所有聪明的部分比特打包、星座映射、脉冲成型滤波、重采样、同步算法、星座图显示。这些处理放在主机上做好处是灵活改个参数重新跑就行不用动硬件。代价是主机和P201Pro之间的数据吞吐有上限采样率不能无限拉高。我实测下来这套分工在几兆采样率的量级上是稳的。如果你想把采样率拉到几十兆主机这边的USB或者网络接口可能就先扛不住了这时候就得考虑把部分处理下放到FPGA里但那是另一个阶段的事这套简单收发系统暂时不需要。2.3 收发链路的整体框图思路虽然不能用图但我可以把链路的走向用文字捋一遍你脑子里应该能形成一条清晰的流水线。发送方向比特源产生随机0/1序列经过打包变成符号流每个符号2比特符号流做QPSK星座映射变成复数样本复数样本过脉冲成型滤波器通常是根升余弦限制带宽、减少码间干扰然后做重采样把采样率调整到P201Pro能接受的速率最后送给P201Pro上变频发射。接收方向P201Pro把收到的射频信号下变频、采样送出复数IQ样本GNU Radio这边先做重采样把速率调整到处理链方便的频率然后过匹配滤波和发送端的根升余弦配对接着做符号同步找到最佳采样时刻再做载波同步纠正频偏和相位偏移最后把符号判决成星座点画在星座图上同时解映射回比特和发送的比特对比算误码率。这条链路里脉冲成型和匹配滤波是一对符号同步和载波同步是两大难点星座图是最终的验收标准。下面我会逐个拆开讲。3. 核心环节的细节拆解与参数选择3.1 比特打包与QPSK星座映射比特打包这一步看着简单但有个细节容易翻车比特到符号的映射顺序。QPSK一个符号对应2个比特这两个比特怎么组合成四种状态是有讲究的。常见的映射方式有格雷码映射和自然二进制映射。格雷码的好处是相邻星座点之间只差一个比特这样即使判决到相邻点也只错一个比特误码率性能更好。我建议用格雷码映射具体对应关系是00对应45度01对应135度11对应225度10对应315度。注意这个顺序00和01相邻只差一位01和11相邻只差一位11和10相邻只差一位10和00相邻只差一位这就是格雷码的精髓。在GNU Radio里星座映射可以用Constellation QPSK模块配合Constellation Modulator也可以自己用Chunks to Symbols加查表实现。我倾向于用现成的星座模块因为它的映射关系已经按标准做好了不容易出错。如果你要自己搭记得把映射表写对我见过有人把01和10搞反结果星座图转了个方向排查了半天。映射出来的复数样本实部和虚部都在正负1附近具体取决于你选的归一化方式。有的实现会把星座点归一化到单位功率也就是每个点的模长是1这样四个点的坐标是正负根号二分之一。归一化的目的是让发送功率可控也方便后面算信噪比。3.2 脉冲成型为什么必须做怎么做基带信号如果直接送出去它的频谱是sinc形状旁瓣衰减很慢会干扰相邻频段。脉冲成型滤波器的任务就是把每个符号的波形捏成一个能量集中、旁瓣低的形状同时保证在符号采样点上没有码间干扰。根升余弦滤波器是收发系统的标配。它的思路是发送端用一个根升余弦接收端再用一个同样的根升余弦两者卷积起来正好是一个完整的升余弦响应满足奈奎斯特第一准则也就是在符号时刻上无码间干扰。关键参数有两个滚降系数和符号率。滚降系数通常取0.35这是个折中值。取小了频谱利用率高但时域拖尾长对同步精度要求高取大了频谱占用宽但时域波形收敛快对同步宽容。我实验里用0.35实测星座图收敛得比较干净。符号率决定了占用带宽比如符号率1M滚降0.35占用带宽大约是1.35M。在GNU Radio里用Root Raised Cosine Filter模块参数填增益1、滚降0.35、符号数比如11、每个符号的采样数比如4。这里每个符号的采样数就是sps它决定了滤波器的插值倍数。发送端做插值接收端做抽取两边要对应上。注意发送端和接收端的根升余弦参数必须完全一致滚降系数、符号数、sps任何一个对不上星座图都会散。我踩过这个坑接收端sps填错星座图直接变成一团糊。3.3 采样率规划与重采样采样率规划是这套系统里最容易被忽视、又最容易出问题的地方。P201Pro有它支持的采样率范围GNU Radio的处理链也有它舒服的速率区间两者不一定直接匹配中间就得靠重采样来桥接。我的做法是先定符号率比如1M符号每秒。发送端每个符号插值4倍那基带采样率就是4M。如果P201Pro的发送采样率设成4M那就不用额外重采样。但实际中P201Pro的采样率往往是固定的几个档位比如你设成5M那就得在GNU Radio里把4M重采样到5M用Rational Resampler插值5抽取4。接收端反过来P201Pro以某个速率采样比如5M我要把它变到4M来处理就插值4抽取5。重采样会引入额外的计算和潜在的失真所以能少做就少做。理想情况是让P201Pro的采样率正好是符号率乘以sps的整数倍这样两边都不用重采样。这里有个经验采样率不要设得太低否则脉冲成型的波形采样点太少滤波效果差也不要设得太高主机处理不过来会丢样本星座图会随机跳。我一般让sps在4到8之间兼顾波形质量和处理负担。3.4 符号同步与载波同步的基本原理符号同步要解决的问题是接收端不知道每个符号的边界在哪采样时刻偏一点星座点就偏。常用的算法有Gardner算法和Mueller-Muller算法GNU Radio里对应Symbol Sync模块。Gardner算法的思路是利用相邻采样点的差值来估计定时误差它对载波相位不敏感所以可以放在载波同步之前做。Mueller-Muller则对载波相位敏感一般放在载波同步之后。我实验里用Gardner配合Polyphase Clock Sync或者新的Symbol Sync模块效果不错。载波同步要解决的是发射端和接收端的本振频率不可能完全一致存在频偏同时还有相位噪声。频偏会让星座图整体旋转相位噪声会让星座点模糊。常用的方法是Costas环GNU Radio里有Costas Loop模块QPSK的话环路带宽设成符号率的百分之几比如1%到5%具体要试。提示同步顺序很重要。一般先做符号同步再做载波同步。如果先做载波同步符号定时还没对准Costas环的误差信号会不准可能锁不上。4. 实操过程与关键环节实现4.1 发送端流图搭建步骤发送端的流图我按数据流向一步步搭这样逻辑清晰出问题也好定位。第一步放一个Random Source输出比特参数里最小0最大2类型是byte这样它输出的是0和1。采样数可以设大一点比如100k保证有足够的数据看星座图。第二步接一个Pack K Bits把8个比特打包成一个字节不对QPSK是2比特一个符号所以这里其实不需要Pack K Bits而是要用Chunks to Symbols或者星座调制模块。我直接用Constellation Modulator它的输入是字节流每个字节代表一个符号的索引0到3。所以前面得有个模块把比特流变成0到3的符号索引。具体做法用Unpack K Bits把字节拆成比特然后每2个比特组合成一个符号。GNU Radio里可以用Pack K Bits的反向思路或者直接用Repack Bits。更简单的办法是用Constellation Modulator配合Packed to Unpacked之类的模块。我实际用的是Random Source输出0/1字节接Unpack K Bits变成比特流再接一个自定义的Python Block把每2比特映射成0到3的符号索引然后送Constellation Modulator。第三步Constellation Modulator输出复数样本接Root Raised Cosine Filter做脉冲成型sps设4滚降0.35。第四步接Rational Resampler做重采样把速率调到P201Pro的发送采样率。第五步接P201Pro Sink设置中心频率、采样率、增益等参数把信号发出去。整个发送链路的采样率关系要算清楚符号率1Msps 4基带采样率4M如果P201Pro发送采样率是4M那Rational Resampler可以省掉。如果P201Pro是5M就插值5抽取4。4.2 接收端流图搭建步骤接收端比发送端复杂因为多了同步环节。第一步P201Pro Source设置中心频率和发送端一致采样率设成和发送端匹配的值增益根据实际信号强度调太小了信噪比不够太大了会饱和。第二步Rational Resampler把采样率变到处理链方便的值比如从5M变到4M。第三步Root Raised Cosine Filter参数和发送端一致做匹配滤波。注意这里的滤波器是抽取模式sps设4相当于每个符号抽取到1个采样点。第四步Symbol Sync做符号同步。参数里环路带宽、阻尼系数这些可以先默认跑起来看星座图再调。第五步Costas Loop做载波同步。阶数设2因为QPSK是四相Costas环的阶数一般是调制阶数的一半QPSK对应2。环路带宽设符号率的1%左右比如10k。第六步Constellation Decoder把同步后的符号判决成星座点输出符号索引。第七步Constellation Sink画星座图。这是验收的关键四个点簇越集中越好。第八步解映射回比特和发送的比特对比算误码率。可以用Constellation Decoder输出符号索引再转回比特接Error Rate模块。4.3 关键参数的计算与设置参数设置这块我把几个核心的算法列一下方便你照着填。符号率1Msps 4基带采样率4M。根升余弦滚降0.35符号数11sps 4。Costas环阶数2环路带宽10k阻尼系数0.707。Symbol Sync的环路带宽可以设成符号率的1%到5%我一般从1%开始试。P201Pro的中心频率根据你的实验许可来定比如433M或者915M这些常用频段具体要遵守当地的无线电管理规定。发送增益不要一上来就拉满先设小一点用频谱仪或者接收端看信号强度慢慢加。注意发送增益和接收增益要配合调。发送太大接收端饱和星座图会削顶发送太小接收端信噪比不够星座图会散。我一般先把发送增益设到中间值调接收增益看星座图再微调发送增益。4.4 实测星座图与误码率观察流图跑起来之后最直观的验收就是星座图。理想情况下QPSK的星座图应该是四个清晰的点簇分别在四个象限点簇越紧越好。我实测下来刚开始跑的时候星座图往往是一团糊或者四个点簇在旋转。一团糊通常是同步没做好或者滤波器参数不匹配旋转通常是载波频偏没纠正Costas环没锁上。这时候要一步步排查先看匹配滤波后的波形对不对再看符号同步有没有对准最后看Costas环有没有锁。误码率方面在信噪比足够的情况下QPSK的理论误码率可以做到很低。我实验里在合适的增益下误码率能到1e-4以下。如果误码率居高不下先看星座图星座图散了误码率肯定高星座图好了误码率还高那可能是解映射的比特顺序搞错了。5. 常见问题与排查技巧实录5.1 星座图不收敛的几种典型原因星座图不收敛是最常见的问题原因可能有好几种我按排查顺序列一下。第一种滤波器参数不匹配。发送端和接收端的根升余弦滚降系数、sps、符号数任何一个不一致星座图都会散。排查方法是把两边的参数打印出来对比确保完全一致。第二种采样率没对齐。发送端和接收端的采样率关系算错导致每个符号的采样点数不对。排查方法是算清楚符号率、sps、采样率三者的关系确保接收端每个符号正好抽取到1个点。第三种符号同步没锁。Symbol Sync的环路带宽设得不合适或者输入信号质量太差导致定时误差估计不准。排查方法是先把环路带宽调大一点看能不能锁上锁上后再调小优化。第四种载波同步没锁。Costas环的环路带宽或者阶数设错导致频偏纠正不了。排查方法是看星座图是不是在旋转如果是就是载波同步的问题。5.2 频偏与相位噪声的处理经验频偏和相位噪声是载波同步的两大敌人。频偏来自本振频率不一致表现为星座图整体旋转相位噪声来自本振的短期不稳定表现为星座点模糊。处理频偏Costas环是主力。环路带宽要设得合适太窄锁得慢可能锁不上太宽跟踪快但引入的噪声大。我一般从符号率的1%开始试锁上后慢慢调窄。处理相位噪声除了Costas环还可以在星座图上看。如果星座点沿圆周方向模糊就是相位噪声大。这时候可以检查P201Pro的本振质量或者降低环路带宽让环路对相位噪声的抑制更强。提示如果频偏太大超过Costas环的捕获范围可以先做粗频偏估计和纠正再做细跟踪。GNU Radio里有Frequency Xlating FIR Filter可以做粗纠正。5.3 采样率与处理能力的平衡采样率设高了主机处理不过来会丢样本星座图会随机跳。采样率设低了波形质量差星座图也会散。这个平衡点要靠试。我的经验是先看主机的CPU占用率。如果GNU Radio跑起来CPU占用率接近100%那采样率就设高了得降。如果CPU占用率很低可以适当提高采样率改善波形质量。另外GNU Radio的流图里每个模块的处理速度不一样瓶颈往往在计算量最大的模块比如根升余弦滤波器和同步模块。如果瓶颈在这可以考虑降低sps或者用更高效的实现。5.4 常见问题速查表现象可能原因排查方法星座图一团糊滤波器参数不匹配对比收发两端根升余弦参数星座图旋转载波频偏未纠正检查Costas环是否锁定调环路带宽星座点沿圆周模糊相位噪声大降低环路带宽检查本振质量星座图随机跳采样率过高丢样本看CPU占用率降低采样率误码率高但星座图正常比特映射顺序错检查星座映射表确认格雷码顺序同步锁不上环路带宽不合适先调大带宽尝试锁定再调小优化6. 阶段性总结与后续扩展方向这套基于P201Pro和GNU Radio的QPSK收发系统从比特流到星座点簇把软件无线电的核心环节都走了一遍。发送端的比特打包、星座映射、脉冲成型、重采样接收端的匹配滤波、符号同步、载波同步、星座判决每一个环节都有它的门道。我踩过的坑主要集中在参数匹配和同步调优上滤波器参数不一致、采样率算错、环路带宽设偏这些都会让星座图糊掉。我个人在实际操作中的体会是软件无线电的实验七分靠参数三分靠调试。参数算清楚了链路搭对了剩下的就是耐心调同步。星座图是最好的老师它直观地告诉你哪里出了问题。四个点簇收得越紧说明链路越健康。后续如果想继续深入有几个方向可以扩展。一是把调制阶数提上去做16QAM甚至64QAM挑战更高阶的同步和判决。二是把部分处理下放到FPGA提高采样率和实时性。三是加入信道编码比如卷积码或者LDPC做完整的编码调制链路。四是做双向通信一端发一端收验证完整的收发闭环。这些方向每一个都够写一篇新的总结等我把16QAM跑通了再来分享。