【问题标题】:MATLAB fread 24 bit convert to PythonMATLAB fread 24 位转换为 Python
【发布时间】:2020-06-08 15:47:58
【问题描述】:

我正在尝试将一些 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] 

谁能指出我正确的方向?

谢谢

【问题讨论】:

    标签: python matlab binary-data uint8array 24-bit


    【解决方案1】:

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

    【讨论】:

    • 太棒了!到目前为止,这似乎对我所有的测试信号都有效,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多