繁体   English   中英

将 16 位字节数组读入整数而不截断

[英]Read 16bit byte array into integers without truncation

我有一个连接到微控制器的 I2S 麦克风,并设法将 16 位音频 WAV 音频转储到 python 字节数组 object,看起来像这样(使用micropython 库):

raw = bytearray(b"\xac\xffW\x00\xfc\xfe\xac\xffs\xfe\xfc\xfe+\xfes\xfe7\xfe+\xfe\x8c\xfe7\xfe\x1f\xff\x8c\xfe\xcf\xff\x1f\xfft\x00\xcf\xff\xfb\x00t\x00?\x01\xfb...")

我已经成功地将这些 bytearray 转储写入我创建的文件中,如下所示:

wav = open('16bitaudio.wav','wb')
#....some code to write the wav header
wav.write(raw)
wav.close()

当我在我的电脑上打开它时,它会播放我忠实录制的样本,听起来很棒。

我的问题来了 - 我想将此数据转换为 integer,它代表我的样本中声音的平均强度。 我首先尝试这样做:

intensity = sum(raw)/count(raw)

然而,这往往会导致一个数字 ~128 几乎所有时间 - 向我暗示它被读取为随机字节。 经过进一步调查,这些数组函数似乎假设我们只有一个 8 位字节(读取值 b'\xffW',我认为它是小端 22527):

>>> int(raw[1])
255

这似乎只是 b'\xff' 部分。

我可以通过将字节多次解析为 int.from_bytes 来获得我的期望值:

>>> int.from_bytes(b'\xffW','little')
22527

但是,如果不截断为 8 位,我似乎无法遍历 bytearray。

最后,我阅读了 struct.unpack 方法 - 看起来不错,但我不确定 bytearray 是否包含长度一致的字节......例如:

>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8

即使我只看到 6 个字节。 我在解包时遇到的最终问题我不确定每个字节是提前 8 位还是 16 位,所以我不知道在第二个参数中使用什么字母组合......

因此,鉴于 b 字符串表示形式,似乎 python 确实知道字节的编码方式,但似乎我手头的普通数组函数正在从字节数组中获取此信息。 我确定有一种 pythonic 方法可以将这个 bytearray 解析为整数,但我就是找不到它......

非常感谢任何帮助

感谢@juanpa.arrivillaga 提供我一直在寻找的答案。 我使用了似乎解决了我所有问题的数组库:

import array
result = array.array('h', raw)

在这里绘制值 output 与我的音频文件的示波器相同......干杯!

我的 working.wav 的整数示波器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM