Graficando una matriz binaria 1D (uint8) con múltiples registros en gnuplot

Entiendo que esta pregunta es similar aGnuplot: cómo trazar múltiples series de tiempo desde un formato binario; sin embargo, ya he configurado un ejemplo que es ligeramente diferente, así que espero que esté bien publicar (a continuación se incluye la respuesta automática).

Estoy generando mis datos binarios como este (ver más abajo para lagenbindata.pl Script de Perl):

$ perl genbindata.pl > bin.dat
$ du -b bin.dat 
234 bin.dat

Este archivo binario,bin.dat tiene un formato como este (las dos primeras filas están basadas en 1 y en el índice basado en 0):

>|  1   2   3   4 |  5   6 ... 104 |105 106 ... 204 |205 206 ... 234
>|000 001 002 003 |004 005 ... 103 |104 105 ... 203 |204 205 ... 233
>| WW  WW  WW  WW | XX  XX ...  XX | YY  YY ...  YY | ZZ  ZZ ...  ZZ  

... dóndeWW Son 4 bytes de firma;XX son 100 bytes de una sinusoide con valores de 0 a 63;YY son 100 bytes de un coseno con valores de 64 a 127; yZZ Son 30 bytes de valor aleatorio; aquí considerando un byte para seruint8.

 

Lo que quiero hacer, es usar estobin.dat tal como eses decir, no me gustaría escribir scripts para analizar los datos y generarlos de forma másgnuplot formato amigable) - y trazar los datos de seno y coseno, con color separado, en un solo diagrama.

encontréGeneral binario sección de la ayuda (igual engnuplot terminal escribiendohelp binary general), pero tienen dificultades para entenderlo (y no pude encontrar mucha más información en línea). Entonces, después de buscar en (los pocos) ejemplos en línea, enciendognuplot en modo terminal, y estoy intentando lo siguientegnuplot mando:

plot "bin.dat" binary skip=4 array=100x1:100x1 format='%uint8%uint8' origin=(0,0):(100,0) using 0:1 with lines

... con la esperanza de que signifique: "Omita los primeros cuatro bytes, interprete los siguientes como 100 bytes de datos 1D (formateados como '% uint8' y origen a 0,0 después del salto), seguido de 100 bytes de datos 1D (100 filas de una columna, con formato '% uint8' y origen a 100,0 después del salto); y use la pseudocolumna 0 (índice del punto) como eje x, y el primer resultado de las matrices, para trazar con líneas " ... desafortunadamente,no hace significa que, como no se traza nada, y el comando falla con "Demasiados usando especificaciones para este estilo".

Entonces pienso - ok, si hay "demasiadosusing", entonces sólo trazaré el1 ahí:

    gnuplot> plot "bin.dat" binary skip=4 array=100x1:100x1 format='%uint8%uint8' origin=(0,0):(100,0) using 1 with lines
    Warning: empty y range [0:0], adjusting to [-1:1]

De hecho, esto genera un gráfico: una sola línea roja plana en y = 0.

Entonces, dado que se queja sobre el rango y, cambio el orden de los argumentos de origen ((100,0) a (0,100), y finalmente obtengo un comando que no genera ningún mensaje:

gnuplot> plot "bin.dat" binary skip=4 array=100x1:100x1 format='%uchar%uchar' origin=(0,0):(0,100) using 1 with lines
gnuplot> 

... pero traza una sola línea inclinada:

... nada como la sinusoide que espero:(

 

Entonces, mi pregunta es, ¿cómo puedo obtenergnuplot ¿Para trazar los datos que quiero?

Aquí estágenbindata.pl:

#!/usr/bin/env perl

use 5.10.1;
use warnings;
use strict;
use open IO => ':raw'; 

binmode(STDIN);
binmode(STDOUT);

my $signatur = "SIGN";
my @signature = unpack('C*', $signatur);

my (@ch1, @ch2) = ()x2;

# generate 100 samples of (co)sinusoid
for ( my $ix = 0; $ix < 100; $ix++ ) {
  my $val1 = 1 + sin($ix*2*3.14/100); # range: 0-2
  my $val2 = 1 + cos($ix*2*3.14/100); # range: 0-2
  my $ch1val = int($val1*32);
  my $ch2val = int($val2*32+64);
  push(@ch1, $ch1val);
  push(@ch2, $ch2val);
  #print STDERR "val[$ix]: $ch1val, $ch2val\n";
}

# generate 30 samples random
my @end = ();
for ( my $ix = 0; $ix < 30; $ix++ ) {
  my $val = int(128*rand() + 32);
  push(@end, $val);
  #~ print STDERR "val[$ix]: $val\n";
}

# concatenate arrays:
my @output = (@signature,@ch1,@ch2,@end);
my $sizarr = scalar(@output);
#~ print STDERR " ".." ";

# print output - uint8: "C"
my $outstr = pack("C*", @output);
my $lenstr = length($outstr);
#~ print STDERR "output size: $sizarr; output length: $lenstr\n";
print $outstr;

# end

Respuestas a la pregunta(1)

Su respuesta a la pregunta