3. 雷达原始数据采集与格式解析

雷达信号处理链路的第一道关口,是把毫米波前端输出的原始采样数据完整、无歧义地落到存储介质上,并在后续处理中准确还原其物理含义。Bosch 毫米波雷达(典型为 77 GHz FMCW 体制)的原始数据并非简单的二维矩阵,而是一个多维数据立方体(Radar Data Cube)。理解这个立方体的维度顺序、每个维度的物理意义,以及 DDMA/TDM-MIMO 带来的通道排列规则,是后续做距离维 FFT、多普勒维 FFT、角度维处理的前提。本章围绕“数据长什么样、怎么排、怎么读、怎么验证”展开。

一、ADC 原始数据立方体的结构

FMCW 雷达在一个相干处理间隔(CPI)内发射多个 chirp,每个 chirp 的回波经混频、低通滤波后由 ADC 采样。原始数据立方体通常由三个维度构成:

  • 快时间维(Fast-time / Range):单个 chirp 内的采样点,采样率典型为 10~25 MSps,每 chirp 采样数 Ns 常见为 256、512 或 1024。该维对应距离信息,经 FFT 后得到距离单元。
  • 慢时间维(Slow-time / Doppler):一个 CPI 内的 chirp 序号,数量 Nc 常见为 64、128、256。该维对应目标相对速度,经 FFT 后得到多普勒单元。
  • 通道维(Channel / Antenna):接收天线与发射通道的组合,典型为 4 个 RX × 若干 TX,形成虚拟阵列通道数 Nch。

因此立方体尺寸为 Ns × Nc × Nch。需要特别强调的是维度顺序约定:不同芯片与采集工具可能采用 [chirp][sample][channel]、[channel][chirp][sample] 或 [sample][chirp][channel] 等不同排列。若在读取时把快慢时间维颠倒,距离与速度结果会完全错位,且往往不会报错,只会表现为“目标距离不对”或“速度符号反了”。工程上必须在解析前明确记录该顺序,并在代码中以显式命名(如 fast_time、slow_time)而非裸索引访问。

二、DDMA 与 TDM-MIMO 的数据排列

为获得角度分辨率,雷达使用多发射通道。两种主流复用方式对数据排列影响显著:

TDM-MIMO:多个 TX 分时轮流发射,每个 TX 占用独立的 chirp 时隙。若 TX 数为 Ntx,则一个“虚拟 CPI”实际包含 Ntx × Nc 个 chirp,慢时间维需要按 TX 分组解复用,再分别做多普勒处理。其代价是等效慢时间采样率下降,最大不模糊速度降低为原来的 1/Ntx。

DDMA(Doppler Division Multiple Access):所有 TX 同时发射,但每个 TX 在慢时间维上施加不同的多普勒频移(相位旋转)。接收端在慢时间维 FFT 后,不同 TX 的回波会落在不同的多普勒子带中,从而实现通道分离。DDMA 的排列特点是:慢时间维 FFT 后需要按预设的频移量把各 TX 的子带“搬移”回零频附近,再重组为虚拟阵列。若忽略这一步,角度估计会因通道间相位不一致而失效。

判断当前数据属于哪种体制,可观察慢时间维 FFT 后的谱:TDM 表现为所有 TX 回波叠加在同一多普勒轴;DDMA 则会在多普勒轴上出现按 TX 数量等间隔分布的多个峰簇。

三、Bosch 雷达数据接口与记录格式

Bosch 雷达通常通过高速串行接口(如 LVDS、以太网或专用采集卡)输出原始 ADC 数据。记录格式常见两类:

  • 二进制裸流(.bin):按固定帧结构连续写入,每帧包含帧头、配置参数(chirp 数、采样数、通道数、采样率、起始频率、斜率)、时间戳与 ADC 数据块。解析时需按帧头中的长度字段逐帧切分。
  • 带元数据的容器格式:如基于 HDF5 或自定义头文件,把配置与数据分离存储,便于批量读取与参数追溯。

无论哪种格式,解析的关键是先读元数据、再读数据。元数据至少应包含:采样率、每 chirp 采样数、chirp 数、TX/RX 数、chirp 斜率、起始频率、帧周期、数据排列顺序、字节序(大端/小端)与 ADC 位宽(12/14/16 bit)。缺少任一项,后续距离/速度标定都会出现系统性偏差。

四、实测数据读取与可视化

读取流程可概括为:打开文件 → 解析帧头 → 按维度重塑为立方体 → 单位换算 → 可视化验证。下面给出一个典型的 Python 读取片段(示例参数为合理假设,非实测结果):

import numpy as np

# 示例元数据(假设值)
Ns, Nc, Nch = 256, 128, 8      # 采样数, chirp数, 虚拟通道数
dtype = np.int16               # ADC 位宽 16 bit
order = 'chirp_sample_channel' # 排列约定

raw = np.fromfile('radar_frame.bin', dtype=dtype)
cube = raw.reshape(Nc, Ns, Nch)          # 按约定重塑
cube = cube.astype(np.float32)

# 距离维 FFT
range_fft = np.fft.fft(cube, axis=1)
range_power = 20*np.log10(np.abs(range_fft)+1e-6)

可视化验证建议至少做三件事:其一,绘制单通道距离谱,确认存在明显峰值且底噪平坦;其二,绘制距离-多普勒二维图(RD map),确认目标在速度维上的位置与符号符合预期;其三,抽取某一距离单元的多普勒切片,检查是否存在直流泄漏或镜像。若 RD map 中目标呈“斜线”或距离随 chirp 漂移,通常说明快慢时间维顺序错误或 chirp 斜率参数不匹配。

ADC 数据立方体与 DDMA/TDM 排列解析 数据立方体 Ns × Nc × Nch 快时间 Ns 慢时间 Nc 通道 Nch 慢时间维排列对比 TDM-MIMO TX1 TX2 TX3 TX1 TX2 TX3 … 分时占用 chirp 时隙,需解复用 DDMA TX1+TX2+TX3 同时发射 多普勒子带分离,需搬移重组 读取与验证链 解析帧头 重塑立方体 单位换算 距离FFT RD图可视化验证 验证判据: ① 距离谱峰值清晰、底噪平坦 ② RD 图中目标位置与速度符号符合预期 ③ 多普勒切片无异常直流泄漏或镜像 异常提示:RD 图目标呈斜线 → 快慢时间维顺序错误或 chirp 斜率不匹配

最后需要强调,原始数据解析不是一次性工作,而是贯穿整个处理链的“地基”。建议在项目初期就固定一套元数据描述规范,把维度顺序、字节序、位宽、TX/RX 映射关系写入配置文件,并在每次采集后自动生成一份数据摘要(帧数、每帧尺寸、校验和、时间戳范围)。这样在后续做 DDMA 子带搬移或 TDM 解复用时,才能快速定位是数据本身的问题,还是算法参数的问题。