Записывать аудиоданные в gnuplot

как я могу преобразовать аудиофайл, такой как aiff, в svg, используя gnuplot? Я использовал sox (sound exchange) для преобразования .aiff в .dat, который я могу загрузить сейчас в gnuplot.

Я сделал что-то похожее на:

set terminal svg
set output "test.svg"
plot "test.dat"

Я получаю файл svg, но только с точками/или множеством x. Как подключить точки?

Ответы

Ответ 1

Чтобы нарисовать линии между точками, используйте

plot "test.dat" with lines

Чтобы сохранить маркеры точек и строки, используйте

plot "test.dat" with linespoints

Итак, ваш пример станет

set terminal svg    
set output "test.svg"
plot "test.dat" with lines

Дополнительные советы:

Не рассматривайте каждый образец:

С большими файлами вы также можете сочтет полезным отображать только каждый n-й образец с "каждым n". Это заставит график намного быстрее генерировать, а также даст меньший (но менее подробный) файл svg.

например.

plot "test.dat" every 100 with lines

Игнорировать заголовок файла .dat:

Если в файле .dat, созданный sox, есть некоторые строки вводных метаданных, например

; Sample Rate 44100
; Channels 2

вы можете добавить следующее, чтобы gnuplot рассматривал эти строки и игнорировал их.

set datafile commentschars ";"

Это избавит вас от необходимости предварительно обрабатывать ваш .dat файл, чтобы удалить эти строки до того, как gnuplot захлопывает их.

Запланировать как левый, так и правый каналы стереозвука:

Если вы работаете со стерео файлом, вы, вероятно, захотите увидеть оба канала.

Мы можем использовать "множитель" для выкладки следующих двух графиков (слева и справа) один над другим на общей оси х, как это делают многие программы редактирования звука.

set multiplot layout 2,1
plot "test.dat" using 1:2 with lines
plot ""         using 1:3 with lines

1: 2 и 1: 3 инструктируют gnuplot, какие столбцы файла dat использовать в качестве источников x и y. Я предполагаю, что ваш стереофонический .dat файл, созданный sox, выглядит как мой, со столбцами для  - 1: время с начала первого образца  - 2: нормализованное значение выборки левого канала  - 3: нормализованное значение выборки правого канала

Пример фрагмента:

   10.840113       0.20101929      0.17840576 
   10.840136       0.26062012      0.14831543 
   10.840159       0.23779297      0.13146973 

Объединение: Здесь a script, который объединяет все вышеперечисленное. Если у вас нет файла стереоданных для этого, вы должны удалить график 1: 3 и настройку мультиплексора.

#!/usr/bin/env gnuplot
set datafile commentschars ";"

set terminal svg
set output "test.svg"

set multiplot layout 2,1
plot "test.dat" using 1:2 every 100 with lines
plot ""         using 1:3 every 100 with lines
unset multiplot

приукрашивание

Наконец, я изменил представление script для презентации (заимствуя большую часть из превосходной книги "gnuplot in action" Филиппа К. Джантера):

#!/usr/bin/env gnuplot
set datafile commentschars ";"

set terminal svg
set output "test.svg"

set multiplot layout 2,1

set ylabel "sample value"
set bmargin 0
set format x ""
set ytics -0.8,0.2
set key bottom
plot "test.dat" using 1:2 every 100 with lines lc rgbcolor "#a0a0b0" title "left channel"

set xlabel "time (s)"
set bmargin
set tmargin 0
set format x "%g"
set ytics -1.0,0.2,0.8
set key top

plot ""         using 1:3 every 100 with lines lc rgbcolor "#a0a0b0" title "right channel"
unset multiplot

Здесь пример вывода (хотя и png): gnuplotted audio data (stereo example)

Как сделать .dat файл

Для тех, кто следует за домом, вы можете использовать sox для создания файла .dat из аудиофайла с помощью следующей команды:

sox input.wav output.dat

Предупреждение о большом файле: преобразование даже 10 секунд стереофонического звука на частоте 40 кГц приведет к выходному файлу 25 МБ.

Ответ 2

Обратите внимание, что вы также можете напрямую строить двоичные данные:

set terminal svg
set output "test.svg"
plot '< sox test.aiff -t s32 -' binary format='%int32' using 0:1 with lines

Ответ 3

Просто хотел задокументировать это - ну, я долго искал средство просмотра аудиосигналов командной строки Linux, которое можно было бы вызывать из командной строки, с исходным двоичным файлом в качестве входных данных, и где формат данные могут быть указаны в командной строке.

Audacity может импортировать необработанные данные, но только из графического интерфейса (нет способа указать формат необработанных файлов данных через его параметры командной строки); в то время как волновые зрители, такие как gwave, gtkwave или Gaw - Gtk Analog Wave viewer могут либо читать правильные .wav, либо SPICE-форматы,

И благодаря ответу от @Thor, теперь я знаю, что могу использовать gnuplot для этой цели. Вот пример командной строки, который интерпретирует необработанные двоичные данные как 16-битное стерео:

gnuplot -p -e "set terminal x11 ; set multiplot layout 2,1 ; plot 0 ls 2, 'data.raw' binary format='%int16%int16' using 0:1 with lines ls 1; plot 0 ls 2, 'data.raw' binary format='%int16%int16' using 0:2 with lines ls 1 ; unset multiplot"

... или сломан в нескольких строках:

gnuplot -p -e "set terminal x11 ; set multiplot layout 2,1 ; \
plot 0 ls 2, 'data.raw' binary format='%int16%int16' using 0:1 with lines ls 1; \
plot 0 ls 2, 'data.raw' binary format='%int16%int16' using 0:2 with lines ls 1; \
unset multiplot"

Обратите внимание, что:

  • вы должны использовать только pipe "< ...", если вы хотите вывести из командной оболочки - если у вас есть файл (например, выше), не используйте этот канал (иначе вы получите отказ в доступе)
  • Обратите внимание, что формат '%int16%int16' приведет к тому, что поток байтов будет "сгруппирован" как 2 байта, представляющий столбец (канал) 1, следующие 2 байта как столбец (канал) 2, следующие 2 байта снова как столбец 1 и так далее... см. gnuplot docs_4.2: Binary General - Format (также связанный: Gnuplot: Как построить несколько временных рядов из двоичного формата)
  • Наконец, с двумя независимыми plot s, одним using 0:1 и другим using 0:2, мы можем получить типичную визуализацию формы (как в принятом ответе) - с одним каналом над другим
  • Так как опция --persist используется выше, gnuplot выйдет, а окно (x11 или wxt) останется - и поэтому типичное взаимодействие gnuplot с окном не будет работать

В любом случае, рад, что я нашел это, спаси меня совсем немного времени, я думаю, :)