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

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

Функции

int readbin (char *fn, void **x, int *pn, int *pm, int *dtype)
 Считать данные из бинарного файла Подробнее...
 
int writebin (void *x, int n, int m, int dtype, char *fn)
 Сохранить данные в бинарный файл Подробнее...
 
int writetxt (double *x, double *y, int n, char *fn)
 Сохранить вещественные данные в текстовый файл Подробнее...
 
int writetxt_3d (double *x, int nx, double *y, int ny, double *z, char *fn)
 Сохранить данные для построения 3D графика Подробнее...
 
int writetxt_int (int *x, int *y, int n, char *fn)
 Сохранить целочисленные данные в текстовый файл Подробнее...
 

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

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

Функции

◆ readbin()

int readbin ( char *  fn,
void **  x,
int *  pn,
int *  pm,
int *  dtype 
)

Считать данные из бинарного файла


Функция считывает реальные или комплексные данные из бинарного файла с именем fn.

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

type 4 байта типа int.
Может принимать значение:
DAT_DOUBLE, если x указатель на вектор вещественных чисел;
DAT_COMPLEX, если x указатель на вектор комплексных чисел.
n 4 байта типа int.
Количество строк данных.
m 4 байта типа int.
Количество столбцов данных.
При сохранении вектора всегда равно 1.
data Данные в бинарном виде.
Размер данных:
n * m * sizeof(double), если dtype==DAT_DOUBLE;
n * m * sizeof(complex_t), если dtype==DAT_COMPLEX.

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

Аргументы
[in]fnИмя файла.

[out]xУказатель на адрес массива данных.
Данный указатель используется для возможности выделения памяти под считываемые из файла данные.
[out]pnУказатель на количество строк возвращаемого массива.

[out]pmУказатель на количество столбцов возвращаемого массива.

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

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

Функция для записи бинарного файла в GNU Octave и Matlab:

function res = writebin(x, type, fn)
if(type~=0 && type~=1)
res = 2;
return;
end
fid = fopen(fn, 'w');
if(~fid)
error('cannot to open file');
end
n = size(x, 1);
m = size(x, 2);
count = fwrite(fid, type, 'int32');
if(count ~= 1)
res = 1;
return;
end
count = fwrite(fid, n, 'int32');
if(count ~= 1)
fclose(fid);
res = 1;
return;
end
count = fwrite(fid, m, 'int32');
if(count ~= 1)
res = 1;
fclose(fid);
return;
end
flag = 0;
if(type==0)
count = fwrite(fid, x, 'double');
if(count ~= n*m)
res = 1;
fclose(fid);
return;
end
flag = 1;
else
y = reshape(x, n*m, 1);
z = zeros(2*n*m, 1);
z(1:2:end) = real(y);
z(2:2:end) = imag(y);
count = fwrite(fid, z, 'double');
if(count ~= 2*n*m)
res = 1;
fclose(fid);
return;
end
flag = 1;
end
if(flag == 0)
res = 3;
else
res = 0;
end
fclose(fid);
end

Пример записи данных в бинарный файл с последующим считыванием функцией writebin :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 6
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
random_t rnd = {0}; /* random structure */
hdspl = dspl_load(); /* Load DSPL function */
/* input vector */
double x[N];
double *y = NULL;
int err, n, m, t;
/* Generate random input vector */
err = random_init(&rnd, RAND_TYPE_MRG32K3A, NULL);
if(err != RES_OK)
goto exit_label;
err = randn(x, N, 0.0, 1.0, &rnd);
if(err != RES_OK)
goto exit_label;
/* Write input vector x to the bin file x.bin */
err = writebin(x, N, 1, DAT_DOUBLE, "x.bin");
if(err != RES_OK)
goto exit_label;
/* Read x.bin to the y vector */
err = readbin("x.bin", (void**)&y, &n, &m, &t);
if(err != RES_OK)
goto exit_label;
/*Print x and y vectors */
printf("n = %d, m = %d, t = %d\n", n, m, t);
for(t = 0; t < n; t++)
printf("%+8.4f, %+8.4f\n", x[t], y[t]);
exit_label:
if(y)
free(y);
/* free dspl handle */
dspl_free(hdspl);
return 0;
}
Автор
Бахурин Сергей www.dsplib.org

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

◆ writebin()

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

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


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

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

type 4 байта типа int.
Может принимать значение:
DAT_DOUBLE, если x указатель на вектор вещественных чисел;
DAT_COMPLEX, если x указатель на вектор комплексных чисел.
n 4 байта типа int.
Количество строк данных.
m 4 байта типа int.
Количество столбцов данных.
data Данные в бинарном виде.
Размер данных:
n * sizeof(double), если dtype==DAT_DOUBLE;
n * sizeof(complex_t), если dtype==DAT_COMPLEX.

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

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

[in]nКоличество строк данных.

[in]mКоличество столбцов данных.

