MATLAB fread 24位转换为Python

2024-09-24 02:14:02 发布

您现在位置: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] 

谁能给我指出正确的方向吗

谢谢


Tags: 文件数据代码示例字节二进制out音频
1条回答
网友
1楼 · 发布于 2024-09-24 02:14:02

所以我尝试了一些东西,得到了和你一样的结果。我不确定它是否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, 255, 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))

相关问题 更多 >