3. 数据存储格式:常见的雷达数据存储格式

做雷达数据回放与复现,第一个绕不开的问题就是:数据存成什么格式?

我见过不少新手,上来就一股脑把数据往硬盘里写,结果回放时发现读不出来,或者读出来全是乱码。嗯,这里面的坑其实不少。今天我就把几种常见的雷达数据存储格式掰开揉碎了讲一讲。

3.1 为什么存储格式这么重要?

说白了,雷达数据就是一堆数字。但这一堆数字怎么组织、怎么存、怎么读,直接决定了你的回放效率和分析体验。

我个人习惯把存储格式分成两类:

  • 原始二进制格式:.bin、.pcap
  • 结构化文本/数据格式:.csv、.json、.h5

你想想看,如果采集时存的是二进制,回放时却用文本解析器去读,那速度能慢到让你怀疑人生。反过来,如果数据量不大,却非要用二进制格式,调试起来又很麻烦。

核心原则:存储格式的选择,取决于你的应用场景——是追求极致性能,还是追求调试便利。

3.2 各格式详解

3.2.1 .bin 格式(纯二进制)

这是最原始、最直接的格式。雷达采集到的ADC数据、IQ数据,直接按字节顺序写入文件。

优点:

  • 读写速度极快,没有解析开销
  • 文件体积最小,不浪费任何字节
  • 与硬件采集端无缝对接

缺点:

  • 可读性为零——你打开文件看到的全是乱码
  • 没有元数据信息,不知道采样率、帧结构、数据类型
  • 一旦格式定义变了,旧文件就废了

我的经验:我在项目中遇到过,某次采集时忘了记录数据位宽,结果回放时怎么都对不上。后来我养成了一个习惯——.bin文件必须配套一个同名的.txt描述文件,写明采样率、通道数、位宽等参数。

// 一个典型的.bin文件读取示例(C语言风格)
FILE *fp = fopen("radar_data.bin", "rb");
uint16_t buffer[1024];
fread(buffer, sizeof(uint16_t), 1024, fp);
// 注意:这里必须知道每个样本是16位还是32位

3.2.2 .pcap 格式(网络抓包格式)

这个格式大家可能更熟悉——Wireshark用的就是它。对于使用以太网传输的毫米波雷达(比如TI的AWR系列通过LVDS转UDP),pcap格式是天然的选择。

优点:

  • 保留了完整的网络包结构,包括时间戳
  • 可以用Wireshark直接分析网络层问题
  • 支持多流、多通道数据

缺点:

  • 文件体积大,因为每个包都有头部开销
  • 解析复杂,需要理解UDP包内的数据排列
  • 不适合存储处理后的结果

避坑指南:我曾经用pcap格式存了一整天的路测数据,结果发现时间戳精度不够——pcap的微秒级精度对于雷达帧同步来说,有时候会丢帧。后来我改用硬件时间戳+自定义头部才解决。

3.2.3 .csv 格式(逗号分隔值)

这是最通用的文本格式。每个数据点一行,用逗号隔开。

优点:

  • 人类可读,用Excel或记事本就能打开
  • 跨平台、跨语言支持最好
  • 适合存储少量处理结果

缺点:

  • 文件体积巨大——一个浮点数存成文本可能占10个字节,二进制只要4个
  • 读写速度慢,尤其是大数据量时
  • 不支持多维数据(比如复数、矩阵)

我的建议:csv格式只适合存「标签数据」或「少量结果」。比如标定参数、目标列表。千万别拿它存原始ADC数据——一个128帧的雷达数据,csv文件能上GB,读一次要几分钟。

# 一个典型的csv文件内容
frame_id,range_idx,doppler_idx,amplitude
0,10,5,0.832
0,11,5,0.745
1,10,5,0.891

3.2.4 .json 格式(JavaScript对象表示法)

json格式在Web开发和配置文件中很常见。它用键值对的方式组织数据。

优点:

  • 可读性极好,结构清晰
  • 支持嵌套结构,适合存储复杂元数据
  • Python、JavaScript等语言原生支持

