numpy 在Python中写入和阅读.sigmf-data文件后会出现NaN值

rta7y2nd  于 2022-12-18  发布在  Python
关注(0)|答案(1)|浏览(121)

我有一个复数值的Numpy数组,准备将其写入.sigmf-data文件:

# ISTFT
t_recon, x_recon = signal.istft(Zxx_unflip,
                                fs=sample_rate,
                                nperseg=NFFT,
                                nfft=NFFT,
                                noverlap=noverlap,
                                window=win,
                                boundary=boundary_istft,
                                input_onesided=onesided)

# Sanity check min, max, and lack of NaN values
print(type(x_recon))
print(np.min(x_recon),np.max(x_recon))

此输出将生成以下内容,因此我认为我的数组是一个Numpy数组,并且在真实的部和虚部都没有NaN值。

<class 'numpy.ndarray'>
(-0.6206440769919024+0.0022856157531386985j) (0.6165799125127172+0.112632267876876j)

SigMF documentation类似,然后将该数组写入.sigmf-data和关联的.sigmf-meta文件:

# write those samples to file in cf32_le
data = np.copy(x_recon)
data.tofile('new_example.sigmf-data')

# create the metadata
meta = SigMFFile(
    data_file='new_example.sigmf-data', # extension is optional
    global_info = {
        SigMFFile.DATATYPE_KEY: 'cf32',
        SigMFFile.SAMPLE_RATE_KEY: sample_rate,
        SigMFFile.VERSION_KEY: sigmf.__version__,
    }
)

# create a capture key at time index 0
meta.add_capture(0, metadata={
    SigMFFile.FREQUENCY_KEY: center_freq,
    SigMFFile.DATETIME_KEY: dt.datetime.utcnow().isoformat()+'Z',
})

# check for mistakes & write to disk
assert meta.validate()
meta.tofile('new_example.sigmf-meta') # extension is optional


这不会产生错误,复数值数组由复数(c)、浮点(f)和32位(32)的DATATYPE_KEY指定,然后我回读生成的文件:

# Open file
collect_base = '/Users/me/'
sigmf_new_data_file = glob.glob(collect_base + '/*.sigmf-data')
sigmf_new_filename  = sigmf_new_data_file[0][:-5]
sigmf_new_signal = sigmffile.fromfile(sigmf_new_filename)

# Get the samples corresponding to annotation
capture_samples = sigmf_new_signal.read_samples_in_capture(0)

# Recheck the min and max of the read-in data array
print(np.min(capture_samples),np.max(capture_samples))
print(type(capture_samples))

在这里,输出仍然显示数组是Numpy数组,但现在我的最小值和最大值不仅不同,而且它们的真实的部 * 也有NaN值。我知道(nan + nan*j)值也存在于数组的其他地方。
是什么导致了数组的改变?我怎样才能删除任何正在损坏我的数组的东西?错误是在我写文件的时候发生的,还是在阅读文件的时候发生的?

qaxu7uf2

qaxu7uf21#

答案在于Numpy数组中的值的特定格式。在最初的问题中,打印元素类型:

print(type(x_recon[0]))

退货

<class 'numpy.complex128'>

SigMF DATATYPE_KEY是32位复数浮点数。
但问题是:SigMF只有32位和64位的复数浮点数选项(cf32cf64),但Numpy不理解32位的复数数据类型,因此它们之间唯一可接受的数据类型是64位的复数浮点数。

  • 但是 *,设置SigMFFile.DATATYPE_KEY='cf64'会导致错误:
SigMFFileError: Unrecognized datatype: 'cf64'.


因此,修复方法是将Numpy数组转换为complex64,并将datatype键设置为cf32。由于某种原因,这种组合可以工作,而128位到32位的转换则不行。在我的系统上,这种修复方法可以工作。

相关问题