使用 wavio Python 3.5 读取 24 位 WAV
Reading 24-Bit WAV with wavio Python 3.5
我正在使用 WarrenWeckesser 的 wavio,因为我需要读取 python 中的 24 位 wav 文件。我拥有的 wav 文件是由一些仪器生成的,我试图在没有任何规范化或缩放的情况下获取原始值。
在 wavio 模块中,完成工作的代码是这样的:
if sampwidth == 3:
a = _np.empty((num_samples, nchannels, 4), dtype=_np.uint8)
raw_bytes = _np.fromstring(data, dtype=_np.uint8)
a[:, :, :sampwidth] = raw_bytes.reshape(-1, nchannels, sampwidth)
a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255
result = a.view('<i4').reshape(a.shape[:-1]
有人能解释一下它到底在做什么吗(我是 numpy 和数组切片的新手)。我明白大部分内容,但我不明白这里发生了什么:
a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255
在我的例子中,它进行了从 24 位到 32 位的转换,但我无法确定它是在缩放数据,还是在不更改任何原始值的情况下简单地填充数据。
a
的形状是(num_samples, nchannels, 4)
和sampwidth == 3
,所以那条线和
是一样的
a[:, :, 3:] = (a[:, :, 2:3] >> 7) * 255
与
相同
a[:, :, 3] = (a[:, :, 2] >> 7) * 255
我们可以去向量化外部的两个循环:
for i in range(num_samples):
for j in range(nchannels):
a[i, j, 3] = (a[i, j, 2] >> 7) * 255
a
的dtype是_np.uint8
,所以a[...] >> 7
只能在<128的时候给出0,或者≥128的时候给出1,所以上面就变成了:
for i in range(num_samples):
for j in range(nchannels):
v = a[i, j, 2]
a[i, j, 3] = 255 if v >= 128 else 0
如果数据是 24 位小端整数,这相当于将 sign-extension 转换为 32 位。
我正在使用 WarrenWeckesser 的 wavio,因为我需要读取 python 中的 24 位 wav 文件。我拥有的 wav 文件是由一些仪器生成的,我试图在没有任何规范化或缩放的情况下获取原始值。
在 wavio 模块中,完成工作的代码是这样的:
if sampwidth == 3:
a = _np.empty((num_samples, nchannels, 4), dtype=_np.uint8)
raw_bytes = _np.fromstring(data, dtype=_np.uint8)
a[:, :, :sampwidth] = raw_bytes.reshape(-1, nchannels, sampwidth)
a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255
result = a.view('<i4').reshape(a.shape[:-1]
有人能解释一下它到底在做什么吗(我是 numpy 和数组切片的新手)。我明白大部分内容,但我不明白这里发生了什么:
a[:, :, sampwidth:] = (a[:, :, sampwidth - 1:sampwidth] >> 7) * 255
在我的例子中,它进行了从 24 位到 32 位的转换,但我无法确定它是在缩放数据,还是在不更改任何原始值的情况下简单地填充数据。
a
的形状是(num_samples, nchannels, 4)
和sampwidth == 3
,所以那条线和
a[:, :, 3:] = (a[:, :, 2:3] >> 7) * 255
与
相同a[:, :, 3] = (a[:, :, 2] >> 7) * 255
我们可以去向量化外部的两个循环:
for i in range(num_samples):
for j in range(nchannels):
a[i, j, 3] = (a[i, j, 2] >> 7) * 255
a
的dtype是_np.uint8
,所以a[...] >> 7
只能在<128的时候给出0,或者≥128的时候给出1,所以上面就变成了:
for i in range(num_samples):
for j in range(nchannels):
v = a[i, j, 2]
a[i, j, 3] = 255 if v >= 128 else 0
如果数据是 24 位小端整数,这相当于将 sign-extension 转换为 32 位。