Создание 1D двоичного массива (uint8) с несколькими записями в gnuplot

Я понимаю, что этот вопрос похож наGnuplot: как построить несколько временных рядов из двоичного формата; Однако я'Мы уже создали пример, который немного отличается, так что надеюсь, что этоs ОК, чтобы отправить (ответьте самостоятельно) .I '

м генерируя мои двоичные данные, как это (см. ниже дляgenbindata.pl Perl скрипт):

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

Этот двоичный файл,bin.dat форматируется следующим образом (первые две строки имеют индекс на основе 1 и индекс на основе 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  

... гдеWW 4 байта подписи;XX 100 байт синусоиды со значениями от 0 до 63;YY 100 байтов косинуса со значениями от 64 до 127; а такжеZZ 30 байтов случайного значения; здесь с учетом байта.uint8

Что я хочу сделать, это использовать этоbin.dat как есть (то есть я бы неМне нравится писать сценарии для анализа данных и вывода их в болееgnuplot дружеский формат) - и нанесите синусоидальные и косинусные данные отдельным цветом на одну диаграмму.

я нашелДвоичный генерал раздел помощи (такой же вgnuplot терминал, набравhelp binary general), но испытывают трудности в понимании этого (и не могнайти гораздо больше другой информации в Интернете). Итак - после очистки для (нескольких) примеров в Интернете - я запускаюgnuplot в режиме терминала, и яя пытаюсь следующееgnuplot команда:

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

... в надежде, что это значит: "Пропустите первые четыре байта, интерпретируйте следующие как 100 байтов данных 1D (отформатированных как '% Uint8'и начало в 0,0 после пропуска), за которым следуют 100 байтов одномерных данных (100 строк одного столбца, отформатированных как '% Uint8'и начало в 100,0 после пропуска); и использовать псевдостолбец 0 (индекс точки) в качестве оси x, и первый результат из массивов, чтобы построить с линиями "... к сожалению, этоне означает, что - поскольку ничего не вычерчивается, а команда не выполняется с "Слишком многие используют спецификации для этого стиля ".

Тогда я думаю - хорошо, если естьОчень много "using, затем я'просто заговор1 там:

    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]

Это на самом деле генерирует график - единственная плоская красная линия при y = 0.

Итак, учитывая, что он жалуется на диапазон y, я изменяю порядок исходных аргументов ((100,0) на (0,100)) и, наконец, получаю команду, которая не 'сгенерировать любое сообщение:

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

... но он показывает только одну наклонную линию:

... ничего похожего на синусоиду, которую я ожидаю:(

Итак, мой вопрос - как я могу получитьgnuplot построить данные, которые я хочу?

Вот: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

Ответы на вопрос(1)

Ваш ответ на вопрос