通用技巧

STAR法则

image-20260721094128140

image-20260721094135388

image-20260721094144860

自我介绍

面试官你好,我叫李志华,目前是桂林电子科技大学新一代电子信息技术专业的硕士,方向主要集中在毫米波雷达信号处理,基于深度学习的雷达感知和嵌入式开发。

首先,我有一段在道通科技参与无人机避障毫米波雷达的算法开发,我主要参与雷达点云生成前端处理链路,包括 Range FFT、Doppler FFT、CFAR目标检测以及Angle FFT/DOA角度估计。项目中我重点参与了电线、树枝这类弱小障碍物的检测优化,结合实测飞行数据和算法链路进行调试调优,最终给后端数据生成稳定的输入。

在此基础上,我从传统雷达算法往AI感知方向扩展,我基于K-Radar数据集做了3D目标检测项目。

他的主要框架是:雷达点云体素化、Simplified PointNet、spconv稀疏3D卷积Backbone、BEV特征,到Anchor-based 3D检测头。针对这个框架链路,我进行了学习和实现,然后利用我学校平台的算力中心在GPU服务器上完成模型训练、验证。后续我又把模型部署到Jetson Orin Nano Super,使用ONNX、TensorRT等方法做了端侧推理优化。

在校期间,每年都获得奖学金,参加过多项赛事和获奖,例如电子设计大赛等

除此之外,我还做过基于DBSCAN+EKF的毫米波雷达点云多目标跟踪,以及毫米波雷达心率呼吸检测,该项目同时也是自治区人米医院的一个合作项目,在这个生命体征项目使用了UDWT和MVDR进行信号分离,同时发表了相关专利和论文,并完成了嵌入式算法部署。以上就是我的一些个人情况。

反问环节:

1.假设进入贵公司进行开发,我的雷达技术栈主要是设计哪些?工作流程大致是怎么样是否只是简单的雷达点云调参?能否进行实际的算法开发?

2.毫米波雷达结合深度学习是雷达的点云进行深度学习后再给ADAS,还是做完雷达点云后,统一给ADAS来做深度学习处理?

3.请问一下贵公司的业务是具体内些内容,我入职后负责大致怎么样的工作?

通道科技

1.const static volitate 关键字 作用域

2.调试的方法 堆栈回溯 栈指针 代码跑飞如何解决 逻辑分析仪

3.虚函数

4.iic spi 的时序和调用方式

5.智能指针

  • ros中中间一大叠变量,可以简单赋值
  • 在c++容器中,用auto可以很好的得到迭代器的值

6.在c++中如何去使用c的一些函数

7.c++编译器怎么用c的文件

使用extern c来引入c文件

HPM6400

  • 编写shell相关的程序来试验一下,可以实现某个驱动的调试。
  • git的学习,分支下载等等。git extension软件熟悉
  • 代码尽量自己写一下,不行再借助ai
  • 代码规范性以及多使用一下c++的特性来写代码
  • 多提升一下能力才能后续工作轻松解决业务问题

一、 针对 CFAR(恒虚警率)与微小目标检测

在无人机场景下,电线和细树枝的雷达反射截面积(RCS)极小(可能只有 0.01㎡),回波极弱。

Q1:传统的 CA-CFAR(单元平均恒虚警)在检测电线和树林时有什么致命缺陷?你在实际工程中是怎么选型的?

  • 满分答案: CA-CFAR 在假设背景噪声均匀时效果很好。但无人机面对树林时,属于**“多目标密集场景”**,强反射点(树干)会抬高整体噪声阈值,导致旁边的弱反射点(细树枝/电线)被“遮蔽(Masking)”而漏检。
  • 工程细节: 我在实际中更倾向于使用 OS-CFAR(有序统计 CFAR) 或 CASO-CFAR(单元平均选小 CFAR)。OS-CFAR 通过排序取中间值作为阈值,抗多目标遮蔽能力极强;如果考虑到嵌入式算力(排序太耗时),我会退而求其次用 CASO-CFAR,分别计算左右参考窗的平均值,取较小的一个来算阈值,既保住了弱目标,又兼顾了 MCU 的算力。

Q2:无人机贴地或超低空飞行时,地面杂波极强,你是怎么在 CFAR 阶段防止地面杂波引起“虚警(误刹车)”的?

  • 满分答案: 单纯靠 CFAR 的标量因子(Alpha/Threshold)很难完全过滤地面。必须结合多维度特征。
  • 工程细节: 1. 高度/俯仰角过滤: 结合解算出的俯仰角(Elevation)和无人机当前高度,直接在 CFAR 之前或之后 Mask(屏蔽)掉绝对高度低于无人机底部的点。结合无人机的高度信息H以及雷达的探测的距离以及俯仰角来进行一个比对来确定是不是地面。 2. 多普勒维过滤: 地面杂波属于静态目标,如果有异常的微多普勒,大概率是杂波,可以通过速度门限卡掉。运动补偿之后来他多普勒维度是否速度为0。

cfar的

能力相加 多通道

image-20260423093041537


二、 针对 多帧点云累积 (Multi-frame Accumulation)

电线太细,单帧扫不到几个点,必须靠多帧累加。但无人机在以 15m/s 高速移动!

Q3:无人机飞得这么快,如果你直接把前 3 帧的点云叠加到当前帧,原本的一个点就会拖成一条长线(重影)。你是怎么做多帧累加的对齐的?

  • 满分答案: 绝对不能直接做空间叠加,必须在累加前做运动补偿映射。
  • 工程细节: 我会维护一个滑动窗口(比如保留过去 3-5 帧的数据)。利用飞控传来的高精度里程计数据(IMU 积分或视觉/GPS 速度),计算出历史帧到当前帧的位姿变换矩阵(旋转分量+平移分量)。把历史帧的点云乘上这个变换矩阵,统一映射到当前时刻的机体坐标系下,然后再进行空间累加。这样电线上的点才会完美重合,信噪比才会倍增。

三、 针对 自运动补偿 (Ego-motion Compensation)

雷达测到的速度是“相对的径向速度”。必须扣除飞机自己的速度,才能知道障碍物到底是静止的还是运动的。

Q4:飞控给你的速度是基于大地坐标系的(北东地),雷达输出的是径向速度,请简述你是怎么把无人机的速度“解耦”出去的?

  • 满分答案: 这是一个典型的矢量投影问题。
  • 将无人机的速度信息先转回为雷达坐标系上面的坐标
  • 根据俯仰和方位信息得到平台的在这上面的镜像速度,然后将这个速度和雷达测得的数据进行相减。

Q5:IMU 的更新频率通常在 200Hz 以上,而雷达可能只有 15Hz-20Hz。数据频率不一致,你是如何处理时间同步的?

  • 满分答案: 必须做时间戳对齐,否则补偿会存在严重滞后。
  • 工程细节: 理想情况是硬件触发(比如飞控给雷达发 PPS 脉冲)。如果在纯软件层面,我会在雷达数据包打上 MCU 接收中断的精确时间戳,然后去飞控维护的 IMU 历史 Buffer 中查找时间戳最接近的两帧,进行线性插值,算出雷达曝光那一瞬间的精确姿态和速度,再进行补偿。

四、 针对 DBSCAN 与 EKF(目标聚类与跟踪)

Q6:DBSCAN 聚类算法的时间复杂度在最差情况下是 。嵌入式 MCU(如 HPM6400)算力有限,如果一帧扫出几百个点,你怎么保证它不超时?

  • 满分答案: 绝对不能暴力遍历。必须引入空间划分数据结构或降维策略。
  • 工程细节: 在嵌入式中,我通常会用**网格法(Grid-based)或体素滤波(Voxel Grid)**进行预处理。先把空间划分成一个个小格子,把点云映射到格子里。DBSCAN 搜索邻居时,只搜索当前点所在的格子及其相邻的 26 个格子。这能把复杂度降到接近 。此外,对于距离超过一定阈值的绝对安全点,我会直接抛弃,不参与聚类。

eps:半径范围,minpts:至少几个点才能算一个目标团块。在半径范围内大于minpts就是核心点。

Q7:微小目标(如细树枝)的雷达回波非常不稳定,经常是“这一帧有,下一帧没,再下一帧又有”(点云闪烁)。你的 EKF 跟踪逻辑是怎么处理这种现象的?

  • 满分答案: 需要一套完善的航迹管理逻辑(Track Management),不能一丢点就立刻删航迹。
  • 工程细节: 1. 航迹起始: 采用 逻辑(比如连续 5 帧里出现 3 次以上才建立正式航迹),过滤掉随机噪点。 2. 航迹维持与滑行(Coasting): 如果某个目标在当前帧没测到,EKF 不会立刻删除它,而是只做“预测(Prediction)”不做“更新(Update)”。系统会依靠物理模型推算它当前的位置(滑行),维持其生命周期。 3. 航迹删除: 只有当目标连续滑行超过一定帧数(比如连续 5 帧都没匹配到实际观测点),才会判定目标消失,正式注销该航迹。这就完美解决了树枝点云闪烁导致的避障逻辑抽风问题。

极飞科技

1.介绍一下在道通具体干了什么

2.介绍心率呼吸的一些方法,你的创新点是什么和别人有什么不同,是否完成部署

3.介绍了一下无人船项目

反问:

1.了解到贵公司在做大模型和雷达数据处理,怎么样结合(同时介绍了一下雷达结合深度学习以及博世工程师的经验)

公司目前在探索,没有给出很具体的方案

2.涉及到多通道的信号处理问题,怎么样保证实时性

  • 第一就是探索的时候是否是需要这么多的数据通道
  • 如果真的需要,就上一些专用的信号处理芯片
  • 实在不行就上fpga
  • c语言的算法优化上不够实际

美团

算法题:一开始接触算法题无法适应ACM模式,通过美团这个笔试来学习一下ACM模式。

题目:

image-20260416155352664

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int n, k;
    cin >> n >> k;
 
    // 按常理,k 的合法范围应为 1 ~ n
    if (k < 1 || k > n) {
        cout << -1 << '\n';
        return 0;
    }
 
    string s;
 
    // 特殊情况:奇怪度为 n
    // 构造全相同字符串,此时最长无重复子串长度为 1,数量为 n
    if (k == n) {
        s = string(n, 'a');
        cout << s << '\n';
        return 0;
    }
 
    // 一般情况:1 <= k < n
    // 前 k+1 位构造成交替串,如 ababa...
    // 后面全部补成最后一个字符,保证不会出现长度 >= 3 的无重复子串
    for (int i = 0; i <= k; i++) {
        s += (i % 2 == 0 ? 'a' : 'b');
    }
 
    // 后面全部补成和当前最后一个字符相同
    while ((int)s.size() < n) {
        s += s.back();
    }
 
    cout << s << '\n';
    return 0;
}
 
 

image-20260416201902407

#include <bits/stdc++.h>
using namespace std;
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
 
    int T;
    cin >> T;
 
    const long long M = 1000000000LL;
 
    while (T--) {
        long long s;
        cin >> s;
 
        long long D = 2LL * s;  // 需要让行列式等于 2s
 
        long long x1 = 0, y1 = 0;
        long long x2 = M, y2 = 1;
        long long x3, y3;
 
        if (D % M == 0) {
            x3 = 0;
            y3 = D / M;
        } else {
            x3 = M - (D % M);
            y3 = D / M + 1;
        }
 
        cout << x1 << " " << y1 << "\n";
        cout << x2 << " " << y2 << "\n";
        cout << x3 << " " << y3 << "\n";
    }
 
    return 0;
}

选择题:

1.在 51/52 单片机中,晶振频率为 6MHz,定时器 T0 工作在方式1。已知一个机器周期为 2μs,若要求定时 1ms,则 T0 的初值应为多少?

解析:这里的机器周期就是定时器每加一就是需要一个机器周期。所以1ms=1000us/2us=500就是定时器需要计数的个数。其次就是定时器是预装载类型的,所以应该是65536-500,然后转为16进制。这里是36是因此这是要多少个状态。(从初值开始“再数 N 次后溢出”,所以要用“总状态数 65536”减,而不是用最大值 65535 减)

image-20260416205121198

image-20260416205327793

image-20260416205449079

14:Cortex-M 中 PSP / MSP 的使用场景 答案:用户/线程 PSP,中断/异常 MSP 用户栈 PSP,中断栈 MSP

15:

是x=1,x=x-1,y=x.是否和x=1,y=x—一样(x—,是把x的值先给y再减减)

image-20260416210558523

清澜科技

1.测距,测速,测角的原理(具体的物理原理(拍频,波程差)+数学公式 + 工程实现)

  • 测距主要是通过发射信号与接收信号之间的时延来进行测距。时间差τ=2R/C来得到距离。混频后就能得到拍频。

FMCW 的测距不是直接测传播时间,而是把传播时延映射为拍频,通过 chirp 内采样做 1D FFT 得到拍频峰值,再结合斜率换算出距离。

  • 通过公式fb=S(调频斜率)*τ=S*2R/C 得到距离R=cfb/2S ,fb是拍频差,表示接受信号与发射信号相差的频率,时间*斜率获得
    

距离分辨率:

image-20260421163309681

  • 测速主要是利用目标运动产生的多普勒效应来进行的。通过观测目标在多个chirp中的相位变化,再通过2dfft获得速度信息。

image-20260421173122161

image-20260508161740393

