7

我有一个二进制文件,其记录结构为 400 个 24 位有符号大端整数,后跟一个 16 位大端有符号短整数。我想做的是:

from numpy import dtype , fromfile
record_dtype = dtype([('samples','>i3',(400,)),('marker','>i2')])
data = fromfile('binary_file.dat',dtype=record_dtype)

不幸的是,我得到的是:

TypeError: data type not understood

响应“> i3”。如何定义 dtype 以读取 24 位二进制数?

4

1 回答 1

12

我有一个 TB 的文件,它是 24 位四通道 PCM。

除了一次想要的部分,我当然不想碰任何其他东西,所以我所做的是这样的:

import numpy as np
from numpy.lib.stride_tricks import as_strided

rawdatamap = np.memmap('4ch24bit800GBdatafile.pcm', dtype=np.dtype('u1'),mode='r')

# in case of a truncated frame at the end
usablebytes = rawdatamap.shape[0]-rawdatamap.shape[0]%12

frames = int(usablebytes/12)
rawbytes = rawdatamap[:usablebytes]

realdata = as_strided(rawbytes.view(np.int32), strides=(12,3,), shape=(frames,4))

someusefulpart = realdata[hugeoffset:hugeoffset+smallerthanram]&0x00ffffff

这从文件中复制了一个smallerthanram字节长的内存。

注意字节掩码!您需要它来切断 32 位字的最高有效字节 - 这将是属于前一个样本的垃圾。

您也可以将其应用于单个数据,如下所示:

scaled_ch2_datum_at_framenum = scalefactor*(realdata[framenum,1]&0x00ffffff)-shiftoffset

它有点乱,但现在已经很好了。

您实际上可能需要 64 位系统来执行此操作。

注意。这适用于小端数据。要处理大端,您将在视图中使用大端 dtype,并替换...&0x00ffffff...&ffffff00>>8

于 2015-12-07T07:08:26.457 回答