news 2026/10/2 11:57:57

PLFM_RADAR:手把手搭建透明可复现的FMCW雷达平台

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PLFM_RADAR:手把手搭建透明可复现的FMCW雷达平台

经常有人问我,雷达入门到底该从哪里切入。我的答案一直很直接:别先急着买那些几千上万的毫米波开发板,也别一头扎进论文里啃自适应波束形成——真正让你建立直觉的,是搞清楚一个chirp是怎么发出去的,一帧原始IQ数据又是怎么变成屏幕上那个距离-速度点的。PLFM_RADAR 这个项目就是在这样的动机下做的:一套基于可编程线性调频(Programmable Linear Frequency Modulation)的 FMCW 雷达平台,从波形参数、射频链路、中频采集到距离-多普勒处理,每一层都完全透明、可复现。如果你正想亲手做一台能测距、测速、分辨多目标的雷达,又不想被开发板封装好的黑盒函数糊弄过去,这篇文章大概能帮你省下几个月的弯路。

PLFM_RADAR 的定位很明确:它不是产品,不是货架上那种即插即用的毫米波评估套件,而是一个带着示波器和FFT在桌上搭建的教学/原型平台。硬件上用 24GHz 频段的收发一体雷达芯片,把差拍输出接到嵌入式MCU的ADC做数字采集,再用 Python 完成从 Range-FFT 到 CFAR 检测的整条信号处理链路。要说清楚这个项目,我打算按立项思考、波形参数设计、射频采样链路、信号处理流水线、实测踩坑这样一条线从头讲,每一段都有可以直接照着抄的公式和代码。

1. PLFM_RADAR 是怎么立项的:为什么做一台“透明”的雷达

1.1 名字解读:可编程线性调频才是核心

先解释项目名。PLFM_RADAR = Phase-Locked / Programmable Linear Frequency Modulation Radar。拆开看,PL 对应 Phase-Locked,指的是发射源的线性调频(chirp)靠锁相环生成,频率随时间严格线性上升;FM 是 Frequency Modulation;RADAR 不用多解释。整个名字其实点明了平台最核心的一件事:雷达测距测速的本质,就是精确控制发射频率的变化规律,再从回波与发射信号之间的频率差里还原目标信息。锁相环决定了波形质量,波形质量又决定了后续所有处理的上限,所以名字里必须带上 PL 和 FM。

立项时我也看过市面上的评估板:TI 的毫米波系列、英飞凌的雷达开发套件、以及各种带 GUI 的一体化模块。这些板子没有问题,跑 demo 十分钟就能出来效果,库函数把 Range-FFT、Doppler-FFT、CFAR 全封装成一行调用。但问题是,一旦你想改波形参数去适配某个特殊场景,或者想弄明白为什么某个距离上突然出现假目标,黑盒会把你卡在原地。PLFM_RADAR 的立项目标,就是让每一个中间量都看得见:中频波形能从示波器上量到,ADC 数据能存下来离线分析,FFT 的每一级都是自己写的。这事听起来“笨”,但对建立雷达系统直觉极其有效。

1.2 为什么先选 FMCW 体制而不是脉冲或多普勒

雷达体制有很多种,脉冲雷达、连续波多普勒雷达、FMCW 是三大主流。PLFM_RADAR 选择 FMCW,原因非常实际:

  • FMCW 可以在很低的发射功率下通过调制带宽换取距离分辨率,适合桌面原型环境;
  • 差拍信号的中频频率低,几百 kHz 到几 MHz 的采样需求正好落在 MCU ADC 的舒适区,不需要昂贵的宽带采集卡;
  • 一发多收的 FMCW 天然适合做周期调频,距离和速度可以在同一帧里同时解算,不需要脉冲体制那样精细的时序控制;
  • 波形生成用 PLL 锁相,线性度稳定,不需要像脉冲雷达那样处理高峰值功率。

