libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Функции ввода - вывода данных

Функции

int gnuplot_script (int argc, char *argv[], char *fn)
 Функция вызова скрипта пакета GNUPLOT для построения графика. Подробнее...
 
int writebin (void *x, int n, int dtype, char *fn)
 Сохранить данные в бинарный файл Подробнее...
 
int writetxt (double *x, double *y, int n, char *fn)
 Сохранить вещественные данные в текстовый файл Подробнее...
 

Подробное описание

Функции ввода и вывода данных. Запись и считывание данных в бинарные и текстовые файлы

Функции

◆ gnuplot_script()

int gnuplot_script ( int  argc,
char *  argv[],
char *  fn 
)

Функция вызова скрипта пакета GNUPLOT для построения графика.


Данная функция использует параметры вызова программы argc и argv[] и обрабатывает их для построения графиков.

Механизм построения графиков при помощи данной функции следующий:

  1. Основная программа производит расчет данных и сохранение их в текстовых файлах.
  2. Для построения графика из текстовых файлов необходимо подготовить plt-скрипт - текстовый файл описывающий стиль отображения графика и файлы данных.
  3. Основная программа вызывает функцию gnuplot_script в которую транслирует параметры отображения и имя plt-скрипта для построения графика. В зависимости от передаваемых программой параметров график может быть построен в отдельном окне, или сохранен в png-файл.
Аргументы
[in]argcЧисло параметров вызова основной программы.
Данный параметр указывает размер массива параметров argv[].

[in]argv[]Указатель на массив строк, передаваемых параметров.
argv[0] – имя программы.
argv[1] – параметр, который задает отображение графика пакетом GNUPLOT.
Параметр argv[1] может принимать следующие значения:
--noplot произвести расчет данных без построения графиков.
--plotwin построение графика в отдельном окне.
--plotpng построение графика в png-файл.

[in]fnИмя файла plt-скрипта построения графика.

Возвращает
RES_OK График построен успещно.
В противном случае возвращается код ошибки пакета GNUPLOT.

Рассмотрим пример. Пусть основная программа рассчитывает некоторые данные (отрезок синсоиды и косинусоиды) и сохраняет их в текстовые файлы dat/sine.txt и dat/cosine.txt:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 100
int main(int argc, char* argv[])
{
void* handle; /* DSPL handle */
handle = dspl_load(); /* Load DSPL function */
double x[N];
double s[N]; /* s(x) = sin(x) */
double c[N]; /* c(x) = cos(x) */
int n;
int err;
/* x vector from -4*pi to 4*pi */
linspace(-4.0 * M_PI, 4 * M_PI, N , DSPL_SYMMETRIC, x);
for(n = 0; n < N; n++)
{
s[n] = sin(x[n]); /* s(x) = sin(x) */
c[n] = cos(x[n]); /* c(x) = cos(x) */
}
/* Save to files "dat/sine.txt" and "dat/cosine.txt" */
writetxt(x, s, N, "dat/sine.txt");
writetxt(x, c, N, "dat/cosine.txt");
/* GNUPLOT script gnuplot/gnuplot_script.plt */
err = gnuplot_script(argc, argv, "gnuplot/gnuplot_script.plt");
/* Print output */
printf("GNUPLOT err = %d\n", err);
dspl_free(handle); /* free dspl handle */
return 0;
}



В каталоге gnuplot расположен plt-файл gnuplot/gnuplot_script.plt:

if(!exists("plotterm")) plotterm = 'wxt'
if(plotterm eq "pngcairo") set output 'img/gnuplot_script.png'
set grid
set xlabel "x"
set terminal plotterm size 560,280 enhanced font 'Verdana,8'
set ylabel "sin(x), cos(x)"
plot 'dat/sine.txt' with lines title "sin(x)", \
'dat/cosine.txt' with lines title "cos(x)"



