我有一个 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