如果只做一个简单多普勒雷达,硬件还能更简化,但测不了距离;如果做脉冲雷达,单片机和信号链路成本立刻上去一个量级。FMCW 是“在桌上能做、能讲清楚、能验证多目标能力”的最佳折中。

1.3 系统层级划分

PLFM_RADAR 整体的技术栈分四层,后面每一章都会对应到其中某层:

  1. 波形生成层:PLL 产生受控线性调频信号,覆盖 24GHz ISM 频段;
  2. 射频与中频层:功分、发射、接收混频、I/Q 差拍输出、放大滤波;
  3. 采集与同步层:MCU 以 ADC 连续采样 I/Q 两路中频信号,chirp 触发与采样窗口对齐;
  4. 数字信号处理层:Python/NumPy 完成去直流、Range-FFT、Doppler-FFT、MTI 杂波抑制、二维 CFAR 检测和坐标换算。

四层里最容易翻车的不是最后的F点处理,而是第二层和第三层的匹配。很多朋友把波形参数设计得很漂亮,一接硬件全乱套,原因就是没搞懂中频链路带宽和 ADC 采样率、chirp同步之间的关系。接下来我先从波形参数说起,因为这一层决定了后边所有链路的技术指标。

2. FMCW 的数学底子:距离、速度、分辨率凭什么由这几个参数决定

2.1 拍频公式与距离换算

FMCW 雷达发射信号的频率在一段时间内线性上升,斜率记为 S,单位 Hz/s。信号碰到目标后产生延时 τ = 2R/c,回波到达时发射信号已经比回波"领先"了 τ 秒,二者频率差就是拍频:

fb = S * tau = (2 * B * R) / (c * Tc)

其中 B 是调制带宽,Tc 是单个 chirp 的时长,R 是目标距离。只要从时域信号里准确估计出 fb,就能反推距离:

R = fb * c / (2 * S)

这句话是整个 FMCW 信号处理的地基。做项目时我把这个公式贴在桌子边上:所谓测距,本质是一个高精度的频率估计问题,而不是时间测量问题。

2.2 距离分辨率与最大不模糊距离的取舍

距离分辨率只由调制带宽决定:

ΔR = c / (2*B)

这里有个容易误解的点:Tc 越长、采样率越高,不代表分辨率越高,分辨率只取决于你“扫”了多宽的频率范围。PLFM_RADAR 选择 B = 200 MHz,理论距离分辨率就是 0.75 m。这个精度做桌面实验完全够用。

最大不模糊距离则受 ADC 采样率和斜率共同限制。拍频信号经过混频输出后,ADC 能采到的最大频率是奈奎斯特极限 fs/2。于是:

R_max = (fs/2 * c) / (2*S) = fs * c / (4*S)

直觉上理解:如果你把 slope S 调得很陡,单位距离对应的拍频就高,同样采样率下能覆盖的距离就变短;反之 S 平缓,能看远,但同样的距离分辨率需要更长的 chirp,刷新率又受限。三个参数(B、Tc、fs)永远是互相牵制的。

PLFM_RADAR 的具体配置如下:B = 200 MHz、Tc = 128 μs,于是 S = B/Tc ≈ 1.5625 MHz/μs。ADC 采样率设 fs = 2 Msps,奈奎斯特上限 1 MHz,对应最大可测距离约 96 m。实际我不会满打满算,中频滤波器和目标余量会让有效距离收敛到 70~80 m 左右,这在室内和校园环境是足够用的。

2.3 慢时间维度与多普勒速度

测量距离用快时间维(一个 chirp 内的采样点),测量速度则利用慢时间维——一帧里连续发送的多个相同的 chirp。目标在一帧内移动,会让每个 chirp 的差拍信号产生一个逐渐变化的相位差。对每个距离单元沿 chirp 方向再做一次 FFT,就得到多普勒频移 fd:

v = fd * λ / 2