N是chirp的数量,T指的是chirp的间隔周期

  • 测角就是通过2个接收天线之间的波程差来计算角度。主要是因为2个天线的接收波程差得到相位差,通过相位差来反解出来角度。工程上通过对每个接收天线做fft得到角度的信息。

image-20260421173942210

2.心理呼吸的流程(类似ti但是做了优化)

3.怎么知道人物位置,万一有干扰

  • 可以设置一定的门限范围
  • 静态杂波抑制,人体呼吸和心跳带来的是慢时间的微动。可以对每个range bin来做一个均值相减。
  • 不看“幅值最大”,而看“慢时间动态最明显“,看慢时间的方差以及动态能量。

4.mvdr是什么解释

他的中文名字是最小方差无失真响应,他是阵列信号处理里的自适应波束形成算法的一种算法。他的核心作用就是对目标方向或者目标频率保持单位增益,也就是“无失真通过”;同时让输出总功率最小,也就是尽可能压制噪声和干扰。

image-20260508165657799

image-20260508165704782

这个算法用的是阵列信号也就是每一个天线的通道。对于心率呼吸来说,他是一维的相位信号,因此要采用这个算法就是要构建成高维虚拟阵列快拍矩阵。

5.帧率是多少的影响

“生命体征算法里真正关键的不是笼统意义上的帧率,而是慢时间采样率。离线 MATLAB 处理中,通常把所有 chirp 或 frame 数据拼成慢时间序列后做相位提取和频谱分析,所以这个参数往往被隐式使用,不会特别有存在感;但它实际上一直在决定频率轴、BPM 换算、滤波器设计和小波分解频带映射。到了嵌入式实时实现阶段,这个参数就必须重点考虑,因为它直接影响最大可观测生理频率、频率分辨率、滑窗时延、缓存大小、计算负载以及结果更新速率。对于同时做呼吸和心率估计的系统,慢时间采样率通常建议至少 10 Hz,工程上更常用 20–25 Hz 或更高,以兼顾心率估计鲁棒性和实时性。”

承泰科技

反问:

1.ai结合毫米波算法可以有很多的方面,就是说ai是一个大函数,他的输入来源有很多。比如二维的fft图,一维fft图,以及现在可能用的比较多的点云信息图?主要用ai来做检测吗?同时ai的部署对于算力是比较大的要求

大型的车载电脑来运算

2.多通道是fpga还是专用dsp芯片,我看到有一个产品是8发8收的。

大型的DSP芯片或者车载雷达的芯片。

3.是否能接触原始数据、点云、航迹,还是只做调参?

4.目前的工作流ai的使用情况

他问:

1.数据累计的经验

  • 非相干累加,提高检测稳定性:在每一个都做完range FFT和Doppler FFT后,每个接收天线都有一个结果,通过将多个天线的通道的能量进行累加,再做处理。这种就是非相干累加。

  • 在使用DOA算法后,知道目标在大概哪个方向,将各个通道的相位进去对其后再相加,这是相干累加,类似于波束形成的DBF,得到更加精确的角度谱。原因就是这样目标方向的信号会相干叠加,噪声和其他方向的信号不会完全对齐,所以会被相对压低

  • 假设目标在2维fft被检测出来了,去除所有天线通道的复数值,形成空间快拍,知道各个天线的间距,就可以使用这些方法来进行测角。

    Angle FFT DBF 数字波束形成 MUSIC MVDR/Capon ESPRIT

image-20260509203422336

  • 在 TDM-MIMO 中,多 TX 不是同时发射,运动目标会引入 TX 间额外相位,因此在形成虚拟阵列并做角度估计前,需要根据 Doppler bin 做相位补偿,否则角度估计会偏。

    我之前做生命体征时,主要利用单通道或少量通道在目标距离 bin 上的相位随时间变化来提取呼吸和心跳,因此对多通道阵列处理依赖不强。但我理解车载雷达中多通道的作用更核心,主要用于提高检测 SNR 和进行空间角度估计。具体来说,在检测阶段可以对多个 RX 或虚拟通道做非相干功率累加形成 range-Doppler map;在测角阶段,需要保留各通道复数相位,经过通道幅相校准、MIMO 虚拟阵列重排和 Doppler 补偿后,通过 Angle FFT、DBF 或 MVDR 得到方位角和俯仰角,最终生成点云。

2.DSP的使用 3.fft算法的旋转因子

这个可以直接看ti的例子来学习,点云可以看ti的tracking里面。

4.MVDR和L什么的区别

5.恒虚警概率的原理,为什么可以做到恒定

CFAR 之所以能做到恒虚警,是因为它不是使用固定门限,而是利用 CUT 周围的参考单元估计局部噪声或杂波水平,再将该估计值乘以门限因子得到自适应门限。这样当背景噪声升高时门限也随之升高,背景噪声降低时门限也降低。对于 CA-CFAR,在噪声服从假设分布、参考单元独立同分布且不含目标的条件下,门限因子可以根据期望的虚警概率和参考单元数量推导出来,因此虚警概率理论上可以保持恒定。但在车载雷达工程中,由于多目标、杂波边缘、强反射和非均匀背景存在,实际只能近似恒虚警,所以会使用 OS-CFAR、GO-CFAR、SO-CFAR 等改进方法。

小公司

天线的布局 做的算法

music原理

Capon 不是简单地把各个通道相加,而是根据接收数据的协方差矩阵,自适应地给不同通道加权。它要求目标方向的信号保持不变,同时让其他方向的能量尽量小。所以它比普通角度 FFT 或常规波束形成的分辨率更高,也更能压制干扰。

image-20260604103035188

image-20260604103111239

MUSIC 是先根据协方差矩阵把接收数据分成信号子空间和噪声子空间。真实目标方向的导向矢量应该落在信号子空间里,和噪声子空间近似正交。所以我们扫描角度,找和噪声子空间最正交的那个方向,这个方向就会出现很尖的谱峰,也就是目标角度。

里面的创新点是在哪里(已放在阶段面试总结)

阶段面试总结

针对只会讲链路的问题的优化

1总体算法流程:我在这个项目里主要负责点云生成前的雷达信号处理和检测参数优化,包括 1DFFT、2DFFT、CFAR 检测以及点云输出前的链路调试。

2存在问题:

  • 无人机飞行环境复杂,如果检测门限太高,弱目标会漏检;门限太低,又会引入大量虚警,影响后端避障判断。

  • 无人机高速飞行时,机体运动和姿态变化会导致帧间点云不稳定。

  • 无人机避障场景下的弱小目标检测。比如电线、树枝这类目标 RCS 小、回波弱,单帧点云非常稀疏;

3.自己的优化:(这些问题的具体细节还要做工程上再了解)

问题:CA-CFAR 在假设背景噪声均匀时效果很好。但无人机面对树林时,属于**“多目标密集场景”**,强反射点(树干)会抬高整体噪声阈值,导致旁边的弱反射点(细树枝/电线)被“遮蔽(Masking)”而漏检。

  • 在检测阶段对 CFAR 参数和类型做优化,不是简单固定一套门限,而是结合实际场景对训练单元、保护单元、门限因子进行调整,并对 CA-CFAR、OS-CFAR 等方式做对比。OS-CFAR 在非均匀杂波、多散射点环境下更稳定。

问题:无人机高速飞行时,相邻两帧之间机体位置和姿态已经发生变化。如果直接把历史点云叠到当前帧,会出现拖影,甚至把目标位置叠错。

  • 所以需要根据飞控提供的姿态、速度或者位姿信息,把历史点云转换到当前机体系或统一坐标系下,再做累积。这样多帧点云才有意义。否则累积帧数越多,虚影越严重。

问题:电线这类目标单帧点云可能非常少,甚至有时候一帧有点、一帧没点。如果后端只看单帧,就容易认为目标不存在。

  • 所以我会把连续几帧点云做时间累积,提高弱小目标的出现概率。这样后端看到的是一个更稳定的障碍物结构,而不是单帧随机点。

  • 工程上的处理是可以保存最新的3到5帧的点云数据,通过滑动窗口的方式来处理数据,将最老的淘汰,将最新的存入,然后一起输出这时刻的点云数据,做到点云累计的效果。

FFT的详细说明

第一是数据组织。雷达 ADC 数据不是简单一维数组,而是按照 chirp、Rx 通道和采样点交织存储,做 FFT 前要先把数据整理成算法需要的维度。按照通道—chirp数—sample点数来排列好数据

第二是加窗。做 Range FFT 前通常要乘窗函数,减少频谱泄露。窗函数在嵌入式上一般会提前生成表,如果是 Q15 定点格式,ADC 数据和窗函数相乘后要右移恢复小数格式。在嵌入式中做加窗,还要考虑到定点乘法、右移(相当于除以32768)。饱和和数据位宽。

image-20260517161701992

第三是旋转因子。FFT 底层蝶形运算需要 twiddle factor,工程实现一般不会实时计算 sin/cos,而是提前生成旋转因子表,DSP 或硬件加速模块直接查表使用。

第四是定点缩放。蝶形运算中复数加法和乘法可能造成溢出,所以定点 FFT 需要考虑每一级缩放、饱和处理和最终幅度归一化。

第五是实时性。雷达每帧数据量比较大,如果全部靠 CPU 搬运和计算会占用很多时间,所以 TI 这类平台通常会结合 EDMA、DSP 或硬件加速器,实现数据搬运和 FFT 计算并行,提高实时性。

所以我目前的理解是:算法层面我能完整理解 Range FFT 和 Doppler FFT 的输入输出及物理意义;工程实现层面,我理解 DSP/HWA 是怎么通过蝶形运算、旋转因子查表、定点缩放和 DMA 数据搬运来实现实时 FFT 的。

上海宏景智驾

他问

1.雷达点云内存够不够(当时的回答是没有遇到这样的情况)

在实际的开发中毫米波雷达点云数据量非常大,尤其多通道、多 range bin、多 chirp 累积时,每帧点云就可能占用几十到几百 KB。

  • 目前我对于这类数据的做法就是保留需要信息剔除不需要的。比如在做心率呼吸的时候,我就暴露我对应的bin的距离就行,同时只利用最后一个chirp的相位数据就行
  • 其次就是数据处理多利用流水线的PING-PONG处理和一些滑动窗口处理。

2.移植平台的DSP开发有没有不一样

  • 我理解 DSP 开发的底层思想是相通的,比如定点/浮点运算、FFT 加速、DMA 数据搬运,流水线和实时性分析。

  • 不同芯片的 DSP 核、HWA 加速器、EDMA 配置、L2/L3 内存分配、和编译工具链会不一样。所以移植平台时,我不会认为完全无成本,但核心算法和优化思路是可以迁移的。

  • 我觉得一到两周可以熟悉基本开发流程,一个月左右可以比较稳定地参与模块移植和调试。当然如果涉及底层驱动、HWA/EDMA 深度优化,时间会更长一些。

3.人和其他静止物体怎么样区分

  • 利用多普勒频移

人体微动:呼吸、心跳、步行时手臂/腿的摆动会产生微小的速度变化。

静止物体:墙体、路边桩、停车车辆等没有微动,速度几乎为零。

方法:

  • 对每个目标点做 多普勒 FFT(Velocity FFT)。

  • 人体微动频率通常在 0.1–3 Hz(呼吸 + 心跳 + 步态),会在多普勒谱上出现微小峰值。

  • 静态目标只在零速度 bin 上有回波。

  • 反射截面(RCS)特征

人 vs 静态大物体:

  • 人的雷达散射截面较小(0.1–1 m²)。
  • 墙壁、汽车、柱子等通常 RCS 较大。

方法:

  • 根据 CFAR 检测出的幅度 过滤异常大或异常小的目标。

  • 人体 RCS 有一定范围,配合速度信息进一步判断。

  • 融合摄像头/传感器信息

毫米波雷达对静态/动态区分有限时,可结合视觉:

  • 通过摄像头检测人形或行人 bounding box
  • 将毫米波点云投影到摄像头视野,匹配后进行速度确认

二面:

是否接触过并行处理雷达数据?

如果入职我的工作流你要怎么做,对于没有接触过的并行处理雷达?

AI的使用情况如何?

阿圆科技

1.简单介绍心率呼吸相关的算法的流程

这个流程是:他主要是利用毫米波雷达检测人体胸腔由呼吸和心跳引起的微小位移。

(S)其中的难点是呼吸位移通常是毫米级,而心跳位移更小,同时心跳信号容易受到呼吸谐波、静态杂波以及人体轻微运动的干扰。

(T)我使用TI AWR1843和DCA1000采集多帧原始ADC数据,在matlab中先完成算法的验证,后续在英飞凌的雷达板子中完成了算法的部署。

(A)获取到原始的雷达ADC数据后,我首先对每个chirp进行距离维FFT,得到距离频谱。然后根据目标能量或者峰值检测,确定人体胸腔对应的距离单元,并提取该距离单元慢时间维的复数信号。

由于人体胸腔的微小位移主要反映在雷达回波相位上,因此下一步会对复数信号进行相位提取和相位解卷绕。

在信号分离阶段,我先根据呼吸和心跳所处的不同频率范围进行滤波,后续再对不同的频率进行相位的fft处理,得到心率和呼吸的频率图,根据谱峰搜索来确定心率和呼吸的大小。

2.在这个心率项目中,创新点和不一样的地方在哪

1.传统做法:

