从零到一:在Linux上构建USRP与GNU Radio的完整信号处理工坊
1. 环境准备打造你的信号处理工坊基础搭建信号处理工坊就像装修新房得先打好地基。我强烈推荐使用Ubuntu 20.04 LTS系统这个版本不仅稳定而且社区支持完善。记得第一次尝试时用了最新版系统结果各种依赖冲突让我欲哭无泪。后来改用20.04问题少了一大半。虚拟机配置是很多人容易忽视的关键点。我的经验是处理器至少4核实测双核编译GNU Radio要等3小时内存8GB起步6GB勉强能跑但容易卡顿磁盘空间建议分配50GB源码编译中间文件很占空间网络模式必须选桥接NAT模式会导致USRP无法识别这里有个实用技巧安装完系统后立即创建快照。我吃过亏有一次配置到90%不小心把Python环境搞崩了不得不重头再来。VMware的快照功能简直就是救命稻草建议每完成一个重要步骤就保存一次快照。2. 硬件连接搭建USRP与主机的桥梁USRP设备就像工坊里的精密仪器连接不当会导致后续所有工作白费。我遇到过最坑的情况是用了百兆网卡结果信号采样率死活上不去折腾两天才发现是硬件限制。正确连接步骤使用千兆网线连接USRP和主机包装盒里配的线就行USRP默认IP是192.168.10.2这个不要改虚拟机IP要设置为同网段比如192.168.10.100测试连通性时有个小窍门先ping USRP的IP如果不通就检查防火墙。Ubuntu默认防火墙规则可能会拦截可以用这个命令临时关闭sudo ufw disable3. 软件栈安装工坊的核心工具链3.1 依赖安装打好基础才能盖高楼安装依赖就像准备建筑材料缺一不可。我整理了一份必装清单sudo apt update sudo apt install -y git cmake g libboost-all-dev libgmp-dev \ libfftw3-dev libsdl1.2-dev libgsl-dev libqwt-qt5-dev \ libqt5opengl5-dev python3-pyqt5 liblog4cpp5-dev libzmq3-dev这里有个坑要注意Ubuntu默认的Python是3.8但有些库需要特定版本。建议用pyenv管理多版本Python我一般用Python3.6作为默认环境兼容性最好。3.2 UHD驱动让硬件活起来UHD是USRP的神经系统安装不当会导致设备无法识别。推荐从源码编译安装git clone https://github.com/EttusResearch/uhd.git cd uhd/host mkdir build cd build cmake ../ make -j$(nproc) sudo make install sudo ldconfig安装完成后一定要测试设备连接uhd_find_devices如果看到设备信息输出恭喜你成功了一半我第一次安装时这个命令没反应后来发现是没把用户加入usb设备组sudo usermod -a -G usb $USER4. GNU Radio编译安装工坊的中央控制系统4.1 VOLK优化提升处理效率的秘密武器VOLK是GNU Radio的性能加速器一定要先安装git clone https://github.com/gnuradio/volk.git cd volk mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease ../ make -j$(nproc) sudo make install编译时可以加个参数提升性能cmake -DCMAKE_BUILD_TYPERelease -DENABLE_ORCON ../4.2 GNU Radio本体安装终于到主角登场了建议使用3.8稳定版git clone --recursive https://github.com/gnuradio/gnuradio.git cd gnuradio git checkout maint-3.8 mkdir build cd build cmake -DCMAKE_BUILD_TYPERelease ../ make -j$(nproc) sudo make install sudo ldconfig编译过程可能持续1-2小时取决于电脑性能建议去喝杯咖啡。完成后测试gnuradio-companion如果看到图形界面弹出你的信号处理工坊就正式开张了5. 实战调试让工坊运转起来5.1 第一个信号处理流程创建一个简单的频谱分析流程测试整套系统在GRC中拖入USRP Source模块添加FFT模块和QT GUI Frequency Sink设置中心频率比如433MHz用于LoRa点击运行常见问题排查如果报No devices found检查uhd_find_devices是否能找到设备出现权限问题可以尝试sudo chmod 666 /dev/bus/usb/*/*采样率设置过高可能导致丢包LoRa应用1MHz就够了5.2 性能优化技巧经过多次项目实践我总结出几个提升稳定性的方法在/etc/sysctl.conf中添加net.core.rmem_max1048576 net.core.wmem_max1048576使用实时内核低延迟sudo apt install linux-lowlatency关闭图形界面的动画效果能节省不少CPU资源6. 项目实战LoRa信号采集系统现在工坊已经准备就绪让我们实际搭建一个LoRa信号采集系统。这个配置我毕业设计时用了三个月稳定可靠from gnuradio import gr from gnuradio import uhd from gnuradio import blocks class lora_receiver(gr.top_block): def __init__(self): gr.top_block.__init__(self) # USRP配置 self.usrp_source uhd.usrp_source( ,.join((, )), uhd.stream_args( cpu_formatfc32, channelsrange(1), ), ) self.usrp_source.set_samp_rate(1e6) self.usrp_source.set_center_freq(433e6) # 文件保存 self.file_sink blocks.file_sink(gr.sizeof_gr_complex, lora_data.dat) # 连接模块 self.connect(self.usrp_source, self.file_sink)保存为.py文件后可以直接运行。采集到的数据会保存在lora_data.dat中后续可以用Python的scipy库进行分析处理。