Итак, я начинаю этот эксперимент так: откройте Audacity, затем установите Project Rate (Hz) на 8000, затем Generate/Silence... - и в появившемся диалоговом окне измените формат времени на сэмплы и установите длину на 10 образцы. Затем, когда полученная тишина из 10 сэмплов будет вставлена, используйте Инструмент рисования (F3), чтобы назначить произвольное значение семплам — это будет выглядеть примерно так:
Затем Файл/Экспорт/Экспорт в формате WAV и сохраните его как test.wav
. Мы можем проверить это в командной строке с помощью mediainfo
:
$ mediainfo test.wav
General
Complete name : test.wav
Format : Wave
File size : 64.0 Bytes
Overall bit rate mode : Constant
Audio
Format : PCM
Format settings : Little / Signed
Codec ID : 1
Bit rate mode : Constant
Bit rate : 128 kb/s
Channel(s) : 1 channel
Sampling rate : 8 000 Hz
Bit depth : 16 bits
Хорошо, теперь я хочу передискретизировать это до 48 кГц - однако без интерполяции (то есть сэмплы просто повторяются: учитывая, что в этом случае 48/8 = 6, это означает, что каждый из вышеперечисленных сэмплов должен повторяться 6 раз, чтобы получить новый файл с передискретизацией)
Итак, я попытался использовать sox
с настройками по умолчанию:
$ sox test.wav -r 48000 test_out.wav
C:\Program Files (x86)\sox-14-4-2\sox.exe WARN rate: rate clipped 1 samples; decrease volume?
C:\Program Files (x86)\sox-14-4-2\sox.exe WARN dither: dither clipped 1 samples; decrease volume?
... но когда я импортирую test_out.wav
в Audacity, я вижу это:
... Итак, файл с передискретизацией явно был интерполирован.
Просто для справки: файл с передискретизацией без интерполяции будет выглядеть примерно так (я пытался рисовать вручную с помощью инструмента «Рисование», так что это не совсем точно, но для иллюстрации должно хватить):
Можно ли как-то уговорить sox
сделать ресемплинг без интерполяции? В качестве альтернативы, есть ли другой инструмент, который позволил бы мне передискретизировать .wav
s без интерполяции?
Для полноты картины вот шестнадцатеричный дамп test.wav
, который я использовал здесь:
$ hexdump -C test.wav
00000000 52 49 46 46 38 00 00 00 57 41 56 45 66 6d 74 20 |RIFF8...WAVEfmt |
00000010 10 00 00 00 01 00 01 00 40 1f 00 00 80 3e 00 00 |........@....>..|
00000020 02 00 10 00 64 61 74 61 14 00 00 00 00 00 78 29 |....data......x)|
00000030 8b 5f a4 95 e5 c0 80 3b 2a 6c b1 39 3f 19 fc ff |._.....;*l.9?...|
00000040
Вы можете преобразовать его обратно в двоичный файл, используя xxd
(см. в двоичный файл с помощью команды Linux )