提取胸腔相位 → 带通滤波 → FFT → 在呼吸和心率频段内找峰值。但是这个方法在实际数据中存在一个问题,就是呼吸信号的能量远强于心跳信号,而且呼吸谐波可能进入心率频段,容易造成心率峰值误判。

我的主要创新是将UDWT多尺度分解和MVDR高分辨率频谱估计结合起来。首先通过UDWT将原始相位信号分解到不同尺度,UDWT不进行下采样,因此能够保留完整的时间序列和微弱的心跳信息。在此基础上,我不是直接对分解后的信号做FFT,而是通过滑动窗口将一维时间序列构造成一个虚拟的阵列矩阵,再计算协方差矩阵,使用MVDR对候选频率进行扫描。这样能够自适应抑制强呼吸及其谐波,同时提高相近频率成分的分辨能力,使微弱心跳峰更加突出。

3.第二个项目跟踪相关的算法的具体介绍

(S)我做的是一个基于TI毫米波雷达和ROS2的点云感知与多目标跟踪项目。毫米波雷达输出的原始点云通常比较稀疏,而且会存在孤立噪声、同一目标点云数量变化以及目标偶发漏检等问题。

(T)我主要负责从雷达点云订阅、预处理、目标聚类到多目标跟踪和RViz可视化的完整处理链路。

(A)首先,我通过串口将毫米波雷达的点云数据传到ROS端后,得到的就是4个维度的雷达点云信息。首先我对雷达点云进行距离、高度和强度过滤,去除无效区域和部分噪声点。

之后将点云投影到BEV平面,降低高度波动的影响,并使用DBSCAN进行聚类。聚类完成后,我计算每个目标簇的中心位置,并结合径向速度形成测量结果

在跨帧跟踪阶段,我使用EKF对目标位置和速度进行预测与更新。预测结果再与当前帧聚类目标进行关联,关联过程中综合考虑位置距离和Doppler速度一致性。匹配成功的目标继续保留原有ID,新目标创建新的轨迹,连续多帧未匹配的目标则被删除。

(R)最终在RViz中稳定输出目标ID、位置、速度箭头和历史轨迹。我还通过rosbag2建立了离线回放调参流程,可以对同一段数据重复测试,提高DBSCAN和EKF参数调试的效率.

4.多人情况是否做过以及怎么样去处理(提到心率呼吸算法和跟踪算法的结合)

反问:

是否结合一定的深度学习相关?

目前做的不是很稳定,如果是做深度学习可能在推理和部署上面使得更慢了。

隔空科技

一面:

1.cfar的一些探究,比如边缘的保护窗口的设置,CA-CAFR的一些应用场景,

2.const的关键字在class中的一些作用理解

3.点云的链路

4.加窗的效果,如果不加窗回怎么样

5.心率呼吸的链路

6.假设没有做解纠缠,什么情况好,什么情况不好

  • 人体的微动比较大

7.怎么样就是解决呼吸的谐波对心率的干扰

二面:

1.链路流程

3.点云维度

4.强度信息

5.DBCAN

6.EKF KF的区别 EKF用了哪些参数

1.波形设计

2.扫频信息

3.研究问题时间参数

4.2个chirp间的时间扫频

5.解纠缠具体过程

总天云科技

帧见关联

如何跟踪

雷达感知+跟踪

面试总结

道通硬件参数:

参数推荐示例值
雷达类型FMCW毫米波雷达
工作中心频率60 GHz
发射/接收天线2Tx4Rx
MIMO工作模式TDM-MIMO,两个Tx交替发射
虚拟天线数量最多8个
ADC采样率10 MHz
ADC数据位宽16 bit,按实数IF采样
ADC采样点数512
Range FFT512点
每Tx有效Chirp数量128
整帧Chirp总数量256
Doppler FFT256点(128个有效Chirp零填充)
Chirp斜率12 MHz/μs
ADC采样时间51.2 μs
完整Chirp周期70 μs
ADC有效扫频带宽614.4 MHz
距离分辨率约0.244 m
理论采样距离上限约62.5 m
设计目标距离约50 m,需经链路预算和实测验证
速度分辨率约0.14 m/s
最大无模糊径向速度±8.93 m/s
Chirp序列采集时间17.92 ms
输出帧率20 Hz
帧周期50 ms

image-20261014231103956

对于无人机避障,雷达不仅要保证检测准确率,还要控制整个信号处理链路的时延。

以20Hz帧率的参考配置为例,一帧周期50ms,256个Chirp、70微秒Chirp周期,对应约17.92ms采集时间。

工程上不会等所有ADC数据采集完成才做Range FFT,而是利用DMA双缓冲,在每个Chirp采集完成后,就对4个接收通道进行512点距离FFT。

这样Range FFT可以和后续Chirp采集重叠。完成一帧后,再执行Doppler FFT、CFAR和角度估计。

为减少运算量,角度估计只对CFAR检测出来的候选目标进行处理。内存方面尽量减少数据拷贝,采用DMA搬运以及适当的定点处理。

扫频是多少?

以这套设计为例,ADC采样率10MHz,每个Chirp采集512个点,所以ADC采样窗口是51.2微秒。调频斜率是12MHz每微秒,对应有效带宽约614MHz。完整Chirp周期70微秒。

image-20261014232632897

image-20261014231838021

一.雷达基本原理(包括阵列)

测距,测速,测角的原理(具体的物理原理(拍频,波程差)+数学公式 + 工程实现)

  • 测距主要是通过发射信号与接收信号之间的时延来进行测距。时间差τ=2R/C来得到距离。混频后就能得到拍频。

FMCW 的测距不是直接测传播时间,而是把传播时延映射为拍频,通过 chirp 内采样做 1D FFT 得到拍频峰值,再结合斜率换算出距离。

  • 通过公式fb=S(调频斜率)*τ=S*2R/C 得到距离R=cfb/2S ,fb是拍频差,表示接受信号与发射信号相差的频率,时间*斜率获得
    

距离分辨率:

image-20260421163309681

  • 测速主要是利用目标运动产生的多普勒效应来进行的。通过观测目标在多个chirp中的相位变化,再通过2dfft获得速度信息。

相邻2个chirp的速度公式推导:

image-20261030102851475

速度公式为:

最大不模糊速度为

速度分辨率:

N是chirp的数量,T指的是chirp的间隔周期

  • 测角就是通过2个接收天线之间的波程差来计算角度。主要是因为2个天线的接收波程差得到相位差,通过相位差来反解出来角度。工程上通过对每个接收天线做fft得到角度的信息。

image-20260421173942210

FMCW的工作原理

发射线性调频 chirp,回波由于传播时延产生频率差,Tx/Rx 混频得到 IF beat signal;对 fast-time 做 Range FFT 获得距离,对同一 range bin 在多个 chirp 的 slow-time 上做 Doppler FFT 获得径向速度。

chirp和普通的正弦信号有什么区别

你:
ADC IF signal
≈ 固定频率正弦

面试官:
TX FMCW chirp
= 线性调频信号


如果您说的是发射端的 FMCW chirp,它和普通正弦最大的区别是瞬时频率随时间线性变化,\(f(t)=f_c+St\)。但如果说的是混频以后 ADC 实际采集的中频信号,对于理想单个静止目标,因为发射和延迟回波的 chirp slope 相同,两者频差 \(f_b=S\tau\) 是常数,所以一个 chirp 内的 IF 信号近似就是一个固定频率的正弦或复指数。不同距离目标对应不同 beat frequency,所以 Range FFT 才能把不同距离目标分开。

距离门:

Range Bin 是离散 FFT 距离单元;距离门 Range Gate 是选取某个距离区间进行后续处理。

24G和60G的一些区别

对比项24 GHz60 GHz
中心频率24 GHz60 GHz
波长12.5 mm5 mm
典型可用带宽视地区和产品而定,常见窄带约 250 MHz部分产品支持数 GHz 带宽
距离分辨率窄带情况下较低宽带情况下更高
最大不模糊速度相同 Chirp 周期下更大相同 Chirp 周期下更小
Doppler 频移同一速度下较小同一速度下更大
角度分辨能力相同物理孔径下较低相同物理孔径下更高
自由空间传播损耗同距离下较低同距离下较高
天线尺寸相对较大更容易小型化
常见应用运动检测、工业测速、部分交通检测生命体征检测、人体存在检测、室内感知、手势识别

Range FFT 和 Doppler FFT 换顺序会怎样?

“Range FFT 是沿每个 chirp 内的 ADC 采样点,也就是快时间维做,得到距离信息;Doppler FFT 是沿同一距离单元、多个 chirp 的慢时间维做,得到速度信息。如果只讨论理想的二维 FFT,而且两维分别做线性变换,先做哪一维,最终二维频谱在数学上是等价的。但工程链路通常先做 Range FFT,因为后面要按距离单元组织数据、做杂波处理和检测;如果中间插入了门限、截断等非线性操作,交换实际处理顺序就不能简单说结果一样。”

Angle FFT 的前提和角分辨率

Angle FFT 利用的是同一目标回波在不同接收或虚拟阵元上的相位差。所以首先要知道阵列几何和阵元顺序,通道之间要做好幅相校准;对于规则的均匀阵列,才能方便地沿阵元维做 FFT。如果用了多个发射通道,还要正确构造虚拟阵列和处理发射时序带来的相位。

孔径计算:

均匀线阵有 (N) 个阵元、间距为 (d),从第一个到最后一个阵元的实际跨度是 ((N-1)d)。

换算成点云

image-20260903145606067

算法流程:

毫米波雷达点云算法流程:

ADC数据 → 预处理 → Range FFT → Doppler FFT → 角度估计 → CFAR检测 → 提取 {r,v,θ,φ,SNR} → 坐标变换得到 {x,y,z} → 点云生成 → 点云滤波与ROI筛选 → 聚类 → 目标状态估计 → 多目标跟踪 → 上层应用输出

  • CFAR原理

我的目标是提高电线、树枝这类弱回波的检出,同时控制虚警给后端带来的负担。先在真实飞行数据里看目标峰值在距离和多普勒维扩散到多少个单元,再定保护单元,避免目标主瓣或旁瓣进入训练窗,把噪声估计抬高。训练单元要足够多,让背景估计稳定,但不能大到跨过明显不同的背景区域。我当时试过单边 4 个保护单元、8 个训练单元这一组配置,随后结合检测门限比较弱目标的检出、连续帧出现情况和背景虚警,而不是只看某一帧点数变多。对于边缘或多目标场景,再比较 CA、SO、OS 等方法的取舍。

一、 针对 CFAR(恒虚警率)与微小目标检测

在无人机场景下,电线和细树枝的雷达反射截面积(RCS)极小(可能只有 0.01㎡),回波极弱。

Q1:传统的 CA-CFAR(单元平均恒虚警)在检测电线和树林时有什么致命缺陷?你在实际工程中是怎么选型的?

  • 满分答案: CA-CFAR 在假设背景噪声均匀时效果很好。但无人机面对树林时,属于**“多目标密集场景”**,强反射点(树干)会抬高整体噪声阈值,导致旁边的弱反射点(细树枝/电线)被“遮蔽(Masking)”而漏检。
  • 工程细节: 我在实际中更倾向于使用 OS-CFAR(有序统计 CFAR) 或 CASO-CFAR(单元平均选小 CFAR)。OS-CFAR 通过排序取中间值作为阈值,抗多目标遮蔽能力极强;如果考虑到嵌入式算力(排序太耗时),我会退而求其次用 CASO-CFAR,分别计算左右参考窗的平均值,取较小的一个来算阈值,既保住了弱目标,又兼顾了 MCU 的算力。

Q2:无人机贴地或超低空飞行时,地面杂波极强,你是怎么在 CFAR 阶段防止地面杂波引起“虚警(误刹车)”的?

  • 满分答案: 单纯靠 CFAR 的标量因子(Alpha/Threshold)很难完全过滤地面。必须结合多维度特征。
  • 工程细节: 1. 高度/俯仰角过滤: 结合解算出的俯仰角(Elevation)和无人机当前高度,直接在 CFAR 之前或之后 Mask(屏蔽)掉绝对高度低于无人机底部的点。结合无人机的高度信息H以及雷达的探测的距离以及俯仰角来进行一个比对来确定是不是地面。 2. 多普勒维过滤: 地面杂波属于静态目标,如果有异常的微多普勒,大概率是杂波,可以通过速度门限卡掉。运动补偿之后来他多普勒维度是否速度为0。

image-20260423093041537

image-20260611114039344

image-20260611114110118

CFAR 后产生很多候选点,怎么去虚警?

我负责的是前端检测,所以不会声称后端每一步都是我实现的。从整体链路看,前端先用局部峰值、幅度或 SNR、合理的距离和速度范围做基础筛选;后端再看点能否形成符合目标尺寸和空间分布的聚类,以及能否在连续帧中被稳定关联。孤立且只出现一帧的点,可信度通常更低。对电线这类本来就稀疏的目标,又不能简单要求每帧都有很多点,所以需要同时看虚警和漏检,不能一味加严门限。”

CFAR优化之后是怎么样的

当时主要通过采集数据回放,对比检测结果和点云输出。我重点看两个现象:一是弱目标是不是经常丢点,能不能在连续帧里保持检测;二是降低门限以后,背景里的误点有没有明显增加。