缺点:

  • 解析开销大,比csv还慢
  • 文件体积更大(因为有很多花括号和引号)
  • 不适合存储大量数值数组

实际用法:我通常用json存「配置文件」和「元数据」。比如雷达参数、处理链路的配置、数据采集的时间地点等。真正的数据体还是用二进制存。

{
  "radar_config": {
    "start_freq": 77e9,
    "slope": 60e12,
    "samples_per_chirp": 256,
    "chirps_per_frame": 128
  },
  "data_file": "raw_data.bin",
  "timestamp": "2024-03-15T10:30:00Z"
}

3.2.5 .h5 格式(HDF5层次数据格式)

这是科学计算领域的大杀器。HDF5可以理解为一个「文件系统」——里面可以存数据集、组、属性,还支持压缩和分块。

优点:

  • 支持大规模数据集(TB级别)
  • 内置压缩,节省空间
  • 支持多维数组、复数、字符串等任意数据类型
  • 可以同时存储数据和元数据

缺点:

  • 需要专门的库(h5py、hdf5)才能读写
  • 学习曲线较陡
  • 不适合小数据量(文件头部开销大)

我的最爱:说实话,我现在做项目首选就是h5格式。一个文件里可以同时存原始数据、处理结果、参数配置,还能加注释。我曾经用一个h5文件存了3TB的路测数据,分块读取时几乎感觉不到延迟。

# Python读取h5示例
import h5py

with h5py.File('radar_data.h5', 'r') as f:
    # 查看文件结构
    print(list(f.keys()))
    # 读取数据集
    raw_data = f['raw/adc_data'][:]
    config = f['config/radar_params'][()]

3.3 格式对比一览

格式 读写速度 文件大小 可读性 元数据支持 适用场景
.bin ★★★★★ 最小 ★ 无 原始ADC数据、实时采集
.pcap ★★★★ 较大 ★★ 有(时间戳) 网络传输的雷达数据
.csv ★★ 巨大 ★★★★★ 无 少量结果、标定数据
.json ★ 巨大 ★★★★★ 丰富 配置文件、元数据
.h5 ★★★★ 较小(压缩) ★★ 非常丰富 大规模数据、综合存储

3.4 我的选择策略

说了这么多,到底该用哪个?我个人的经验是:

  1. 采集阶段:用.bin或.pcap,追求速度和最小开销
  2. 处理阶段:转成.h5,方便管理和随机访问
  3. 结果输出:用.csv或.json,方便别人查看和导入

你想想看,如果采集时就用json存原始数据,那采集卡可能都来不及写盘。反过来,如果给客户交付结果时给个.bin文件,人家还得问你要解析代码。

重要提醒:无论选什么格式,一定要在文件头部或配套文件中写明数据格式定义。我曾经接手过一个项目,里面全是.bin文件,没有任何说明文档。最后我只能对着示波器一点一点猜数据排列——那感觉,就像在玩拼图游戏,但缺了参考图。

3.5 知识体系总览

下面这张图,我把整个存储格式的选择逻辑画出来了。你可以把它当作一个决策树来用。

雷达数据存储格式选择决策树 雷达数据 原始数据 处理结果 网络传输 → .pcap 本地采集 → .bin 少量数据 → .csv 配置/元数据 → .json 综合存储 → .h5 数据量大、需要长期管理 → 推荐h5格式 临时调试、快速验证 → 推荐bin+csv组合 交付给客户 → 推荐h5或json+bin 选择存储格式时,永远要考虑「谁会用、怎么用、用多久」

这张图的核心逻辑其实很简单:先分清楚你存的是原始数据还是处理结果,然后再根据数据量和用途去选。我个人强烈建议,如果你要做长期的数据管理,直接上h5格式,省心省力。

最后说一句:格式只是工具,别为了用某个格式而用。我见过有人为了「高大上」非要用h5存几个KB的配置文件,结果读一次要加载整个HDF5库——得不偿失。合适的才是最好的。

可可精品资料库