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 我的选择策略
说了这么多,到底该用哪个?我个人的经验是:
- 采集阶段:用.bin或.pcap,追求速度和最小开销
- 处理阶段:转成.h5,方便管理和随机访问
- 结果输出:用.csv或.json,方便别人查看和导入
你想想看,如果采集时就用json存原始数据,那采集卡可能都来不及写盘。反过来,如果给客户交付结果时给个.bin文件,人家还得问你要解析代码。
重要提醒:无论选什么格式,一定要在文件头部或配套文件中写明数据格式定义。我曾经接手过一个项目,里面全是.bin文件,没有任何说明文档。最后我只能对着示波器一点一点猜数据排列——那感觉,就像在玩拼图游戏,但缺了参考图。
3.5 知识体系总览
下面这张图,我把整个存储格式的选择逻辑画出来了。你可以把它当作一个决策树来用。
这张图的核心逻辑其实很简单:先分清楚你存的是原始数据还是处理结果,然后再根据数据量和用途去选。我个人强烈建议,如果你要做长期的数据管理,直接上h5格式,省心省力。
最后说一句:格式只是工具,别为了用某个格式而用。我见过有人为了「高大上」非要用h5存几个KB的配置文件,结果读一次要加载整个HDF5库——得不偿失。合适的才是最好的。