说实话,拿到“PLFM_RADAR”这个项目代号的时候,我一开始也有点懵。PLFM到底指什么?查了一圈和项目相关的技术文档,再结合它挂在RADAR后面的语境,项目组内部最认可的解释是Programmable Linear Frequency Modulated,也就是可编程线性调频雷达。简单说,这个项目不是要做一款传统的、功能固定的脉冲雷达,而是要把雷达的发射信号参数——带宽、脉宽、调频斜率、脉冲重复周期——全部做成可配置,让同一条硬件链路能根据不同的探测场景自动切换工作模式。
这篇博文,我想完整复盘这个项目从信号体制选型、硬件搭建、算法落地到实测踩坑的全过程。里面所有的参数、代码片段、排查思路,都是我在这个项目里真实趟过的。如果你正准备做雷达方向的课题、产品原型,或者只是对雷达信号处理感兴趣,这篇文章应该能帮你省掉不少弯路。
1. 为什么非要做可编程的LFM雷达:传统雷达的痛点
先说一个最直接的问题:传统固定参数雷达到底哪里不好用,逼着我们自己造一个PLFM_RADAR?
1.1 固定参数雷达的“一刀切”困局
传统雷达发射信号的参数是出厂定死的。比如一台C波段的船用导航雷达,它的发射脉冲宽度、重复频率、峰值功率都是固定的。这种设计在单一场景下没问题,但你一旦想让它干点别的,就非常尴尬。
我举一个项目里实际遇到的例子。我们最初用一台固参雷达做厂区周界监测,目标是同时探测两类目标:一类是低速移动的人(步行速度大概1~2 m/s),另一类是高速接近的无人机(速度可能到15~20 m/s)。固定参数的雷达,脉冲重复频率(PRF)只能取一个折中值。PRF取高了,最大不模糊距离就短,远处的围墙边界直接折叠到近区,形成虚假目标;PRF取低了,多普勒频移的采样率不够,高速无人机在速度维上直接混叠,显示出来的速度是错的。
当时调来调去,只能在一个很窄的参数区间里勉强同时工作,但余量非常小,稍微有点天气影响或者电磁干扰,系统就罢工。这时候我们才意识到,雷达如果想要适配多场景,发射信号的参数必须能动态调整。
1.2 PLFM_RADAR的破局思路:把“乐高”递给信号源
PLFM_RADAR的思路特别直白:与其让雷达固化成一种模式,不如把发射信号的每一个关键参数都变成可以随时改写的寄存器值。我们需要什么样的信号,就往波形发生器里写什么样的配置。
具体到系统架构上,相当于我们把传统雷达里“发射机+天线+接收机+信号处理器”这条链路拆开,在发射端加入一个可编程波形发生器,在接收端加入一个高速数据采集卡,后续所有的信号处理全部交给软件完成。这样做的好处有三个:
- 同一台硬件,通过不同的波形配置,可以短时间内在“近距高分辨”和“远距大范围”两种模式之间切换。
- 算法的迭代不需要改硬件,改完代码重新跑一遍数据就行,开发速度非常快。
- 接收到的原始回波数据全部落盘,随时可以拿来做离线分析,这在做算法研究时是刚需。
说白了,PLFM_RADAR本质上是一台“软件定义的雷达开发平台”。它不是为了某一个固定应用设计的,而是让算法工程师可以像写Python脚本一样,自由地定义雷达的行为。
1.3 这个项目的定位:它是雷达开发者的“工作台”
所以,如果你问这个项目最终交付的是什么,我不会说它是一台雷达。它更像一个雷达信号处理实验床。你可以把它理解成一个显微镜:显微镜本身不产生生物学的结论,但它能让你看见细胞;PLFM_RADAR本身也不直接输出“前方50米有入侵者”的结论,但它能让你拿到高质量的中频回波数据,然后用算法去挖掘出目标信息。
我们项目最终的核心产出物是三样东西:
- 一套可以任意配置LFM信号参数的软件控制界面;
- 一块稳定可靠、能同步采集收发数据的硬件前端;
- 一整套从原始回波到目标点迹的信号处理Python算法库。
这套组合拳打下来,无论是做科研验证还是做产品原型预研,都够用了。
2. LFM信号体制的底层逻辑:大时宽带宽积是怎么实现的
既然叫PLFM_RADAR,核心信号体制必然是线性调频。这一节我打算把LFM的底层逻辑掰开揉碎了讲清楚。因为我在项目里发现,很多新手(甚至一些做过一段时间雷达的人)对LFM的理解停留在“发射信号的频率随时间线性变化”这句话上,但真要问他为什么这样能提高距离分辨率,他就说不清了。
2.1 距离分辨率的瓶颈:时宽和带宽的矛盾
故事要从距离分辨率公式说起。雷达的距离分辨率由发射信号的带宽决定,公式是:
ΔR = c / (2B)
其中c是光速,B是信号带宽。比如带宽是200 MHz,距离分辨率就是 3×10^8 / (2×2×10^8) = 0.75米。想要更高的距离分辨率(比如0.3米),你需要把带宽推到500 MHz以上。
但问题来了:传统的单频脉冲雷达,如果脉冲宽度是τ,那么它的信号带宽大约是1/τ(这是傅里叶变换的固有性质)。想要500 MHz的带宽,脉宽就得压到2纳秒级别。这么窄的脉冲,峰值功率必须拉得非常高才能在噪声里把回波翻出来,这种雷达工程实现难度极大,成本也极其高昂。
这就是经典雷达理论里的“时宽-带宽积”矛盾:想探测得远,需要大能量,即大时宽;想分辨得细,需要大带宽。传统信号两者不可兼得。
2.2 LFM的巧妙解法:让时间换带宽
LFM(线性调频)信号的精妙之处在于,它把频率在脉冲持续时间内线性地扫过一段范围。也就是说,一个脉宽为50微秒的脉冲,它的频率可以从24 GHz线性扫到24.5 GHz(也就是带宽500 MHz)。这样一来:
- 它的脉冲宽度很大(50微秒),所以它有充足的能量去探测远距离目标;
- 它的带宽很宽(500 MHz),所以它有很好的距离分辨率。
这就像一个跑长跑的人,他不需要瞬间爆发(高峰值功率),而是通过持续加速(频率变化)来累积“信息量”,最后照样能获得理想的成绩。
这里面用到的匹配滤波原理,我之前在看别的项目资料时看到过一个特别贴切的生活化类比:LFM信号的匹配滤波,本质上就相当于把一根原本“拉长”的绳子瞬间“压缩”成一小团,能量全部集中在一个点上。回波信号经过匹配滤波器之后,原本分散在50微秒内的能量会压缩成一个有效宽度仅1/B的窄脉冲,这就是脉冲压缩,也是LFM雷达能同时兼顾探测距离与距离分辨率的根本原因。
2.3 可编程体现在哪里:四个关键参数的实时配置
回到PLFM_RADAR项目名称里的“PL”也就是Programmable,我们系统需要能实时调节的参数,主要是下面这四个:
| 参数 | 作用 | 调节影响 |
|---|---|---|
| 起始频率 fc | 决定雷达工作频段 | 影响天线尺寸、大气衰减 |
| 信号带宽 B | 决定距离分辨率 | B越大,ΔR越小 |
| 脉冲宽度 τ | 决定发射能量 | τ越大,探测距离越远 |
| 脉冲重复周期 PRI | 决定最大不模糊距离和多普勒范围 | PRI与PRF互为倒数 |
这四个参数组合起来,就决定了雷达的这一帧探测行为。比如我们做近距离高分辨扫描时,会用大的带宽(比如600 MHz),短一点的脉宽(10微秒),高一点的PRF;做远距离监视时,就反过来用小带宽(50 MHz)、长脉宽(100微秒)、低PRF。
这种灵活性是传统雷达完全不具备的。传统雷达想改一个参数,可能得换一个发射机模块;我们只需要在控制界面里改一个数字,然后点击“应用”,下一个脉冲就是新参数。我到现在还记得第一次在软件界面里实时切换波形参数,然后看着屏幕上的回波图从近距高分辨模式瞬间切换成远距监视模式的那个瞬间,那种“硬件为软件让路”的感觉,真的非常奇妙。
3. 硬件链路搭建:从射频前端到数据采集的选型与踩坑
软件定义雷达听起来很美,但硬件地面上的功夫一点都不能少。这一节我重点讲硬件链路的搭建思路,以及我们在实际选型、联调过程中踩过的一些坑。雷达的硬件链路看着不复杂,但每个环节都有讲究,任何一个短板都会成为整条链路的瓶颈。
3.1 整条链路的结构:发射与接收的完整通路
PLFM_RADAR的硬件链路,可以分成发射通路、接收通路、时钟同步三大部分。我直接按信号流向写出来:
- 发射通路:基带波形发生器(DDS/任意波形发生器AWG)产生LFM基带信号 → 上变频混频器搬到射频 → 功放(PA)放大 → 发射天线辐射出去。
- 接收通路:接收天线收到回波 → 低噪声放大器(LNA) → 下变频混频器搬回中频/基带 → 带通滤波 → 模数转换器(ADC)采样 → 数据缓存 → 交给上位机。
- 时钟同步:整个系统要共用一个高稳定度的参考时钟(通常用10 MHz OCXO恒温晶振),保证发射和接收的相位是相干的。这一点至关重要,后面算法处理时能不能做相干积累,就看这里的时钟做得好不好。
3.2 关键器件选型:这几款是我们用过比较稳的
直接报我们项目里最终采用的方案,给大家一个参考,都是实际跑过数据、验证过性能的:
- 任意波形发生器(AWG):我们用的是某国产品牌的2.4 GSPS采样率、14 bit垂直分辨率的板卡。2.4 GHz的采样率意味着它能直接产生最高1 GHz带宽的基带LFM信号,覆盖我们90%以上的实验场景。
- 射频收发前端:采用24 GHz频段的评估板。为什么选24 GHz?因为这个频段是ISM频段,不需要申请额外的实验频点,而且天线尺寸小,方便我们做成桌面级的原型系统。这块评估板集成了发射功放和接收LNA,还自带收发本振(LO)同步功能,可以大大简化我们的时钟设计。
- 数据采集卡:同样选了2 GSPS采样率、12 bit的板卡。这里要提醒大家,接收机的中频带宽一定要大于发射信号带宽,否则带宽被截掉一块,距离分辨率就直接劣化。我们先用宽带中频(1 GHz)设计,再通过数字下变频把有效带宽截取出来。
3.3 必踩的坑:直采方案的本振泄漏与直流偏置
硬件联调阶段我们遇到最大的坑,是接收机直采方案里的本振泄漏(LO leakage)。
事情是这样的:为了简化链路,我们一开始采用零中频接收方案——也就是直接把射频回波和本振信号混频,得到基带信号。零中频方案的优点是结构简单、成本低,但它的致命弱点是直流偏置和本振泄漏。本振信号会从混频器的射频端口泄漏出去,然后又被天线反射回来,在基带输出一个巨大的直流分量。
第一次上电测试,我盯着频谱仪看基带输出信号,结果看到的不是预期的LFM信号,而是一个巨大的尖峰浮在底噪之上。当时我没反应过来,还以为是LFM信号没产生成功,查了半天AWG配置也没发现问题。后来灵机一动,把发射天线堵住了再测,才发现这个尖峰是固定的,和发射信号无关。这就是本振泄漏导致的直流偏置。
3.4 如何解决:零中频改低中频,一次到位
解决思路其实很传统:放弃零中频架构,改用低中频(Low-IF)接收。也就是说,本振频率不是刚好等于射频频率,而是故意偏开一个小的中频偏移(比如偏开150 MHz),这样回波信号和本振混频后的输出就是150 MHz的中频信号,而不是直流。
直流问题解决了,但射频前端的本振泄漏依然存在,只是从直流位置挪到了零频附近,和有效中频信号完全分开。接下来只需要在后续数字信号处理里用一个数字混频器把它下搬到基带,再做低通滤波抽取,就能拿到干净的基带信号。
这个修改让我们的接收链路从“看起来完美”变成“用起来没问题”。所以我给个建议:做雷达接收机设计时,除非你有非常充分的理由,否则不要为了省事直接用零中频方案。尤其在做宽带信号的项目里,低中频方案才是稳的。
4. 信号处理管线:距离维FFT、多普勒维FFT与CFAR的完整实现
硬件把数据流送上来之后,真正的重头戏才开始。PLFM_RADAR的灵魂就在这里——一整套从原始ADC数据到目标点迹的信号处理管线。我会按数据处理顺序,把我们算法库里的核心模块一个个讲明白。代码部分我会贴出关键实现,用的全是Python生态,方便大家直接复现。
4.1 原始回波数据的组织方式:快时间与慢时间
拿到ADC采回来的数据,第一步要理解数据在内存里是怎么排的。
假设一次测量用了M个脉冲,每个脉冲采样了N个点,那么数据就是一个M行N列的二维矩阵:
- 每一行代表一个脉冲回波,称为“快时间维”(fast time),它承载的是目标的距离信息;
- 每一列代表同一个距离单元在不同脉冲之间的变化,称为“慢时间维”(slow time),它承载的是目标的多普勒/速度信息。
这个矩阵就是雷达信号处理的“原材料”,距离维FFT和多普勒维FFT都是围绕它展开的。
为什么会有快慢时间这两个维度,我用一个生活化的例子帮助理解:快时间就像你用高速摄像机拍一颗子弹飞过,你用极短的时间间隔去观测它的位移,得到的是“距离”;慢时间就像你用普通速度录像,记下每帧里子弹从面前飞过的瞬间,得到的是“它在动”。
4.2 第一个FFT:距离维的脉冲压缩
LFM信号做脉冲压缩,标准做法就是在快时间维做FFT → 频域乘以匹配滤波器的共轭 → IFFT。在数字实现里,为了利用FFT的高效性,我们通常直接在频域完成匹配滤波。
匹配滤波器的频响,其实就是发射LFM信号的频谱的共轭。如果我们知道自己发出的LFM基带信号是 s(t),那么匹配滤波器的传递函数在数字域就是 S(f) 的共轭 S*(f)。于是脉冲压缩这步就变成:
range_profile = IFFT( FFT(raw_signal) * conj(FFT(reference_signal)) )这里有一件很重要但也很容易忽略的事:参考信号要用和发射信号完全相同参数的LFM信号。我们项目里由于AWG直接可编程,所以可以直接从AWG的内存里读出原始发射波形的基带采样点,作为参考信号。这样可以消除很多由波形发生器本身非线性引入的误差。
4.3 第二个FFT:多普勒维的相参积累
距离维脉冲压缩做完之后,我们就拿到了一个“距离-脉冲”矩阵。每一列是一个距离单元的慢时间序列。对慢时间维再做一次FFT,就能得到多普勒频谱。这一步在雷达里叫“相参积累”,它的作用是:
- 把淹没在噪声里的微弱目标信号通过M个脉冲的累加增强(信噪比提升约10log10(M) dB);
- 把目标的多普勒频率搬移到对应的频率格上,从而计算出目标径向速度。
多普勒频率和径向速度的换算公式是:
v = fd × λ / 2
其中λ是工作波长。举个具体数字:24 GHz对应的波长约为0.0125米,如果慢时间维FFT算出的多普勒频率是200 Hz,那对应的径向速度就是 200 × 0.0125 / 2 ≈ 1.25 m/s,大约等于一个慢速步行的人的速度。
4.4 CFAR检测:从噪声图里挑出真正的目标
做完两个FFT,我们拿到的是二维的“距离-多普勒图”(Range-Doppler Map)。下一步是从这张图里把目标检测出来。直接用门限阈值是行不通的,因为近距杂波、天线泄漏、噪声底噪的分布并不均匀,一个固定的门限要么漏警要么虚警满天飞。
标准做法是使用CFAR(恒虚警率检测)。CFAR的核心思想是:为每一个待检测单元,取它周围一圈单元作为参考,估算出局部噪声/杂波水平,然后根据局部噪声水平动态设置检测门限。
我们用的是二维CFAR,带着保护单元(guard cells)。保护单元是为了防止目标本身能量泄漏到参考窗里,导致噪声水平被高估、目标被吞掉。实现可以用两边滑窗,也可以直接用scipy的uniform_filter配合移位减法来做,性能会好很多,代码也短。
粗略的CFAR核心逻辑如下:
def cfar_2d(rd_map, guard=(4, 4), ref=(8, 8), pfa=1e-5): # 基于缩放的均匀杂波背景估计 from scipy.ndimage import uniform_filter # 计算窗内平均值 avg = uniform_filter(rd_map, size=(ref[0]*2+1, ref[1]*2+1), mode='constant') # 用滑动窗内的均值和标准差估计噪声功率 sq_avg = uniform_filter(rd_map**2, size=(ref[0]*2+1, ref[1]*2+1), mode='constant') var = sq_avg - avg**2 std = np.sqrt(var) # 检测门限 = 均值 + alpha * 标准差 # alpha 由 PFA 反推(工程上通常取 4~10) alpha = 8.0 threshold = avg + alpha * std det = rd_map > threshold return det实际实现比这个严谨,但思路就是这样。
检测出目标之后,还不要开心得太早。接下来还有一道容易栽跟头的工序——目标凝聚(clustering)。因为目标能量并不是严格集中在一个格子上的,距离维和多普勒维溢出会导致目标在邻近几个格里都有响应。直接把所有超门限的点全报出来,会出现“一个目标变成七个目标”的壮观场面。所以CFAR之后必须做连通域合并,或者做一个局部峰值提取:在检测到目标的区域内,沿着距离维和多普勒维做质心加权,得到精确的距离/速度估计。
5. 实测数据复盘:一台调试好的PLFM_RADAR到底长什么样
硬件跑起来了,算法也都写了,那最终这台雷达跑出来的“探测图景”到底是怎么样的?这一节我来复盘一组真实实测数据。只有盯着原始数据看过、处理过、分析过,你才能真正理解前面那些理论到底在说什么。
5.1 实验场景:走廊尽头的角反射器
为了做性能验证,我们在办公楼走廊里搭了一个简易的测试场景。目标是一块标准的三角形角反射器——这东西的雷达散射截面(RCS)非常稳定且大,适合当作已知标准目标来做测试。
- 角反射器放置位置:走廊尽头,距离雷达约20米;
- 雷达模式:带宽500 MHz(对应距离分辨率约0.3米);
- 脉冲数:256个;
- 发射功率:低功率模式(确保不会对楼里的人造成辐射风险)。
5.2 距离维脉冲压缩之后看到什么
先只做距离维FFT,不做多普勒维FFT,观察原始回波的情况。走廊场景不算特别复杂,但依然能看到好几根明显的峰值:
- 0米处有个尖峰:这是天线隔离度不够好,发射信号直接串到接收通道形成的“直达波”,也是我们在低中频方案下依然会看到的现象。
- 20米处有一根很干净的尖峰:角反射器的回波。
- 约10米处还有一小团杂波:走廊墙面的多次反射,由于角反射器本身在这段的几何关系,造成了额外的反射路径叠加。
这里我要特别提醒:很多初学者看到0米的直达波尖峰会非常紧张,觉得系统有故障。其实它还包含了幅度和相位信息,在企业级的雷达系统里,这一段甚至会被专门用来做收发通道的相位校准,因为它本质上是一条非常稳定的参考链路。
5.3 加上多普勒维FFT之后,杂波去哪了
这是我觉得整个PLFM_RADAR项目里最“高光”的一刻。当我们把256个脉冲的多普勒维FFT做完,生成Range-Doppler图之后,接近零速的静止杂波会被压缩到一个很窄的多普勒单元里。走廊墙壁、地面、天花板这些静态目标,全部集中在零频附近;而运动的角反射器(哪怕我们只是用手轻轻推着它向雷达移动)会在对应的距离上产生一个明显的正多普勒频移。
这一下,动态目标和静态杂波在二维平面上就被完美地分开了。你可以非常直观地理解“相参积累”带来的信噪比提升,也可以理解为什么动目标显示(MTI)用两个脉冲对消就能把静态杂波干掉——因为在慢时间维,静态回波是常数,而运动目标的相位是线性变化的。
5.4 一个意外发现:风扇的微多普勒特征
测试时楼道里正好有一台壁挂式工业风扇在转。这本是一个干扰源,结果它的叶片转动带出来了两条明显的旁瓣——在雷达的Range-Doppler图上,风扇位置附近沿着多普勒维度展现了周期性的闪烁结构。这就是微多普勒效应:目标的非刚体运动(转动、振动等)会在主多普勒频率附近产生额外的边带分量。
这个意外发现后来直接变成了我们项目组的一个研究方向。因为微多普勒特征可以用来识别目标是风扇、无人机还是行走的人——人们在行走时腿和手臂的摆动也会产生独特的微多普勒谱。雷达不再只是测一个目标“有没有”,还可以通过微多普勒特征分辨目标“是什么”。这是PLFM_RADAR带给我们的一个比原计划更大的收获。
6. 系统标定与误差校正:雷达测距测速准不准,全看这一步
很多项目做到“能看到目标”就觉得大功告成了。但如果你想更进一步,让雷达给出精确的距离、速度数值,就必须认真做系统标定。这里面的坑也特别多,我按实际踩坑顺序来讲。
6.1 距离标定:截距和采样的对齐
理论上,距离可以通过快时间维FFT的峰值位置计算出来。计算公式是:
R = n × (c / (2 × fs))
其中n是距离维FFT的峰值索引,fs是采样率。但现实是,发射信号从AWG出来到混频器,再到功放、天线,这中间会引入固定的延迟。接收链路同样有滤波器和放大器的延迟。这些延迟加在一起,会让雷达把距离测偏一个固定值。
解决的办法是做一个“零距离校准”:把一根射频线直接从发射端接到接收端(完全短路),测出来的距离就是整个系统的固定延迟。把这个延迟量记录成校准参数,之后每次处理回波数据时都减掉这个偏置,距离就准了。
我们实测下来,系统固定延迟大概等效于0.5米左右的距离偏移。如果不校,你的雷达把目标测成20.5米,这在很多专利文本里看是不起眼,但在实际部署场景里,足以让目标落进一个错误的围栏区间。
6.2 速度标定:晶体振荡器精度不允许被忽略
速度测量的核心依赖多普勒频率的准确测量,而多普勒频率的准确测量依赖时基的稳定。我们用的10 MHz OCXO的稳定度大概是±0.1 ppm,换算到24 GHz频段,多普勒频率的误差大概是本振频率几千赫兹的千分之一,看起来好像可以忽略?但别忘了,多普勒频率测量的最终目标是提取目标速度,测速误差和载频成正比,频率越高,误差越会被放大。
一个更实际的坑是:AWG的采样时钟和数据采集卡的采样时钟如果不完全同步,采样起始时间的抖动会直接转化成多普勒频移的模糊误差。所以我们在最初设计时钟分配架构时,就用同一颗10 MHz时钟同时为AWG和ADC提供参考时钟,而不是各自用自己板卡上的晶振。这颗时钟从源头上保证了发射和接收是相参的。
6.3 接收通道不平衡校正:I/Q幅度与相位失衡
低中频下变频到基带,需要用数字混频+I/Q分解。现实世界的模拟电路不可能做到完全理想的I/Q正交,幅度上差个零点几dB,相位上差个一两度,都是家常便饭。如果没有校正,这种失衡会在多普勒谱上引入镜像频率,从而导致“假速度峰”。一个实际速度为5 m/s的目标,有可能在-5 m/s的位置也出现一个虚假的响应,这在某些场景下是致命的——比如它会把“靠近的目标”误判成“离开的目标”。
工程上的校正方法是:发射一个单频连续波信号,采集接收回波,然后测量I/Q两路之间的幅度比和相位差,用这两个参数做三角函数补偿。校正完成后,镜像抑制比能提升30 dB以上。
7. 那些顺带收获的经验:调试雷达到底在调试什么
做完PLFM_RADAR这个项目,我最大的感觉是,雷达系统调试不像写代码——代码报错会有log,而雷达出了问题,所有环节都可能有问题,且症状往往都表现为“噪声变大了”或者“出现了奇怪的峰”。这一节把这些“杂学”经验集中写出来,算是给大家的一个彩蛋集锦。
7.1 接地、屏蔽和射频泄漏:最难查的问题往往最不起眼
我们项目一开始发现,只要把雷达放到真实办公室里,底噪就比实验室里高好几个dB,怎么都查不到原因。后来排查到电源:办公室的开关电源噪声非常大,直接通过地线串进了我们的接收机。解决办法是给雷达系统装了一个线性电源,同时在接收机外壳和射频线缆上加了一圈磁环。
还有一个射频泄漏的教训:有一段时间,雷达旁1米放了一台WiFi路由器,结果Range-Doppler图上莫名其妙出现了一条从近距一路延伸到远距的宽带干扰带,直接盖住了所有目标。把路由器挪走之后,一切恢复正常。民用频段雷达,最怕的就是和通信设备抢占电磁环境。调试雷达到底在调试什么——很大程度是在调试“你能不能控制住周围的电磁环境”。
7.2 测试还是用天线罩或者软目标比较好
雷达测试时,用金属角反射器当然好,但它的RCS峰太高,主瓣又很窄,稍微偏一个角度,回波强度就掉好几个dB。所以我们后来同时备了金属球和专用的雷达软目标。软目标的好处是回波性能各向同性,没有角度的强敏感性问题,测出来的一致性好很多。如果想验证微多普勒特征,拿个跑步机在雷达前跑,比让测试人员来回跑省力得多。
7.3 关于数据记录:永远不要舍不得存原始数据
最后这点,真的真的很重要。我们在项目初期,为了省磁盘空间,只保存了处理后的Range-Doppler图。后来发现,很多“当时没注意”的性能问题,恰恰需要回溯原始ADC数据才能定位。从那以后,我们的原则变成了“宁可存错,不可不存”:所有实验都保存完整的原始回波矩阵(M×N的复数矩阵),哪怕一帧数据就是几十MB,也都原样保存下来。因为原始数据是不可再生的——目标当时在那个位置、以那个速度运动,这样的机会可能过去就没有了。而这些数据,才是你做离线算法迭代最宝贵的资产。
8. 回看这个项目:PLFM_RADAR还能怎么玩
现在回头看PLFM_RADAR,它给我的不仅仅是“把雷达调通了”这个结果,更是一整套可复用的雷达实验方法论。固定参数雷达能回答“有没有目标”,可编程雷达能回答“目标是什么形状、什么运动特征”,这中间释放的空间,值得后续好好挖掘。
就我个人的实操体会来说,这个系统后续最值得投入的方向有两个:
一是让波形参数具备自适应性。目前我们虽然能手动配置波形参数,但还是靠人去判断场景切换。下一步完全可以训练一个简单的分类器,根据当前Range-Doppler图里的杂波分布和目标稀疏程度,自动调整下一帧的带宽、脉宽和PRF。到那时候,PLFM_RADAR才真正变成“智能雷达”。
二是把微多普勒特征做成识别库。前面提到风扇叶片暴露出了微多普勒特征,这个方向我们已经在收集各种目标的微多普勒数据。等库大了之后,结合一点深度学习的分类模型,这台雷达就不仅能探测目标,还能对目标种类做初步的甄别。
最后再分享一个小技巧吧。做这种软件定义雷达,你最容易低估的不是信号处理,也不是硬件调试,而是波形的可重复性。也就是说,如果你连“同一个实验场景,设置同一组参数”都不能保证两次测量的起始相位一致,那后面所有的相参积累都是纸上谈兵。所以无论你用的是什么波形发生器,一定要研究清楚它的相位连续模式。在我们的系统里,这占了最后成功的一半功劳。
PLFM_RADAR的坑我已经替大家踩得差不多了,剩下能挖出来的金子,就看各位了。