关键指标有两个:

  • 最大不模糊速度 v_max = λ / (4 * T_rep),其中 T_rep 是两个 chirp 起始时刻的间隔。如果目标速度超过这个值,多普勒频率会折叠,速度出现模糊;
  • 速度分辨率 Δv = λ / (2 * T_frame),其中 T_frame 是一帧的总观测时间。想看更精细的速度,就得拉长整帧的观测时长,但帧率也随之下降。

PLFM_RADAR 中,24GHz 对应的波长 λ = 12.5 mm,设 T_rep = 160 μs(128 μs 有效线性调频 + 32 μs 回程),一帧发 128 个 chirp,帧时长 T_frame ≈ 20.48 ms。于是 v_max ≈ 19.5 m/s,速度分辨率约 0.305 m/s。这个组合兼顾了室内人员慢速移动和低速车辆实验,如果想测更快的目标,把 T_rep 缩短即可。

2.4 一张表看全部参数

符号含义PLFM_RADAR 设计值决定因素
f0中心频率24 GHz(ISM 频段)频段合法性与硬件成本
B调制带宽200 MHz距离分辨率 ΔR=0.75m
Tc单 chirp 时长128 μs最大距离与刷新率的折中
S调频斜率1.5625 MHz/μsB/Tc
fsADC 采样率2 Msps(I/Q 各一路)最大拍频 ≤1MHz
N_SAMPLES单 chirp 采样点数256fs × Tc
N_CHIRPS每帧 chirp 数128速度分辨率与帧率
T_repchirp 重复周期160 μsv_max=19.5m/s
ΔR距离分辨率0.75 m带宽
v_max最大不模糊速度19.5 m/sT_rep
Δv速度分辨率0.305 m/s帧时长

这张表我建议打印出来对着看。任何一个指标需要调整时,你都能从表里找到牵动它的上下游参数,这也正是“自己做平台”比“用别人配置好的开发板”更有收获的地方。

3. 射频链路和中频采集:从天线到 ADC 的每一个环节

3.1 为什么落在 24GHz ISM 频段

PLFM_RADAR 的波形虽然漂亮,但需要硬件能把它发出去。频率选择上,24.00~24.25 GHz 这个 ISM 频段对短距设备友好,天线尺寸也凑合:波长 12.5mm,PCB 贴片天线的单阵子不到 6mm 见方,手焊贴片能做。77GHz 车规频段的模块性能和供应链确实更诱人,但对个人原型来说,裸板布线难度、连接器成本、调试门槛都会陡增,初学者在 24GHz 上更容易成功。

技术上,24GHz 频段也是许多收发一体雷达芯片的主战场,可以用带集成 VCO、功分器、接收混频器的单片方案,把 VCO 扫频和混频这部分最难搞的射频问题交给芯片,自己主要处理中频信号和基带。这对“学习平台”定位是合理的——你要学的是 FMCW 系统在波形、链路、信号处理层面的配合,而不是从零设计一个低相噪毫米波 VCO。

3.2 收发前端与中频链路设计

PLFM_RADAR 的中频链路是最容易被人低估的部分。雷达芯片输出的是 IQ 两路差拍信号,幅度通常只有几毫伏到几十毫伏,而 ADC 的满量程输入是 1.5~3V 左右,中间需要两级放大加滤波。我设定了这几条硬指标:

  • 每级增益 20 dB 左右,两级共 40 dB,留出 -6 dBFS 的余量,避免近距离强反射信号把 ADC 顶到饱和;
  • 低通滤波器截止频率 1 MHz,和二分之一采样率对齐,抑制带外噪声和杂散;
  • I/Q 两路必须用相同规格的运放和 RC 参数,增益误差尽量控制在 0.5 dB 以内,相位误差控制在 2° 以内,否则后面会产生镜像目标。

为什么要强调 I/Q 同时采样?雷达芯片输出的 I/Q 分量可以看作一个复数信号,实部和虚部合起来才能区分目标的运动方向,也能去除拍频频率中的镜像项。如果只采单路实信号,目标的正负多普勒会混叠在一起,测不了速度方向。很多便宜的 D 波段雷达只输出单路中频,PLFM_RADAR 选择 IQ 输出,就是为了后面信号处理少受一套混叠的罪。