После компиляции основной программы возможны следующие варианты:

  1. Программа вызвана без параметров. Тогда будет построен график в отдельном окне
    gnuplot_script_wxt.png
  2. Программа вызвана с параметром --noplot. Построения графика не будет, но в дириктории dat будут сохранены данные в текстовых файлах.
  3. Программа вызвана с параметром --plotwin. Также будет построен график в отдельном окне.
  4. Программа вызвана с параметром --plotpng. График не будет выведен в отдельное окно, но будет создан графический файл img/gnuplot_script.png
    gnuplot_script.png


    Заметки
    Для изменения стиля отображения графика, цвета линий, подписей и др. необходимо модифицировать plt-файл. Документацию по оформлению графиков можно найти на сайте проекта GNUPLOT.

    функция передает параметр plotterm в plt-скрипт. Поэтому строки
          if(!exists("plotterm")) plotterm = 'wxt'
          if(plotterm eq "pngcairo") set output 'img/gnuplot_script.png'
    необходимо сохранить. Но имя файла img/gnuplot_script.png может быть произвольным.
    Автор
    Бахурин Сергей. www.dsplib.org

См. определение в файле inout.c строка 48

◆ writebin()

int writebin ( void *  x,
int  n,
int  dtype,
char *  fn 
)

Сохранить данные в бинарный файл


Функция сохраняет реальный или комплексный вектор данных размера [n x 1] в бинарный файл fn.

Файл является универсальным для хранения как одномерных, так и двумерных массивов и имеет следующий формат:

type 4 байта типа int.
Может принимать значение:
DAT_DOUBLE, если x указатель на вектор вещественных чисел;
DAT_COMPLEX, если x указатель на вектор комплексных чисел.

n 4 байта типа int.
Количество строк данных.

m 4 байта типа int.
Количество столбцов данных.
При сохранении вектора всегда равно 1.

data после идут данные в бинарном виде.
Размер данных:
n * sizeof(double), если dtype==DAT_DOUBLE;
n * sizeof(complex_t), если dtype==DAT_COMPLEX.

Файл может быть использован для верификации алгоритмов сторонними пакетами, такими как GNU Octave или Matlab.

Аргументы
[in]xУказатель на массив данных.
Размер вектора [n x 1].

[in]nРазмер вектора данных.

[in]dtypeТип данных.
Может принимать значения:
DAT_DOUBLE – вещественные данные;
DAT_COMPLEX – комплексные данные.

[in]fnИмя файла.

Возвращает
RES_OK Файл сохранен успешно.
В противном случае код ошибки:
Заметки
Данная функция производит запись в файл без потери точности, поэтому рекомендуется использовать ее для верификации данных DSPL.

Функция для чтения бинарного файла в GNU Octave и Matlab:
function [dat, n, m] = readbin(fn)
fid = fopen(fn);
if(~fid)
error('cannot to open file');
end
type = fread(fid, 1, 'int32');
n = fread(fid, 1, 'int32');
m = fread(fid, 1, 'int32');
if(type==0)
dat = fread(fid, [n*m, 1], 'double');
end
if(type==1)
y = fread(fid, [n*m*2, 1], 'double');
dat = y(1:2:end) + 1i * y(2:2:end);
end
dat = reshape(dat, n, m);
fclose(fid);
end
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле inout.c строка 163

◆ writetxt()

int writetxt ( double *  x,
double *  y,
int  n,
char *  fn 
)

Сохранить вещественные данные в текстовый файл


Функция сохраняет вещественные данные в текстовый файл fn.
Файл имеет следующий формат:

x[0]  y[0]
x[1]  y[1]
...
x[n-1]  y[n-1]

Файл может быть использован для построения графика сторонней программой, например пакетом GNUPLOT (см. функцию gnuplot_script).

Аргументы
[in]xУказатель на первый вектор.
Размер вектора [n x 1].

[in]yУказатель на второй вектор.
Размер вектора [n x 1].
Может быть NULL.
Файл будет содержать только один столбец соответствующий вектору x если y == NULL.

[in]nРазмер входных векторов.

[in]fnИмя файла.

Возвращает
RES_OK Файл сохранен успешно.
В противном случае код ошибки:
Заметки
Данная функция производит округление данных при записи в файл. Поэтому не рекомендуется использовать ее для верификации данных DSPL.
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле inout.c строка 236