[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

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

◆ 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 (см. раздел Функции построения графиков.).

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

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

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

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

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

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

◆ writetxt_3d()

int writetxt_3d ( double *  x,
int  nx,
double *  y,
int  ny,
double *  z,
char *  fn 
)

Сохранить данные для построения 3D графика


Функция сохраняет вещественные данные в текстовый файл fn для построения 3D поверхности.
Функция \( z(x,y)\) описывается матрицей значений z[x[n], y[n]] как это показано на рисунке

Матрица z хранится в памяти по столбцам, как это показано красной стрелкой.
Файл имеет следующий формат:

x[0]        y[0]        z[0, 0]
x[1]        y[0]        z[1, 0]
x[2]        y[0]        z[2, 0]
...         ...         ...
x[nx-1] y[0]        z[nx-1, 0]

x[0]        y[1]        z[0, 1]
x[1]        y[1]        z[1, 1]
x[2]        y[1]        z[2, 1]
...         ...         ...
x[nx-1] y[1]        z[nx-1, 1]

...         ...         ...
...         ...         ...
...         ...         ...

x[0]        y[ny-1] z[0, ny-1]
x[1]        y[ny-1] z[1, ny-1]
x[2]        y[ny-1] z[2, ny-1]
...         ...         ...
x[nx-1] y[ny-1] z[nx-1, ny-1]

Таким образом, каждое значение матрицы z записано отдельной строкой со соответствующими значениями x и y. Столбцы матрицы отделены пустой строкой.

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

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

[in]nxРазмер вектора оси x.

[in]yУказатель на второй вектор значений оси y.
Размер вектора [ny x 1].
[in]nyРазмер вектора оси y.

[in]zУказатель на матрицу значений функции z(x, y).

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

Возвращает
RES_OK — файл сохранен успешно.
В противном случае код ошибки:
Пример использования функции и посторения 3D поверхности приведен в следующем листинге:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "dspl.h"
#define NX 20
#define NY 30
int main(int argc, char* argv[])
{
void* hdspl; /* DSPL handle */
void* hplot; /* GNUPLOT handles */
hdspl = dspl_load(); /* Load DSPL function */
double x[NX];
double y[NY];
double z[NX * NY];
int n, m;
int err;
/* x vector from -2 to 2 */
linspace(-2.0, 2.0, NX, DSPL_SYMMETRIC, x);
/* y vector from -2.5 to 2.5 */
linspace(-2.5, 2.5, NY, DSPL_SYMMETRIC, y);
/* z(x,y) = x * exp(-x^2 - y^2) */
for(n = 0; n < NX; n++)
{
for(m = 0; m < NY; m++)
{
z[n + m*NX] = x[n]*exp(-x[n]*x[n] - y[m]*y[m]);
}
}
/* Save to files "dat/data3d.txt" */
err = writetxt_3d(x, NX, y, NY, z, "dat/data3d.txt");
printf("writetxt_3d error 0x%8x\n", err);
/* plotting 3d surface by GNUPLOT */
/* Create window 0 */
err = gnuplot_create(argc, argv, 560, 480, "img/writetxt_3d.png", &hplot);
printf("GNUPLOT err = %d\n", err);
gnuplot_cmd(hplot, "set pm3d implicit at s");
gnuplot_cmd(hplot, "set view 50, 340, 1, 1");
gnuplot_cmd(hplot, "set xlabel 'x'");
gnuplot_cmd(hplot, "set ylabel 'y'");
gnuplot_cmd(hplot, "splot 'dat/data3d.txt' with lines");
gnuplot_close(hplot);
dspl_free(hdspl); /* free dspl handle */
return 0;
}

Данная программа рассчитывает и строит поверхность функции

\[ z(x,y) = x \exp(-x^2 -y^2) \]

В каталоге dat будет создан файл data3d.txt.
Кроме того программа GNUPLOT произведет построение 3D поверхности по сохраненным в файл данным:

Автор
Бахурин Сергей www.dsplib.org

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

◆ writetxt_int()

int writetxt_int ( int *  x,
int *  y,
int  n,
char *  fn 
)

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


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

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

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

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

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

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

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

Возвращает
RES_OK — файл сохранен успешно.
В противном случае код ошибки:
Автор
Бахурин Сергей www.dsplib.org

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

Структура параметров датчиков псевдослучайных чисел.
Definition: dspl.h:349
int writebin(void *x, int n, int m, int dtype, char *fn)
Сохранить данные в бинарный файл
Definition: writebin.c:227
void gnuplot_close(void *h)
Закрыть хэндл GNUPLOT.
Definition: gnuplot_close.c:80
int randn(double *x, int n, double mu, double sigma, random_t *prnd)
Генерация вектора нормально распределенных псевдослучайных чисел.
Definition: randn.c:89
void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
void gnuplot_cmd(void *h, char *cmd)
Функция посылает команду cmd пакету GNUPLOT, для построения или оформления графика,...
Definition: gnuplot_cmd.c:82
int writetxt_3d(double *x, int nx, double *y, int ny, double *z, char *fn)
Сохранить данные для построения 3D графика
Definition: writetxt_3d.c:211
int random_init(random_t *prnd, int type, void *seed)
Инициализация датчиков псевдослучайных чисел.
Definition: random_init.c:120
void dspl_free(void *handle)
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:558
int readbin(char *fn, void **x, int *pn, int *pm, int *dtype)
Считать данные из бинарного файла
Definition: readbin.c:318
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
Definition: linspace.c:169
int gnuplot_create(int argc, char *argv[], int w, int h, char *fn_png, void **hplot)
Создать график GNUPLOT.