
1. 从零认识这套组合为什么偏偏是B210加GNU Radio1.1 这套东西到底能干什么软件无线电这个概念听起来很唬人但说白了就一句话把传统上用硬件电路完成的调制、解调、滤波、变频这些活儿搬到电脑里用软件来做。你手里那块USRP B210本质上就是一个高速的模数/数模转换器加上射频前端它负责把空中的电磁波抓下来变成数字流送给电脑或者把电脑算好的数字流变成电磁波发出去。真正决定你收什么、发什么、怎么处理的是跑在电脑上的GNU Radio。我第一次接触这套组合的时候最直观的感受就是“自由”。传统对讲机你只能听它预设好的频段和模式但B210加上GNU Radio从调频广播到LoRa信号从ADS-B飞机广播到气象卫星云图只要你能想到的、天线能收到的理论上都可以拿来分析。这也是为什么它在高校实验室、创客空间和通信工程圈子里这么受欢迎。适合读这篇内容的人我大致分三类第一类是通信、电子相关专业的学生课程里提到了软件无线电但没实际动过手第二类是做物联网或者无线产品开发的工程师想用低成本方案验证一下自己产品的射频行为第三类就是纯粹的无线电爱好者想找个能玩得深、又能学到真东西的平台。不管你是哪一类只要跟着走完一遍至少能做到“硬件连得上、软件跑得通、信号收得到”。1.2 为什么选B210而不是其他型号市面上能跑GNU Radio的硬件不少从几百块的RTL-SDR到几万块的高端设备都有。B210的定位很特殊它卡在一个“性能够用但价格不至于劝退”的甜蜜点上。它支持70MHz到6GHz的连续覆盖瞬时带宽最高能到56MHz而且是2发2收的全双工架构。这意味着你不仅能接收还能发射能做双向链路实验这是RTL-SDR那种只收不发的设备完全做不到的。另外一个关键点是B210用的是USB 3.0接口。这一点非常重要因为软件无线电对数据吞吐量的要求极高。你可以简单算一笔账假设采样率设为10MS/s每个采样点是16位复数实部虚部各16位那数据率就是10M × 4字节 40MB/s。USB 2.0的理论上限才60MB/s实际能稳定跑到的也就30多MB/s根本不够用。USB 3.0的理论带宽是5Gbps换算下来约625MB/s余量就充足多了。所以如果你打算认真玩USB 3.0的接口和线材是硬性要求这个后面还会细说。还有一点是B210的时钟架构。它板上有一颗TCXO晶振也可以外接10MHz参考时钟和PPS信号。对于一般的入门实验板载晶振的精度足够了但如果你要做多设备同步或者对频率精度要求很高的实验外接时钟就是必须的。这个设计给了你从入门到进阶的完整路径不用换硬件。1.3 GNU Radio在整个链路里扮演什么角色很多人一开始会搞混以为GNU Radio是个软件界面装上了就能收信号。其实GNU Radio是一个信号处理的框架它本身不直接跟硬件打交道。真正跟B210通信的是UHD驱动全称是USRP Hardware Driver。UHD负责把B210的数据通过USB传上来GNU Radio再通过UHD的接口去读取这些数据。你可以把整个链路想象成一条流水线B210是原料采集站UHD是运输带GNU Radio是加工车间。GRC也就是GNU Radio Companion是GNU Radio的图形化界面让你用拖拽模块的方式搭建信号处理流程不用写代码。对于入门来说GRC是最友好的入口你先把流程图搭起来看到信号了再去理解每个模块背后的原理这个学习曲线会平缓很多。2. 动手之前的准备工作硬件、软件、环境一个都不能少2.1 硬件清单与连接要点先把需要的东西列清楚。核心设备是USRP B210一块这个不用多说。天线方面入门建议至少准备两根一根覆盖你目标频段的宽带天线比如700MHz到2.6GHz的橡胶天线或者小盘锥天线另一根可以用简单的拉杆天线做对比实验。射频线缆要注意阻抗匹配B210的SMA接口是50欧姆的别拿75欧姆的电视线凑合驻波比会很差。USB 3.0线材是个容易被忽视的坑。B210包装里附带的线一般质量还行但如果你要延长一定要买带屏蔽的USB 3.0延长线而且长度最好不要超过1米。我试过用一根2米的普通USB 3.0线结果采样率一超过5MS/s就开始丢包换成短的屏蔽线之后立刻稳定。这个现象的本质是USB 3.0的高速信号对线材的阻抗一致性和屏蔽要求很高劣质线材会导致误码率上升表现出来就是数据流断断续续。供电方面B210可以通过USB总线供电但在高采样率或者发射模式下USB口提供的电流可能不够。建议准备一个外接的5V/2A电源适配器插在B210的DC接口上。这样能保证设备在全速运行时不会因为供电不足而复位。2.2 软件栈的安装顺序与版本选择软件这块我强烈建议在Ubuntu系统上操作20.04或者22.04都可以。Windows下虽然也能装但驱动和依赖库的问题会多很多尤其是USB驱动层新手很容易卡住。如果你只有Windows电脑可以考虑装个双系统或者用虚拟机但虚拟机对USB 3.0的透传支持不一定完美这点要有心理准备。安装顺序很重要一定是先装UHD驱动再装GNU Radio。因为GNU Radio在编译或者安装的时候会检测系统里有没有UHD如果有的话它会自动把UHD相关的模块编译进去。如果你反过来先装了GNU Radio再装UHD那GRC里可能就找不到USRP Source和USRP Sink这两个关键模块。UHD的安装Ubuntu下最省事的方式是用aptsudo apt update sudo apt install libuhd-dev uhd-host装完之后需要下载FPGA镜像和固件。B210内部有一块FPGAUHD驱动需要把对应的比特流文件烧录进去才能正常工作。这个步骤很多人会漏掉结果设备插上电脑后uhd_find_devices能找到设备但一打开就报错。下载镜像的命令是sudo uhd_images_downloader这个命令会把所有支持的USRP型号的镜像都下载到/usr/share/uhd/images/目录下。下载完成后用uhd_find_devices确认设备能被识别。GNU Radio的安装Ubuntu下同样可以用aptsudo apt install gnuradio但apt源里的版本可能比较旧。如果你想要新版本可以用PyBOMBS或者直接从源码编译但那个过程对新手来说比较折腾。我的建议是入门阶段先用apt版本等熟悉了再考虑升级。2.3 验证驱动是否正常工作的三个命令装完UHD之后别急着打开GRC先用命令行工具确认驱动层面没问题。第一个命令是uhd_find_devices它会列出当前连接的所有USRP设备。正常输出应该能看到B210的型号和序列号。第二个命令是uhd_usrp_probe这个会打印出设备的详细信息包括FPGA版本、固件版本、各通道的频率范围、增益范围等等。如果这个命令能跑完不报错说明驱动和硬件之间的通信是正常的。第三个命令是uhd_fft这是一个简单的频谱扫描工具UHD自带的。运行uhd_fft -f 100e6 -s 10e6它会以100MHz为中心频率、10MS/s的采样率扫描频谱。如果你能看到底噪在-60dB左右波动说明接收链路是通的。这个工具虽然简陋但作为第一步验证非常有用。注意如果uhd_find_devices找不到设备先检查USB线是否插在3.0口上然后运行lsusb看看有没有看到Ettus Research或者National Instruments的设备。如果看到了但UHD找不到大概率是权限问题需要把当前用户加到usrp组里或者直接用一个udev规则文件来解决。3. 第一个GRC流程图从信号源到频谱显示3.1 搭建一个最简单的接收链路打开GRC你会看到一个空白的画布。别被那些密密麻麻的模块列表吓到入门阶段我们只需要用到其中几个。先来搭一个最基础的接收链路目标是把B210收到的信号在频谱图上显示出来。从左侧模块库里拖出以下几个模块Options、Variable、UHD: USRP Source、QT GUI Frequency Sink。Options模块是每个流程图都必须有的它定义了流程图的标题、作者、生成代码的语言等。Variable模块用来定义全局变量比如中心频率和采样率。把USRP Source的output端口连到Frequency Sink的input端口一个最简单的接收流程图就搭好了。但这时候直接运行会报错因为USRP Source需要配置设备地址和参数。3.2 关键参数怎么填采样率、中心频率、增益双击USRP Source模块会弹出一个参数配置窗口。这里有几个参数必须搞清楚。首先是Device Arguments。如果你只有一台B210这一栏可以留空UHD会自动找到第一个可用的设备。如果你有多台设备就需要填typeb200或者serial你的序列号来指定。然后是Sample Rate。这个参数决定了每秒采集多少个采样点。B210的最大采样率是61.44MS/s但实际能稳定跑多少取决于你的电脑性能。入门建议从1MS/s开始这个速率对CPU的负担很小几乎任何电脑都能跑。等熟悉了再逐步往上加。Center Frequency就是你要接收的中心频率。比如你想听调频广播可以设成100MHz。Gain是接收增益B210的增益范围大概是0到76dB。增益设得太低信号淹没在底噪里设得太高信号会饱和失真。一般从30dB开始试根据频谱图上的信号强度再调整。Antenna这一栏选择你接天线的端口B210有两个接收端口TX/RX和RX2。一般用TX/RX口就行它既能收也能发。3.3 运行流程图并解读频谱图参数填好之后点击GRC上方的绿色播放按钮流程图就开始运行了。如果一切正常会弹出一个QT GUI的窗口上面显示着实时的频谱曲线。这时候你看到的应该是一条起伏的噪声基线这就是底噪。如果你把中心频率调到当地调频广播的频段比如88MHz到108MHz之间应该能看到一些明显的尖峰那些就是广播电台的信号。每个尖峰的宽度大约是200kHz对应一个调频频道。频谱图的横轴是频率纵轴是功率单位是dB。你可以用鼠标在图上拖动来调整显示范围也可以滚轮缩放。右上角有一些控制按钮可以调整FFT的大小、平均次数等参数。FFT越大频率分辨率越高但刷新率会降低平均次数越多曲线越平滑但响应越慢。提示如果你看到的频谱是一条平直的线没有任何起伏先检查天线是否接好然后确认中心频率和采样率的设置是否合理。另外如果增益设成了0也可能什么都看不到。4. 进阶实战解调一个真实的调频广播信号4.1 从频谱到声音调频解调链路搭建看到频谱只是第一步真正有意思的是把信号解调成声音。调频广播的解调链路比刚才的纯频谱显示要复杂一些但逻辑很清晰。在刚才的流程图基础上我们需要增加几个模块。首先从USRP Source出来之后接一个Low Pass Filter用来滤掉我们目标频道之外的信号。截止频率设为100kHz左右因为调频广播的带宽大约是200kHz但实际音频信息集中在更窄的范围内。然后接一个Quadrature Demod模块这是调频解调的核心。它的增益参数需要计算公式是sample_rate / (2 * pi * max_deviation)。调频广播的最大频偏是75kHz所以如果采样率是1MS/s增益就是1000000 / (2 * 3.14159 * 75000)约等于2.12。解调出来的信号还是浮点数的采样流需要再经过一个Rational Resampler降采样到音频采样率比如48kHz。最后接一个Audio Sink模块就能从音箱里听到声音了。4.2 滤波器参数的选取与验证Low Pass Filter的参数设置直接影响解调效果。截止频率设得太宽会把相邻频道的信号也放进来产生干扰设得太窄音频的高频部分会被切掉听起来发闷。一个实用的方法是先设一个比较宽的截止频率比如150kHz然后一边听一边往下降直到声音开始变差再往回加一点。截止频率和过渡带宽这两个参数要配合着调过渡带太窄会导致滤波器阶数很高计算量大过渡带太宽则滤波效果不理想。Decimation参数决定了滤波之后输出的采样率。如果输入是1MS/sDecimation设为10输出就是100kS/s。这个速率对于调频解调来说足够了。4.3 音频输出与实时调整技巧Audio Sink模块的采样率要和前面Rational Resampler的输出速率匹配。如果Rational Resampler把100kS/s降到了48kS/s那Audio Sink就设成48kHz。实际运行的时候你可能会听到一些杂音或者断续。这通常有几个原因一是增益设置不当信号太强导致饱和二是天线位置不好接收到的信号太弱三是电脑的音频系统有延迟或者缓冲问题。可以试着调整USRP Source的增益或者换一个更强的电台频率。我自己的经验是在市区用一根简单的拉杆天线把增益设在40dB左右就能很清楚地收到本地强台的调频广播。如果追求更好的效果可以做一个简单的半波偶极子天线长度按照目标频率的波长来算。比如100MHz对应的波长是3米半波偶极子就是1.5米左右。5. 发射实验用B210发一个简单的单音信号5.1 发射链路的搭建与注意事项发射比接收要谨慎得多因为不当的发射可能会干扰其他合法通信。在动手之前务必确认你使用的频率是允许自由使用的比如ISM频段或者用假负载代替天线把信号限制在电缆里。发射链路的基本结构是Signal Source产生基带信号经过一些处理模块最后接到UHD: USRP Sink。Signal Source可以设成一个正弦波频率设为1kHz幅度设为0.5。USRP Sink的参数配置和Source类似需要设中心频率、采样率、增益。发射增益一般不要设得太高从20dB开始试。另外要注意B210的发射端口和接收端口是分开的发射要用TX/RX口。5.2 用频谱仪或者第二台设备验证发射如果你有频谱仪可以直接把B210的发射输出接到频谱仪的输入端看有没有在目标频率上出现一个单音。如果没有频谱仪可以用另一台SDR设备来接收验证。甚至可以用同一台B210的接收通道来接收自己的发射信号但需要加一个衰减器否则接收端会饱和。验证的时候把接收设备的中心频率设成和发射频率一样应该能看到一个明显的尖峰。如果尖峰的位置不对检查发射端的中心频率设置如果尖峰很弱或者没有检查发射增益和线缆连接。5.3 发射实验的安全边界与合规提醒这一点必须强调无线电频谱是公共资源受到严格管理。在发射之前一定要确认你所在的频段是允许使用的。一般来说ISM频段如2.4GHz、5.8GHz是可以低功率使用的但具体的功率限制和频段划分各地可能不同。一个稳妥的做法是所有的发射实验都先用假负载或者衰减器加电缆的方式把信号限制在封闭环境里。等确认链路工作正常了再考虑用天线发射而且功率要尽可能低。另外绝对不要在航空、应急通信等敏感频段附近做发射实验。6. 常见问题排查与避坑经验6.1 设备识别类问题最常见的问题就是UHD找不到设备。排查顺序是这样的先确认USB线插在3.0口上用lsusb看系统有没有识别到设备如果识别到了但UHD找不到检查udev规则和用户权限如果lsusb都看不到换一根线或者换一个USB口试试。还有一个坑是FPGA镜像版本不匹配。UHD驱动和FPGA镜像的版本必须对应如果版本不一致uhd_usrp_probe会报错。解决办法就是重新运行uhd_images_downloader确保下载了最新版本的镜像。6.2 数据流中断与采样率上不去采样率一高就丢包这个问题我遇到过很多次。原因通常有三个USB线材质量不行、电脑的USB控制器带宽不够、CPU处理不过来。先换一根短的、带屏蔽的USB 3.0线这是成本最低的排查手段。如果还不行检查电脑的USB控制器是不是和其他高速设备共享带宽比如外接硬盘、摄像头等。可以把B210单独接在一个USB控制器上。最后如果CPU占用率很高可以试着降低FFT大小或者减少显示模块的刷新率。6.3 GRC流程图报错速查GRC的报错信息有时候比较晦涩但常见的就那么几类。如果报“AttributeError”或者“ImportError”通常是模块的依赖库没装全可以用sudo apt install补上。如果报“RuntimeError: Unable to create streamer”一般是采样率或者带宽设置超出了设备能力降低采样率试试。还有一个常见错误是“ValueError: itemsize mismatch”这通常是因为模块之间的数据类型不匹配。比如USRP Source输出的是复数但你接了一个只接受浮点数的模块。解决办法是在中间加一个Complex to Float或者Complex to Mag的转换模块。问题现象可能原因排查方法uhd_find_devices无输出USB线或驱动问题换线、检查lsusb、重装UHD采样率一高就丢包USB带宽或线材问题换短屏蔽线、降低采样率GRC运行报streamer错误采样率超出设备能力降低采样率或带宽频谱图无信号天线或增益问题检查天线连接、提高增益解调声音断续增益或滤波参数不当调整增益、优化滤波器参数6.4 性能优化的几个实用技巧如果你发现GRC的界面卡顿可以试着把FFT的刷新率降低或者把频谱图的平均次数减少。另外关闭不必要的显示模块也能释放CPU资源。对于接收链路如果只是做信号记录而不需要实时显示可以把数据直接存到文件里用File Sink模块这样能省掉显示的开销。存储的时候注意磁盘的写入速度高采样率下数据量很大普通机械硬盘可能跟不上建议用SSD。还有一个技巧是合理设置采样率。很多人一上来就设很高的采样率觉得这样能收到更多信号。但实际上采样率越高数据量越大对电脑的压力也越大。对于窄带信号完全可以用较低的采样率然后在软件里做数字下变频效果是一样的。7. 从入门到进阶的后续方向7.1 值得尝试的几个实战项目当你把基本的收发链路跑通之后可以尝试一些更有意思的项目。比如用B210接收ADS-B信号解码飞机的呼号和位置信息。这个项目的链路比较复杂涉及到1090MHz的接收、脉冲检测、报文解码等步骤但网上有现成的GRC流程图可以参考。另一个方向是接收气象卫星的APT信号。NOAA的气象卫星在137MHz附近发射模拟图像信号用B210加上一个简单的V型偶极子天线就能收到。解调出来的信号经过同步和图像重建能看到云图。这个项目的成就感很强而且涉及的知识点很全面。如果对数字通信感兴趣可以试着用B210和GNU Radio搭建一个简单的QPSK收发链路。这个会涉及到星座图、符号同步、载波恢复等概念是通信原理的绝佳实践。7.2 学习资源与社区GNU Radio的官方文档和教程是最权威的起点虽然有些地方写得比较简略但配合社区里的讨论基本能解决问题。YouTube上有很多实操视频跟着做一遍比看文字快得多。另外GNU Radio的邮件列表和论坛非常活跃遇到问题搜索一下通常能找到答案。如果找不到发帖提问的时候记得附上你的GRC流程图、UHD版本、设备型号和完整的报错信息这样别人才能帮你定位问题。7.3 硬件扩展与升级路径B210本身已经很强大了但如果你的实验需要更高的性能可以考虑外接10MHz参考时钟来提高频率稳定性或者加一个GPSDO模块来实现高精度的时间同步。天线方面根据你的目标频段可以自制或者购买定向天线比如八木天线或者抛物面天线。如果以后需要更多的通道或者更高的带宽可以考虑升级到N系列或者X系列但那是另一个量级的投入了。对于绝大多数入门和中级实验B210完全够用。我在实际使用中的体会是软件无线电最大的门槛不是硬件而是对信号处理基本概念的理解。采样率、带宽、增益、滤波这些参数每一个都会直接影响最终的结果。刚开始的时候不用追求一次就调好多试几次看着频谱图和音频输出的变化慢慢就能建立起直觉。踩过几次坑之后你会发现那些曾经觉得抽象的概念其实都对应着非常具体的现象。