在Python中将有符号PCM_FORMAT_S16_LE转换为浮点数
我有一个beagleboard,想要编程。
我正在使用PyAlsaAudio
来捕捉音频并绘制图形(还要对音频进行一些处理)。
不过,这其实是我第一次接触python和计算机音频。通常我使用数据采集系统和matlab,所以我从来没有处理过二进制(我猜是这样)数字。
pyalsa让我可以以多种格式输出音频,但示例代码都使用PCM_FORMAT_S16_LE
,所以我就先用这个,除非有人告诉我别的。
我需要学习的是如何将PCM_FORMAT_S16_LE
转换成一个数字数组。这应该很简单,但我还没找到简单的解决办法。
谢谢你们的阅读和帮助。 穆斯塔法
编辑:1 我想补充一下,我试过
In [113]: aaa = numpy.fromstring(data)
In [112]: numpy.size(aaa)
Out[112]: 250
但大小不对,因为我把周期大小设定为1000。 请帮帮我。
1 个回答
0
根据这个链接,PCM_FORMAT_S16_LE
表示的是每个通道的有符号16位样本(小端字节顺序)。当你使用numpy.fromstring
而不指定dtype
参数时,它默认会把数据当成float
类型,这样就会变成float64
。所以你原本的1000个16位样本会被转换成只有250个64位样本。
我觉得你应该这样做:
aaa = numpy.fromstring(data, dtype='<i2')
在数据类型中,<
表示小端字节顺序,i
表示有符号整数类型,2
表示16位,也就是2个字节的长度。