在测试片段里,调参后部分弱目标的检测连续性有所改善,但也存在误点增加的情况,所以需要在保留弱目标和控制误报之间做权衡。

二:cfar的一些探究,比如边缘的保护窗口的设置,CA-CAFR的一些应用场景

我当时距离维CFAR参数是以单侧8个训练单元、4个保护单元作为基线。

训练单侧太少:虽然窗口比较局部,但噪声估计容易受单个杂波点影响,估计结果波动比较大。无人机飞行时会经过树木、地面、建筑物等复杂背景,这时如果训练单元太少,CFAR门限会跟着背景起伏,容易出现一帧能检出电线、下一帧又检不出的情况,点云稳定性会比较差。

训练单侧太多:因为无人机实际场景不是完全均匀噪声,训练窗口拉得太宽以后,很容易把附近的树枝、地面或者其他强反射目标也包含进去,这些强目标会把噪声估计抬高,最终CFAR门限也被抬高。电线本身回波很弱,这时候就更容易被强背景“压掉”,产生漏检。

保护单元太少:因为目标的能量不是集中在一个range bin,有时候会扩展到相邻的几个bin。如果保护单元太少,那么目标附近的能量也会进入窗口,相当于目标自己的能量把噪声能量提高,若目标容易产生漏检。

保护单元太大:真正参与噪声估计的训练单元离CUT太远,估计到的就不一定是目标附近真实的局部背景;另外也会浪费很多有效数据

场景:空旷的场景比较适合,比如无人机在空旷的背景中作业时候。

image-20260806092604658

三:cfar边缘的保护窗口怎么样设置?

在左边缘可以直接不检测,因为距离很近的同时,前面的几个bin也有更多的干扰,比如天线泄露,静态杂波等。在右边直接使用单侧的训练窗口,所以如果出现边缘杂波,就是可以使用GO-CFAR来避免这种情况。其次就是二维的cfar可以使用循环的窗口。

四:怎么样维持恒定虚警概率?

1.首先门限是a*T,a是已经固定了,比如我们期望要多少的虚警概率已经固定就可以算出来a。其次就是T就是根据训练单元的局部噪声来计算的,因此局部噪声的变化,导致门限也变化,最终就是一个恒定的概率。CFAR的作用是根据实时背景噪声调整门限,使实际虚警率尽可能维持在这个目标附近

image-20260819111336604

2.在这个项目的无人机中,我设定的虚警率为10-3到10-4这样。因为我希望要漏检弱小目标,我反而会倾向于让前端 CFAR 稍微“松一点。这样会导致我的cfar门限比较低,输出不是特别干净,但是后续的算法比如DBSCAN/多帧积累/EKF 跟踪可以把一些噪声滤除。

image-20260819111556903

  • FFT相关问题

1.加窗和不加窗的影响?

不加窗的话会出现频谱泄露。原因是如果不加窗导致信号跳变和不完全的周期(前后图像不连续)就会出现这种情况。由于不周期了就会导致信号可能出现其他的频率,所有会频谱泄露。如果周期就是只有一个频率点了。用更宽的主瓣换更低的旁瓣,针对针对弱目标电线说明的也有好处如图2。从频域看,加窗通常会使主瓣变宽,但旁瓣电平明显降低。时间域就是使得图像更加平滑和周期,减小边界不连续造成的频谱泄漏。

image-20260816113532851

image-20260816113813880

2.fft的具体实现?

第一是数据组织。雷达 ADC 数据不是简单一维数组,而是按照 chirp、Rx 通道和采样点交织存储,做 FFT 前要先把数据整理成算法需要的维度。按照通道—chirp数—sample点数来排列好数据

第二是加窗。做 Range FFT 前通常要乘窗函数,减少频谱泄露。窗函数在嵌入式上一般会提前生成表,如果是 Q15 定点格式,ADC 数据和窗函数相乘后要右移恢复小数格式。在嵌入式中做加窗,还要考虑到定点乘法、右移(相当于除以32768)。饱和和数据位宽。

image-20260517161701992

第三是旋转因子。FFT 底层蝶形运算需要 twiddle factor,工程实现一般不会实时计算 sin/cos,而是提前生成旋转因子表,DSP 或硬件加速模块直接查表使用。

第四是定点缩放。蝶形运算中复数加法和乘法可能造成溢出,所以定点 FFT 需要考虑每一级缩放、饱和处理和最终幅度归一化。

第五是实时性。雷达每帧数据量比较大,如果全部靠 CPU 搬运和计算会占用很多时间,所以 TI 这类平台通常会结合 EDMA、DSP 或硬件加速器,实现数据搬运和 FFT 计算并行,提高实时性。

所以我目前的理解是:算法层面我能完整理解 Range FFT 和 Doppler FFT 的输入输出及物理意义;工程实现层面,我理解 DSP/HWA 是怎么通过蝶形运算、旋转因子查表、定点缩放和 DMA 数据搬运来实现实时 FFT 的。

Range FFT 的 128 点采样做 256 点 FFT,改善了什么

假设实际采了 128 个点,我补零后做 256 点 FFT,输出的频率 bin 间隔从 (F_s/128) 变成 (F_s/256),对应的距离网格也变得更密。它方便我定位落在原来两个 bin 之间的单个谱峰。

其次就是增加点数可以一直增加他的细分度,但是超过雷达具体的距离分辨率后也没有意义了,因为雷达无法区分了已经。

如何找到fft bin中间的一些值?

背景:MATLAB画图画自动画平滑了,导致我看图像找距离的时候就可以找到非常精确的距离值,实际通过寻找峰值找到的是某个距离bin。

1.就是可以通过增加fft的点数来使得频谱更加密集,从而定位到中间。

2.通过插值的方法(我先取 Range FFT 的最大峰,再拿峰值及左右相邻两个 bin 的幅值做三点抛物线拟合。拟合得到一个小数 bin 偏移量,比如最大峰在第 10 个 bin,偏移量是 0.2,我就按 10.2 个 bin 换算拍频和距离)

偏移量:

(A_{k-1}):左侧 Bin 的幅值。

(A_k):峰值 Bin 的幅值。

(A_{k+1}):右侧 Bin 的幅值。

数据累计的经验

  • 非相干累加,提高检测稳定性:在每一个都做完range FFT和Doppler FFT后,每个接收天线都有一个结果,通过将多个天线的通道的能量进行累加,再做处理。这种就是非相干累加。

  • 心率呼吸距离维度可以进行一个非相干累加,相位可以进行一个相干累加

  • 在使用DOA算法后,知道目标在大概哪个方向,将各个通道的相位进去对其后再相加,这是相干累加,类似于波束形成的DBF,得到更加精确的角度谱。原因就是这样目标方向的信号会相干叠加,噪声和其他方向的信号不会完全对齐,所以会被相对压低

  • 假设目标在2维fft被检测出来了,去除所有天线通道的复数值,形成空间快拍,知道各个天线的间距,就可以使用这些方法来进行测角。

    Angle FFT DBF 数字波束形成 MUSIC MVDR/Capon ESPRIT

image-20260509203422336

  • 在 TDM-MIMO 中,多 TX 不是同时发射,运动目标会引入 TX 间额外相位,因此在形成虚拟阵列并做角度估计前,需要根据 Doppler bin 做相位补偿,否则角度估计会偏。

    我之前做生命体征时,主要利用单通道或少量通道在目标距离 bin 上的相位随时间变化来提取呼吸和心跳,因此对多通道阵列处理依赖不强。但我理解车载雷达中多通道的作用更核心,主要用于提高检测 SNR 和进行空间角度估计。具体来说,在检测阶段可以对多个 RX 或虚拟通道做非相干功率累加形成 range-Doppler map;在测角阶段,需要保留各通道复数相位,经过通道幅相校准、MIMO 虚拟阵列重排和 Doppler 补偿后,通过 Angle FFT、DBF 或 MVDR 得到方位角和俯仰角,最终生成点云。

雷达杂波抑制有哪些方法

image-20261025143128650

静态杂波抑制: 慢时间均值相减、高通滤波、零多普勒抑制。

背景建模: 多帧背景估计,抑制固定场景中的杂波。

自适应处理: 在适用场景下采用MTI、MTD或空时自适应处理等方式。

运动平台补偿: 对无人机自运动进行补偿,避免把静态环境误判为运动目标。

人和其他静止物体怎么样区分

  • 利用一维FFT

利用多个chirp的一维fft,做均值相减,静止的目标就会被删除。

  • 利用多普勒频移

如果只检测运动目标,可以在 Range FFT 后,对同一距离 bin 的多个 chirp 求复数均值并相减,压制墙面等基本不变的回波。

这种针对人之后,有可能会出现删除了人的信息。因此可以再目标的距离bin上跨帧跟踪相位信息,人是变化的相位,墙的相位是稳定的。

  • 反射截面(RCS)特征

人 vs 静态大物体:

  • 人的雷达散射截面较小(0.1–1 m²)。
  • 墙壁、汽车、柱子等通常 RCS 较大。

方法:

  • 根据 CFAR 检测出的幅度 过滤异常大或异常小的目标。

  • 人体 RCS 有一定范围,配合速度信息进一步判断。

  • 融合摄像头/传感器信息

毫米波雷达对静态/动态区分有限时,可结合视觉:

  • 通过摄像头检测人形或行人 bounding box
  • 将毫米波点云投影到摄像头视野,匹配后进行速度确认
阵列

4.MVDR和L什么的区别

CAPON(MVDR)&& MUSIC

capon:

最优权向量

image-20260629153140716

R为协方差矩阵,a为方向导向矢量。原理:目标方向无失真,其他方向能量最小。 这里的R是协方差矩阵,他在目标方向上面的对角是比较大的。

image-20260901154906162

MUSIC:

MUSIC 是一种基于信号子空间和噪声子空间正交性的超分辨率测角算法。核心思想是对阵列协方差矩阵进行特征值分解,将阵列空间分成信号子空间和噪声子空间。真实目标方向的导向矢量属于信号子空间,因此与噪声子空间理论上正交。

因此,真实目标方向的导向矢量应该和噪声子空间正交。MUSIC 就是利用这一点,扫描不同角度,找哪个角度的导向矢量和噪声子空间最正交,哪个角度就会在 MUSIC 谱上出现峰值。

image-20260903160209474

另一种理解:C相当于噪声子空间的向量,然后你用不同的角度去和它相乘,只有目标信号才会为0,做一个倒数在频域上就是一个尖峰。

6a4f7cbae4d154e1a31e106ce97beaae

三种测角的优缺点

image-20261025133753327

雷达存在方位误差,怎么校准?

我会先在暗室或者相对干净的环境中,用角反射器或强散射点目标,在已知距离和已知角度下采集数据。先统计各 RX/虚拟阵元幅相误差,做通道级幅相校准;再在多个已知方位角采样,对测量角度与真实角度之间的偏差建模,如果是固定 bias 就直接补偿,如果误差随角度变化则建立 LUT 或拟合函数,最后再用独立角度数据验证校准后的 RMSE。

原因:由于实际中2个接收通道并不会完全一致,比如因为阵列互耦,硬件差异,比如PCB走线,天线实际位置等。

方法:

  • 通道福相校准:

    假设通道是这样的偏移量

image-20261030104202400

image-20261030104228741

第二个方法就是测不同角度,然后建立表格去校准。

image-20261030104252913

第三种:

image-20261030104325019

二.心率呼吸

简单介绍心率呼吸相关的算法的流程

这个流程是:他主要是利用毫米波雷达检测人体胸腔由呼吸和心跳引起的微小位移。

(S)其中的难点是呼吸位移通常是毫米级,而心跳位移更小,同时心跳信号容易受到呼吸谐波、静态杂波以及人体轻微运动的干扰。

(T)我使用TI AWR1843和DCA1000采集多帧原始ADC数据,在matlab中先完成算法的验证,后续在英飞凌的雷达板子中完成了算法的部署。

(A)获取到原始的雷达ADC数据后,我首先对每个chirp进行距离维FFT,得到距离频谱。然后根据目标能量或者峰值检测,确定人体胸腔对应的距离单元,并提取该距离单元慢时间维的复数信号。

由于人体胸腔的微小位移主要反映在雷达回波相位上,因此下一步会对复数信号进行相位提取和相位解卷绕。

在信号分离阶段,我先根据呼吸和心跳所处的不同频率范围进行滤波,后续再对不同的频率进行相位的fft处理,得到心率和呼吸的频率图,根据谱峰搜索来确定心率和呼吸的大小。

生命体征中“相位”的物理意义?

胸部呼吸时会前后移动,雷达到胸部的距离发生变化,回波的往返路径也跟着变化,所以相位就会变化。连续观察它在不同帧之间的变化。在目标稳定、回波质量足够好的情况下,这个相位变化就能反映胸部沿雷达视线方向的微小位移

心率呼吸用了几个FFT?

如果按照处理阶段来讲有两处 FFT。第一处是在每帧 ADC 的 fast-time 维做 Range FFT,用于定位人体的距离 bin;第二处是在固定距离 bin 上提取跨帧相位序列,对这个慢时间生命体征序列做频谱分析,得到呼吸和心率频率。

在这个心率项目中,创新点和不一样的地方在哪

1.传统做法:

提取胸腔相位 → 带通滤波 → FFT → 在呼吸和心率频段内找峰值。但是这个方法在实际数据中存在一个问题,就是呼吸信号的能量远强于心跳信号,而且呼吸谐波可能进入心率频段,容易造成心率峰值误判。