3.3 chirp 同步与数据采集

波形参数的最后一个关键约束是时序同步。发射端以固定周期发送 chirp,ADC 必须像摄像机跟拍一样,在每一个 chirp 的同一个相位位置开始采样。PLFM_RADAR 的做法是 MCU 输出一个与 chirp 起始沿同步的触发脉冲,ADC 等待该沿后启动 DMA 采样。

采样配置:I/Q 两路合计 2 Msps,一个 chirp 128 μs 得 256 个复数点;一帧 128 个 chirp,总采样量是 256×128 = 32768 个复数点,也就是 65536 个 12bit 采样值。这个数据量对 STM32 系列完全不是问题,DMA 连续搬运后打包通过串口或者 USB 上传到 PC,一帧也就 20 毫秒多一点。实测下来,MCU 端的数据采集和上传速度不是瓶颈,真正的瓶颈反而是射频前端带宽和低噪放增益控制。

3.4 成本与选型参考

我列一个大致成本档位,给想复现的朋友参考:

模块方案参考成本
雷达收发前端24GHz 收发一体芯片 + 评估小板200~500 元
天线PCB 微带贴片阵列(2发2收即可开始)几十元,打板成本
中频调理双通道运放 + 有源低通50~200 元
采集STM32F4/H7 开发板 + DMA100~200 元
处理任意 PC,NumPy 环境已有

整套下来不会超过两千元,相比主流毫米波评估板要便宜一个档位。如果是想更快跑通,也可以先用商用的 24GHz FMCW 模组评估板做替换,但中频信号的引出和 ADC 采样部分仍然要自己处理,这恰恰是学习链路的关键。

4. 信号处理链路:原始数据怎么变成一张距离-多普勒图

4.1 数据结构与预处理

从 ADC 拿回来的数据是一个三维物理量被重新排布成二维矩阵的过程。我把一帧数据组织成:

data[n_chirp, n_sample]

其中 n_chirp 是 0~127 的 chirp 索引,n_sample 是 0~255 的采样点索引。每个元素都是一个复数 I+jQ。第一步是去除直流:中频信号经过放大后往往带有直流偏置,直接做 FFT 会在零频处形成一个巨大的尖峰,压制旁边的弱目标。去直流我用逐行减去均值的方式,注意是每行单独减,不是整体减,因为每个 chirp 的直流偏置可能有细微差异。

4.2 Range-FFT:把时间波形变成距离谱

对一个 chirp 内的 256 点做 FFT,就完成了快时间域到频域的转换。频率轴上的每一个 bin 对应一个特定的拍频,也就对应一个特定距离。代码如下:

import numpy as np N_SAMPLES = 256 FS = int(2e6) # 采样率 B = 200e6 # 带宽 TC = 128e-6 # chirp 时长 S = B / TC # 调频斜率 C = 3e8 # 原始IQ: 形状 (N_CHIRPS, N_SAMPLES),类型 complex iq = raw_data.astype(np.complex64) iq = iq - np.mean(iq, axis=1, keepdims=True) # 去直流 win_r = np.hanning(N_SAMPLES) # 对每个chirp做FFT range_fft = np.fft.fft(iq * win_r, axis=1) # 半谱部分,只保留0~fs/2 range_fft = range_fft[:, :N_SAMPLES//2] # 频率轴和距离轴换算 f_bins = np.arange(N_SAMPLES//2) / N_SAMPLES * FS r_bins = f_bins * C / (2 * S)

做完这步,你在示波器上看到的时域差拍波形被压缩成一条条距离谱线。加窗是为了压低 FFT 旁瓣,Hanning 窗是我在这里最常用的,它会把主瓣略微展宽,但能让泄漏到相邻距离单元的能量降下来。如果目标很多,旁瓣互相干扰会很难看,建议先加窗再谈分辨率。

4.3 Doppler-FFT:把距离谱展开成距离-速度图

