在Python中确定wave文件中允许的最大样本值

时间:2015-09-15 18:23:34

标签: python audio scipy wav

scipy.io.wavfile.read以整数形式返回数据。要进行音频处理,我想将它们转换为浮点数。我想在输入文件中允许任意位深度,所以我需要知道用于规范化整数数据的正确数字。例如,对于16位wav文件,我将整数数组除以( 2**15 - 1 )。但对于8位音频,我必须除以( 2**7 - 1 )

有没有一种简单的方法来获得这种深度,所以我可以将所有这些文件转换为可比较的浮点数据?我觉得这很基本,但我似乎无法找到它。

由于一些原因,我至少在目前没有安装更多功能更强的软件包,例如scikits

2 个答案:

答案 0 :(得分:1)

您可以使用numpy.iinfo获取有关整数数据类型的信息。例如,这里是一个16位有符号整数数组:

In [338]: data = np.array([10, 20, -30], dtype=np.int16)

In [339]: ii = np.iinfo(data.dtype)

In [340]: ii.max
Out[340]: 32767

In [341]: ii.min
Out[341]: -32768

In [342]: ii.bits
Out[342]: 16

这是一个8位无符号整数数组:

In [350]: data = np.array([10, 20, 200, 5], dtype=np.uint8)

In [351]: ii = np.iinfo(data.dtype)

In [352]: ii.max
Out[352]: 255

In [353]: ii.min
Out[353]: 0

In [354]: ii.bits
Out[354]: 8

答案 1 :(得分:0)

我已经写了一个tutorial和一个名为pcm2float()的帮助函数,可以做你想要的。

给定NumPy数组sig中的信号和目标数据类型dtype,它只是这样做:

sig.astype(dtype) / dtype.type(-np.iinfo(sig.dtype).min)