尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LFM信号识别实战:从时频分析到深度学习分类的完整链路

LFM信号识别实战:从时频分析到深度学习分类的完整链路 1. 项目思路与需求拆解1.1 为什么偏偏要识别LFM信号LFMLinear Frequency Modulation线性调频信号通俗讲就是频率在脉冲持续时间内线性扫过的信号频率从低到高叫上调频从高到低叫下调频。这东西在雷达、声呐、水声通信、电子对抗里几乎是“半壁江山”级别的存在——雷达用它做脉冲压缩可以在不牺牲距离分辨率的前提下提升作用距离通信系统用它做扩频抗干扰敌我识别和电子侦察系统则天天琢磨怎么把它从复杂电磁环境里捞出来。所以“分类与检测识别”这个题本质上是在回答三个问题电磁环境里有没有LFM信号它和多信号混在一起怎么挑出来挑出来之后是哪种参数模式的LFM能不能和连续波、相位编码、跳频等其他信号类型区分开我接手这个项目时客户给的场景很具体输入是一段宽带中频采样数据里面可能混有LFM、单载频CW、BPSK/NLFM非线性调频、以及简单噪声任务是先把LFM信号“摘”出来再按带宽、脉宽、调频方向细分。你可能会觉得这题不难——频域看一眼带宽就知道了呗。但在低信噪比、多信号交叠、脉内干扰的场景下单纯看频谱很容易翻车需要一套从时频分析到特征提取再到分类决策的完整链路。这篇文章就把整条链路摊开来讲从原理到代码从踩坑到调参适合正在做雷达信号分选、通信侦察、频谱监测或者搞毕业设计的同学参考。1.2 检测识别任务的整体技术路径梳理一下这个项目的技术架构本质上是一条“信号处理 机器学习”的流水线我用一张思维导图式的结构来表达数据层中频采样数据或仿真生成作为输入信号源预处理层下变频、去直流、滤波、截断分帧检测层粗检测能量/自相关 精细检测时频峰值/CFAR特征层时域、频域、时频域特征提取或直接生成时频图像分类层传统机器学习分类器SVM、随机森林或深度学习分类器CNN、ResNet决策层分类结果融合、置信度输出、告警或分选结果。这个路径的第一原则是“先检测后识别”而不是直接一把梭分类。为什么因为真实采集信号里绝大多数时间窗是没有目标的直接分类会导致类别极度不均衡——负样本纯噪声占99%模型会偷懒把所有样本判成噪声。先做检测门限把“疑似有信号”的片段截出来再送分类器准确率和计算效率都会好很多。后面我会具体讲各个环节的实操方法。2. 核心原理与时频分析方法2.1 LFM信号的数学模型与特征先把数学底子打牢。LFM信号的复基带表达式是s(t) A · exp{j·2π·(f₀·t ½·k·t²)}0 ≤ t ≤ T其中f₀是起始频率k B / T是调频斜率Hz/sB是信号带宽T是脉宽A是幅度。瞬时频率为f(t) f₀ k·t是t的线性函数——这就是“线性调频”四个字的由来。这个表达式的关键参数有三个起始频率f₀、带宽B、脉宽T。由带宽和脉宽算出的时宽带宽积D B·T是个极其重要的量。雷达里常说“脉冲压缩比等于时宽带宽积”因为匹配滤波后输出的主瓣宽度是1/B处理增益正好是D。举个例子如果T 10μsB 20MHz那么D 200匹配滤波后信噪比可以提升23dB左右。这是LFM被广泛应用的根本原因。在检测分类场景中LFM的辨识性特征体现在时频平面上——它在时频图上表现为一条倾斜的亮线直线斜率就是调频斜率k。这个“直线”特征非常独特单载频CW是一条水平线相位编码信号是一片近似均匀的矩形区域跳频信号是若干条离散的水平短线。正是这种时频形态的差异决定了我们做分类时可以拿“时频图当图片”来处理让卷积神经网络去学形态差异。这也是为什么我在项目中选了“时频分析 图像分类”作为核心方案而不是硬套时域高阶统计量。2.2 短时傅里叶变换与Wigner-Ville分布的选择做时频分析首选工具常规是两个短时傅里叶变换STFT和Wigner-Ville分布WVD。两个我都实际用过可以说各有利弊。STFT的思路很简单把信号加窗分段做FFT把频率随时间的变化拼起来。离散化以后第m帧的谱为X(m, ω) Σ x(n)·w(n - mH)·exp(-jωn)其中w是窗函数H是帧移。STFT的实现成本低、稳定性好没有任何交叉项干扰是工程落地最稳妥的选择。但代价是受不确定性原理约束时间和频率分辨率不能同时提高——窗长取短频率分辨率差窗长取长时间分辨率差。对于LFM信号如果你用短窗比如128点时频图上的直线会变得很粗很糊测调频斜率容易偏用长窗比如1024点斜率倒是清楚了但脉冲沿的时间定位会模糊。WVD则是另一种极端。对单分量LFM信号WVD的理想结果是沿瞬时频率的一条无限锐利的直线聚焦性比STFT好太多。公式是W(t, ω) ∫ s(t τ/2)·s*(t - τ/2)·exp(-jωτ) dτ但问题是这个双线性变换遇到多分量信号会产生严重的交叉项在时频图上表现为分量之间的虚假能量峰。比如两个LFM信号交叠WVD会多出一堆“幽灵”斜线分类器很容易被骗。我一开始图WVD聚焦性好直接用它对实际采集的多信号数据做时频图结果分类准确率反而不如STFT。后来加了伪Wigner-Ville分布PWVD即在时域加窗滑动的WVD交叉项压下去不少但计算量翻倍最终在工程版里我还是换回了STFT。给你的选型建议是如果样本是干净的单个LFM信号追求图像质量用WVD或PWVD没问题如果是复杂电磁环境、有多信号交叠、有噪声干扰老老实实用STFT。STFT加合适窗长配合后续的图像增强和网络训练性能完全够用而且稳定性远超WVD。表里汇总一下方法频率分辨率时间分辨率交叉项计算量适用场景STFT受窗长限制受窗长限制无低通用、多信号环境WVD高高严重中单分量、高信噪比PWVD较高较高部分抑制较高少量分量、中等信噪比短时分数阶傅里叶变换高高较弱高参数估计、高精度斜率测量2.3 为什么时频图比频谱图更适合分类这一节说一个很多人忽略的认知点。单看频谱LFM和宽带噪声很像——都是一段平坦的带内能量区别不过是带宽大小但看时频图LFM的斜线模式一眼就能认出来。分类问题的本质是找“判别性特征”而LFM最大的判别性特征恰恰在时频二维平面上而不是一维频谱上。打个比方一维频谱像把一段音乐直接看成功率谱你能知道高频多还是低频多却不知道旋律是怎么变化的时频图则像乐谱横轴是时间、纵轴是音高旋律线条一目了然。LFM的“旋律”就是一条斜线CW是平线BPSK则是一堆断续的小段线。这种形态差异用卷积神经网络提取是天作之合。所以在项目里我选择把STFT得到的幅度谱重新映射成灰度图或伪彩色图当作图像样本喂给CNN。后续的所有流程——数据增强、网络设计、训练策略——都是围绕“时频图像分类”展开的。这个思路也延续到了检测环节后面细讲。3. 仿真数据生成与样本集构建3.1 用Python生成LFM信号样本集任何监督分类项目第一步都是搞到足够的标注数据。实测采集数据成本高、标注难所以我先搭了一套仿真信号生成器再在仿真数据上做预训练最后用少量实测数据微调。这里给出关键代码import numpy as np from scipy.signal import chirp from scipy.fftpack import fft def generate_lfm(duration10e-6, fs50e6, start_freq5e6, bandwidth20e6): 生成LFM基带复信号 duration: 脉宽秒 fs: 采样率Hz start_freq: 起始频率Hz bandwidth: 信号带宽Hz t np.arange(0, duration, 1/fs) k bandwidth / duration # 调频斜率 phase 2 * np.pi * (start_freq * t 0.5 * k * t**2) signal np.exp(1j * phase) return t, signal def add_noise(signal, snr_db): 添加高斯白噪声, snr_db为信噪比 signal_power np.mean(np.abs(signal)**2) noise_power signal_power / (10**(snr_db/10)) noise np.sqrt(noise_power/2) * (np.random.randn(*signal.shape) 1j*np.random.randn(*signal.shape)) return signal noise这里我故意把采样率定为50MHz信号带宽20MHz起始频率5MHz。为什么要留这么多余量因为后面做STFT时边界效应会产生频谱泄漏如果信号频率顶到奈奎斯特频率上时频图会被边界擦掉一块。按经验信号最高频率不要超过采样率的40%最低频率不要低于采样率的5%这样时频图才完整。仿真时要覆盖的参数包括脉宽从1μs到100μs随机变化带宽从5MHz到50MHz随机变化信噪比从-6dB到12dB均匀采样。为什么要刻意让参数范围大因为我在后续测试里发现模型很容易“记住”训练集里的参数范围一旦实测信号带宽超出范围准确率就崩。参数随机化是一种天然的域随机化能明显提升泛化性。还要生成几类干扰信号CW单一频率连续波、BPSK相位编码、NLFM非线性调频比如正弦调频、以及纯噪声样本。类别总数为5其中LFM根据调频方向又细分为上调频和下调频。这样分类器要解决的就是一个6选1问题5类信号1类纯噪声难度适中工程上有代表性。3.2 时频图生成与预处理样本生成之后下一步是统一把它变成时频图并做预处理。STFT计算我这里直接用scipy的spectrogram窗函数选择汉明窗窗长256点对应的时域长度5.12μs重叠率75%。代码如下from scipy.signal import spectrogram def compute_stft_image(signal, fs50e6, nperseg256, noverlap192): 计算STFT并返回归一化的灰度图像 f, t, Sxx spectrogram(signal, fsfs, windowhamming, npersegnperseg, noverlapnoverlap, modemagnitude) # 取对数压缩动态范围 Sxx_db 20 * np.log10(Sxx 1e-12) # 归一化到0~255 img_min np.percentile(Sxx_db, 5) img_max np.percentile(Sxx_db, 95) img (Sxx_db - img_min) / (img_max - img_min) img np.clip(img, 0, 1) * 255 return img.astype(np.uint8)有几个预处理细节值得多说几句。第一为什么要取对数因为LFM信号匹配滤波输出动态范围很大主瓣和旁瓣可能差30dB以上。如果直接用线性幅度旁瓣在图像里几乎看不见信息就丢了。取对数相当于把动态范围压缩让神经网络能同时看到主瓣和旁瓣的形状。实践中两张图一张线性一张对数网络在对数图上收敛明显更快。第二归一化的百分位数选择。我不用全局最大最小值归一化因为噪声峰值偶发会让图整体变暗改用第5百分位到第95百分位截断能自动适应不同信噪比图像对比度更稳定。这个细节是从两年图像分割项目里带过来的经验很不起眼但对训练效果帮助很大。第三图像尺寸统一。STFT输出形状跟信号长度有关参考样本的时频图可能是300×400另一个是200×500不能直接送网络。所以我把所有图片统一缩放到224×224正好匹配ResNet输入尺寸用OpenCV的resize双线性插值即可。如果比例变化太大注意先补齐后缩放避免信息挤压。4. 分类识别模型选择与训练4.1 传统机器学习方案SVM与特征工程在决定上深度学习之前我先用传统方案做了一版基准——不是走形式而是为了拿到一个对照基线。如果传统方法已经能到97%准确率那深度的价值就要重新考虑了。传统方案的核心是人工特征提取我挑了三个维度的特征时域特征信号包络的上升沿/下降沿时间、脉宽估计值、瞬时频率斜率估计相位差分法频域特征-3dB带宽、频谱峰值频率、谱峰陡峭度时频特征STFT时频图上能量最大直线方向的Hough变换峰值角度、时频脊线拟合残差。Hough变换检测直线这个点值得展开。时频图里的LFM是一条直线所以对二值化的时频图做Hough变换会有一个明显的峰值点峰值对应的角度就是直线的倾角也就是调频斜率。这个特征对LFM来说非常强判别。我在scikit-image里实现很简单实际测试里仅靠“Hough峰值角度”一个特征就能把LFM和CW、BPSK分开准确率已经超过90%。特征提完之后用支持向量机RBF核做分类5折交叉验证。在30000个仿真样本上SVM的综合准确率大概是93.7%其中高信噪比段6dB准确率98%低信噪比段-3dB~0dB掉到78%。这个结果说明什么呢传统方法能做但对低信噪比的鲁棒性不足主要原因是低信噪比下特征提取本身就不稳人工特征对噪声敏感。这为我选择深度学习方案提供了量化依据。4.2 深度方案ResNet18与时频图分类深度方案用的是ResNet18输入224×224×3灰度图复制成三通道输出6类。选ResNet18而不是更深的ResNet50是因为时频图的语义比较简单深层网络容易过拟合而且推理速度也重要。在边缘设备上ResNet18用CPU推理一张图大约15ms而ResNet50要50ms以上差距明显。训练的关键超参数我列一下都是踩过坑后调出来的# 数据加载器 train_loader DataLoader(train_dataset, batch_size64, shuffleTrue, num_workers4) val_loader DataLoader(val_dataset, batch_size64, shuffleFalse, num_workers4) # 模型与优化器 model models.resnet18(pretrainedTrue) model.fc nn.Linear(512, 6) optimizer torch.optim.Adam(model.parameters(), lr1e-3, weight_decay1e-4) scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max30) # 损失函数 criterion nn.CrossEntropyLoss()用ImageNet预训练权重做迁移学习这招很关键。虽然ImageNet是自然图像但网络前几层学到的边缘、纹理基础特征对时频图同样有效。我对比过随机初始化和预训练初始化在同样epoch数下预训练模型收敛速度快了大约三倍最终准确率高出3~5个百分点。训练50个epochbatch size 64初始学习率1e-3余弦退火调度。最终测试集准确率98.2%其中LFM类别的F1分数比SVM提升了约6个百分点低信噪比段-3dB~0dB准确率从78%提到了92%。这个提升的来源主要是网络能在时频图上学习到更鲁棒的形态特征而不是依赖几个脆弱的统计量。4.3 数据增强策略仿真数据的劣势是分布过于理想直接拿仿真训练好的模型去实测数据上通常会有明显的性能下降。我做了一套针对时频图的增强策略在不改变基本形态的前提下增加样本多样性随机噪声叠加对时频图再叠加不同方差的高斯噪声模拟不同信噪比频率偏移在STFT之前把信号整体搬移一个随机频率使得时频图上下平移时间裁剪截取脉冲的一部分模拟只有部分信号在观察窗内的情况幅度变化随机改变信号幅度模拟不同距离下的接收能量差异混合信号干扰把两个样本的时频图加权叠加模拟信号交叠。这里有一个比较反直觉的经验传统图像增强里的随机裁剪、水平翻转、颜色抖动等操作对时频图分类反而是有害的。因为水平翻转会把“上调频”变成“下调频”直接翻转语义标签随机裁剪则可能裁掉LFM直线的一部分让网络学到残缺模式。所以时频图增强必须从信号产生的物理过程出发而不是照搬自然图像的增强方法。我最后的增强管线只保留了噪声叠加、频率偏移、功率变化三类增强后的训练集规模从3万扩到9万模型在实测样本上的准确率从84%提升到95%效果非常明显。这个对比也说明了“针对物理过程的增强”比“通用图像增强”有效得多。5. 检测与识别联动从信号流到告警输出5.1 检测环节怎么做能量检测与CFAR前面讲的全是分类问题但实际项目中信号流是连续的不能假设所有时间窗里都恰好有一个信号等着分类。检测环节的任务是回答“这段数据里到底有没有信号”再决定要不要送分类。我用的是“粗检 精检”两级方案。粗检测用滑动窗能量检测把数据分成每段1ms的帧计算每帧的平均功率再用前后若干帧做滑动中值估计噪声底设置门限为噪声底加6dB。超过门限的帧标记为“疑似有信号”。这个方法的优点是简单快速一秒钟数据几十个帧几十微秒就算完了。精检测用频域CFAR恒虚警检测的思想在疑似帧的时频图上沿时间轴对每一行的频域幅度做均值形成一个“频率-能量剖面”。然后用单元平均CFARCA-CFAR检测峰值频率。CFAR的滑窗长度和虚警概率设置要好好调——我用的保护单元数10个、参考单元数20个、虚警概率10⁻⁶。在信噪比高于3dB时这个精检的检测概率超过99%信噪比低到-3dB时检测概率掉到75%左右还可以接受。为什么不能只做能量检测因为宽带干扰下纯噪声帧的能量也可能飙升能量检测会产生大量虚警。加了CFAR之后只有真正表现为“频域局部凸起”的能量才被确认为信号能滤掉大部分宽带干扰。5.2 检测到目标之后时频块裁剪与分类检测通过后从原始数据里裁剪出目标所在的时间段重新计算STFT时频图缩放后送分类网络。这里有一个重要的工程细节检测用的STFT和分类用的STFT参数可以不一样。检测时为了速度用短窗128点粗算分类时为了图像质量用长窗256点或512点重算。两个参数解耦各自调到最优而不是互相迁就。另外因为检测只能给出目标的大致时间范围裁剪时要在前后各多取一段余量确保信号完整落在图像内。我通常在目标起点前留5%的时间终点后留5%这样即使检测的时间定位有偏差裁剪窗口也能完全包住信号。如果裁剪窗口把信号截断了一半分类器大概率会误判这种问题在实测数据里特别常见。整条链路的运行流程是数据进入滑动窗能量检测判断是否存在候选目标候选段进入CFAR精检排除宽带干扰通过CFAR的段进入时频分析生成时频图时频图送入分类网络输出信号类型与置信度置信度超过0.7则输出识别结果否则标记为“待复核”。5.3 边缘端部署的工程优化实验室跑通只是第一步这项目最终要部署在一台X86工控机上还要兼顾实时性。数据流速率是50MHz采样率的中频数据每秒数据量约100MB复数据、16bit不可能全部实时处理。我最终的设计是分两级缓冲第一级在FPGA上做部分预处理和数据降速只把能量高于门限的数据段传给CPUCPU只负责对稀疏的候选段做时频分析和分类。模型端的优化也做了几个动作。第一是INT8量化用PyTorch的量化接口把ResNet18量化到8bit模型大小从45MB压到12MBCPU推理速度从15ms降到6ms准确率只掉了0.4个百分点。第二是批次推理把同一秒内检测到的多个候选时频图合并成一个批次一次性前向传播进一步摊薄了计算开销。第三是ONNX Runtime部署比直接用PyTorch的eager模式快20%左右。这些优化做完之后整条链路在一台普通i5工控机上对1秒数据的处理时间从最初的800ms降到了130ms左右能够满足“准实时”的需求。6. 实测问题与排查技巧6.1 分类准确率上不去的常见原因我在这类项目上踩过不少坑很多问题在仿真里完全看不出来一上实测全暴露了。这里把排查经验整理成表方便你对着自查现象可能原因排查方法解决方案实测准确率远低于仿真训练仿真数据分布与实测差异大对比实测与仿真的时频图差异增加域随机化和真实噪声低信噪比段识别为纯噪声时频图像对比度设置不当检查归一化参数改用百分位数归一化上调频和下调频互相错分数据增强做了水平翻转查看训练配置禁用水平翻转增强时频图亮线断裂、分类器当多类STFT窗长太短或帧移太大目检时频图提高重叠率到75%以上多信号交叠时误判分类网络没见过双分量信号增加混合增强在训练集加入混合信号样本训练loss不降学习率过大或类别不平衡检查损失曲线换用更小的学习率并加权loss模型对参数范围外信号失效训练样本参数范围过窄统计训练集参数分布扩大参数随机范围6.2 典型误判案例说一个很有迷惑性的失败案例。有一次实测数据里出现了一个“伪LFM”某型号雷达工作在脉冲多普勒模式下由于天线扫描调制频谱上偶尔会出现类似斜线的能量拖尾分类器把它当成了LFM信号。后来我分析时频图才发现这条“斜线”其实是多根CW谱线的包络调制产物斜率并不恒定而且在某些时刻会断裂。解决办法是在特征层面加了一个“直线连续性”校验对时频图二值化后做形态学骨架提取计算骨架的连续性分数低于0.85的一律不判为LFM。这个工程气很浓的规则比单靠网络概率阈值可靠得多。另一个案例是BPSK信号的低信噪比误判。BPSK的时频图在正常信噪比下是均匀的矩形亮块但信噪比降到1dB以下矩形亮块的边缘开始模糊整体变得像一条宽斜线——和低斜率LFM很接近。我用常规测试集测BPSK在0dB时的错分率有8%其中大部分被错分成“LFM低斜率”。针对这个我把训练数据里的BPSK信号集中在低信噪比段做了过采样同时新增了一类“低斜率LFM”和“BPSK低信噪比”的混淆样本错分率降到了3%以下。所以遇到难分对不要只调网络结构先看混淆矩阵里的具体错误模式再有针对性地补数据。6.3 参数调整心得与工程避坑清单最后分享五个项目里最值得记住的经验。第一STFT窗长的选择要和目标参数范围匹配。如果LFM的带宽是20MHz、脉宽是10μs那么时频图上直线的斜率为2MHz/μs。在采样率50MHz下一个256点窗覆盖5.12μs、频率分辨率约195kHz。如果直线斜率太大在一个窗内频率变化量远超频率分辨率时频图会变得阶梯状这时要缩小窗长反之直线太平要放大窗长。没有万能窗长关键看你要分析的信号斜率范围。第二信噪比低于0dB时对数幅度谱比线性谱可靠得多。我第一次做时频图就是在低信噪比下直接用线性幅度结果整个图灰蒙蒙一片网络完全学不到特征换成dB刻度之后信号结构立刻清晰了。第三分类网络的最后一层用softmax输出但实际部署时不要直接用argmax。把置信度阈值设在0.7低于阈值一律判为“未知信号”能避免很多离谱错误。真实电磁环境里的信号类型远不止你训练集里的那几种与其硬猜不如老实标记为未知。第四训练集里一定要留一部分“负样本”——纯噪声和干扰。一开始我没放实测里大量纯噪声片段被分类器强行判成某一个信号类虚警率爆表。加上负样本类别后模型学会了“不确定就说不知道”虚警率直接降了一个数量级。第五迁移学习的预训练权重对这类任务有奇效但要注意冻结和解冻的策略。我前10个epoch冻结backbone只训练分类头后面全网络微调用比较低的学习率1e-4比起全程用1e-3从头训准确率能差出3个百分点左右。这个项目做下来我最大的体会是LFM信号分类识别看起来是“老三样”信号处理的问题但实际上它是一个典型的“信号处理与深度学习交叉落地”的完整工程。想拿高分你不能只会在干净仿真里用CNN跑个99%准确率而要把检测、特征、模型、部署这条链路全部走通每一步都考虑到实际电磁环境的脏乱差。尤其是时频分析和数据增强这两个环节它们决定了模型性能的上限而检测门限和置信度阈值这些工程细节决定了系统能不能真正被用起来。如果你正在做类似的项目建议按这个顺序推进先搞定时频图的质量再设计匹配物理过程的数据增强最后才去磨模型结构和部署优化。
返回列表