Создание 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