我有一个复数值的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)
值也存在于数组的其他地方。
是什么导致了数组的改变?我怎样才能删除任何正在损坏我的数组的东西?错误是在我写文件的时候发生的,还是在阅读文件的时候发生的?
1条答案
按热度按时间qaxu7uf21#
答案在于Numpy数组中的值的特定格式。在最初的问题中,打印元素类型:
退货
SigMF
DATATYPE_KEY
是32位复数浮点数。但问题是:SigMF只有32位和64位的复数浮点数选项(
cf32
和cf64
),但Numpy不理解32位的复数数据类型,因此它们之间唯一可接受的数据类型是64位的复数浮点数。SigMFFile.DATATYPE_KEY='cf64'
会导致错误:型
因此,修复方法是将Numpy数组转换为
complex64
,并将datatype键设置为cf32
。由于某种原因,这种组合可以工作,而128位到32位的转换则不行。在我的系统上,这种修复方法可以工作。