wavfile.write: идентичные массивы, но работает только один - PullRequest
0 голосов
/ 20 мая 2018

У меня есть два одинаковых массива (по замыслу, потому что я получил второй, выполнив БПФ, а затем обратный БПФ первого).Однако, когда я записываю первый файл в файл .wav, я получаю звуковой файл, а не когда я делаю то же самое со вторым.У меня нет звука.Вот мой код:

fs, data = wavfile.read(filename)
a = data.T[0]
c = fft(a)
y2 = fftp.ifft(c)
y2 = np.array([int(round(i)) for i in y2.real])

Теперь, когда я пытаюсь:

sum(y2==a)==len(a)

, я получаю True, что означает, что два массива идентичны.Единственное отличие состоит в том, что он имеет "dtype = int16":

In [322]: a
Out[322]: array([ 1,  1,  1, ..., 21, 20, 21], dtype=int16)
In [321]: y2
Out[321]: array([ 1,  1,  1, ..., 21, 20, 21])

Как преобразовать второй массив в формат, в котором он также создает действительный файл .wav?

1 Ответ

0 голосов
/ 20 мая 2018

Эта «единственная разница» - огромная разница.

Формат WAV по умолчанию хранит сэмплы в виде 16-разрядных целых чисел со знаком с прямым порядком байтов.Таким образом, когда вы записываете массив int16 значений в виде необработанных данных, вы получаете воспроизводимый WAV-файл (по крайней мере в системе с прямым порядком байтов).

Но когда вы пишете массив int32значения, вы получаете ерунду - каждое число превращается в 2 образца, один из которых является старшим словом ваших данных, а следующий - младшим словом.Таким образом, у вас есть исходные аудиосэмплы с половинной скоростью и чередование с фактически случайным шумом.


Или, в качестве альтернативы, вы можете использовать формат WAV не по умолчанию.Вы не показали достаточного количества своего кода, чтобы показать, как вы справляетесь с этим, но вы можете записывать файлы WAV в различных форматах: от 8-разрядного беззнакового целого до 32-разрядного с плавающей запятой, а 32-разрядные целые числа со знаком являютсядействительный формат.Файлы WAV могут даже справляться со сжатием (включая MP3).

Но менее распространенные форматы могут воспроизводиться не с каждым инструментом;многие программы предполагают, что WAV - это 16-битные целые числа, и не будут знать, что делать с чем-либо еще.

Итак, вам, вероятно, лучше писать 16-разрядные целые числа.


Или, может быть, вы уже делаете это - записываете 32-разрядные значения типа int с правым заголовком -и, возможно, ваш плеер обрабатывает их правильно.

Но вы пишете 32-битные значения типа int в диапазоне от -32768 до 32767. Это означает, что вы используете только 1/55636 от динамического диапазона, так что все будетневероятно тихоЕсли вы хотите записать 32-разрядные значения типа int, вы должны нормализовать их в 32-разрядном диапазоне int, а не в 16-разрядном диапазоне int.


Самое простое решение всех этих проблем -: преобразовать значения обратно в int16 перед записью их:

y3 = y2.astype(np.int16)
...