ARTICLE DETAIL

资讯详情

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

USRP B210 软件无线电入门:从 UHD 驱动到 GNU Radio 实战

USRP B210 软件无线电入门:从 UHD 驱动到 GNU Radio 实战 1. 为什么我劝每个想玩软件无线电的人第一台设备就选 USRP B210软件无线电SDR这个圈子有个很怪的现象很多人一上来就被各种几十块钱的电视棒吸引买回来折腾几天发现只能收个FM广播想发射没门。想玩更宽的频段带宽不够。想跑个实时协议栈USB 2.0 的吞吐直接卡死。我自己当年也是从廉价方案一路踩坑过来的最后才明白一个道理——入门设备决定了你能走多远。USRP B210 就是那种“一步到位”的选择。它是 Ettus Research现属 NI出的第二代总线系列设备覆盖70 MHz 到 6 GHz的射频范围瞬时带宽最高56 MHz而且是2x2 MIMO 全双工也就是说你可以同时收发两路信号。这个规格放在今天依然能打关键是它在二手市场和学术圈流通量极大资料多、坑少、社区活跃。配合GNU Radio这个开源信号处理框架你不需要写一行底层驱动代码就能用图形化的方式搭出一个完整的收发链路。GNU Radio Companion简称GRC就是那个拖拖拽拽就能出成果的工具特别适合刚接触软件无线电的人建立直觉。这篇文章面向的是零基础但有一定动手能力的读者。你可能是个电子专业的学生也可能是个想转行做通信的工程师甚至只是个对无线电好奇的爱好者。我会从硬件开箱、UHD驱动安装、GRC环境配置一路讲到第一个能实际收发的信号链路把每一步的“为什么”都讲清楚。看完之后你应该能独立搭出一个能收FM、能发单音的完整系统并且知道下一步该往哪走。提示本文所有操作基于 Ubuntu 22.04 LTS 环境这是目前 GNU Radio 和 UHD 兼容性最好的平台。Windows 下虽然也能跑但驱动和依赖的坑会多出好几倍新手不建议。2. 硬件到手先别急着插B210 开箱检查与接口全解析2.1 包装里到底有什么以及你还需要买什么B210 的官方包装其实很朴素一个金属外壳的主机、一根 USB 3.0 线、一份快速入门说明。就这些。但真正要让它跑起来你至少还需要以下几样东西我按重要性排序天线B210 的 SMA 接口是母头你需要公头的天线。入门建议买一根覆盖 70 MHz 到 1 GHz 的宽带鞭状天线再配一根 2.4 GHz 的棒状天线。别小看天线它决定了你能收到什么。USB 3.0 数据线原装线很短如果你需要更长距离务必买带屏蔽层的高质量线。我试过用普通延长线结果采样率一上 20 MSps 就丢包。外部时钟源可选但推荐如果你要做相干接收或者多设备同步一个 10 MHz 的 OCXO 恒温晶振能让频率稳定度提升一个数量级。入门阶段可以先不买。散热片或小风扇B210 全双工跑起来发热不小夏天连续跑半小时外壳能到烫手的程度。贴个散热片或者放个小 USB 风扇吹着能显著降低丢包率。2.2 面板上的接口每一个都有讲究B210 的面板布局很紧凑我按从左到右的顺序给你拆解一遍RF A 组TX/RX 和 RX2这是通道 0 的主端口。TX/RX 是收发共用内部有切换开关RX2 是纯接收端口。如果你做全双工发射走 TX/RX接收走 RX2这样能避免切换开关带来的损耗。RF B 组TX/RX 和 RX2通道 1 的端口功能和 A 组完全一样。做 MIMO 的时候两组一起用。USB 3.0 Type-B 接口这是数据和供电的唯一入口。注意B210 没有独立电源口全靠 USB 供电。所以你的电脑 USB 口必须能提供足够的电流否则设备会反复枚举失败。我建议直接插主板后置的 USB 3.0 口别用前面板或者 Hub。SMA 时钟接口REF IN、PPS IN、10 MHz OUT 等这些是给高级同步用的。入门阶段你只需要知道它们存在暂时不用接。LED 指示灯通电后会有几个灯亮。具体含义我实测下来是这样的——电源灯常亮表示供电正常TX/RX 灯闪烁表示正在收发数据。如果灯不亮或者异常闪烁八成是 USB 供电不足或者驱动没装好。注意B210 的射频端口最大输入功率是 -15 dBm超过这个值可能烧毁前端。在没有衰减器的情况下千万别直接把天线接到大功率发射源附近。2.3 第一次通电怎么判断设备真的活了插上 USB 线之后先别急着装 GNU Radio。打开终端运行lsusb你应该能看到一行类似ID 2500:0020 Ettus Research LLC的输出。如果看不到说明系统根本没识别到设备问题出在 USB 层——换线、换口、检查供电。看到设备之后再运行uhd_find_devices这个命令会列出所有 UHD 能发现的设备。正常输出里会有设备的序列号、型号和固件版本。如果这一步报错说找不到设备但lsusb能看到那通常是UHD驱动没装或者版本不匹配。我踩过的一个坑是Ubuntu 自带的 UHD 版本太老和 B210 的固件不兼容。解决办法是卸载系统包从源码编译最新版 UHD。这个后面会详细讲。3. UHD 驱动安装这一步决定了后面 80% 的稳定性3.1 为什么 UHD 是绕不开的核心UHDUSRP Hardware Driver是 Ettus 设备与主机之间的唯一桥梁。GNU Radio 本身不直接跟硬件打交道它通过 UHD 的 API 来配置采样率、中心频率、增益这些参数。所以UHD 装不好后面全是白搭。UHD 的版本和 FPGA 固件版本必须匹配。B210 内部有一块 FPGA负责高速信号处理。如果主机端的 UHD 版本和 FPGA 镜像版本差太多设备会拒绝工作或者跑着跑着就崩。3.2 从源码编译 UHD 的完整流程我强烈建议从源码编译而不是用apt install uhd-host。原因很简单系统源的版本往往落后半年以上而 B210 的固件更新很频繁。先装依赖sudo apt update sudo apt install -y cmake build-essential libboost-all-dev \ libusb-1.0-0-dev libudev-dev python3-dev python3-numpy \ python3-mako python3-requests python3-setuptools然后下载源码。截至我写这篇文章时稳定版是 UHD 4.6 系列git clone https://github.com/EttusResearch/uhd.git cd uhd git checkout v4.6.0.0编译之前先建个构建目录这是好习惯方便清理mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DENABLE_PYTHON_APION .. make -j$(nproc) sudo make install sudo ldconfig-DENABLE_PYTHON_APION这个选项很重要它让你能在 Python 里直接调用 UHD后面写自动化脚本会用到。编译过程大概需要 15 到 30 分钟取决于你的 CPU。我用的是一台老 i5跑了 25 分钟。3.3 下载 FPGA 镜像别跳过这一步UHD 装好之后B210 的 FPGA 里可能还是出厂固件。你需要下载匹配的镜像sudo uhd_images_downloader这个脚本会自动从 Ettus 的服务器拉取所有设备的镜像文件存到/usr/local/share/uhd/images/。下载量大概几百 MB耐心等。下载完之后插上 B210运行uhd_usrp_probe这个命令会打印出设备的全部信息包括 FPGA 版本、固件版本、各通道的增益范围、天线端口等。如果这一步能正常输出一大段信息恭喜你硬件和驱动都通了。提示如果uhd_usrp_probe报错说 FPGA 版本不匹配运行uhd_image_loader --argstypeb200来强制刷新固件。刷新过程中千万别拔 USB 线。3.4 一个容易被忽略的权限问题Linux 下普通用户默认没有 USB 设备的直接访问权限。你需要把 UHD 的 udev 规则装进去sudo cp /usr/local/lib/uhd/utils/uhd-usrp.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger做完之后把当前用户加入usrp组sudo groupadd usrp sudo usermod -aG usrp $USER然后注销重新登录否则组权限不生效。我见过太多人卡在这一步一直用 sudo 跑 GNU Radio结果图形界面各种权限报错。4. GNU Radio 安装与 GRC 环境配置4.1 版本选择3.10 还是 3.9GNU Radio 目前有两个活跃分支3.9 和 3.10。3.10 是新的 LTSAPI 更现代但对老模块的兼容性稍差。3.9 生态最成熟网上大部分教程都是基于它。我的建议是新手直接上 3.10。因为 3.10 的 GRC 界面改进很大而且 Python 绑定更干净。如果你要跑一些老项目再考虑 3.9。安装方式同样推荐源码编译理由和 UHD 一样——系统源版本太旧。但 GNU Radio 的依赖比 UHD 多得多编译时间也更长。4.2 依赖安装与编译先装一大坨依赖sudo apt install -y git cmake g libboost-all-dev libgmp-dev \ libmpfr-dev libfftw3-dev libtool libusb-1.0-0-dev \ liblog4cpp5-dev python3-pip python3-numpy python3-scipy \ python3-matplotlib python3-pyqt5 python3-pyqt5.qwt \ libqwt-qt5-dev qtbase5-dev libqt5svg5-dev \ libgsl-dev libzmq3-dev libvolk2-dev然后编译 VOLK这是 GNU Radio 的 SIMD 加速库能显著提升信号处理速度git clone --recursive https://github.com/gnuradio/volk.git cd volk mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease .. make -j$(nproc) sudo make install sudo ldconfig接着编译 GNU Radio 本体git clone --recursive https://github.com/gnuradio/gnuradio.git cd gnuradio git checkout v3.10.7.0 mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease -DPYTHON_EXECUTABLE/usr/bin/python3 .. make -j$(nproc) sudo make install sudo ldconfig整个编译过程在我那台 i5 上跑了将近两个小时。如果你机器更慢建议晚上挂着跑。4.3 验证 GRC 能不能正常启动编译完成后直接在终端输入gnuradio-companion如果弹出一个图形界面左边是模块库中间是画布右边是变量和参数面板那就成功了。第一次启动可能会提示你配置 Python 路径。如果 GRC 报错说找不到某些模块检查一下/usr/local/lib/python3/dist-packages/是否在PYTHONPATH里。可以在~/.bashrc里加一行export PYTHONPATH/usr/local/lib/python3/dist-packages:$PYTHONPATH然后source ~/.bashrc生效。注意GRC 的界面缩放有时候在高分屏上会出问题。如果字太小在~/.config/gnuradio/grc.conf里调整canvas_font_size参数。5. 第一个实战用 B210 接收 FM 广播5.1 为什么从接收开始发射涉及功率、天线匹配、法规限制一不小心就可能干扰别人。接收则是纯被动的安全、简单而且能立刻看到效果对建立信心很有帮助。FM 广播在 88 MHz 到 108 MHz 之间信号强、带宽宽200 kHz非常适合作为第一个目标。5.2 在 GRC 里搭一个最简 FM 接收链路打开 GRC新建一个流图。你需要拖入以下几个模块UHD: USRP Source这是 B210 的接收源。双击配置把中心频率设成 100 MHz找一个你当地有信号的频点采样率设成 2 MHz增益设成 30 dB。天线端口选 RX2。Low Pass Filter截止频率设 100 kHz过渡带宽 20 kHz。这一步是把 FM 信号从宽带采样里滤出来。Quadrature Demod这是 FM 解调的核心。增益参数设为采样率除以 2π 乘以频偏对于 FM 广播频偏是 75 kHz所以增益大约是2000000 / (2 * 3.14159 * 75000) ≈ 4.24。Rational Resampler把采样率从 2 MHz 降到 200 kHz这样音频处理压力小。Audio Sink输出到声卡。采样率设 48 kHz需要再加一级重采样。把这些模块用连线接起来顺序是USRP Source → Low Pass Filter → Quadrature Demod → Rational Resampler → Audio Sink。点击运行按钮如果一切正常你应该能听到广播声。5.3 参数背后的计算逻辑很多人照着教程拖完模块能跑但不知道为什么这么设。我解释一下关键参数采样率 2 MHzFM 广播的带宽是 200 kHz根据奈奎斯特采样定理理论上 400 kHz 就够了。但实际中为了留余量给滤波器过渡带通常取 10 倍左右所以 2 MHz 是合理的。增益 30 dBB210 的增益范围是 0 到 76 dB。增益太低信号淹没在噪声里太高则前端饱和产生互调。30 dB 是个安全的起点你可以根据实际信号强度微调。Quadrature Demod 的增益这个公式是sample_rate / (2 * pi * max_deviation)。max_deviation 是 FM 广播的最大频偏标准值是 75 kHz。代入 2 MHz 采样率得到约 4.24。这个值不对的话声音会失真或者音量异常。5.4 实测效果与常见现象我第一次跑通的时候听到的是本地一个交通广播音质相当清晰背景有轻微沙沙声。把增益调到 40 dB 后沙沙声消失但偶尔会有爆音——那是增益过高导致的前端饱和。如果你什么都听不到按这个顺序排查确认中心频率对不对。用uhd_fft或者 GRC 里的 FFT Sink 看一下频谱有没有明显的峰值。检查天线接的是不是 RX2 端口。把增益拉到 50 dB 试试。确认声卡没被其他程序占用。6. 进阶实战用 B210 发射一个单音信号6.1 发射前的安全准备发射之前你必须做两件事第一接假负载或者衰减器。千万别直接接天线发射除非你确认频率合法且功率在允许范围内。一个 30 dB 的衰减器加一个 50 欧姆的假负载是最安全的做法。第二确认频率不干扰他人。业余无线电有专门的频段比如 430 MHz 到 440 MHz。如果你没有执照建议用屏蔽箱或者有线连接的方式做实验。6.2 搭建发射链路在 GRC 里新建一个流图拖入以下模块Signal Source产生一个正弦波。频率设 100 kHz采样率设 1 MHz幅度设 0.5。UHD: USRP Sink发射端。中心频率设 433 MHz采样率设 1 MHz增益设 20 dB。天线端口选 TX/RX。Throttle限制流速防止 CPU 跑飞。连接顺序Signal Source → Throttle → USRP Sink。运行之后B210 的 TX 灯会亮起表示正在发射。如果你接了频谱仪或者另一台接收机应该能在 433.1 MHz 处看到一个单音峰值。6.3 发射增益的调整策略发射增益比接收增益更敏感。B210 的发射增益范围是 0 到 89 dB。我实测下来20 dB 的时候输出功率大约在 -20 dBm 左右接衰减器后刚好能进频谱仪的安全范围。调整增益的时候要一点点加每次加 5 dB观察输出。千万别一上来就拉到 60 dB那样很容易烧掉后级设备。注意B210 的 TX/RX 端口在发射时会有直流偏置如果你接的是敏感设备中间加一个隔直电容。6.4 用另一台 B210 做收发闭环验证如果你有两台 B210可以做一个完整的闭环测试一台发射一台接收中间用同轴电缆加衰减器连接。这样既能验证发射链路又能验证接收链路而且完全不会对外界造成干扰。接收端的流图就是前面 FM 接收的简化版USRP Source → FFT Sink。在频谱上看到发射的单音就说明整个链路通了。7. 常见问题与排查技巧实录7.1 设备识别类问题速查表现象可能原因解决方法lsusb看不到设备USB 线或供电问题换线、换后置 USB 3.0 口uhd_find_devices报错UHD 版本不匹配从源码重装最新 UHDuhd_usrp_probe提示 FPGA 版本不符固件未更新运行uhd_image_loader普通用户无法访问设备udev 规则未生效重装 udev 规则并重新登录GRC 启动报 Python 模块缺失PYTHONPATH 未配置在.bashrc里加路径7.2 运行时丢包与溢出问题这是 B210 用户最常遇到的问题。现象是 GRC 控制台不断打印 “O” 或者 “U”表示溢出overflow或欠载underrun。根本原因是主机处理速度跟不上 USB 传输速度。解决办法有几个降低采样率从 2 MHz 降到 1 MHz数据量减半。关闭不必要的显示模块FFT Sink 和 Waterfall Sink 很吃 CPU调试阶段可以关掉。用 VOLK 优化确保 VOLK 编译时开启了所有 SIMD 指令集。换更快的电脑这是最直接的但也是最贵的。我实测下来一台 i5-8250U 的笔记本跑 2 MHz 采样率加 FFT 显示CPU 占用率在 70% 左右偶尔会丢包。换成 i7-12700 之后同样的流图 CPU 占用降到 15%完全不丢。7.3 频谱上什么都看不到怎么办先确认三件事中心频率对不对、增益够不够、天线接没接对。如果这三样都没问题用uhd_fft这个命令行工具直接看频谱排除 GRC 流图本身的问题。uhd_fft --argstypeb200 --freq 100e6 --rate 2e6 --gain 40这个命令会弹出一个实时频谱窗口。如果这里有信号而 GRC 里没有那就是流图配置的问题。7.4 几个我踩过的坑坑一USB 线太长。我用了一根 3 米的延长线结果采样率一上 10 MSps 就疯狂丢包。换回原装 1 米线问题消失。USB 3.0 对线材质量非常敏感。坑二忘记装 udev 规则。用 sudo 跑 GRC 能工作但普通用户跑就报权限错误。这个问题的隐蔽性在于sudo 下一切正常让你误以为驱动没问题。坑三FPGA 镜像下载不完整。uhd_images_downloader中途断网镜像文件损坏但脚本没报错。结果uhd_usrp_probe一直失败。删掉镜像目录重新下载就好了。坑四GRC 里变量名冲突。我定义了一个变量叫freq结果和某个内置变量重名流图编译时报了一堆莫名其妙的错。后来改成center_freq就好了。变量命名尽量加前缀避免冲突。8. 从入门到进阶下一步可以玩什么跑通收发之后你算是正式进了软件无线电的门。接下来有几个方向可以深入方向一ADS-B 接收。1090 MHz 的飞机广播信号用 B210 加一根 1090 MHz 的天线就能收到。GRC 里有现成的解码模块能看到周围飞机的呼号、高度、速度。这个项目的成就感很强适合拿来练手。方向二LoRa 收发。LoRa 是低功耗广域网技术Sub-GHz 频段。用 B210 可以实现 LoRa 的物理层收发理解扩频通信的原理。这个稍微难一点需要一些数字信号处理基础。方向三OFDM 链路。GNU Radio 自带 OFDM 的收发示例可以搭一个完整的数字通信链路。这个能让你理解导频、均衡、同步这些通信核心概念。方向四频谱监测。写一个脚本让 B210 自动扫描一段频段记录信号强度随时间的变化。这个在电磁环境评估里很有用。我个人建议先从 ADS-B 入手因为它的信号格式公开、解码工具成熟、效果直观。跑通之后再回头做 OFDM会发现之前学的采样率、增益、滤波这些概念全都串起来了。最后分享一个小技巧GRC 的流图可以导出成 Python 脚本用grcc命令就能生成。这样你可以把流图嵌入到更大的自动化系统里比如用 Python 控制 B210 定时扫描特定频段。这个在写论文或者做项目演示的时候特别有用。grcc -o ./output my_flowgraph.grc生成的 Python 文件可以直接python3运行不依赖 GRC 图形界面。
返回列表