我的主要创新是将UDWT多尺度分解和MVDR高分辨率频谱估计结合起来。首先通过UDWT将原始相位信号分解到不同尺度,UDWT不进行下采样,因此能够保留完整的时间序列和微弱的心跳信息。在此基础上,我不是直接对分解后的信号做FFT,而是通过滑动窗口将一维时间序列构造成一个虚拟的阵列矩阵,再计算协方差矩阵,使用MVDR对候选频率进行扫描。这样能够自适应抑制强呼吸及其谐波,同时提高相近频率成分的分辨能力,使微弱心跳峰更加突出。

mvdr是什么解释

他的中文名字是最小方差无失真响应,他是阵列信号处理里的自适应波束形成算法的一种算法。他的核心作用就是对目标方向或者目标频率保持单位增益,也就是“无失真通过”;同时让输出总功率最小,也就是尽可能压制噪声和干扰。

image-20260508165657799

image-20260508165704782

这个算法用的是阵列信号也就是每一个天线的通道。对于心率呼吸来说,他是一维的相位信号,因此要采用这个算法就是要构建成高维虚拟阵列快拍矩阵。

为什么fft不能,MVDR可以更加尖锐

FFT的局限:

1.谐波可能会压制心率的峰值。数据只有有限时长,频谱峰就有宽度;观察时间越短,相邻频率通常越难分开

1.如果一段信号是比较稳定和平稳的,那用fft可以较好的分析出来,像心率这种可能会按照时间进行变化,如果这段时间一起分析能量就会散在一段频率范围里,更难用一个峰概括。

MVDR

解决第一个问题:

MVDR 的权重会根据数据中的相关关系进行调整。分析某个候选频率时,它在保持对该频率响应的同时,尽量降低其他成分的贡献,所以相邻频率之间的干扰可能更小,谱峰可能更尖。

但这不是无条件提高真实分辨能力:数据太短、协方差估计不稳,或者模型不匹配时,峰也可能失真。我会用已知频差的仿真和真实心率参考值一起验证。

MVDR多个峰值如何处理

首先利用UDWT分解和重构心跳相关信号,尽量减小呼吸干扰,然后通过MVDR估计心率频谱。

如果出现多个峰值,我会考虑三个方面。第一是限制心率搜索范围,在0.8–2 Hz内提取候选峰。第二是结合呼吸基频判断候选峰是否接近呼吸的高次谐波,降低这类峰值的可信度。第三是结合峰值显著性和前几个滑动窗口的估计结果,通过时间连续性判断哪个峰更可能是真实心率。

算法的延迟大概是多少

当前的延迟大概在ms级别。当前论文验证主要偏精度提升,没有针对实时部署优化。滑窗长度决定算法延迟,例如窗口设置为N秒那么理论延迟至少接近N秒。目前实验版本主要用于离线分析,如果做实时产品,会降低窗口长度,同时优化协方差更新和矩阵求逆。

4.帧率是多少的影响

我自己用的多少要回答一下。

“生命体征算法里真正关键的不是笼统意义上的帧率,而是慢时间采样率。离线 MATLAB 处理中,通常把所有 chirp 或 frame 数据拼成慢时间序列后做相位提取和频谱分析,所以这个参数往往被隐式使用,不会特别有存在感;但它实际上一直在决定频率轴、BPM 换算、滤波器设计和小波分解频带映射。到了嵌入式实时实现阶段,这个参数就必须重点考虑,因为它直接影响最大可观测生理频率、频率分辨率、滑窗时延、缓存大小、计算负载以及结果更新速率。对于同时做呼吸和心率估计的系统,慢时间采样率通常建议至少 10 Hz,工程上更常用 20–25 Hz 或更高,以兼顾心率估计鲁棒性和实时性。”

  • 可以设置一定的门限范围
  • 静态杂波抑制,人体呼吸和心跳带来的是慢时间的微动。可以对每个range bin来做一个均值相减。
  • 不看“幅值最大”,而看“慢时间动态最明显“,看慢时间的方差以及动态能量。

image-20260914211124804

解纠缠的具体过程

首先拿到一个复数信号后,通过反正切的方法来获取相位,反正切计算出来的相位会被限制在[−π,π] 范围内。真实相位连续变化并超过这个范围时,测量相位会突然从 +π 跳到 −π,或者反过来。相位解缠就是把这些人为的 2π 跳变消除,恢复连续的相位曲线。比如真实的相位可能会到300,400.具体过程:

1.如果跳变下降超过2派,就在原来的相位加2π。正派到-派的跳变

2.相位突然上升超过 2π,就是-2派

假设没有做解纠缠,什么情况好,什么情况不好

  • 人体的微动比较大
  • 雷达的频率低一些,波长就长一些,可以可能更好。

送入小波分解之前,你是否进行了相位解缠绕?

普通小波分解不会自动判断相位中的跳变究竟来自真实运动还是包裹边界。如果没有解缠绕,这种人为的不连续可能引入高频成分,污染小波分解结果。

phase = angle(IQ_signal);
phase_unwrap = unwrap(phase);

% 后续再进行UDWT分解

7.怎么样就是解决呼吸的谐波对心率的干扰

  • 得到呼吸的基准频率后,在他的多次谐波做陷波处理。

  • 其次可以利用 EMD、VMD、DWT、UDWT 等时频分解方法,将呼吸、谐波和心跳分离到不同尺度

2.心率呼吸是否关注扫频的时间或者是和chirp周期有关吗?

一句话结论:心率呼吸需要关注波形配置,但扫频时间主要影响距离定位和相位质量;若每帧输出一个相位点,真正决定生命体征采样率的是帧周期,帧率需要根据最高关注的心率谐波满足奈奎斯特采样要求。

具体回答:第一:呼吸的频率一般为0.1-0.5hz,心率的频率一般为0.8-2,心率的3次谐波,那就是6hz,那么奈奎斯特采样定律的话,对于相位的采样频率就是至少要满足12hz。 这个主要是帧周期的采样率满足即可,那么一般情况下chirp周期和扫频时间是足够满足的。(在采用每个chirp采样的时候,Tc还有一个作用就是做完fft之后,知道每一个bin间隔的频率,从而计算出对应的心率呼吸)

image-20260727161821480

第二:影响相位质量是因为,扫频时间影响带宽,带宽从而影响距离的分辨率。用于区分2个距离bin,不然容易和背景混在一起,从而影响相位的信息。

3.心率呼吸是否涉及波形设计?

我没有从零设计新的雷达波形,采用的是 TI 官方提供的 FMCW 线性调频参数;但我对关键波形参数进行了理解和适用性验证,确认它们能够满足人体距离定位、相位稳定性和生命体征慢时间采样要求。

第一个理解:呼吸的频率一般为0.1-0.5hz,心率的频率一般为0.8-2,心率的3次谐波,那就是6hz,那么奈奎斯特采样定律的话,对于相位的采样频率就是至少要满足12hz。 这个主要是帧周期的采样率满足即可。

第二个参数理解:心率呼吸主要是用到距离的定位,因此对于距离分辨率也要有一定的了解。距离分辨率只和带宽相关,而带宽主要是涉及到扫频周期和调谐频率。

第三个参数理解:我主要涉及的是微动检测,和他相对应的是相位的灵敏度,因此和波长相关。同样大小的胸腔微笑位移可以产生更大的回波相位变化。

image-20260914214716531

  • 速度分辨率和其他参数怎么样设置

部署的雷达参数

硬件项目官方规格
发射/接收1Tx3Rx
工作频率58–63.5GHz
ADC精度12bit
ADC最高采样率4MSps
SPI最高时钟50MHz
FIFO容量8192个24bit字
FIFO换算容量24KiB
FIFO传输格式两个12bit采样值打包成24bit
FIFO模式Mode 1、Mode 2、Mode 3
参数用于本次计算的配置
雷达BGT60TR13C
发射通道1Tx
接收通道3Rx(Mode 3)
ADC采样点128
Chirp数量128
ADC采样率示例2MHz
采样位宽12bit
帧率20Hz
帧周期50ms
SPI时钟3Rx完整一帧仅1Rx一帧
10MHz58.98ms19.66ms
20MHz29.49ms9.83ms
25MHz23.59ms7.86ms
40MHz14.75ms4.92ms
50MHz11.80ms3.93ms
总数据72KB

三.障碍物检测

(S)我做的是一个基于TI毫米波雷达和ROS2的点云感知与多目标跟踪项目。毫米波雷达输出的原始点云通常比较稀疏,而且会存在孤立噪声、同一目标点云数量变化以及目标偶发漏检等问题。

(T)我主要负责从雷达点云订阅、预处理、目标聚类到多目标跟踪和RViz可视化的完整处理链路。

(A)首先,我通过串口将毫米波雷达的点云数据传到ROS端后,得到的就是4个维度的雷达点云信息。首先我对雷达点云进行距离、高度,径向速度,去除无效区域和部分噪声点。

之后将点云投影到BEV平面,降低高度波动的影响,并使用DBSCAN进行聚类。聚类完成后,我计算每个目标簇的中心位置,并结合径向速度形成测量结果

在跨帧跟踪阶段,我使用EKF对目标位置和速度进行预测与更新。预测结果再与当前帧聚类目标进行关联,关联过程中综合考虑位置距离和Doppler速度一致性。匹配成功的目标继续保留原有ID,新目标创建新的轨迹,连续多帧未匹配的目标则被删除。

(R)最终在RViz中稳定输出目标ID、位置、速度箭头和历史轨迹。我还通过rosbag2建立了离线回放调参流程,可以对同一段数据重复测试,提高DBSCAN和EKF参数调试的效率.

更加完整:

拿到雷达点云后,我第一步是做基础过滤,比如限制在感兴趣区域内、筛掉信噪比太低和离群的点,先去掉一部分杂波。

第二步是聚类。我会用 DBSCAN 把同一个目标的点聚成一个簇。这里的邻域半径和最小点数需要根据目标大小和距离动态调,半径太大容易把旁边的人粘在一起,太小同一个人又会被拆成两半。

聚好类后,每个簇就作为一个测量值送入跟踪器。我用的是扩展卡尔曼滤波,状态量是位置和速度,也就是一个匀速运动模型。每一帧先预测,再做数据关联。

关联时有个细节:我不会只算简单的欧氏距离,而是用预测协方差去算马氏距离来做门控,把离谱的关联直接过滤掉。而且雷达有点云特有的多普勒速度,所以在人车密集时,我还会把径向速度一致性加进去。(特别密集的场景,我会上匈牙利算法做全局的一对一匹配)。

关联上就做更新。没关联上的航迹不会直接删,而是进入滑行状态,靠预测再撑几帧。

另外,新出现的量测我不会马上当真,而是先建一个暂定航迹,用 M/N 逻辑连续命中几帧,才升级为确认航迹,这样能防住单帧杂波带来的假目标。

最后,确认航迹如果连续好几帧都没匹配上,超过阈值才彻底销毁。整套参数其实就是在误检、漏检、响应速度和ID稳定性之间找平衡。”

面试官问“四五个人的时候怎么调”,你应该怎么答

多人场景下我首先会关注两个问题,一个是DBSCAN聚类粘连,另外一个是目标交叉时的数据关联导致ID切换。

聚类这边,如果两个人靠得比较近,DBSCAN的半径设置过大,很容易把两个目标聚成一个cluster;但如果半径太小,又会把一个人体拆成多个cluster。所以我会结合雷达距离和角分辨率去调邻域半径和最小点数,一般我设置3m左右的邻域半径是0.35,5m是0.37这样的一个关系表。这个关系是我通过收集大量的某个位置的数据帧,计算他们的临近距离,然后取百分之90的数据都小于某个距离得到的。

聚类完成以后,真正容易出问题的是两个人交叉或者靠得很近时的关联。单纯按照位置最近容易发生ID Switch,所以我会先用EKF预测下一帧的位置,然后用预测协方差构造马氏距离门限做gating,把明显不可能的measurement提前过滤掉,再在候选目标里面做一对一关联。如果场景比较密集,可以从简单Nearest Neighbor进一步升级到GNN/Hungarian,甚至JPDA。

雷达本身还有Doppler,所以除了位置,我还可以把径向速度一致性作为关联特征。比如两个人位置比较接近,但是速度方向明显不一样,通过Doppler可以降低关联错配的概率。”

image-20260925152253353

image-20260925152534470

我不是针对每个场景单独手工调一套参数,而是先根据AWR1843的点云特性给出一个初始范围,再通过不同距离实测做标定。人体场景我一般从0.3到0.6 m左右的邻域半径开始,最小点数先设3。

因为目标距离增加以后Radar点云会越来越稀疏,所以我不会全距离固定一个eps,而是让它和range建立一个简单关系。例如我实验里可以从 (\varepsilon=0.30+0.015R) 开始,然后限制在0.35到0.7 m范围。这样5 m大约0.38 m,10 m大约0.45 m,20 m大约0.6 m。

参数不是拍脑袋定的。我会分别采3、5、10、15 m的单人数据,统计同一目标内部点间距,再采两个人靠近的数据统计不同目标间距离,希望eps大于同一目标内部大部分点间距,同时小于两个目标之间的典型间距。

