2011-04-29 14 views
14

¿cómo podría convertir un archivo de audio como un aiff en svg usando gnuplot? Usé sox (intercambio de sonido) para convertir un .aiff en .dat, que ahora puedo cargar en gnuplot.trazar datos de audio en gnuplot

hice algo similar a:

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

consigo un archivo SVG, pero sólo con puntos/o una gran cantidad de x. ¿Cómo podría conectar los puntos?

Respuesta

24

Para dibujar líneas entre los puntos, utilice

plot "test.dat" with lines 

o para mantener los marcadores de punto, así como las líneas, utilice

plot "test.dat" with linespoints 

Así que su ejemplo se convierte en

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

Otros consejos:

No considere todas las muestras:

Con archivos grandes, también puede resultarle útil representar cada enésima muestra con "cada n". Esto hará que la trama sea mucho más rápida de generar y también arrojará un archivo svg más pequeño (pero menos detallado).

p. Ej.

plot "test.dat" every 100 with lines 

Ignorar encabezado del archivo .dat:

Si su sox-producido archivo .dat tiene algunas líneas de metadatos de introducción, como

; Sample Rate 44100 
; Channels 2 

se puede añadir lo siguiente a tener gnuplot considere esos comentarios de líneas e ignórelos.

set datafile commentschars ";" 

Esto le ahorrará tener a su archivo .dat pre-proceso con el fin de eliminar esas líneas antes de gnuplot se ahoga con ellos. canales

Terreno izquierdo y derecho de audio estéreo:

Si está trabajando con un archivo de música, es probable que quieren ver los dos canales.

Podemos usar "multiplot" para trazar los siguientes dos gráficos (del canal izquierdo y derecho) uno encima del otro en un eje x compartido, como lo hacen muchos programas de edición de sonido.

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

El 1: instruir gnuplot 3 que las columnas del archivo DAT para utilizar como x y fuentes Y: 2 y 1. Estoy asumiendo tu estéreo.dat archivo producido por sox parece como el mío, con columnas para - 1: el tiempo desde el inicio de la primera muestra de - 2: valor de la muestra normalizada de canal izquierdo - 3: valor de la muestra normalizada de canal derecho

fragmento de ejemplo:

10.840113  0.20101929  0.17840576 
    10.840136  0.26062012  0.14831543 
    10.840159  0.23779297  0.13146973 

Juntando todo: Aquí hay un script que pone todo lo anterior junto. Si no tiene un archivo de datos estéreo para probar esto, querrá eliminar la trama de 1: 3 y la configuración de multiplot.

#!/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 

prettification

Por último, hemos ajustado el guión de presentación (préstamos en gran medida de la excelente "gnuplot en acción" libro de Philipp K. Janert):

#!/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 

Aquí hay un ejemplo de salida (aunque png): gnuplotted audio data (stereo example)

Cómo hacer un archivo .dat

Para cualquier persona siguiendo a lo largo en su casa, puede utilizar Medias para generar un archivo .dat de un archivo de audio con el siguiente comando:

sox input.wav output.dat 

advertencia archivo grande: La conversión de solo 10 segundos de audio estéreo a 40kHz producirá un archivo de salida de 25Mb.

+0

gracias que será de gran ayuda! – algomachine

+0

Ahora recibo un error de análisis después de crear el archivo .svg. Puedo leer el archivo, por ejemplo, en Safari, pero no en Adobe Illustrator. Después de abrir el archivo en Safari, el navegador me dice que sucedió "error en la línea 1857 en la columna 47: contenido adicional al final del documento". – algomachine

+0

Acabo de crear un archivo eps postscript. Gracias de nuevo. – algomachine

4

Tenga en cuenta que también se puede representar gráficamente los datos binarios directamente:

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

Sólo quería documentar esto - bueno, estaba buscando desde hace mucho tiempo para una línea de comandos visor de forma de onda de audio en Linux, lo que podría llamarse desde la línea de comandos, con un archivo binario sin procesar como entrada, y donde el formato de los datos podría especificarse en la línea de comando.

Audacity puede importar datos sin procesar, pero solo desde la GUI (no hay forma de especificar el formato del archivo de datos en bruto a través de sus opciones de línea de comando); mientras que los visualizadores de onda como gwave, gtkwave o Gaw - Gtk Analog Wave viewer pueden leer los formatos adecuados .wav o SPICE.

Y gracias a la answer by @Thor, ahora sé que puedo usar gnuplot para este propósito. Aquí hay una línea de comando de ejemplo, que interpreta los datos binarios en bruto como estéreo de 16 bits:

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" 

...o roto en varias líneas:

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" 

Tenga en cuenta que:

  • Sólo debe utilizar tubería "< ..." si quieres salida de un comando shell - si usted tiene un archivo (como arriba), don' t use el conducto (de lo contrario, obtener permiso denegado)
  • Tenga en cuenta que el formato '%int16%int16' hará que el flujo de bytes se "agrupe" como 2 bytes que representan la columna (canal) 1, los siguientes 2 bytes como columna (canal) 2, el siguiente 2 bytes de nuevo como columna 1, y así sucesivamente ... ver gnuplot docs_4.2: Binary General - Format (también relacionado: Gnuplot: How to plot multiple time series from a binary format)
  • último con dos plot s independientes, uno using 0:1 y el otro using 0:2, podemos obtener una representación típica forma de onda (como en la respuesta aceptada) - con un canal sobre el otro
  • Dado que la opción --persist se utiliza anteriormente, gnuplot terminará, mientras que la ventana (o x11wxt) permanecerá - y por lo tanto, el típico gnuplot interacción con la ventana se no trabajo

de todas formas, contento de haber encontrado esto, me va a salvar a qui Te un poco de tiempo, creo que :)

Cuestiones relacionadas