plot audio data in gnuplot

后端 未结 3 1470
孤独总比滥情好
孤独总比滥情好 2020-12-23 15:26

how could I convert an audio file such as a aiff into a svg using gnuplot? I used sox (sound exchange) to convert an .aiff into a .dat, which I can load now in gnuplot.

3条回答
  •  南笙
    南笙 (楼主)
    2020-12-23 15:54

    Just wanted to document this - well, I was looking for a long time for a Linux command line audio waveform viewer, which could be called from the command line, with a raw binary file as input, and where the format of the data could be specified on the command line.

    Audacity can import raw data, but only from the GUI (there is no way to specify raw datafile format through its command line options); while wave viewers like gwave, gtkwave or Gaw - Gtk Analog Wave viewer can either read proper .wav, or SPICE based formats.

    And thanks to the answer by @Thor, now I know I can use gnuplot for the purpose. Here is an example command line, which interprets the raw binary data as 16-bit stereo:

    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"
    

    ... or broken in several lines:

    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"
    

    Note that:

    • you should only use pipe "< ..." if you want to output from a shell command - if you have a file (like above), don't use the pipe (else getting permission denied)
    • Note the format '%int16%int16' will cause the byte stream to be "grouped" as 2 bytes representing column (channel) 1, the next 2 bytes as column (channel) 2, the next 2 bytes again as column 1, and so on... see gnuplot docs_4.2: Binary General - Format (also related: Gnuplot: How to plot multiple time series from a binary format)
    • Finally with two independent plots, one using 0:1 and the other using 0:2, we can get a typical waveform rendering (as in accepted answer) - with one channel above the other
    • Since the --persist option is used above, gnuplot will exit, while the (x11 or wxt) window will remain - and so, the typical gnuplot interaction with the window will not work

    Anyways, glad I found this, will save me quite a bit of time, I think :)

提交回复
热议问题