恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
无人机射频检测实战:从SDR信号采集到MATLAB/Python双语言识别
首页
资讯中心
/
无人机射频检测实战:从SDR信号采集到MATLAB/Python双语言识别
无人机射频检测实战:从SDR信号采集到MATLAB/Python双语言识别
发布时间:2026/9/2 1:12:06
简介这是一套面向无人机安防与低空监管场景的MATLAB/Python代码库聚焦通过射频信号实现无人机检测与识别适合无线信号处理、机器学习方向的研究者和开发者直接参考或复用。资源压缩包共18个文件大小仅1.85MB核心包括7个MATLAB脚本、1个Python分类脚本以及LabVIEW射频录制与回放工程和README/PDF说明文档覆盖从数据聚合、信号标注到特征分析和分类实验的完整链路。已有182人学习下载。源码附带了多个可直接运行的演示模块能够对无人机射频信号进行频率、强度、模式等特征提取并借助SVM、决策树、随机森林等算法训练识别模型同时保留了数据清洗与结果可视化环节LabVIEW模块可用于真实信号录制与回放便于搭建实验环境。这套开源代码降低了无人机信号识别技术门槛无论用于科研验证还是实际项目开发都能提供清晰的实现路径。 先说个结论无人机射频检测这类项目80%的精力都花在数据侧和信号前端模型反而是最后才需要考虑的问题。我最近整理了一套基于无人机射频信号做无人机检测和识别的代码仓库同时包含MATLAB和Python两套实现最近在社区里反复和人聊这些代码怎么用、为什么这么设计。这里把整个系统的思路、关键算法、踩坑过程和可复现细节一次性讲清楚适合准备用低成本SDR起步做射频感知、或者刚拿到类似开源仓库准备二次开发的工程师。这套代码解决的事情说简单点就是在某个区域部署一台接收机通过被动接收无人机遥控链路和图传链路产生的射频信号判断无人机是否存在以及识别它属于哪一类、哪一型号。代码链路从IQ采集、预处理、特征提取到分类器训练和推理都有对应模块。我把MATLAB和Python的边界划得很清楚MATLAB负责信号处理原型验证Python负责机器学习与最终部署两边用统一的文件格式交换数据。你如果期待的是无人机雷达测向或者三维定位这个仓库不合适它做的是射频信号层面的检测和识别。1. 无人机射频检测到底在解决什么问题1.1 无人机的“射频指纹”藏在哪些链路里消费级无人机工作时至少有两套射频链路处于活跃状态遥控链路和图传链路。遥控链路通常使用2.4GHz或5.8GHz的ISM频段图传链路也集中在这附近有些机型还走5.2GHz。关键在于即使没有回传图像遥控器与无人机之间也会周期性发送控制包比如固定每几十毫秒一包用于保持链路同步和指令交互。这意味着只要无人机在飞射频信号就会间歇性出现。这些信号在频谱上通常表现为几种形态遥控信号多采用跳频或窄带调制在频谱图上是一系列跳来跳去的窄峰图传信号带宽比遥控宽很多可能是几十MHz甚至更宽的OFDM波形。所以射频检测的核心是对这些形态进行持续监控从周围一大堆Wi-Fi、蓝牙、运营商通信和工业噪声里把无人机的特征摘出来。1.2 检测、识别和定位是三个不同难度很多人把“检测”和“识别”混在一起实际上这是两个完全不同的任务。检测是二分类问题回答“这个频段里有没有疑似无人机信号”识别是分类问题回答“如果检测到它属于哪类设备或哪个型号”。仓库里两个任务都有代码路径。检测用能量和频域特征输出异常分数识别用机器学习模型对信号片段分类比如区分“大疆Mavic系列”“穿越机图传”“普通遥控器开关信号”。识别粒度完全取决于训练数据里有哪些标签别指望一个只有三类样本的模型到现场能认出新机型的固件差异。定位则是另一个量级的问题需要多通道阵列天线、相位差校准和DOA估计算法。这个仓库没有覆盖定位但后续可以在数据采集端预留多通道接口。1.3 被动射频方案在工程上有什么优势我选择射频方案而不是视觉或雷达是因为它有几条非常实际的好处第一被动接收不主动发射电磁波部署合规压力小也适合长时间值守第二设备成本低一套软件无线电接收机加上天线几百到几千块钱就能起步第三不受光照和雨雾影响监控终端放在室内天线外置就能连续工作。当然也有明显短板射频方案无法直接测距只能告诉你“这个区域里有某种无人机在通信”不能告诉你它飞在哪个方向、离你多远。所以工程上通常用射频做广域感知再用其他手段做精确定位。2. 数据是怎么来的接收机选型、采样参数与数据集构建2.1 低成本的SDR硬件能做到什么程度仓库默认使用软件无线电接收机采集数据。不同硬件的能力差别很大实测过几类常见的设备这里直接给个选型参考设备频率范围最大采样带宽适合场景RTL-SDR24MHz-1.7GHz约2.4MSPS低频段实验验证2.4GHz需要碰运气HackRF One1MHz-6GHz20MSPS2.4GHz/5.8GHz主流无人机频段采集USRP B20070MHz-6GHz56MSPS多通道、高质量数据集用于复杂模型如果只做遥控链路检测RTL-SDR那套方案在1GHz以下频段还能用但消费级无人机大多在2.4GHz和5.8GHzRTL-SDR在2.4GHz接收能力很有限。我测试后最推荐HackRF One起步覆盖频率够、采样带宽够、驱动生态也成熟。采样率不要贪高。HackRF虽然能开到20MHz带宽但带宽越大单文件数据量越大后面做训练时的I/O瓶颈越明显。仓库默认用2MSPS或4MSPS先把窄带遥控链路的检测验证完再考虑要不要拉高带宽抓图传。2.2 采集环境与标注方法采集时除了记录IQ数据本身还要同步记录一份metadata中心频率、采样率、时间戳、无人机型号、遥控模式、图传开关状态、环境类型开阔地、楼宇旁、工业区。这些信息是后续分析特征漂移的关键比样本本身更重要。标注我建议半自动方式先用MATLAB把采集文件画成频谱图人工标记有信号的时间段再写脚本把对应区间切成1秒窗口。不要手工一个个截速度慢且容易标错。标签也不要只写“有无人机”尽量写“机型遥控模式图传开/关”这样训练出来的模型更有实际意义也能方便排查错误。数据集的构成上一定保留三类样本纯背景噪声、无人机信号、同频段干扰信号。很多人只采集无人机和静默噪声结果模型把Wi-Fi突发当成了无人机因为训练时从没见过这种负样本。2.3 数据规模与平衡策略如果只有刚开始采集的几百条样本别急着上深度学习。我的经验是每类至少300秒信号加上同等时长的纯噪声先把传统机器学习基线跑出来。分类不平衡时可以在传统模型里用类别加权或者在时频图上做频移和噪声叠加增强比在IQ空间里做回波增强容易得多。3. MATLAB与Python各承担什么角色双语言管线拆解3.1 MATLAB侧快速验证信号处理逻辑我习惯用MATLAB做采集数据的离线预览和信号前端验证。Signal Processing Toolbox里的spectrogram、cwt、medfilt1、findpeaks都很成熟画时频图、做阈值分割非常快。检测部分的核心逻辑其实很短读IQ数据分帧做FFT估计噪声底再去找连续超阈值的频带。MATLAB里写起来大概是这样cfg jsondecode(fileread(config/config.json)); x read_iq(cfg.data_file); [S, F, T] spectrogram(x, hamming(cfg.fft_size), cfg.overlap, cfg.fft_size, cfg.fs); pow_dB 10*log10(abs(S) eps); noise_floor median(pow_dB, 2) cfg.threshold_k * std(pow_dB, 0, 2); flag any(pow_dB noise_floor, 1);这套东西在MATLAB里迭代很快但我从不把训练放MATLAB。矩阵实验室的强项是算法原型工程化训练还是放Python更顺。3.2 Python侧特征工程、训练和推理Python这边我用VSCode配合venv管理环境Python 3.9起步。仓库的依赖很简单numpy、scipy、scikit-learn、matplotlib深度学习可选tensorflow或pytorch。Dataloader用numpy从二进制文件读IQscipy.signal做重采样和滤波特征用scikit-learn的train_test_split划分分类器默认RandomForest模型库里也放了一个三层CNN用于扩展。这里有个原则不要在Python里重复做复杂的信号前端处理能在MATLAB离线预处理好的就提前做完。训练代码只关心窗口化特征就好。import numpy as np raw np.fromfile(path, dtypenp.float32) iq raw[0::2] 1j * raw[1::2]3.3 两套代码如何交换数据很多开源仓库MATLAB和Python各玩各的数据格式对不上最后我都要重构一遍。这个仓库里我统一采用原始IQ存为float32二进制文件metadata放同路径JSON预处理后的特征数组存成.npy文件。MATLAB端不直接写.npy可以借助现成的npy读写工具库或者干脆输出无头二进制文件Python这边用np.fromfile读。不要依赖.mat作为唯一交换格式Python读.mat的体验太差HDF5和npy都更顺。4. 检测与识别算法从能量检测到深度学习的完整方案4.1 作为底线的能量检测和频域特征无人机控制信号在频域上通常表现为瞬时的窄带峰或跳频序列和宽带Wi-Fi图传不太一样。最简单可靠的检测算法是分帧FFT后用噪声底加一个动态阈值找出超过阈值的频窗。阈值不能写死。先对每个频点做中位数滤波得到噪声底估计再乘一个系数作为检测门限。系数建议3-5倍标准差太小会把环境底噪误判成信号太大又会漏掉弱信号。多个连续帧在同一频带出现才判定为可疑源这可以滤掉瞬时干扰。更稳一点可以上CFAR检测但小样本下和动态阈值差距不大。我的建议是先用动态阈值跑通流程再根据实际误报率决定要不要上CFAR。4.2 传统特征加随机森林小数据集的首选当标注样本只有几千条时深度学习优势不大随机森林加手工特征是最稳的路线。仓库里提供了一个特征表对每个1秒窗口提取RMS、峰值均值比、频谱平坦度、频带宽度、峰值个数、零交叉率、谱熵再加上STFT频带的几个统计量。这些特征加在一起用随机森林在5倍交叉验证下通常能到90%左右。特征选择别贪多先用全量特征跑一版再用feature_importance把明显没用的特征去掉。RF模型在几百棵树以上性能提升非常有限100棵树足够作为默认。4.3 时频图加CNN数据量够大的时候再用如果数据集到了几万条数量级再把时频图送CNN。具体做法是把每个窗口的STFT幅度谱归一化成灰度图输入一个简单卷积网络。仓库里放的是一个轻量模型64x64输入三层Conv2D加BN加MaxPoolDense层64维加Dropout最后softmax输出类型。STFT参数直接决定识别效果。FFT长度决定频率分辨率窗口长度决定时间分辨率。对无人机跳频遥控信号我建议FFT长度1024、50%重叠这样频谱细节和时间细节都有保障。直接用原始IQ训练也不是不行但时频图的可解释性更好也方便在图上做频移、噪声叠加这类数据增强。5. 实测中踩过的几个坑与完整排查思路5.1 测试集准确率很高现场检测率突然下降第一个版本在实验室里用录好的文件测试准确率95%。拿到室外开阔地一跑误报率瞬间上来。排查链路是这样的先看实时频谱图发现环境里频段占用明显噪声底比实验室高8dB左右。原来的检测阈值是固定值到新环境自然失灵。解决办法是把所有阈值改成和环境噪声底实时绑定的相对值误报立刻降下来。这个教训之后仓库里所有检测参数都改成了动态形式不再提供写死的绝对阈值。5.2 同一型号无人机的特征漂移第二种典型问题同一款无人机遥控器固件版本不同跳频序列和包长度会有变化。模型在旧固件上识别很好新固件样本进来后置信度明显下降。我一开始以为是模型过拟合后来把新旧固件的时频图放在一起对比才发现根本不是过拟合而是特征分布确实移动了。解决办法是训练时尽量多采集几台不同批次、不同固件的设备人为制造多样性。另外天线朝向也影响信号幅度模型不能太依赖幅度特征要更多使用频域形状特征。5.3 实时推理卡顿先查数据管线别赖模型在树莓派或者普通笔记本上跑实时推理模型本身只占少量CPU反而从SDR读取数据、分帧做FFT、窗口滑动的整个流程特别慢。我起初以为是模型太重profile之后发现瓶颈在SDR读取函数阻塞了后面的计算。解决方法是把实时链路改成独立采集线程加队列缓存采集线程只管把数据块塞进队列识别线程从队列里取批处理最后用一个批处理STFT统一出结果。仓库里的infer_live.py用的就是这个结构不要再看成一行while True循环读数据算一次的例子。6. 仓库结构、参数配置与后续扩展方向6.1 一个拿来就能跑的目录长这样仓库我建议按语言拆开但共享配置和数据路径drone-rf-detector/ ├── matlab/ │ ├── acquisition/ │ ├── preprocessing/ │ └── visualization/ ├── python/ │ ├── dataloader.py │ ├── features.py │ ├── train_ml.py │ ├── train_cnn.py │ └── infer_live.py ├── config/ │ └── config.json ├── data/ │ ├── raw/ │ └── processed/ └── models/读完一个目录就能知道每个文件的职责比把所有脚本堆在根目录要省心得多。所有脚本从config.json读路径和参数不在代码里写绝对路径。6.2 环境配置和几个关键参数MATLAB侧建议安装Signal Processing Toolbox和Communications Toolbox我测试时用的MATLAB R2022b跑在Linux下Windows也没有问题。Python侧就是VSCode加venv依赖写进requirements.txt不要用一堆Anaconda channel折腾环境。几个关键参数给出一组默认值实际用时要重新标定参数建议值说明center_freq2.45GHz遥控链路主要频段sample_rate2MSPS窄带遥控信号够用fft_size1024频率分辨率约1.95kHzoverlap512时间重叠50%threshold_k3-5噪声底倍数6.3 后续可扩展方向这套系统其实只是第一层。后续可以在接收端加第二个通道用两通道之间的相位差做来波方向估计也可以朝设备指纹方向做尝试识别同一型号的不同个体边缘部署方面可以把Python脚本导出成TensorRT或者C实现跑在更轻量的设备上。我自己下一步打算把整套代码迁移到树莓派5上用多通道同步采集试试看看延迟和识别精度能到什么程度。有实际结果再单独写一篇。本文还有配套的精品资源点击获取