如何解决将16位字节数组读取为整数而不被截断
我已经将I2S麦克风连接到微控制器,并设法将16位音频WAV音频转储到看起来像这样的python字节数组对象(使用micropython library):
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...")
我已成功将这些字节数组转储写入到我创建的文件中,如下所示:
wav = open('16bitaudio.wav','wb')
#....some code to write the wav header
wav.write(raw)
wav.close()
当我在PC上打开它时,它会如实播放我录制的样本,听起来很棒。
我的问题来了-我想将此数据转换为一个整数,该整数代表样本中声音的平均强度。我首先尝试这样做:
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位,我似乎无法遍历字节数组。
最后,我已经阅读了struct.unpack方法-看起来不错,但是我不确定字节数组是否被长度一致的字节打包了。例如:
>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8
即使我只看到了6个字节。解压缩的最终问题是我不确定每个字节是否提前8或16位,因此我不知道在第二个参数中使用哪种字母组合...
因此,考虑到b字符串表示形式,似乎python确实了解字节的编码方式,但是似乎我手头的普通数组函数正在从bytearray中获取此信息。我确定有一种将这种字节数组解析为整数的pythonic方法,但是我只是找不到它...
非常感谢任何帮助
解决方法
感谢@ juanpa.arrivillaga为我寻找的答案。我使用了似乎可以解决所有问题的数组库:
import array
result = array.array('h',raw)
在此处绘制输出值的图形与我的音频文件的示波器相同...。干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。