读取/写入.wav文件时,将样本数组乘以比例因子会产生模糊的结果

时间:2019-06-17 12:14:53

标签: python scipy wav

我需要处理一些.wav文件,并且我正在使用scipy.io.wavfile模块来帮助我完成此任务。

当我试图了解readwrite函数的工作方式时遇到了一个问题。

我有一个示例文件input_file.wav。我编写的按预期工作的代码是:

def scale(filename):
    fs, x = wavfile.read(filename)
    wavfile.write('test_output.wav', fs, x)
    return
scale('input_file.wav')

当我将它们导入Audacity时,输入和输出文件看起来完全相同,并且在耳机上听起来完全相同。 执行以下代码时遇到问题。

def scale(filename):
    fs, x = wavfile.read(filename)
    x1 = x * 0.5
    wavfile.write('test_output1.wav', fs, x1)
    return
scale('input_file.wav')

我希望输出的声音会大一半(因为我将每个样本的值乘以0.5。但是当我将其导入Audacity时,文件声音很大到严重失真的程度。

当我乘以1.011.00010.1和其他尝试的其他值时,发生了同样的事情-将音量大大提高到了大失真的程度。

当我将样本数组乘以1/32767左右的值(即1/(2^15-1))时,文件开始听起来完全相同(导入Audacity时看起来完全相同)。这很奇怪,因为read()函数返回的示例数组中的值肯定不相同。

当缩放值为1或1/32767(两个非常不同的数字)时,为什么写操作的输出文件听起来相同?

任何帮助将不胜感激,谢谢。

编辑:如果有帮助,则x.dtype的输出(dtype返回的示例数组的read()属性为int16)。

1 个答案:

答案 0 :(得分:1)

如果xdtype np.int16,则x1dtype np.float64。看来scipy.io.wavfile.write试图将64位浮点值写入文件,即使文档仅提到32位浮点格式。您可以通过将x1转换为int16或将x1中的值标准化为[-1,1](或[-0.5,0.5]或到[-1,1]中的任意范围)。也就是说,您可以使用

wavfile.write('test_output1.wav', fs, np.round(x1).astype(x.dtype))  # If x has an integer dtype

wavfile.write('test_output1.wav', fs, (x1/2**15).astype(np.float32))