在Python中将有符号PCM_FORMAT_S16_LE转换为浮点数

1 投票
1 回答
831 浏览
提问于 2025-04-17 13:36

我有一个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个字节的长度。

撰写回答