距离谱只能告诉你“有没有目标、在哪”,区分不了静止目标与运动目标,也测不了速度。所以要对同一距离单元、不同 chirp 之间的复数值再做一次 FFT。因为是沿着 chirp 方向(慢时间)做,速度信息就藏在相邻 chirp 之间的相位变化里:

N_CHIRPS = 128 # 先对range_fft做慢时间加窗 win_d = np.hanning(N_CHIRPS) rd = range_fft.T * win_d[:, None] # 形状 (N_CHIRPS, N_SAMPLES//2) # 沿慢时间做FFT,然后移到零频居中 rd = np.fft.fft(rd, axis=0) rd = np.fft.fftshift(rd, axes=0) rd_mag = np.abs(rd) rd_db = 20 * np.log10(rd_mag + 1e-12)

Doppler-FFT 输出的是一个 (128, 128) 的二维复数矩阵,行方向是速度,列方向是距离。rd_db 就是你看到的距离-多普勒热力图的数据来源。到这里,目标检测变成了在二维平面上找“亮点”的问题。

需要特别注意:多普勒维加窗不是可选项,而是必须项。因为慢时间维的采样点数只有 128,不加窗的话旁瓣会淹没小目标,尤其是在强反射体附近。Hanning 窗会让速度分辨率略降,但换来的是干净的检测面。

4.4 静态杂波抑制与 MTI

室内环境下,墙壁、地板、桌面这些静止物体的反射能量巨大,在距离-多普勒图里表现为零多普勒附近一整条亮线。它不移动,所以多普勒频率为零;但它的能量会通过 FFT 泄漏到相邻速度通道,导致低速运动目标被掩盖。

MTI(动目标显示)是处理这个问题的经典手段。最简单有效的方式是在慢时间维做一个一阶差分,也就是脉冲对消:y[n] = x[n] - x[n-1]。这个操作等价于一个高通滤波器,把零频附近静止杂波压掉。我实测后建议,如果一帧里有 128 个 chirp,先做一次对消,再做 Doppler-FFT 和窗函数,效果比直接对 FFT 结果挖零频通道要自然——直接挖 bin 会连带伤害很慢的、但确实在移动的目标(比如人缓慢走动时速度只有 0.1~0.3 m/s,占到零频附近好几个 bin)。

4.5 二维 CFAR 检测

距离-多普勒图即便做了杂波抑制,噪声基底也不是均匀的。靠近强目标的地方噪声抬高,远处又可能偏低。所以不能用一个全局门限去判断“哪些点是目标”。二维单元平均恒虚警检测(CA-CFAR)是标准做法:对每个待测单元,取它周围一圈参考单元的平均功率,乘上一个门限因子,作为本地自适应门限。

def ca_cfar_2d(rd_power, guard=(4, 4), ref=(8, 12), alpha=2.0): # rd_power: 形状 (N_CHIRPS, N_SAMPLES//2) 的功率谱 visited = np.zeros_like(rd_power, dtype=bool) det = [] for i in range(ref[0] + guard[0], rd_power.shape[0] - ref[0] - guard[0]): for j in range(ref[1] + guard[1], rd_power.shape[1] - ref[1] - guard[1]): noise = 0.0 cnt = 0 for di in range(-ref[0], ref[0] + 1): for dj in range(-ref[1], ref[1] + 1): if abs(di) <= guard[0] and abs(dj) <= guard[1]: continue noise += rd_power[i + di, j + dj] cnt += 1 noise /= (cnt + 1e-12) threshold = noise * alpha if rd_power[i, j] > threshold: det.append((i, j)) return det

CFAR 的 guard 窗口作用是把目标自己的能量排除出噪声估计,否则同一个强目标把门限抬得比自身还高,谁也检测不出来。参考窗越大,噪声估计越稳,但边缘区域会因为缺少参考单元而检测性能下降。PLFM_RADAR 里我用的参考窗是 (8, 12),保护窗 (4, 4),门限因子 α 设为 2.0,大概对应 10^-4 级别的虚警率,实际操作起来很均衡。

