Discussion:
[SoX-devel] spectrogram values
Markus Glugla
2016-01-08 14:31:18 UTC
Permalink
Hi,

I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.

I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the same
intention and more experience than me to produce a patch?

Thanks, Markus




------------------------------------------------------------------------------
Thor Andreassen
2016-01-20 02:37:36 UTC
Permalink
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.
I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall output,
that can be sent to Gnuplot. I will need these in the coming months, so
perhaps it will get done.

A crude way of getting the raw numbers could be to use the color values
from the generated png file, e.g. with Imagemagick:

sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |

# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all decorations. See
`sox --help-effect spectrogram` for more.

Now plot the data file with Gnuplot:

echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist

If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel files.
Use the new `-O filename` switch to save the binary data.

The default output is a sequence of floats which are 4 bytes long. This
is also Gnuplots default for binary input. This means you can plot the
output like this:

echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image' |
gnuplot --persist

Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
--
best regards
Thor Andreassen
Pander
2016-01-21 15:33:19 UTC
Permalink
Post by Thor Andreassen
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.
I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall output,
that can be sent to Gnuplot. I will need these in the coming months, so
perhaps it will get done.
A crude way of getting the raw numbers could be to use the color values
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all decorations. See
`sox --help-effect spectrogram` for more.
echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist
If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel files.
Use the new `-O filename` switch to save the binary data.
The default output is a sequence of floats which are 4 bytes long. This
is also Gnuplots default for binary input. This means you can plot the
echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image' |
gnuplot --persist
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Please note that there are some tricky side effects if you do it
incorrectly. See my post
https://sourceforge.net/p/sox/mailman/message/34724933/ on when to omit
and when not to omit the last sample of spectrogram data. Only when that
sample is completely filled, it may be included. That is the best
approach. All others result in deformed or suboptimal energy spectra.
Post by Thor Andreassen
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
Thor Andreassen
2016-01-22 23:54:22 UTC
Permalink
On Thu, Jan 21, 2016 at 04:33:19PM +0100, Pander wrote:

[...]
Post by Pander
Post by Thor Andreassen
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Please note that there are some tricky side effects if you do it
incorrectly. See my post
https://sourceforge.net/p/sox/mailman/message/34724933/ on when to omit
and when not to omit the last sample of spectrogram data. Only when that
sample is completely filled, it may be included. That is the best
approach. All others result in deformed or suboptimal energy spectra.
Interesting. I will have a closer look when I have more time.

Here is a link to the original mail you sent on the subject:

https://sourceforge.net/p/sox/mailman/message/33625255/
--
best regards
Thor Andreassen
Pander
2016-01-26 12:24:39 UTC
Permalink
Let me know when you start working on it. It is very tricky and I am
willing to be a critical tester if you want.
Post by Thor Andreassen
[...]
Post by Pander
Post by Thor Andreassen
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Please note that there are some tricky side effects if you do it
incorrectly. See my post
https://sourceforge.net/p/sox/mailman/message/34724933/ on when to omit
and when not to omit the last sample of spectrogram data. Only when that
sample is completely filled, it may be included. That is the best
approach. All others result in deformed or suboptimal energy spectra.
Interesting. I will have a closer look when I have more time.
https://sourceforge.net/p/sox/mailman/message/33625255/
Thor Andreassen
2016-01-22 17:38:51 UTC
Permalink
On Wed, Jan 20, 2016 at 03:37:36AM +0100, Thor Andreassen wrote:

[...]
Post by Thor Andreassen
A crude way of getting the raw numbers could be to use the color values
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
With the rgbimage feature of Gnuplot, you can actually access the pixels
directly, e.g.:

echo "plot 'spectrogram.png' binary filetype=png format='%uchar%uchar%uchar' \
using 1:2:3 with rgbimage" | gnuplot --persist

Or if you want to set the red channel to zero:

echo "plot 'spectrogram.png' binary filetype=png format='%uchar%uchar%uchar' \
using (0):2:3 with rgbimage" | gnuplot --persist

[...]
--
best regards
Thor Andreassen
Markus Glugla
2016-01-28 12:51:14 UTC
Permalink
Post by Thor Andreassen
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.
I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall output,
that can be sent to Gnuplot. I will need these in the coming months, so
perhaps it will get done.
A crude way of getting the raw numbers could be to use the color values
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all decorations. See
`sox --help-effect spectrogram` for more.
echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist
If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel files.
Use the new `-O filename` switch to save the binary data.
The default output is a sequence of floats which are 4 bytes long. This
is also Gnuplots default for binary input. This means you can plot the
echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image' |
gnuplot --persist
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Hi Thor

Thank you for your source code and your patch. I enjoy about your idea
which increases the productivity.

It is also in my opinion to use gnuplot as plotting tool to create
spectrogram in the same, my, style.

I also think about the grab the spectrogram datas via imagemagick. But
in this case it is easier to use GSL.

Thank you for your help. Your code snippets are very informative.

