Мне нужно манипулировать некоторыми .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
и ряд других опробованных мной значений - громко увеличил громкость до уровня больших искажений.
Файл начал звучать идентично (и выглядеть одинаково при импорте в Audacity), когда я умножил массив семплов на значение 1/32767
или около того (то есть 1/(2^15-1)
). Это странно, потому что значения в массиве примеров, возвращаемые функцией read()
, определенно не идентичны.
Почему выходные файлы из операции записи звучат одинаково, когда значение масштабирования равно 1 или 1/32767, два совершенно разных числа?
Любая помощь будет оценена, спасибо.
РЕДАКТИРОВАТЬ: Если это помогает, вывод x.dtype
(атрибут dtype
массива выборки, возвращаемый read()
, равен int16
).