Python读写.sigmf-data文件后出现NaN值问题排查
SigMF读写复数数组后数值异常与NaN问题分析
可能原因(写入/读取环节都可能出错)
写入环节常见问题
- 复数存储格式错误:SigMF要求复数以实部、虚部交错的顺序存储(如
[re0, im0, re1, im1,...]),但Numpy复数数组在内存中是连续实部+连续虚部的布局(如[re0, re1,... im0, im1,...])。如果直接将Numpy复数数组的内存块写入文件,会导致存储格式完全不符合SigMF规范,读取时必然出现数值混乱和NaN。 - 数据类型不匹配或转换错误:若写入时未显式将数组转换为SigMF支持的类型(如
cf32/cf64),而是直接用原数组的complex128等类型写入,或转换时精度溢出(比如将超大值的float64转float32),会导致数值失真,极端情况出现NaN。 - 元数据类型声明错误:元数据
core:datatype字段与实际写入的数据类型不匹配(比如实际写的是cf32,元数据填f32),会导致读取时解析逻辑错误,生成无效数值。
读取环节常见问题
- 解析格式错误:读取时未按照SigMF的交错格式重组实部虚部,而是直接将字节流还原为Numpy复数数组,会导致数据错位,产生异常值和NaN。
- 数据类型解析错误:读取时使用的dtype与写入时不一致(比如写入
cf32,读取用cf64),或字节序处理错误(比如大端/小端搞反),会导致数值解析错误。 - 文件读取不完整:读取时未读取完整的文件字节流,导致最后几个元素的实部/虚部缺失,解析为NaN。
修复方案
写入环节修正
- 严格按照SigMF格式转换复数数组
将Numpy复数数组拆分为实部、虚部,交错拼接后写入文件:import numpy as np # 假设原复数数组为complex_array target_dtype = np.float32 # 对应SigMF的cf32类型 interleaved = np.empty(2 * len(complex_array), dtype=target_dtype) interleaved[0::2] = complex_array.real.astype(target_dtype) interleaved[1::2] = complex_array.imag.astype(target_dtype) # 写入文件 interleaved.tofile("your_file.sigmf-data") - 同步更新元数据
在元数据的core:datatype字段填写对应类型,比如上述代码对应"core:datatype": "cf32"。 - 验证文件完整性
写入后检查文件大小:cf32类型下,N个复数元素的文件大小应为N * 8字节(每个实部/虚部各4字节);cf64则为N * 16字节。
读取环节修正
- 按SigMF格式解析数据
读取字节流后,重组为复数数组:import numpy as np # 根据元数据的datatype选择对应dtype source_dtype = np.float32 # 对应cf32 interleaved = np.fromfile("your_file.sigmf-data", dtype=source_dtype) # 重组复数数组 complex_array = interleaved[0::2] + 1j * interleaved[1::2] - 匹配元数据的类型声明
务必根据元数据core:datatype选择读取的dtype:cf32→np.float32cf64→np.float64
- 检查读取的数组长度
确保读取的交错数组长度为偶数(实部虚部成对),若为奇数则说明文件截断,需重新写入完整数据。
定位错误环节的方法
- 写入后立即验证:写入完成后,立刻读取文件并解析,对比原数组的最值和NaN情况。若此时已异常,说明问题出在写入环节;若此时正常,后续读取异常则是读取环节的问题(如代码逻辑错误、文件损坏)。
- 核对元数据与实际数据:对比元数据的
core:datatype、core:sample_count与实际文件大小、读取的数组长度是否匹配。
内容的提问来源于stack exchange,提问作者AaronJPung
相关产品推荐
相关产品推荐

