Python 将16位字节数组读入整数而不截断
我有一个I2S麦克风连接到一个微控制器,并成功地将16位音频WAV音频转储到一个python bytearray对象,该对象如下所示(使用): 我已成功地将这些bytearray转储写入我创建的文件,如下所示:Python 将16位字节数组读入整数而不截断,python,wav,esp32,micropython,Python,Wav,Esp32,Micropython,我有一个I2S麦克风连接到一个微控制器,并成功地将16位音频WAV音频转储到一个python bytearray对象,该对象如下所示(使用): 我已成功地将这些bytearray转储写入我创建的文件,如下所示: wav = open('16bitaudio.wav','wb') #....some code to write the wav header wav.write(raw) wav.close() 当我在电脑上打开它时,它会播放我忠实录制的样本,听起来很棒 我的问题来了-我想把这些数
wav = open('16bitaudio.wav','wb')
#....some code to write the wav header
wav.write(raw)
wav.close()
当我在电脑上打开它时,它会播放我忠实录制的样本,听起来很棒
我的问题来了-我想把这些数据转换成一个整数,它代表我样本中声音的平均强度。我首先尝试这样做:
intensity = sum(raw)/count(raw)
然而,这往往会导致几乎所有时间都有128个数字——这对我来说意味着它被读取为随机字节。经过进一步研究,这些数组函数似乎假设我们只有一个8位字节(读取值b'\xffW',我认为这是一个小的endian 22527):
这似乎只是b'\xff'部分
我可以通过将字节解析为int.from_字节来获得期望值:
>>> int.from_bytes(b'\xffW','little')
22527
但是,如果不将bytearray截断为8位,我似乎无法遍历它
最后,我已经阅读了struct.unpack方法-看起来还可以,但我不确定bytearray是否包含长度一致的字节。。。。e、 g:
>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8
尽管我只看到了6个字节。解包的最终问题是我不确定每个字节是提前8位还是提前16位,所以我不知道在第二个参数中使用什么字母组合 因此,考虑到b字符串表示,python似乎确实知道字节的编码方式,但是我手头的普通数组函数似乎是从bytearray获取这些信息。我确信有一种python方法可以将这个bytearray解析为整数,但我就是找不到它
非常感谢@juanpa.arrivillaga为我提供的帮助。我使用的阵列库似乎解决了我所有的问题:
import array
result = array.array('h', raw)
这里输出的数值与我的音频文件的示波器相同。。。。干杯
共有8个字节,可打印ascii范围内的任何字节都会打印为相应的ascii字符,因此在第一个字节后有一个字节
o
,在最后有一个字节d
。无论如何,字节数组是一个字节数组,因此当您对其进行迭代时,它将覆盖缓冲区的8位部分。那么,您似乎知道可以使用struct.unpack
,问题到底是什么?“我不确定每个字节是提前8位还是提前16位”嗯?一个字节是8位,但您正在尝试解包16位表示有符号整数?也许我不知道解包是如何工作的,但它似乎需要一个格式字符串来定义序列中每个字节的长度。我不知道如何从我的bytearray
的形状推断出这一点(不需要手动操作)-也许更好的问题是“如何将我的16位bytearraybytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d')
转换为6个无符号整数的序列”你所说的字节长度是什么意思?一个字节总是8位。格式字符串提供您尝试创建的类型的格式(包括位长度)。无论如何,使用array
方法,它采用相同的格式字符串,您只需要导入数组;array.array('h',raw)
例如,它创建了一个由16位有符号整数组成的数组,我想这就是您想要的(您还不是很清楚)
>>> len(bytearray(b'\xfdo\xfe\x7f\xfd\xd3\xf1d'))
8
import array
result = array.array('h', raw)