4. 雷达信号处理算法概览:脉冲压缩、MTI/MTD、CFAR、DOA估计、波束形成

好,咱们进入正题。这一章我打算把雷达信号处理里几个核心算法串起来讲一遍。你可能会问,为什么要先来个概览?

因为在实际的嵌入式系统里,这些算法不是孤立的。它们像流水线一样,一环扣一环。我见过不少新手,把每个算法都学得挺明白,但一上板子就懵了——不知道先跑哪个,后跑哪个,更不知道哪个环节最吃资源。

所以这一章,咱们不抠细节,先把全景图看清楚。后面每个算法都会单独开章节深挖。

4.1 脉冲压缩:距离分辨率的救星

先说说脉冲压缩。说白了,它就是解决一个矛盾:又想看得远,又想看得清楚。

你看,要提高探测距离,就得发射大能量。最简单的方法是把脉冲做宽。但脉冲一宽,距离分辨率就差了——两个靠得很近的目标就分不开了。

脉冲压缩怎么破这个局?它发射一个宽脉冲,但内部做了调制(比如线性调频)。接收的时候用一个匹配滤波器去处理。结果就是,宽脉冲进去,窄脉冲出来。

效果呢? 既保留了宽脉冲的大能量,又获得了窄脉冲的高分辨率。

核心公式(匹配滤波器):

h(t) = s*(-t)  // 发射信号的共轭反转

在数字域实现,其实就是做一次卷积。或者用FFT更快:

y = IFFT( FFT(s) * conj(FFT(h)) )

我的经验: 在嵌入式平台上,我建议优先用FFT方式实现脉冲压缩。直接做卷积,点数一多,计算量就上去了。FFT虽然也有开销,但胜在稳定可控。我曾经在一个项目里,为了省那点内存,硬是用时域卷积,结果CPU占用率飙到90%,后来改成频域实现,直接降到30%。

4.2 MTI / MTD:把不动的东西滤掉

雷达回波里,除了我们想看的运动目标,还有大量静止杂波——山啊、楼啊、地面啊。这些东西的回波强度往往比目标大得多。

MTI(动目标显示)就是干这个的。它利用运动目标的多普勒频移,把静止杂波滤掉。

最简单的MTI就是一个对消器

y[n] = x[n] - x[n-1]

你看,如果目标是静止的,相邻两个脉冲的回波几乎一样,一减就没了。运动目标呢?回波有相位变化,减不干净,就留下来了。

但MTI有个问题——它只能告诉你“有东西在动”,但说不清动得多快。这时候就需要MTD(动目标检测)了。

MTD本质上就是一组窄带滤波器。它用FFT把不同速度的目标分到不同的通道里。比如你发64个脉冲,做64点FFT,就能分出64个速度通道。

避坑指南: 我曾经在一个项目中,MTI做完后直接接MTD,结果发现效果很差。后来排查才发现,MTI对消器会改变噪声的统计特性,导致MTD的检测性能下降。正确的做法是:要么只用MTD(不做MTI),要么在MTI之后加一个窗函数再进MTD。嗯,这个坑我踩过,你记住就行。

4.3 CFAR:自适应门限检测

信号经过脉冲压缩和MTI/MTD之后,我们得到的是一个二维数据矩阵(距离-多普勒图)。接下来要做的,就是判断哪些点是目标,哪些是噪声。

最简单的办法是设一个固定门限。但现实中的噪声和杂波是变化的——远处噪声小,近处噪声大;晴天噪声小,雨天噪声大。固定门限根本没法用。

CFAR(恒虚警率)就是解决这个问题的。它根据待检测单元周围的噪声水平,动态调整门限。

常见的CFAR类型:

类型 特点 适用场景
CA-CFAR 取左右参考窗的平均值 均匀杂波环境
GO-CFAR 取左右参考窗的最大值 杂波边缘(如地物边界)
SO-CFAR 取左右参考窗的最小值 多目标环境
OS-CFAR 对参考单元排序后取第k个 非均匀杂波

我的建议: 实际工程中,我一般先用CA-CFAR,简单可靠。如果发现虚警太多,再换成GO-CFAR。如果发现目标被漏检,再考虑SO-CFAR。别一上来就搞OS-CFAR,排序操作在嵌入式上很费时间。

4.4 DOA估计:目标在哪个方向?

前面几步,我们知道了目标的距离和速度。但它在哪个角度呢?这就需要DOA(波达方向)估计了。

DOA估计依赖阵列天线。简单说,就是多个接收天线同时接收信号,利用不同天线之间的相位差来推算角度。

最经典的方法:

  • 数字波束形成(DBF): 对各个通道加权求和,形成指向某个方向的波束。然后扫描所有角度,找能量最大的方向。
  • Capon波束形成: 也叫最小方差无畸变响应(MVDR)。它能在抑制干扰的同时,保持对目标方向的增益。
  • 子空间方法(MUSIC/ESPRIT): 利用信号子空间和噪声子空间的正交性,实现超分辨。但计算量大,嵌入式上慎用。

工程权衡: 在嵌入式系统里,我通常首选DBF。虽然分辨率不如MUSIC,但胜在稳定、计算量小。如果天线数量少(比如4个),DBF的角度分辨率确实有限,这时候可以考虑Capon。MUSIC?嗯,除非你的芯片有硬件加速,否则我不建议在实时系统里用。

4.5 波束形成:数字域的“透镜”

波束形成和DOA估计其实是“一体两面”。DOA是“接收”端的事——我们从回波里反推目标方向。波束形成则既可用于发射,也可用于接收。

在发射端,波束形成可以把能量集中到某个方向,提高探测距离和角度分辨率。在接收端,它可以同时形成多个波束,覆盖不同方向,实现“同时多波束”。

数字波束形成的核心操作:

// 假设有N个天线,阵元间距为d,波长为lambda
// 想要形成指向theta方向的波束
for (int i = 0; i < N; i++) {
    phase_shift = 2 * PI * i * d * sin(theta) / lambda;
    output += input[i] * exp(-j * phase_shift);
}

你看,其实就是对每个通道的信号,补偿一个相位差,然后加起来。这个相位差取决于目标方向和阵元位置。

注意: 波束形成对相位一致性要求极高。我曾经在一个项目里,调试了三天发现波束指向总是不对。最后用示波器一量,发现有两路ADC的采样时钟有皮秒级的偏差。嗯,从那以后,我每次做阵列系统,第一件事就是先做通道校准。

4.6 算法流水线:从回波到目标

好了,现在我们把所有算法串起来,看看一个典型的处理流程:

  1. ADC采样 → 得到数字中频信号
  2. 脉冲压缩 → 提高距离分辨率
  3. MTI/MTD → 抑制杂波,提取速度信息
  4. CFAR检测 → 从噪声中挑出目标点
  5. DOA估计 → 计算每个目标的角度
  6. 目标凝聚与跟踪 → 把点迹变成航迹

这个流程不是死的。比如,如果你只关心距离和速度,不做角度测量,那DOA那步就可以省掉。如果你做的是相控阵雷达,波束形成可能放在最前面——先形成波束,再做脉冲压缩。

我的习惯: 在设计嵌入式雷达系统时,我会先画一个数据流图,标出每个模块的输入输出数据格式、数据量、处理时间预算。然后对着这个图,一个一个模块去优化。这样不容易漏掉瓶颈。你想想看,如果脉冲压缩那步就卡死了,后面再好的算法也跑不起来,对吧?

这一章咱们把雷达信号处理的几个核心算法过了一遍。后面每一章,我都会带着你深入一个算法,从原理到代码,从仿真到板级调试。咱们一步一步来。