雷达时频谱图与深度学习:从微多普勒到CNN识别实战
发布时间:2026/9/19 9:22:02 锦皓数字建站

干这行时间久了会发现雷达信号处理其实一直在变。早年搞目标检测就是滤波器加FFT再来个CFAR门限看到谱峰就报目标工作内容相对单一。这几年不行了因为场景越来越复杂无人机、汽车雷达、人体感知、智慧交通都开始要“认得出是谁”而不是“看到了东西”。靠人工设计特征的路子走到了瓶颈反而是时频谱图配合深度学习把这摊水搅活了。遇到不少朋友问时频谱图不就是个二维颜色图吗怎么就成了智能感知的入口为什么AI一定要看谱图直接看原始回波不行吗这背后其实有一条非常清晰的进化逻辑——从频域到时频域从人工特征到自动特征从单帧检测到序列感知。这篇内容就把这条线捋一遍顺便把我在Matlab里做时频谱图生成、用CNN做目标识别、再往边缘端部署的全流程和一些踩坑经历分享出来。无论你是刚接触雷达信号处理的入门者还是想给现有系统加AI能力的从业者应该都能用得上。1. 为什么是时频谱图雷达回波里的信息密码1.1 传统频域分析的局限雷达回波本质上是一个非平稳信号尤其是当目标带有微动特征的时候。所谓微动就是目标本身在做小幅振动、旋转或者摆动比如无人机旋翼在转、人走路时四肢在摆动、车辆发动机在抖动。这些微动会让回波在原有的多普勒频率附近产生额外的调制边带也就是“微多普勒效应”。传统做法是把一段时间内的回波拿去FFT得到多普勒谱然后通过谱峰位置判断目标速度再通过谱宽甚至解算后判断是否是大目标。这里面的问题在于FFT把整个时间窗内的频率成分平均了。我举个例子如果一个人从静止开始往前走他的身体多普勒频率是慢慢变化的同时四肢摆动的频率也在变。但FFT只给你一个平均下来的多普勒谱你根本不知道这些频率分量是什么时候出现的更没法从频谱上分离出“躯干”和“肢体”的贡献。所以传统频域分析在处理静止、匀速、刚性目标时很顺手但遇到微动目标就抓瞎了。这里不是说FFT没用而是它丢失了时间维度上的信息。在雷达目标识别里时间维度恰恰是最有价值的区分维度之一。1.2 时频分析如何打开另一扇窗时频分析的核心思路很简单把一维信号映射到二维平面横轴是时间纵轴是频率每个点的颜色表示该时刻某个频率成分的强度。这样既能看“有什么频率成分”又能看“这个频率成分在什么时候出现”。雷达信号处理里最常用的就是短时傅里叶变换STFT也就是把信号滑窗切段然后对每一段做FFT。用STFT画出来的图就是题目里说的“时频谱图”。比如一类目标的微多普勒特征是正弦变化的频率调制在时频谱图上就表现为一条弯曲的条纹另一类目标可能是线性调频呈现出来就是斜线。这种差别在频谱里可能纠缠在一起但在时频谱图里肉眼就能看出来更别提深度网络了。还有一个常用工具是Wigner-Ville分布时频分辨率更好但交叉项干扰很严重实际工程里用STFT和小波变换更多。我自己的经验是STFT简单稳定、可解释性强放在AI模型里作为输入效果好调参也容易。小波变换能在低频段获得更好的频率分辨率适合低频微动目标实现复杂度也略高。前面说的认知其实就是从这段开始的时频谱图不是一张花哨的图它把雷达回波里微多普勒特征变成了一个AI可以直接用的视觉特征层。2. 雷达信号处理中AI的切入点2.1 传统雷达检测与分类的痛点雷达信号处理传统链路一般是脉冲压缩、MTI/MTD、CFAR检测、特征提取、分类器。前几步在检测层面已经很成熟但到了“分类识别”就难了。传统特征提取依赖人工设计常见的包括多普勒谱峰数目、谱宽、RCS统计特征、微多普勒周期等。问题在于真实场景里目标类型太多一个特征组合很难覆盖所有类别。我实际碰到过的情况是无人机和鸟的RCS都很小多普勒谱也很像传统方法经常搞混。后来加了微多普勒特征好一些但换个型号的无人机参数就失效了因为旋翼转速和叶片数量一变谱结构就全变了。人工特征就是在跟目标种类赛跑跑不赢。低信噪比环境下更难受。目标回波淹没在噪声和杂波里CFAR勉强能检测到但提取出来的特征全是毛刺。这时候分类器再强也白搭输入都是垃圾。传统方法还有一个问题雷达目标识别本质上是一个高维模式识别问题但人工特征只能触及低维的表象很多隐藏的调制结构在特征提取前就被人工切掉了。2.2 AI模型如何利用时频谱图AI切入最自然的方式就是把时频谱图当作一张图像交给卷积神经网络CNN去自动学习特征。为什么偏偏是时频谱图而不是原始I/Q数据也不是距离-多普勒图因为原始I/Q数据太底层时序长度长、信噪比波动大网络需要很深的层才能学到微动模式距离-多普勒图是静态的丢失了时间维度的变化只有时频谱图保留了“频率随时间演化”的动态特性这才是微动目标区分的核心特征。以无人机检测为例时频谱图里旋翼的微多普勒通常呈现周期性的闪动条纹而鸟类扑翼则是较宽且随机的包络。CNN不需要你说“我要提取条纹间距”它会在卷积层中自动学出一组边缘检测器、纹理检测器再在高层组合成“像旋翼闪动”的概念。所以现在的典型做法是雷达回波先经过预处理和STFT变成时频谱图然后进入CNN或者更重的ResNet、Transformer输出目标类别和置信度。这条路我跑了快两年实际验证下来对于无人机、人、车、动物四分类准确率从传统特征方法的78%左右提升到了94%以上而且对无人机型号的泛化能力也强了不少。AI的意义不在于替代传统雷达信号处理而是把检测之后的那一段“识别”环节从“人定规则”变成“数据驱动”。3. 实操基于Matlab的雷达时频谱图生成与AI识别流程3.1 仿真数据准备构造带微多普勒的雷达回波没有实测数据的时候只能靠仿真先跑通流程。我一般用Matlab生成一个包含静止底座和正弦微动散射点的回波模拟微多普勒目标。这样做的好处是可控方便调试算法。一个比较简单的生成方法是假设雷达发射单频连续波CW频率为fc目标主体径向速度为零但某个散射点在做正弦振动。核心的Matlab代码思路大致是这样fs 2000; % 采样率 2kHz fc 24e9; % 24GHz雷达 t 0:1/fs:2; % 2秒时长 vib_amp 0.002; % 振动幅度 2mm vib_freq 20; % 振动频率 20Hz phase 4*pi*vib_amp*cos(2*pi*vib_freq*t) * fc / 3e8; signal exp(1j * phase); % 单散射点回波 noise 0.1/sqrt(2) * (randn(size(t)) 1j*randn(size(t))); received signal noise;相位表达式中4π乘以振幅再除以波长就是微多普勒相位的常用近似。这样生成的信号做STFT后就能看到一条按20Hz振荡的频率曲线。如果仿真里多加几个不同振动频率和幅度的散射点就能模拟更复杂的旋翼目标。还可以给主体加上匀速平动这样时频谱图上会有一条直线打底上面叠加正弦波纹更接近真实场景。3.2 时频谱图生成的关键参数Matlab里直接用spectrogram函数最省事window hamming(256); noverlap window.length - 64; % 保持16ms的时间步进 nfft 512; spectrogram(received, window, noverlap, nfft, fs, yaxis);这里有几个参数非常关键。窗长决定了时频分辨率的基本权衡窗长越长频率分辨率越高但时间分辨率越差窗长越短时间定位越准但频率模糊。具体取值要根据目标微多普勒特征来定。比如振动频率50Hz、需要区分相邻5Hz的谱峰那么频率分辨率至少要2.5Hz对应窗长约0.4秒。这个0.4秒窗会导致至少0.4秒的时间模糊对快速运动目标来说会吞掉很多细节。我通常的做法是先看一眼目标是快变还是慢变。对于人体动作的微多普勒频率一般5到20Hz窗长128到512点足够对于无人机旋翼动辄几百Hz的微多普勒需要把采样率做高窗长反而可以稍短些。NFFT不用太大只需要在窗长基础上补零到满足频率采样点即可补零不会提高真实分辨率只让图形更光滑。重叠率则建议设到50%到75%防止时间轴出现条纹断层。生成图像以后别忘了保存时保持原始数值。很多初学朋友直接把spectrogram截图存成JPG喂给CNN这是大错特错。截图引入了压缩噪声而且RGB通道重复冗余。正确做法是保存成单通道灰度图或者直接用imagesc输出归一化矩阵保存为PNG。如果后续要做数据增强最好直接存MAT数据或NumPy矩阵方便在线处理。3.3 构建一个简单的CNN分类器时频谱图准备好后我用Matlab的Deep Learning Toolbox快速跑了一个基础CNN更复杂的工程里我会用PyTorch。这里贴一个Matlab风格的网络结构方便直接用trainNetwork训练layers [ imageInputLayer([256 256 1], Normalization, none) convolution2dLayer(3, 8, Padding, same) batchNormalizationLayer reluLayer maxPooling2dLayer(2, Stride, 2) convolution2dLayer(3, 16, Padding, same) batchNormalizationLayer reluLayer maxPooling2dLayer(2, Stride, 2) fullyConnectedLayer(4) softmaxLayer classificationLayer ];这个网络很浅但作为基线足够了。输入图像统一缩放到256×256的灰度图每个像素值归一化到0到1。注意imageInputLayer里我特意把Normalization设为none因为时频谱图的数值范围本身是相对稳定的再套一个Matlab默认的零均值归一化有时会把微弱信号压没。全连接层的输出节点数改成你自己的类别数。训练时我一般用带动量的随机梯度下降options trainingOptions(sgdm, ... InitialLearnRate, 0.01, ... MaxEpochs, 20, ... MiniBatchSize, 32, ... ValidationData, {valImages, valLabels}, ... Plots, training-progress, ... Verbose, false);3.4 训练与调优的实操经验训练过程里最容易翻车的不是网络结构而是数据划分。很多朋友把所有时频谱图的随机切片混在一起再随机分训练测试集这样同一个目标片段的不同时间窗都进了训练集测出来准确率虚高。实测下来得分可能95%但拿到现场就掉到70%多原因就是数据泄漏。正确做法是按“目标轨迹”或“目标ID”划分。比如一条2秒的连续雷达记录只允许前半段进训练集、后半段进测试集绝不能交叉。更严格一点可以用多个目标的独立记录分别划分。第二个常见问题是类别不均衡。无人机样本好采但动物样本特别少训练出来的网络会倾向把所有目标判断为无人机。我建议在损失函数里加类别权重或者直接对少数类做重复采样/过采样。Matlab的classWeights可以在classificationLayer里指定或者用augmentedImageDatastore做在线增强把少数类随机平移、旋转、加噪让网络见过更多变体。还有一个参数容易忽略时频谱图的尺度一致性。不同距离、不同姿态下回波幅度差异很大如果直接对每张图单独归一化到0到1会丢失绝对幅度信息但如果不归一化网络又很难学。我通常采用全局统计归一化即用训练集所有时频谱图的均值方差做标准归一化验证集和测试集也用同一套统计量这样既保留了相对强度又让数值范围稳定。4. 从识别到智能感知多传感器融合与实时部署4.1 智能感知的三个层次能对时频谱图做分类属于“识别”层面。但真正的“智能感知”我认为包含三个递进层次检测、识别、认知。检测是知道“有目标”识别是知道“是什么目标”认知是进一步理解目标的行为和意图比如“这个人正在朝门走”“那架无人机正在下降靠近”。传统雷达只能做到前两层认知层面需要把时间序列上的多个判定结果联系起来。时频谱图本身就是一个时间序列的切片集合你可以把连续多帧时频谱图叠成一个三维张量用LSTM或Transformer捕捉时序依赖从而预测行为。这一块我做过的方案是前几秒钟的时频谱图序列输入一个轻量级CNN提取每一帧的特征向量再送入Transformer编码器最后输出行为类别。相比逐帧独立分类准确率提升了8个百分点尤其是在人转身、蹲起这类连续动作上提升明显。4.2 边缘端部署与模型轻量化雷达系统很多时候跑在嵌入式设备上资源紧张没有大服务器跑重型网络。涉及模型部署我经常被问“训练好的CNN怎么塞进边缘盒子”答案是模型轻量化。先剪枝再量化是性价比最高的两步。训练时可以用TensorFlow或PyTorch导出成ONNX再通过TensorRT或者OpenVINO转到目标平台。量化方面FP32转FP16基本无损再转INT8会有一些精度损失但对雷达时频谱图这种纹理特征明显的输入损失通常可以控制在1%以内。我实测过一个四分类CNNINT8量化后模型体积从24MB缩到6MB推理时间从12ms降到3ms精度只掉了0.7个百分点完全够用。如果目标平台实在小还有一个土办法把时频谱图分辨率降低。256×256输入改成96×96只保留主要微多普勒纹理网络精度下降没想象中严重同时推理速度提升显著。当然这种降采样必须在训练时跟着做不能训练用高清、部署用低清否则输入分布不匹配效果直接崩。4.3 数据增强和域自适应从仿真走向实测最大的坑是域差异。仿真时的噪声是理想高斯白噪声实测回波里有各种杂波、多径、天线增益不平坦时频谱图纹理和仿真差距巨大。用纯仿真数据训练的模型拿到真实设备上推理准确率能掉二三十个百分点。解决办法有两个方向。一个方向是数据增强在仿真阶段同时扰动信噪比、中心频率偏移、时频谱图时间抖动、小角度旋转等让模型见过更多变化增强鲁棒性。另一个方向是域自适应用对抗训练方式让网络学习“域无关”的特征。我在实际项目里常用一个更简单有效的方法把少量真实数据加入训练集并对真实数据做过采样混合训练后模型通常就能拉回80%以上的效果。如果连真实数据都没有可以考虑仿真器和真实数据之间做一个CycleGAN样式的图像风格迁移把仿真时频谱图转成接近真实风格的图谱再用转换后的数据训练。不过这个方案工程量偏大适合长期迭代的产线不建议项目初期就上。5. 常见问题与排查技巧实录我在带新人或者帮同行看问题时发现踩的坑相对集中在下面几个。整理成一份速查表方便大家直接对照排查。问题现象可能原因解决办法时频谱图条纹“糊成一片”窗长过长或者NFFT过小缩短窗长调整重叠率先做单目标调试时频谱图全是横线看不到时变特征强静态杂波没有抑制做MTI滤波或平均相消先去掉零频附近能量模型训练准确率高实测崩盘数据划分泄漏或纯仿真训练按目标ID划分数据集混入真实数据微调少数类别完全识别不出来类别不均衡设置类别权重对少数类做过采样实时性不够模型太深或输入图像太大剪枝、量化、降分辨率三板斧模型在不同设备间结果差异大部署时图像预处理不一致统一全局归一化统计量和图像缩放算法单独拎出两块再细说一下。第一时频谱图里强静态杂波的问题。很多雷达场景下静止的背景反射非常强占据了时频谱图的中心零频位置动态目标的微多普勒条纹会被它压得看不见。这时候一定要在生成频谱图之前先做一次多普勒域的高通滤波或者MTI相消。最简单的做法是把每一帧回波减去前几帧的平均值这叫“平均相消”能把静止杂波抑制掉。我见过有人把杂波图直接丢进CNN网络倒也能学出一些特征但收敛慢精度上限也低不如先做信号域预处理来得干净。第二时频谱图输入模型的实时滑窗策略。雷达系统是流式数据不可能等整段采集完再处理。通常的做法是维护一个滑动窗口窗口长度覆盖目标微多普勒的一到两个周期每更新一帧数据就生成一张最新的时频谱图交给模型推理。这里要特别注意相邻窗口之间的重叠率重叠太低会导致识别结果抖动重叠太高又浪费算力。我一般设75%的重叠推理结果再做一次时间上的滑动平均输出置信度平滑很多。还有一个我反复强调的细节数据标注的准确性。时频谱图上类别边界可能很模糊比如无人机慢速飞行和鸟的扑翼在短时间窗内非常像。标注时不要只看单帧图要结合连续时频谱图和目标轨迹一起看甚至配合摄像头画面否则模型先吃进了错误标签后面怎么调都白费。最后再分享一个工作习惯每换一种目标类型或换一个雷达平台我会先把几段典型回波存成MAT文件生成时频谱图后主动看一遍问自己三个问题——目标条纹是不是清晰、背景杂波重不重、类别之间的差异是不是足够稳定。这三个问题能过再谈AI建模。很多时候模型效果差根子不在网络结构而是数据呈现方式不对。时频谱图这个环节做扎实了后面的智能感知才有地基可谈。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。