当 reading/writing .wav 文件时,将样本数组乘以比例因子会产生不明确的结果
Multiplying samples array by scaling factor gives ambiguous results when reading/writing .wav files
我需要操作一些 .wav
文件,我正在使用 scipy.io.wavfile
模块来帮助我完成这项任务。
当我试图了解 read
和 write
函数的工作原理时,我 运行 遇到了问题。
我有一个样本文件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.01
、1.0001
、0.1
和我尝试的许多其他值时,同样的事情发生了 - 将音量大幅提升到大失真的程度。
当我将示例数组乘以 1/32767
左右的值(即 1/(2^15-1)
)时,文件开始听起来完全相同(并且在导入 Audacity 时看起来完全相同)。这是 st运行ge 因为 read()
函数返回的样本数组中的值肯定不相同。
为什么当缩放值为 1 或 1/32767,两个非常不同的数字时,写入操作的输出文件听起来相同?
如有任何帮助,我们将不胜感激。
编辑:如果有帮助,x.dtype
的输出(read()
返回的示例数组的 dtype
属性是 int16
)。
如果x
有dtype
np.int16
,那么x1
有dtype
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))
我需要操作一些 .wav
文件,我正在使用 scipy.io.wavfile
模块来帮助我完成这项任务。
当我试图了解 read
和 write
函数的工作原理时,我 运行 遇到了问题。
我有一个样本文件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.01
、1.0001
、0.1
和我尝试的许多其他值时,同样的事情发生了 - 将音量大幅提升到大失真的程度。
当我将示例数组乘以 1/32767
左右的值(即 1/(2^15-1)
)时,文件开始听起来完全相同(并且在导入 Audacity 时看起来完全相同)。这是 st运行ge 因为 read()
函数返回的样本数组中的值肯定不相同。
为什么当缩放值为 1 或 1/32767,两个非常不同的数字时,写入操作的输出文件听起来相同?
如有任何帮助,我们将不胜感激。
编辑:如果有帮助,x.dtype
的输出(read()
返回的示例数组的 dtype
属性是 int16
)。
如果x
有dtype
np.int16
,那么x1
有dtype
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))