4.6 把索引换算成物理量

最后一步是把检测点 (i, j) 换算成距离和速度:

  • 距离:距离轴第 j 个 bin 对应频率 j * FS / N_SAMPLES,距离 R = f_bin * C / (2*S);
  • 速度:速度轴是经过 fftshift 后的,多普勒 bin 索引减去 N_CHIRPS/2 得到有符号的多普勒通道数,速度 v = doppler_index * Δv,正值朝向雷达,负值远离。

到这里,一套完整的 FMCW 测距测速链路就闭环了。你从 ADC 原始 IQ 一路做到检测结果,中间没有任何封装好的黑盒函数。

5. 实测踩坑:镜像频率、静态杂波与近距离盲区

5.1 I/Q 不平衡:总在镜像位置出现假目标

第一次用 PLFM_RADAR 在走廊里测人时,目标明明在 12m 左右,距离-多普勒图却在 -12m 的位置出现了一个能量只差 3dB 的亮斑。一开始以为是天线旁瓣,后来发现两个亮斑的速度符号正好相反,才意识到这是 I/Q 不平衡造成的镜像频率。

原因是硬件上 I 路和 Q 路的增益、相位不可能完全一致。幅相失衡的结果是复数信号里混入了共轭分量,在 FFT 后表现为以零频为对称轴的镜像峰。解决方法是做一次单点校准:

  1. 放一个静止强目标在已知距离,比如 10m 处;
  2. 采集一帧 IQ 数据,做 Range-FFT,测量正 / 负频率峰的幅度和相位;
  3. 计算复数修正系数,之后每个 IQ 采样乘以该系数即可。

这个校准不完美,但能把镜像峰压到 -25dB 以下,肉眼基本看不出来了。我建议把校准系数固化成一个配置文件,每次开机先跑一遍,而不是偶尔测一次。温度变化会引起增益漂移,长时间运行后镜像又会冒出来,这个坑值得留意。

5.2 静态杂波:零频亮线盖住慢速目标

还有一个非常经典的场景:房间里有个人站在桌边不动,雷达显示一切正常;人慢慢移动,速度只有 0.2 m/s 左右,结果在距离-多普勒图上直接消失了。排查后我确定不是检测门限问题,而是静态杂波这条零频亮线的旁瓣泄漏把低速目标淹没了。

我当时用了一个笨办法,把 Doppler 维靠近零频的 5 个 bin 直接置零。效果立竿见影,但代价是那种 0.1~0.3 m/s 的微小动作全部丢失。后来改成 MTI 一阶对消,低速目标保住了,零频杂波也压掉了不少。这里的要点是:杂波抑制应该在慢时间序列上做滤波,而不是粗暴地丢弃 FFT 输出。如果你希望保留极低速目标的信息,也可以尝试 MTI 后再补一个二阶对消,或者在 Doppler-FFT 之后只对零频 bin 用小范围陷波,别动相邻通道。

5.3 近距离盲区:为什么 1m 内的目标看不到

我在调试时曾把一罐水放在雷达正前方 0.5m 处,预期出现一个强目标,结果是:快时间维大片饱和,远距离弱目标全被压平,近距目标反而不见了。这是典型的“近距盲区”问题,根源是收发隔离度不够,泄漏信号太强把接收链路推到饱和,中频放大器还没等到回波进来就已经被堵死了。

处理办法有几个方向:

  1. 提高天线之间的隔离度。PCB 天线上加一排打过孔的金属隔离带,或者中间留出足够的地平面,能换来 10dB 以上的改善;
  2. 中频链路里加一个数字可控增益,近距离时降低增益,远距离时再把增益拉回来。这个“距离相关增益”在雷达里叫 STC(灵敏度时间控制),是硬实时系统常用的方案,MCU 里实现并不难;
  3. 如果只是桌面验证,最省事的是把近距目标挪远一点,同时用吸波材料压住正前方的反射。