另外1843有Doppler信息,所以多人靠得比较近时我不会只看XY距离,还会增加径向速度一致性,例如人体可以先把速度差门限放在0.8 m/s左右,再根据实测调整。

如果是汽车,参数尺度会更大。TI自己的AWR1843汽车demo里,对car-like object使用过1.7 m、minPoints=3的DBSCAN参数,MRR配置甚至会到2.5 m,所以不同目标类别本身就应该有不同的聚类尺度。最后这些参数我会结合漏聚类率、两个目标粘连率以及后端ID Switch情况一起确定,而不是只看某一帧聚类好不好

  • 点云的输出维度

主要是输出[x,y,z,多普勒速度],其中这个SNG是二维cfar检测后计算出来的能量。

  • DBCAN的原理解释

DBSCAN是一种基于密度的聚类算法,主要有两个参数:邻域半径 eps 和最小点数 minPts。对于每个点,算法统计其 eps 邻域内的点数。如果点数大于等于 minPts,该点被认为是核心点;不满足核心点条件,但位于核心点邻域中的点属于边界点;既不属于核心点,也不在核心点邻域中的点被认为是噪声

选择DBSCAN是因为它不需要提前指定目标数量,能够识别不规则形状的点云,并且可以直接将孤立点标记为噪声,比较符合毫米波雷达点云稀疏、目标数量动态变化和虚警较多的特点

  • EKF KF UKF的区别

KF主要用在线性系统,而我这个是非线性,其次就是UKF的计算量很大。

image-20260727171423278

自己补充:

1.预处理具体过滤哪些点

1.主要是滤除无限大的异常点 2.滤除欧式距离range = sqrt(x² + y² + z²)太近(最近0.2m)或者太远(10m)的,和距离高度不正常的点云(Z 高度过滤可以去除地面杂波、天花板反射、安装结构反射和明显不符合目标高度的点。)。3.离线回放的时候还要严格限制x/y的距离,限制在一定的ROI中。

为什么过滤过近或者过远的点?

过近的点:过近点通常处于雷达近场区域,容易受到发射泄漏、天线耦合、安装支架、机身结构和近距离多径反射影响。它们的坐标和速度稳定性较差,容易形成虚假聚类。

过远的点:最大距离门限不是雷达的物理最大探测距离,而是当前应用场景的有效感知范围。距离越远,点云通常越稀疏,角度误差对应的横向位置误差越大,检测稳定性也会下降。

为什么是三维的欧式距离,不是平时的x距离?

这里计算的是点到雷达坐标原点的三维直线距离,适合做以雷达为中心的球形距离门限。

2.DBSCAN流程

首先输入的是毫米波的点云数据,用的是BEV的平面聚类,只用x,y的数据,z的数据不用。eps邻域半径设置为0.45m,,如果a和b距离小于0.45那就是邻居,b和c也小于0.45也是邻居,最后abc都输入一个蔟。min_sample表示一个邻域内至少有多少个点才被认为是核心点。

  • 如果它还没有访问,就访问它;
  • 再次查询它的邻域;
  • 如果它的邻居数量也达到 min_samples,说明它也是核心点;
  • 将它的邻居继续加入扩展队列;
  • 如果该点原来被标记为噪声,则重新归入当前 cluster;
  • 最终所有密度可达的点都被归入同一个 cluster。

输出:聚类完成后,我再通过 min_cluster_points=2 和 max_cluster_points=80 删除过小或过大的异常簇,同时计算每个簇的质心和,包围盒,点数等。

质心计算:

centroid_x = 所有点 x 的和 / 点数
centroid_y = 所有点 y 的和 / 点数
centroid_z = 所有点 z 的和 / 点数
  1. 为什么 eps 太大会把两个目标粘在一起?

DBSCAN 具有链式连通性,只要两个目标之间存在一串间距小于 eps 的点,就可能被合并。应结合距离自适应 eps、速度差、方位角分辨率和最大包围盒尺寸进行约束。

  1. 为什么远处目标更容易被拆散?

角分辨率对应的横向间距会随距离增加,远处点更稀疏;固定 eps 对近处可能过大,对远处又可能过小。可令 eps 随距离增加,或在极坐标中按量测协方差进行聚类。

  1. 如何判断一组聚类参数更好?

不能只看 RViz。应在标注 bag 上统计目标过分割、误合并、漏聚类、虚假聚类、质心误差和处理时延,并按距离区间分别评估。最终还要看下游 ID switch、轨迹连续率和速度误差,因为聚类是为跟踪服务的。

总体的流程和讲解

image-20260827211109778

协方差数学:

image-20260828140318803

KF的说明

image-20260828140407530

解释p0,第一次预测的x,y是获取DBSACN聚类后的目标的x,y值,速度直接先设置为0。其次就是0.25值得是方差,而不是标准差,这个p0的意思就是我对距离有大约0.5m左右的标准差,就是这个值为什么浮动0.5m左右的意思。

首先4次方是源于距离=1/2at平方,因此这个位置就是1/4的t的四次方,三次方是因为他是收到距离和加速度影响,2次方加自己的一次方所有是三次方。

代码EKF流程

image-20260828140432511

image-20260828140503162

数据关联

image-20260828140525079

如何调试参数

  • 我实际调参主要集中在三个部分,第一个是运动模型,第二个是过程噪声Q,第三个是测量噪声R。

  • 我的项目里面采用的是二维CV模型,状态量是[x,y,vx,vy],因为毫米波雷达输出的目标点云主要是位置和速度信息,所以第一版选择匀速模型。

  • 其中Q主要描述目标运动模型的不确定性,比如实际目标存在加速、减速、转弯等情况,而我的模型是假设匀速,所以需要通过Q调节模型适应能力。

  • R主要描述雷达测量误差,因为毫米波雷达点云存在一定的位置抖动,所以需要根据实际数据调整。

  • 调整的时候我主要观察滤波输出轨迹,比如Q增大以后,滤波器会更加相信测量值,对目标机动响应更快,但是轨迹可能变得抖动;R增大以后,会更加相信预测模型,轨迹更平滑,但是响应会变慢(要计算)。

  • 信预测(Q小 R大):1.轨迹平滑 2.缺点就是响应慢 (多急停,加速度变化,也要提高Q)

  • 信测量(Q大,R小):1.响应快 2.点云抖动

Q里面q为什么设置0.8²

q表示过程噪声强度,和目标加速度的不确定性有关。我根据实际目标运动情况设置一个初始值。如果目标机动性更强,例如车辆急加速或者转弯,需要提高q;如果目标运动比较稳定,可以降低q。

你这里R=0.0625怎么来的

这个初始值是根据实际雷达点云的位置误差进行经验估计的,因为R对应测量误差方差。例如假设x/y方向标准差约0.25m,那么方差就是0.25²=0.0625。后续通过外场数据观察残差分布进一步调整。

有没有用其他的运动模型

我第一版采用CV模型,因为项目主要验证雷达点云聚类和跟踪链路,目标主要是低速运动目标,CV模型计算量小,而且参数容易收敛。

但是在实际车辆场景中,如果存在急加速、急转弯等机动行为,CV模型预测误差会增加。因此进一步可以考虑CA模型处理加速度变化,或者针对车辆运动采用CTRV模型(恒定转向率和速度模型)。如果目标运动模式变化较大,可以采用IMM框架融合多个模型。

低机动场景CV够,高机动车辆建议CA/CTRV,复杂场景使用IMM。

[x,y,v,θ,ω] θ=航向角 ω=转向角速度

为什么用马氏距离

我使用马氏距离进行数据关联,是因为它能够同时考虑轨迹预测协方差和雷达测量噪声。普通欧氏距离只能反映两个位置的几何差异,无法区分不同方向和不同置信度下的误差。我的代码通过 S = H P_pred Hᵀ + R 得到残差协方差,再计算 **d² = rᵀS⁻¹r**,并使用 gating_mahalanobis=5.99 进行门控。这样轨迹预测不确定时关联范围可以适当放宽,预测稳定时则更加严格。

image-20261026151009048

image-20260828141405999

马氏距离有什么缺点?需要付出什么代价?

第一,依赖协方差矩阵的准确性。

第二,计算量比欧氏距离大。

第三,对协方差矩阵的数值性质有要求。

例如协方差矩阵接近奇异时,直接求逆可能出现数值不稳定。

另外,当噪声不符合假设的分布、存在明显离群值时,传统马氏距离关联也可能不够鲁棒。

协方差矩阵是怎么得到的?

image-20261026151321493

五.k-radar项目

kradar的数据格式

该雷达的参数:

参数K-Radar
RadarRETINA-4ST
工作频段77–81 GHz
最大距离118 m
距离分辨率0.46 m
Doppler分辨率0.06 m/s
方位角分辨率1°
俯仰角分辨率1°
方位FOV107°
俯仰FOV37°
帧率10 FPS
4D Tensor64×256×107×37

关于几发几收?

但我查过K-Radar公开资料,它没有直接披露底层Tx/Rx天线配置。因为数据集给的是已经完成雷达前端处理之后的4D Tensor,而不是多通道Raw ADC

**一辆车 / 一个人,一帧到底多少个“点”?**点云密度的时候

原始K-Radar不是点云,因此不存在官方固定的一辆车多少点。我的网络使用的是由Radar Cube进一步稀疏化后的Sparse Radar Cube,这时一辆车产生多少有效点会跟距离、姿态、RCS以及稀疏化阈值有关,这个官方的设定一般的过滤百分之90,留下百分之10的强反射区域。

你项目里的输入到底是 Point Cloud、Radar Cube 还是BEV?

我的网络输入不是原始4DRT,也不是已经生成好的BEV图,而是从Radar XYZ Cube中经过高功率筛选得到的Sparse Radar Cube,可以看成带有x、y、z、power以及可选Doppler信息的稀疏雷达点。然后我再做voxelization和SparseConv,最后在网络内部把3D feature转换成BEV feature。

image-20260924104744898

我们用的数据是下面这个形式,就是每个平面空间都有雷达power。

image-20260924104924593

我在 Radar-only 项目中主要没有直接把完整4D Tensor送进网络,而是使用预处理后的 ZYX Radar Cube,再通过功率阈值或 quantile 稀疏化得到 [x,y,z,power] 或带 Doppler 的稀疏雷达数据。

项目整体解析

简单介绍:这个项目是基于K-Radar数据集完成的Radar-only 3D目标检测和端侧部署项目。整个流程首先对毫米波雷达点云进行ROI筛选和体素化,然后使用Simplified PointNet编码体素内部点特征,再通过spconv构建稀疏3D卷积Backbone(主干网络)提取空间特征,之后将3D特征压缩到BEV空间,最后使用Anchor-based( 基于锚框的目标检测)检测头完成目标分类、3D框回归和方向预测。

在训练侧,我基于PyTorch完成了训练、验证、Checkpoint管理,以及裁剪和混合精度微调。

后面主要工作是在Jetson Orin Nano Super上进行迁移部署,因为spconv并不能像普通CNN一样直接完整转换TensorRT,所以我采用了spconv Backbone、TensorRT AnchorHead和CUDA NMS(使用CUDA在GPU上实现NMS)组成的混合推理链路,并进一步做了FP16、BN Folding、Sparse ReLU融合以及GPU Buffer复用,最终把推理速度从3.48 FPS提升到了12.54 FPS。

image-20260829151838339

image-20260829151908239

image-20260829151916281

image-20260829151935561

image-20260829151956372

你的3D检测网络叫什么参考了什么?

  • 我的整体3D检测方案参考了 PointPillars 这类成熟3D检测框架的思路,同时包括点/体素特征编码、多尺度Neck做特征融合和Anchor-based Head。整体思路是把稀疏Radar measurement先进行体素化,在每个voxel内部通过简化的PointNet做点特征编码,然后用3D Sparse Convolution提取空间特征,再转换成BEV,通过多尺度Neck做特征融合,最后使用Anchor-based Head完成分类和3D框回归。

  • 和PointPillars比较明显的区别是,PointPillars在比较早的阶段就把点云组织成Pillar并转换到BEV,后面主要做2D卷积;我的方案保留XYZ三维voxel结构更久,在3D SparseConv阶段显式提取高度方向的信息,最后才投影到BEV,所以高度特征不会在前处理中就直接丢掉。”

  • 我自己主要做了三块:第一是把 K-Radar 的 Sparse Radar 数据链路和 voxel feature encoding 跑通;第二是围绕训练参数、数据增强、anchor匹配和稀疏化方式做实验和分析;第三是部署,尤其是 SparseConv 不能直接完整转 TensorRT,所以我做了 PyTorch/spconv + TensorRT Head 的混合推理,并进一步做 FP16、显存和数据搬运优化。

================================================================================================
                                      PointPillars 整体架构框图
================================================================================================

【输入层】
  ┌──────────────────────────────────────────────────────────────┐
  │  原始雷达/激光雷达点云 (Raw Point Cloud)                       │
  │  数据维度: [N, 4]  (x, y, z, 反射强度r)                        │
  └──────────────────────────────┬───────────────────────────────┘
                                 │
                                 ▼
【预处理阶段:柱体化 (Pillarization)】
  ┌──────────────────────────────────────────────────────────────┐
  │  1. 在X-Y平面划分网格 (无限高的柱体 Pillar)                    │
  │  2. 将点云分配到各个柱体中,每个柱体最多保留 N 个点             │
  │  3. 输出张量: [D, P, N]                                       │
  │     (D=9 特征维度, P=非空柱体数量, N=每柱最大点数)              │
  └──────────────────────────────┬───────────────────────────────┘
                                 │
                                 ▼
