MATLAB fread 24位转换为Python

我正在尝试将一些MATLAB代码转换为Python。

代码从串行读取音频数据:

out = fread(s,s.bytesavailable,'uint8'); % [255 205 217 255 212 60 255 207 132 255 ...]

'out'然后保存到二进制文件中,并使用fread读回:

fwrite(fid1,out,'uint8');
[d ~]= fread(fid2,[1 inf],'bit24','b');

如预期的那样,每个样本有三个字节,“ d”是“ out”长度的三分之一。但是,我无法确定fread读取二进制数据的方式。

我将“ out”作为字节数组或可以在Python中作为二进制文件打开,并且希望在Python中进行从“ out”到“ d”的转换。我已经尝试过使用numpy,struct,wave,wavio,soundfile的方法,但是由于我是编程新手,所以没有取得太大的成功。理想情况下,我不想写入临时文件并从中读取,但这不是必需的。

如果有帮助,以下是3个示例的示例:

out = [255 205 217 255 212 60 255 207 132]
d = [-12839 -11204 -12412] 

有人能指出我正确的方向吗?

谢谢

iCMS 回答:MATLAB fread 24位转换为Python

所以我只是尝试了一下,并得到了与您相同的结果。我不确定它是否100%正确,但是应该按照您的指示为您指明正确的方向。

import struct

def divide_chunks(data: bytearray,n: int):
    for i in range(0,len(data),n):
        yield data[i: i + n]


out = bytearray([255,205,217,255,212,60,207,132])

list_24bit = list(divide_chunks(out,3))
list_32bit = list(map(lambda x: bytearray([0 if x[0] < 128 else 255,*x]),list_24bit))

d = list(map(lambda x: struct.unpack('>i',x),list_32bit))
本文链接:https://www.f2er.com/2177296.html

大家都在问