当 reading/writing .wav 文件时,将样本数组乘以比例因子会产生不明确的结果

Multiplying samples array by scaling factor gives ambiguous results when reading/writing .wav files

我需要操作一些 .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 时看起来完全相同)。这是 st运行ge 因为 read() 函数返回的样本数组中的值肯定不相同。

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

如有任何帮助,我们将不胜感激。

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

如果xdtypenp.int16,那么x1dtypenp.float64scipy.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))