【第一阶段:Pillar Feature Net (PFN) —— 核心创新点】
  ┌──────────────────────────────────────────────────────────────┐
  │  输入: [D, P, N]                                             │
  │                                                              │
  │  步骤1: 特征增强 (Feature Augmentation)                       │
  │         ┌────────────────────────────────────────────┐       │
  │         │ 原始特征: (x, y, z, r)                      │       │
  │         │ 增强1: 相对柱体中心偏移 (xc, yc, zc)        │       │
  │         │ 增强2: 相对柱体均值偏移 (xp, yp)            │       │
  │         │ 最终维度 D = 9                              │       │
  │         └────────────────────┬───────────────────────┘       │
  │                              ▼                               │
  │  步骤2: 简化的 PointNet                                       │
  │         ┌────────────────────────────────────────────┐       │
  │         │ 多层感知机 (MLP)                            │       │
  │         │ 批归一化 (BatchNorm) + ReLU                 │       │
  │         │ 最大池化 (Max Pooling) 沿 N 维度            │       │
  │         └────────────────────┬───────────────────────┘       │
  │                              ▼                               │
  │  步骤3: 生成伪图像 (Pseudo-Image)                             │
  │         ┌────────────────────────────────────────────┐       │
  │         │ 将每个柱体的特征向量散射回原X-Y位置         │       │
  │         │ 输出伪图像张量: [C, H, W]                   │       │
  │         │ (C=特征通道数, H=网格高, W=网格宽)          │       │
  │         └────────────────────┬───────────────────────┘       │
  └──────────────────────────────┼───────────────────────────────┘
                                 │
                                 ▼
【第二阶段:Backbone (2D CNN 主干网络)】
  ┌──────────────────────────────────────────────────────────────┐
  │  输入: 伪图像 [C, H, W]                                       │
  │                                                              │
  │  ┌───────────────────────┐      ┌───────────────────────┐    │
  │  │ 自顶向下路径 (Downsample)│─────▶│ 自底向上路径 (Upsample)│    │
  │  │ (类似ResNet的卷积块)    │      │ (类似FPN的特征融合)    │    │
  │  └───────────────────────┘      └───────────┬───────────┘    │
  │                                              │               │
  │  输出: 多尺度融合特征图 (Multi-scale Feature Map)              │
  └──────────────────────────────┬───────────────────────────────┘
                                 │
                                 ▼
【第三阶段:Detection Head (检测头 - SSD)】
  ┌──────────────────────────────────────────────────────────────┐
  │  输入: 多尺度特征图                                            │
  │                                                              │
  │  对特征图每个网格位置进行密集预测:                              │
  │  ┌────────────────────────────────────────────────────────┐  │
  │  │ 1. 类别分类 (Classification) -> 车/人/自行车            │  │
  │  │ 2. 3D边界框回归 (Box Regression) -> (x, y, z, l, w, h, yaw)│  │
  │  │ 3. 方向分类 (Direction Classification) -> 朝向角修正    │  │
  │  └────────────────────────────────────────────────────────┘  │
  └──────────────────────────────┬───────────────────────────────┘
                                 │
                                 ▼
【输出层】
  ┌──────────────────────────────────────────────────────────────┐
  │  最终的 3D 目标检测结果 (3D Bounding Boxes + 类别 + 置信度)     │
  └──────────────────────────────────────────────────────────────┘

Anchor-based Head的工作机制

我的3D框采用Anchor-based预测。每个目标最终用 (x,y,z,l,w,h,yaw) 七个参数表示。训练时先在BEV上预设不同尺寸和朝向的3D Anchor,再通过Anchor和GT之间的IoU进行正负样本匹配。网络本身并不是预测IoU,而是分别输出类别概率、Anchor相对于GT的7维回归残差以及方向信息。推理时把这些残差decode成实际3D框,再通过score threshold和NMS得到最终检测结果。

模型最后的指标怎么样

image-20260925144234872

RTNH的3D AP大约47.44%,BEV AP大约58.39%。作为对照,不保留完整高度信息的RTN,3D AP大约40.12%,BEV AP大约50.67%,所以3D SparseConv保留高度信息以后大概提升了7个百分点。AP具体是先用IoU判断预测框和GT是否匹配,再根据不同confidence threshold得到Precision和Recall,形成PR曲线,曲线下面积就是AP。这里BEV AP只评价俯视平面的框,而3D AP还考虑z和高度,因此通常3D AP会低于BEV AP。

迁移学习怎么样做的?

“严格来说,我这里做的更准确地叫加载预训练权重进行微调,还不算真正意义上的跨数据集、跨雷达迁移。

我一开始是直接在自己选取的一个较小的 K-Radar 数据子集上,从随机初始化开始训练 RTNH。这个时候我发现几个比较明显的问题:第一是模型收敛比较慢,训练初期分类损失和框回归损失都比较高;第二是验证集上的检测结果不稳定,误检比较多;第三是因为我使用的数据量比较小,模型比较容易把训练数据本身学得比较好,但泛化到验证集以后效果并不好。

后来我没有再让网络从随机参数开始训练,而是加载 K-Radar 官方已经训练好的 RTNH 预训练权重。也就是说,网络的三维稀疏卷积主干、BEV 特征提取以及检测头,都从已经训练过的一组参数开始,而不是从零开始。

这样做的原因是,官方预训练模型已经在比较大规模、不同天气和不同场景的 K-Radar 数据上训练过,它实际上已经学习到了一些比较基础而且稳定的雷达空间特征,比如目标在稀疏雷达数据中的空间分布、三维体素特征、不同尺度的 BEV 特征,以及三维框回归的一些先验。因此我自己的小数据集不需要重新从头学习这些基础特征,而是在已有模型的基础上继续调整。

在微调阶段,我主要做了几件事情。首先是把学习率调低,因为预训练模型本身已经处于一个比较好的参数位置,如果学习率还像从头训练时那么大,很容易把原来已经学到的有效特征破坏掉。所以微调阶段我会用更小的学习率,让网络参数进行比较小幅度的更新。

第二,我当时没有只训练最后的检测头,而是采用了全网络微调。因为我使用的还是 K-Radar 数据,输入形式、目标类别和网络结构都没有发生特别大的变化,所以没有必要把前面的主干网络完全冻结。我希望前面的稀疏卷积特征和后面的检测头都能根据当前数据继续做一定程度的调整。

第三,在训练过程中我还加入了旋转等数据增强。这里需要区分一下:加载预训练权重才是迁移和微调的核心,数据增强本身并不属于迁移学习。 数据增强只是微调阶段为了提高模型泛化能力采用的一种训练手段。

最后我主要通过训练损失和验证集 AP 来判断微调效果。如果训练损失逐渐下降,同时验证集 AP 上升并趋于稳定,说明微调是有效的;如果训练损失还在下降,但是验证集 AP 开始下降,就说明可能出现了过拟合。

训练

如何判断已经收敛?

  • rain loss 持续下降后逐渐趋于平稳
  • 验证集上的 mAP 基本稳定(模型在特定 IoU 评价标准下,各类别 Precision-Recall 曲线对应 AP 的平均值)
  • 连续几个 epoch 指标提升非常小

模型具体在哪个 epoch 收敛其实没有一个固定值,我主要会结合训练集 Loss 和验证集指标判断。训练前期 Loss 通常下降比较快,后期如果 Loss 下降幅度已经很小,同时验证集上的 mAP、Recall 等指标连续多个 epoch 基本不再提升,我会认为模型已经进入收敛阶段。

为什么训练一开始 Loss 下降很快,后面越来越慢?

训练初期的时候模型的参数离最优解比较远,因此梯度更新比较大,模型的参数更新就会很明显,因此loss就会很大的下降。

Loss 震荡、不收敛是什么原因?

  • 学习率太大:一步跨过最优点,来回震荡。
  • Batch Size 太小:每个 batch 的数据差异太大,梯度噪声大。
  • 数据或标签有问题:比如 GT 框错误、类别标注错、坐标系错。
  • Loss 各项权重不合理:比如分类 loss 和回归 loss 差几个数量级。
  • 梯度爆炸:更新量突然非常大。

训练集 Loss 降,验证集 Loss 升是什么原因?

一般出现这种情况就是出现了过拟合的现象,对训练数据拟合的越来越好,但是泛化能力很差。我会尝试的方法就是:

  • 权值衰减(对更新较大的权值进行一定的惩罚)
  • Dropout的方法(随机删除一些神经元,增加泛化能力)
  • 数据增强
  • 其次还要检查训练集和验证集的划分是否合理

Batch Size 怎么调?

Batch Size 我一般会在显存允许范围内尽量选择比较合适的值。太小会导致梯度噪声比较大,训练震荡;太大会占用较多显存,而且可能影响泛化能力。我会结合显存占用、训练稳定性和验证集效果综合调整。

训练多少个 Epoch 是怎么定的?

Epoch 通常设置一个上限,真正训练多少轮主要通过验证集判断。

Epoch 一般先根据原项目或者经验设置一个较大的上限,然后结合 validation loss 和 mAP 判断。如果验证集指标连续多个 epoch 基本没有提升,就认为模型已经基本收敛,可以通过 Early Stopping 提前结束训练。

Adam 和 SGD 有什么区别

SGD 主要按照当前梯度方向更新参数,通常配合 Momentum 使用。Adam 同时利用梯度的一阶矩和二阶矩,对不同参数自适应调整更新步长,因此一般前期收敛更快,对学习率没有 SGD 那么敏感。不过 SGD 调参合适时往往有不错的泛化能力。

image-20260829153226177

image-20260829153349614

image-20260831203701678

推理

ONNX 和 Tensor RT的概念:

image-20260831111730237

image-20260831112217497

image-20260831112250047

image-20260831112459637

执行的顺序

PyTorch FP32
   ↓
ONNX FP32
   ↓
TensorRT FP32
   ↓
TensorRT FP16


image-20260831112557038

1.混合推理模型:前面稀疏卷积的部分因为不是标准的算子,无法直接通过onnx转为tensor RT,因此这部分有pytoch+spconv直接实现。

其次就是后面的部分是dense 的卷积因此可以直接用onnx转化为标准的tensor RT。(因为 SparseConv3d 和 SubMConv3d 不只是做普通的三维卷积计算,它们还需要维护非空体素的位置索引,建立输入体素和输出体素之间的卷积对应关系,并根据这些对应关系完成特征的读取、计算和写回。这一整套稀疏计算流程不是标准 ONNX Conv 算子能够直接描述的,因此不能像普通 3D 卷积一样直接转换成 TensorRT)。

非空体素的位置索引:就是空间中哪个位置有多少个

image-20260829160904585

建立输入体素和输出体素之间的卷积对应关系:普通的卷积他会将9个位置都要参与计算即使这些位置都是0,那么这个网路要计算的就会大。而稀疏卷积的话,他知道哪些位置是不存在的不参与计算,而不是设置为0这么简单,因此可以减少计算量。

(从数学上可以把空体素看成0,所以稀疏卷积和稠密卷积仍然遵循卷积的基本计算思想;区别在实现上,Dense Conv显式保存整个规则网格,而Sparse Conv只保存非空体素及其位置,并通过索引对应关系只计算真正存在的邻域特征,从而跳过大量“0乘权重”的无效运算。)

image-20260829161331912

image-20260829161343382

找到A/B/C之间的关系
        ↓
Indice Pair

真的把A/B/C的Feature取出来
        ↓
Gather

乘各自对应的卷积权重
        ↓
GEMM / Sparse Conv

结果放到C的输出Feature 计算完之后放回哪个位置c的新的特征值
        ↓
Scatter



Radar
  ↓
Voxelization
  ↓
Simplified PointNet
  ↓
SparseConvTensor
  ↓
┌──────────────────────────┐
│ spconv Backbone          │
│                          │
│ SparseConv3d             │
│ SubMConv3d               │
│ SparseConv3d             │
│ SubMConv3d               │
│ ...                      │
└──────────────────────────┘
          ↓
      3D Sparse Feature
          ↓
     Z维压缩 / BEV转换
          ↓
      Dense BEV Feature
          ↓
┌──────────────────────────┐
│ TensorRT AnchorHead      │
│                          │
│ Conv2D                   │
│ Cls Head                 │
│ Box Head                 │
│ Direction Head           │
└──────────────────────────┘
          ↓
      Box / Score / Dir
          ↓
       CUDA NMS

那在其中的BN、ReLU能否直接转化?

BN、ReLU本身是TensorRT标准算子,但它们嵌在spconv的SparseTensor执行链中,而整个SparseConv计算图无法通过普通ONNX完整表达,因此我没有把这一段直接转换成TensorRT。

那有没有办法把整个spconv也做成TensorRT?

TensorRT官方就是用Plugin机制支持原生不支持的自定义算子。但是目前我这个相对比较难而且工程量较大。比如普通的卷积中,输入固定的shape,通过kernel算,输出的shape也是固定的。

输入Shape固定
↓
Kernel算
↓
输出Shape固定

而对于稀疏卷积,首先每帧输入的voxel数量就是不一样的,是一个动态变化的。所以要实现一个动态的算子工作量和算法量非常的大。

Frame 1
N_active = 8000

