雷达信号处理链:ADC采样、距离FFT、多普勒FFT、CFAR检测

各位同学,今天我们来聊聊雷达信号处理链的核心环节。说实话,这部分内容我做了十几年,每次带新人时都会反复强调——这是毫米波雷达的「灵魂」所在。你想想看,天线接收回来的原始信号,就像一团乱麻,我们要通过这四步把它理清楚:ADC采样、距离FFT、多普勒FFT、CFAR检测。

我个人习惯把这四个步骤比作「剥洋葱」。一层层剥开,才能看到真正的目标。好,我们开始。

1. ADC采样:从模拟到数字的第一步

ADC采样,说白了就是把天线接收到的连续模拟信号,变成离散的数字信号。这一步看似简单,但坑特别多。

采样率的选择是个大学问。根据奈奎斯特定理,采样率至少要是信号最高频率的两倍。但实际项目中,我一般会留出20%~30%的余量。为什么?因为滤波器不是理想砖墙,会有过渡带。

关键参数速查表

参数典型值说明
采样率 (Fs)10~40 MHz取决于中频带宽
采样位数12~16 bit越高动态范围越大
采样点数64~512影响距离分辨率

我在项目中遇到过一个问题:采样位数选低了,导致小目标完全淹没在量化噪声里。后来换成14位的ADC,效果立竿见影。嗯,这里要注意——采样位数每增加1位,动态范围提升约6dB。

实战技巧:ADC采样前一定要加抗混叠滤波器。我曾经偷懒没加,结果镜像频率混进来,距离维上出现了「鬼影」目标。排查了整整两天才找到原因。

2. 距离FFT:把时间差变成距离

ADC采样完成后,我们得到的是时域信号。但雷达想知道的是——目标在哪儿?这就需要做距离FFT。

原理其实不复杂。发射信号和回波信号之间存在时间差,这个时间差在频域上表现为一个频率偏移。做一次FFT,就能把这个频率偏移提取出来。

// 距离FFT的典型实现(伪代码)
for each chirp:
    // 对每个chirp的采样点做FFT
    range_fft(chirp_samples, N_fft)
    // 取模得到幅度谱
    range_profile = abs(fft_result)
    // 存储到距离-多普勒矩阵
    rd_matrix[chirp_idx][:] = range_profile

距离分辨率由带宽决定:ΔR = c / (2B)。比如带宽4GHz,分辨率就是3.75cm。这个公式我建议你背下来,面试经常考。

我个人习惯在距离FFT之前先加窗。不加窗的话,旁瓣会很高,强目标旁边的弱目标根本看不见。汉明窗、布莱克曼窗我都试过,汉明窗是性价比最高的选择。

避坑指南:我曾经在项目中直接用原始数据做FFT,结果距离维上出现了很多假峰。后来发现是直流分量没去除。记得先做直流偏置校准,或者用高通滤波器把直流分量滤掉。

3. 多普勒FFT:测速的关键一步

距离FFT做完,我们知道了目标在哪儿。但目标在动吗?速度是多少?这就需要多普勒FFT。

多普勒FFT是在慢时间维上做的。什么意思?你发射了N个chirp,每个chirp做完距离FFT后,在同一个距离门上,沿着chirp方向再做一次FFT。这样就能提取出多普勒频率,进而算出速度。

速度分辨率取决于帧周期:Δv = λ / (2T_frame)。帧周期越长,速度分辨率越好。但帧周期太长,运动目标会跨距离门,这就是所谓的「距离走动」问题。

多普勒FFT的关键参数

  • chirp数量:一般64~256个,越多速度分辨率越好
  • 最大不模糊速度:v_max = λ / (4T_chirp)
  • 速度分辨率:Δv = λ / (2 * N_chirp * T_chirp)

我记得有一次做车载雷达测试,一辆自行车从雷达前面经过,速度显示是负的。一开始以为是代码写错了,后来才意识到——多普勒速度是有正负的,靠近为正,远离为负。自行车是远离雷达的,所以速度是负值。嗯,这个细节容易忽略。

实战技巧:多普勒FFT之前,建议做一次MTI(动目标指示)处理。说白了就是相邻chirp相减,可以滤掉静止杂波。我在做安防雷达时,用这个方法把墙体的强反射抑制掉了,效果非常好。

4. CFAR检测:从噪声中找出目标

距离FFT和多普勒FFT做完,我们得到了一个距离-多普勒矩阵。但这个矩阵里,除了目标,还有噪声、杂波、干扰。怎么把真正的目标挑出来?CFAR(恒虚警率检测)就是干这个的。

CFAR的核心思想很简单:对每个待检测单元,用周围参考单元的噪声水平估计一个自适应阈值。如果待检测单元的能量超过这个阈值,就判为目标。

常见的CFAR算法有三种:

算法特点适用场景
CA-CFAR均值类,计算简单均匀噪声环境
SO-CFAR取两侧最小值多目标场景
GO-CFAR取两侧最大值杂波边缘场景

我个人习惯用CA-CFAR作为默认选项。但如果场景中有多个目标靠得很近,我会换成SO-CFAR。为什么?因为CA-CFAR会把邻近目标也当成噪声,导致漏检。

// CA-CFAR的简化实现
for each cell under test (CUT):
    // 计算参考单元的均值
    noise_level = mean(reference_cells)
    // 计算阈值
    threshold = noise_level * alpha
    // 判决
    if CUT > threshold:
        mark as target
    else:
        mark as noise

alpha(阈值因子)的选择很关键。alpha太大,漏检多;alpha太小,虚警多。我一般根据经验取3~5,然后根据实测数据微调。

避坑指南:我曾经在CFAR检测时忘了加保护单元。结果目标本身泄漏到了参考单元里,导致阈值被抬高,目标自己把自己「屏蔽」了。保护单元一般取3~5个,具体取决于目标在距离维和多普勒维的展宽。

知识体系总览

下面这张图展示了雷达信号处理链的完整流程。你可以看到,每一步的输出都是下一步的输入,环环相扣。

雷达信号处理链流程图 ADC采样 距离FFT 多普勒FFT CFAR检测 时域 → 频域 → 距离-多普勒矩阵 → 目标检测 各步骤关键输出 ADC采样 → 数字中频信号 距离FFT → 距离-幅度谱 多普勒FFT → 距离-多普勒矩阵 CFAR检测 → 目标列表(距离、速度、角度)

这张图把整个流程串起来了。你从ADC采样开始,一步步往下走,最终得到的就是目标的距离、速度和角度信息。说白了,雷达信号处理链就是「从原始数据到目标信息」的转化过程。

好,这一章的内容就到这里。记住我强调的几个关键点:采样率要留余量、距离FFT前要加窗、多普勒FFT要注意速度正负、CFAR要设保护单元。这些都是我踩过的坑,你记住了就能少走弯路。

本章核心要点:

  1. ADC采样:采样率≥2倍信号带宽,留20%余量
  2. 距离FFT:加窗抑制旁瓣,去除直流分量
  3. 多普勒FFT:慢时间维FFT,注意速度正负
  4. CFAR检测:选对算法,设好保护单元和阈值因子

可可精品资料库