Markus
Pander
2016-01-28 13:00:49 UTC
Permalink
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.
I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall output,
that can be sent to Gnuplot. I will need these in the coming months, so
perhaps it will get done.
A crude way of getting the raw numbers could be to use the color values
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all decorations. See
`sox --help-effect spectrogram` for more.
echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist
If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel files.
Use the new `-O filename` switch to save the binary data.
The default output is a sequence of floats which are 4 bytes long. This
is also Gnuplots default for binary input. This means you can plot the
echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image' |
gnuplot --persist
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Hi Thor
Thank you for your source code and your patch. I enjoy about your idea
which increases the productivity.
It is also in my opinion to use gnuplot as plotting tool to create
spectrogram in the same, my, style.
I also think about the grab the spectrogram datas via imagemagick. But
in this case it is easier to use GSL.
Thank you for your help. Your code snippets are very informative.
Markus
Make sure to validate what the impact is of including or omitting the
last sample as it often is not complete and distorts the spectrum, see
my earlier analysis with graphs illustrating that.
Post by Markus Glugla
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
Markus Glugla
2016-01-28 14:47:22 UTC
Permalink
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other tools
e.g. gnuplot.
I would be very grateful if it were possible to output the spectrogram
data as plotable values in a file or stream. Does anybody have the
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall output,
that can be sent to Gnuplot. I will need these in the coming months, so
perhaps it will get done.
A crude way of getting the raw numbers could be to use the color values
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2, ($3+$4+$5)/3 }' |
awk 'NR > 2 && $2 != prev { printf "\n" } { prev = $2 } 1' \
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all decorations. See
`sox --help-effect spectrogram` for more.
echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist
If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel files.
Use the new `-O filename` switch to save the binary data.
The default output is a sequence of floats which are 4 bytes long. This
is also Gnuplots default for binary input. This means you can plot the
echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image' |
gnuplot --persist
Note that if your output from sox is short, the spectrogram dimensions
will be different from 800x513 and Gnuplot will barf.
Hi Thor
Thank you for your source code and your patch. I enjoy about your idea
which increases the productivity.
It is also in my opinion to use gnuplot as plotting tool to create
spectrogram in the same, my, style.
I also think about the grab the spectrogram datas via imagemagick. But
in this case it is easier to use GSL.
Thank you for your help. Your code snippets are very informative.
Markus
Make sure to validate what the impact is of including or omitting the
last sample as it often is not complete and distorts the spectrum, see
my earlier analysis with graphs illustrating that.
I read your hints, thank you very much.

I think, it is typical of FFT which needs a even number of samples (2n).
On short sequences, the 2n FFT array is longer than the sequence you get
also porblems. A FFT with a number of less than 2n will be incorrect. I
think it's better to cut the sequence on right position to 2n before
FFT, is'nt? What is with windowing?

Thank you for your hint,
Markus
Post by Pander
Post by Markus Glugla
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
Pander
2016-01-28 16:17:09 UTC
Permalink
Post by Markus Glugla
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
Hi,
Hi Markus
Post by Markus Glugla
I read the spectrogram threads and affiliate a request. I'm using
sometimes sox spectrogram to get an spectral overview of various
measurement datas. But i want to plot the spectrogram with other
tools
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
e.g. gnuplot.
I would be very grateful if it were possible to output the
spectrogram
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
data as plotable values in a file or stream. Does anybody have
the
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
same intention and more experience than me to produce a patch?
I have been planning to implement an amplitude and water-fall
output,
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
that can be sent to Gnuplot. I will need these in the coming
months, so
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
perhaps it will get done.
A crude way of getting the raw numbers could be to use the color
values
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
sox -n -n synth 1 synth 1k:5k spectrogram -r -o - |
convert png:- txt:- |
# translate into Gnuplot compatible input
awk -v FS='[,:() ]+' 'NR > 2 { print $1, $2,
($3+$4+$5)/3 }' |
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
awk 'NR > 2 && $2 != prev { printf "\n" } {
prev = $2 } 1' \
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Post by Markus Glugla
spectrogram.dat
Note the use of the `-r` option to sox, which omits all
decorations. See
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
`sox --help-effect spectrogram` for more.
echo 'splot "spectrogram.dat" with pm3d' | gnuplot --persist
If you want to get at the raw spectrogram, you need to patch
spectrogram.c. The attached patch works best with single channel
files.
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
Use the new `-O filename` switch to save the binary data.
The default output is a sequence of floats which are 4 bytes long.
This
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
is also Gnuplots default for binary input. This means you can plot
the
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
echo 'plot "<sox -n -n synth 1 sine 1k:5k spectrogram -O -" \
binary array=(513,800) flipy rotation=90d with image'
|
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
gnuplot --persist
Note that if your output from sox is short, the spectrogram
dimensions
Post by Pander
Post by Markus Glugla
Post by Thor Andreassen
will be different from 800x513 and Gnuplot will barf.
Hi Thor
Thank you for your source code and your patch. I enjoy about your
idea
Post by Pander
Post by Markus Glugla
which increases the productivity.
It is also in my opinion to use gnuplot as plotting tool to create
spectrogram in the same, my, style.
I also think about the grab the spectrogram datas via imagemagick.
But
Post by Pander
Post by Markus Glugla
in this case it is easier to use GSL.
Thank you for your help. Your code snippets are very informative.
Markus
Make sure to validate what the impact is of including or omitting the
last sample as it often is not complete and distorts the spectrum,
see
Post by Pander
my earlier analysis with graphs illustrating that.
I read your hints, thank you very much.
I think, it is typical of FFT which needs a even number of samples (2n).
On short sequences, the 2n FFT array is longer than the sequence you get
also porblems. A FFT with a number of less than 2n will be incorrect. I
think it's better to cut the sequence on right position to 2n before
FFT, is'nt? What is with windowing?
More combination are OK, it is just theast sample that is dangerous. So safest is to skip it. That means either calculating the number of samples or parseing it twice or with a delay.
Post by Markus Glugla
Thank you for your hint,
Markus
------------------------------------------------------------------------------
Post by Pander
Post by Markus Glugla
Site24x7 APM Insight: Get Deep Visibility into Application
Performance
Post by Pander
Post by Markus Glugla
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
------------------------------------------------------------------------------
Post by Pander
Site24x7 APM Insight: Get Deep Visibility into Application
Performance
Post by Pander
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
SoX-devel mailing list
https://lists.sourceforge.net/lists/listinfo/sox-devel
Loading...