Frame 2
N_active = 12000

Frame 3
N_active = 6000

混合推理部分如何进行的

我的前半段spconv Backbone仍然运行在PyTorch/spconv上,输出的BEV Feature本身已经是CUDA Tensor。我没有把它通过 .cpu().numpy() 拷到CPU再交给TensorRT,而是直接获取这个Tensor的GPU地址,通过TensorRT的input binding或者 set_tensor_address 将它作为Engine输入。TensorRT的分类、框回归和方向输出也提前分配CUDA Buffer,Engine直接写入这些GPU内存,然后继续交给CUDA Decode和Rotated NMS处理。这样整个中间数据流都留在GPU上,避免GPU-CPU-GPU搬运和频繁显存申请。

为什么这样做,都在gpu上面

因为BEV Feature本身比较大,如果每帧先从GPU拷到CPU,再转成numpy并重新拷回GPU,会带来明显的数据传输和同步开销,可能抵消TensorRT本身的推理加速。因此我通过GPU指针绑定实现不同推理后端之间的显存直接衔接,同时输出Buffer提前分配并复用,减少动态显存管理开销。

如果面试官问“如何保证PyTorch算完TensorRT再开始

我让PyTorch、TensorRT以及后续CUDA算子尽量使用同一个CUDA Stream,这样可以保证spconv先生成BEV Feature,再执行TensorRT Head,最后执行CUDA NMS。如果使用多个Stream,就需要用CUDA Event(事件组,显式告诉GPU TensorRT必须等spconv完成)显式建立依赖关系。

NMS

57,600 Anchors
      ↓
分类Score
      ↓
阈值过滤
      ↓
TopK
      ↓
最多4096
      ↓
Rotated NMS
      ↓
最多500

Topk:就是保留大于比如设置的阈值0.5的候选框。

NMS:非极大值抑制。就是比如一个目标被很多框选中,那么就有这样的得分:

Anchor A → score 0.95
Anchor B → score 0.91
Anchor C → score 0.87
Anchor D → score 0.76

首先按照置信度排列:

A 0.95
B 0.90
C 0.82
D 0.70

然后计算各自和最高分A的置信度。

IoU(A,B) = 0.80
IoU(A,C) = 0.72
IoU(A,D) = 0.05

B 和 A 高度重叠
→ 删除B

C 和 A 高度重叠
→ 删除C

D 和 A 重叠很少
→ 保留D
NMS全称是Non-Maximum Suppression,也就是非极大值抑制。Anchor-based检测会在BEV空间生成大量候选框,同一个真实目标附近往往有多个Anchor都能得到较高置信度,Decode以后会形成多个高度重叠的检测框。NMS会先保留置信度最高的框,再根据IoU抑制和它高度重叠的低分框,从而去除重复检测。

我的项目做的是带yaw角的3D目标检测,所以BEV中的目标框是旋转矩形,普通Axis-Aligned NMS不能准确计算重叠关系,因此使用Rotated NMS。部署时我又把这一部分放在CUDA上执行,这样TensorRT Head输出后可以直接在GPU完成Decode和NMS,减少CPU-GPU数据搬运。

FP16 对精度有什么影响?

FP16 用更少的位数表示浮点数,模型占用和计算开销通常能下降,但表示范围和数值精度也会变化,所以少数对数值敏感的层可能带来输出偏差。我的项目不是整网直接转 TensorRT:稀疏卷积部分仍在 PyTorch,常规 2D 检测头转 TensorRT。我会用同一验证集,对比 FP32 和 FP16 的检测指标、关键场景误检漏检,再量端到端耗时;只有指标在可接受范围内才使用 FP16。当时我观察到速度从约 6 FPS 到约 8 FPS,但精度变化需要用实际验证结果来描述,不能只说‘感觉影响不大’

其他优化

FP16:压缩数据量,可以压缩一半,在保证准确率的情况下。

BN Folding:讲BN这个操作融入到卷积里面,减少一个算子的开销。

Conv
 ↓
BN
 ↓
ReLU

image-20260831110907122

image-20260831110922562

四.其他

道通的一些

image-20261002142012915

image-20261002142159533

1.雷达点云内存够不够(当时的回答是没有遇到这样的情况)

在实际的开发中毫米波雷达点云数据量非常大,尤其多通道、多 range bin、多 chirp 累积时,每帧点云就可能占用几十到几百 KB。

  • 目前我对于这类数据的做法就是保留需要信息剔除不需要的。比如在做心率呼吸的时候,我就暴露我对应的bin的距离就行,同时只利用最后一个chirp的相位数据就行
  • 其次就是数据处理多利用流水线的PING-PONG处理和一些滑动窗口处理。

2.移植平台的DSP开发有没有不一样

  • 我理解 DSP 开发的底层思想是相通的,比如定点/浮点运算、FFT 加速、DMA 数据搬运,流水线和实时性分析。

  • 不同芯片的 DSP 核、HWA 加速器、EDMA 配置、L2/L3 内存分配、和编译工具链会不一样。所以移植平台时,我不会认为完全无成本,但核心算法和优化思路是可以迁移的。

  • 我觉得一到两周可以熟悉基本开发流程,一个月左右可以比较稳定地参与模块移植和调试。当然如果涉及底层驱动、HWA/EDMA 深度优化,时间会更长一些。

怎么样优化:

如果把算法部署到资源受限的 MCU 或 DSP,我首先会做 profiling,确定主要瓶颈是在计算量、内存还是数据搬运,而不是直接开始优化。

算法层面首先做裁剪,例如只保留后续需要的 Range Bin、降低不必要的 FFT 点数或者减少复杂算法的矩阵维度;数值计算上,如果芯片浮点性能较弱,可以把 float 改成 Q15/Q31 定点,并做好缩放、饱和和误差验证。

内存方面会采用 Buffer 复用、in-place计算和流式处理,尽量避免保存整帧中间结果;数据搬运方面使用 DMA 和 ping-pong buffer,让采集和算法计算并行。

如果芯片支持 DSP/SIMD、厂家 DSP 库或者 FFT/HWA 加速器,我会优先利用这些硬件资源。另外像 sin、cos、twiddle factor 等重复计算可以通过 LUT 减少计算开销。

数学基础

傅里叶级数:主要描述的是周期信号,描述一个周期信号是由一些列的离散频率成分组成。

傅里叶变化:主要是描述非周期信号,他的频谱是连续的。傅里叶变换可以看成周期趋向无穷大以后傅里叶级数的极限形式

SNG信噪比

信号功率/噪声功率 .

image-20260922104102278

六.通用类型

假如3年之后,你觉得自己应该做到什么水平,然后薪资应该到什么层次?

分析:考察你有没有目标,目标是否可以实现?是不是适合长期的培养

原来回答:希望三年能真正做出一个产品,拿到业务后能快速分析问题,从算法链路找到解决方式。

我觉得三年时间,我希望自己能够从一个执行算法开发的人,成长为可以独立负责一个毫米波雷达产品或者项目的人。

具体来说,第一阶段我希望把毫米波雷达完整链路真正掌握,包括从芯片平台、ADC数据处理,到Range FFT、Doppler FFT、CFAR检测、目标跟踪以及后续AI算法应用,不只是会调用算法,而是遇到问题能够定位原因。

第二阶段,希望能够结合具体产品场景,比如人体感知、生命体征或者智能设备应用,能够独立完成算法设计、数据采集、参数优化和产品落地。

三年之后,我希望自己具备比较强的问题分析和工程落地能力,能够负责一个模块甚至一个小项目。

薪资方面:

薪资方面,我觉得还是跟个人能力和公司的发展匹配。我希望三年之后自己的技术能力能够达到一个比较成熟的算法工程师水平,如果能够独立负责项目,我相信薪资也会随着能力提升达到行业正常水平。如果按照行业情况,我希望年薪能够达到30万左右,同时我也重视技术成长和能够负责有价值的项目。

为什么选择我们公司

image-20260920131236751

image-20260920131329535

广东人为什么不选择深圳之类,去其他地方

我虽然是广东人,但是我对于工作的地域限制没有特别强。我选择城市主要还是看岗位方向和技术成长机会。

我目前希望发展的方向是毫米波雷达算法和智能驾驶感知,而武汉在汽车产业和智能驾驶研发方面也有比较好的产业基础。另外我也希望能够到一个新的环境中锻炼自己,所以对于武汉这样的城市我是可以接受的。

其次一个个人原因就是虽然我是广东人,但是我可能刻板印象是广东人都想留在广东,但是我其实是想待在外面的。就是我父母太关心我了,感觉自己需要一点空间。

薪资范围

结合我的学历背景、实习经历以及毫米波雷达相关项目经验,我期望税前月薪大概在15K左右。当然我也比较看重岗位匹配度、技术成长空间以及公司的培养体系,如果公司的整体薪酬体系有对应标准,我也愿意进一步沟通。

有没有offer?

目前确实有几家公司在流程推进中,主要方向也是毫米波雷达、智能驾驶感知相关岗位。不过我更关注岗位匹配度和技术发展,希望能够选择一个和自己长期方向一致的平台。

image-20260528151556961

image-20260528151245983

image-20260601150350768

(14)波束形成的各种算法对比 DOA算法的各种对比和分析

雷达方程

雷达方程表达形式:

image-20260601150915284

代表:

image-20260603125551345

image-20260603130308991

image-20260528151556961

中频正交采样

概念:对雷达混频后的中频 IF 信号进行 I/Q 两路采样,得到复数信号 I+jQI,保留幅度和相位信息,方便后面做距离 FFT、速度 FFT 和角度估计。

image-20260609145614378

实采样做 FFT 后也能得到频点相位,但由于实信号频谱是正负频率共轭对称的,所以存在频率符号歧义,不方便区分正负多普勒,也就是目标靠近还是远离。

I/Q 正交采样得到的是复数信号,相当于同时采到同相分量和正交分量,可以表示信号在复平面上的完整旋转。可以通过区分他的旋转方向来确定物体是原理还是靠近。

静态杂波滤除

现象:静态杂波滤除就是去除雷达回波中长期不变的背景反射,比如墙面、地面、护栏、天线泄漏和 DC 偏置。

常用方法有慢时间均值相消、帧间差分、滑动背景估计、MTI 高通滤波,以及在 Range-Doppler 图上抑制零多普勒 bin。

静态杂波在多帧或多个 chirp 中变化很小,相当于 DC 或低频分量,减均值或高通滤波后会被压制,而动态目标因为相位和幅度随时间变化,会被保留下来。

针对一个距离bin:

image-20260610143258531

image-20260610143320227

滑动背景估计:系统会维护一个背景模型,认为长期稳定存在的东西是背景。每来一帧,就更新一点背景,然后用当前帧减去背景。这样墙壁、地面这类长期存在的静态反射会被滤掉

如果是路上的静止车辆或者行人:

image-20260610143035129

image-20260610143113801

脉冲雷达与连续波雷达区别

面试话语:

image-20260612110035073

相参积累和非相参积累

概念:相参积累是对复信号进行相干叠加(保留幅度 + 相位),可以提高SNR;非相参积累是对幅度或功率做叠加,不利用相位信息,只能提高检测稳定性,不能像相参那样线性提升SNR。

相参应用:

  • 同一 range bin 在多个 chirp 上 FFT / Doppler / DOA

image-20260618144032259

非相参:

CFAR后融合 / 多帧稳定

集合毫米波心率呼吸算法说一下:

优化1:对三通道做非相干累加来确定距离bin

优化2:对各个通道的距离bin的相位数据做相干累加。

程序会先选出质量最高的通道作为参考通道,再计算其他通道与参考通道的相关性。如果某通道和参考通道明显负相关,就把它乘以 -1,做符号翻转,如果某通道和参考通道相关性太弱,则降低它的权重。

聚类算法

image-20260624120056365

DBSANC

eps:邻域半径 minPts:邻域内最少点数

DBSACN流程

  1. 遍历所有点
  2. 对每个点查找 eps 邻域内的点
  3. 如果邻域点数 >= minPts,就创建/扩展一个簇
  4. 从核心点继续向外扩展,把密度相连的点都加入同一个簇
  5. 最后剩下无法归类的点标记为噪声

image-20260624115021570

image-20260624115052430

欧式聚类

两个点距离小于阈值,就认为它们属于同一个目标。它的缺点是距离阈值不好选,近距离目标容易合并,远距离目标容易被拆开

栅格/连通域聚类

将雷达点云投影到2维平面,将临近点云的格子认为是同一目标。同时在这个二维平面也会切割成小块,来确定点云是否落在里面。

image-20260624125805033

image-20260624120432557

关联算法

最近邻算法:根据距离的远近来预测物体和前面帧之间的关联性。

image-20260625113537729

匈牙利算法:

在多目标跟踪中的作用主要是确定在连续的帧之间,哪个目标对应哪个目标,以保持对目标的连续追踪。

代价矩阵:

image-20260625115250064

DOA角度

image-20260626113537305

image-20260626130247855

经验分享

薪资谈判:

image-20260105210203014

你谈了才有,不谈就没有了。

3:公司大概给多少,大概知道多少。风哥知道多少,这个要采集上面的多少。

image-20260105211428468

image-20260105211725312

领域活跃可以很好调,1年1次都可以。

未上市公司:招股书 港股交易所 https://www.hkexnews.hk/index.htm

上市:审计的财报

12134324324