我最后是把中频增益从 40dB 降到 28dB,加了一块 3mm 厚的吸波棉放在天线前方边缘,近距 0.3m 处的盲区明显缩小,远距目标也没有损失太多。这个取舍说明:雷达系统里几乎不存在一个参数全局最优,只有针对你目标场景的局部最优。

5.4 示波器同步检查是排查一切的起点

中频信号出问题时,我第一步永远是拿示波器同时看 chirp 触发沿和 I/Q 波形,确认两件基本的事:chirp 是否线性扫频,ADC 采样窗口是不是和 chirp 严格对齐。很多看似玄学的现象——距离轴整体偏移、目标距离忽远忽近、速度忽正忽负——最后都回到同步问题上。这个习惯我建议保留在每次排障清单的第一行。

6. 复现建议和后续还能怎么玩

6.1 最小可复现配置

如果不想一步到位,可以先跑一个 I/Q 数据 + Python 处理的版本,后端复用上面全部代码。硬件替代方案是:用任意一款输出 I/Q 中频的 24GHz FMCW 模组,配一块至少 2 Msps 采样率的 MCU 板卡,把数据以 npz 格式存下来。先不要做实时检测,先离线跑通从去直流到 CFAR 的整条链路,再考虑实时。

我刚接触雷达时犯过一个错误:一上来就想写一个带 GUI 的实时目标检测程序,结果数据还没存明白,就在 FFT 里迷失了。建议顺序是:单帧离线 → 多帧离线 → 实时 GUI。每一步都要有可视化输出,因为雷达信号处理里“看到了什么”远比“算出了什么”重要。

6.2 扩展方向:从测距测速到更多玩法

PLFM_RADAR 的底子是二维距离-多普勒矩阵,往上叠加模块就能玩很多花样:

  1. 微多普勒分析:把单个目标的慢时间相位序列做时频分析,可以识别人的走动、挥手等动作。这个方向很适合做存在检测和室内行为分析原型。
  2. 增加天线阵列:目前硬件是单通道,下一步扩展为 2 发 2 收或 4 收,通过比相测角,就能输出目标的方位角,距离、速度、角度三维信息就齐了。
  3. 调频波形切换:从锯齿波改成三角波,可以独立解算距离和速度从而消除模糊;或者用步进频连续波获取更高的距离分辨率。

每次扩展,你都会发现当初在波形参数和信号处理链路上花的功夫没有白费。PLFM_RADAR 这个名字下藏着的初衷,其实就是一句话:雷达不是靠一个神奇芯片显灵,而是靠每一个参数、每一级处理、每一个分贝的积累。把这一圈走完,你会发现自己不只是会用雷达,而是真的懂雷达了。

最后分享一个实际体会:做这个项目最大的收获不是测出了多少米、分清了几个目标,而是彻底改掉了我在信号处理里“先跑通再说”的坏习惯。雷达系统里每一个异常都会让你同时怀疑硬件、波形、FFT 和算法,如果不把中间数据一层层存下来、画出来,排障就是浪费时间。我强烈建议你在自己的项目里也保留这个习惯:每一级信号处理都输出一个中间量并保存,排障时回溯起来会轻松得多。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 11:57:29

数据库系统概论真题解析:概念-逻辑-语法-设计四层穿透训练

简介&#xff1a;本资源是《数据库系统概论》课程期末复习与应试必备的高质量试卷及详解&#xff0c;面向高校计算机、软件工程等相关专业本科生&#xff0c;助力系统梳理核心知识点并检验学习成效。试卷严格对标课程教学大纲&#xff0c;覆盖实体联系类型、关系模型与代数运算…

作者头像 李华
网站建设 2026/10/2 11:54:53

Gorilla MCP 服务说明文档:把 MCP endpoint 改到 TaoToken 的配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 11:54:46

TaoToken 场景下 Traefik 中 EntryPoint、Router 与 Service 三者关系拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/2 11:54:12

Hermes 上下文压缩架构拆解:长任务 Agent 不失忆的几个关键设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华