libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
inout.c
1 /*
2 * Copyright (c) 2015-2019 Sergey Bakhurin
3 * Digital Signal Processing Library [http://dsplib.org]
4 *
5 * This file is part of DSPL.
6 *
7 * is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * DSPL is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 
26 #include "dspl.h"
27 
28 
29 
30 /*******************************************************************************
31 Print DSPL info
32 *******************************************************************************/
33 void DSPL_API dspl_info()
34 {
35  printf("\n\n D S P L - 2.0\n");
36  printf(" version 2.19.10.20\n");
37  printf("\n Copyright (C) 2015-2019\n");
38  printf(" Sergey Bakhurin www.dsplib.org\n");
39  printf(" ---------------------------------------------\n");
40  printf(" BLAS and LAPACK ver.: 3.8.0 www.netlib.org\n");
41 
42 }
43 
44 
45 /*******************************************************************************
46 run gnuplot script
47 *******************************************************************************/
48 int DSPL_API gnuplot_script(int argc, char* argv[], char* fn)
49 {
50  char cmd[1024] = {0};
51 
52  if(!fn)
53  return ERROR_PTR;
54 
55 
56  if(argc > 1 && argv)
57  {
58  if(!strcmp(argv[1], "--noplot"))
59  {
60  return RES_OK;
61  }
62  if(!strcmp(argv[1], "--plotwin"))
63  {
64  sprintf(cmd, "gnuplot -e \"plotterm = 'wxt'\" -p %s", fn);
65  goto script_label;
66  }
67 
68  if(!strcmp(argv[1], "--plotpng"))
69  {
70  sprintf(cmd, "gnuplot -e \"plotterm = 'pngcairo'\" -p %s", fn);
71  goto script_label;
72  }
73  return ERROR_GNUPLOT_TERM;
74  }
75 
76  {
77  sprintf(cmd, "gnuplot -e \"plotterm = 'wxt'\" -p %s", fn);
78  goto script_label;
79  }
80 
81 script_label:
82  return system(cmd);
83 }
84 
85 
86 /******************************************************************************
87 Write a real array to the binary file "fn"
88 *******************************************************************************/
89 int DSPL_API readbin(char* fn, void** x, int* k, int* dtype)
90 {
91  FILE* pFile = NULL;
92  int n, m, t, err;
93 
94  if(!x)
95  return ERROR_PTR;
96  if(!fn)
97  return ERROR_FNAME;
98 
99  pFile = fopen(fn, "rb");
100  if(pFile == NULL)
101  return ERROR_FOPEN;
102 
103  if(fread(&t, sizeof(int), 1, pFile) != 1)
104  {
105  err = ERROR_FREAD_SIZE;
106  goto exit_label;
107  }
108 
109  if(dtype)
110  *dtype = t;
111 
112  if(fread(&n, sizeof(int), 1, pFile) != 1)
113  {
114  err = ERROR_FREAD_SIZE;
115  goto exit_label;
116  }
117 
118  if(fread(&m, sizeof(int), 1, pFile) != 1)
119  {
120  err = ERROR_FREAD_SIZE;
121  goto exit_label;
122  }
123 
124  if(k)
125  *k = n*m;
126 
127  switch(t)
128  {
129  case DAT_DOUBLE:
130  (*x) = (*x) ? realloc(*x, n*m*sizeof(double)) :
131  malloc(n*m*sizeof(double));
132  if(fread(*x, sizeof(double), n*m, pFile) != n*m)
133  {
134  err = ERROR_FREAD_SIZE;
135  goto exit_label;
136  }
137 
138  break;
139  case DAT_COMPLEX:
140  (*x) = (*x) ? realloc(*x, n*m*sizeof(complex_t)) :
141  malloc(n*m*sizeof(complex_t));
142  if(fread(*x, sizeof(complex_t), n*m, pFile) != n*m)
143  {
144  err = ERROR_FREAD_SIZE;
145  goto exit_label;
146  }
147  default:
148  err = ERROR_DAT_TYPE;
149  goto exit_label;
150  }
151  err = RES_OK;
152 exit_label:
153  if(pFile)
154  fclose(pFile);
155  return err;
156 }
157 
158 
159 
160 /******************************************************************************
161 Write a real array to the binary file "fn"
162 *******************************************************************************/
163 int DSPL_API writebin(void* x, int n, int dtype, char* fn)
164 {
165  int k, res;
166  FILE* pFile = NULL;
167 
168  if(!x)
169  return ERROR_PTR;
170  if(n < 1)
171  return ERROR_SIZE;
172  if(!fn)
173  return ERROR_FNAME;
174 
175  pFile = fopen(fn, "wb");
176  if(pFile == NULL)
177  return ERROR_FOPEN;
178 
179 
180  if(fwrite(&dtype, sizeof(int), 1, pFile) != 1)
181  {
182  res = ERROR_FWRITE_SIZE;
183  goto exit_label;
184  }
185 
186 
187  if(fwrite(&n, sizeof(int), 1, pFile) != 1)
188  {
189  res = ERROR_FWRITE_SIZE;
190  goto exit_label;
191  }
192 
193  k = 1;
194  if(fwrite(&k, sizeof(int), 1, pFile) != 1)
195  {
196  res = ERROR_FWRITE_SIZE;
197  goto exit_label;
198  };
199 
200  switch(dtype)
201  {
202  case DAT_DOUBLE:
203  if(fwrite((double*)x, sizeof(double), n, pFile) != n)
204  {
205  res = ERROR_FWRITE_SIZE;
206  goto exit_label;
207  }
208  break;
209  case DAT_COMPLEX:
210  if(fwrite((complex_t*)x,
211  sizeof(complex_t), n, pFile) != n)
212  {
213  res = ERROR_FWRITE_SIZE;
214  goto exit_label;
215  }
216  break;
217  default:
218  res = ERROR_DAT_TYPE;
219  goto exit_label;
220  }
221  res = RES_OK;
222 exit_label:
223  if(pFile)
224  fclose(pFile);
225  return res;
226 }
227 
228 
229 
230 
231 
232 
233 /******************************************************************************
234 Write a real arrays to the text file "fn"
235 *******************************************************************************/
236 int DSPL_API writetxt(double* x, double* y, int n, char* fn)
237 {
238  int k;
239  FILE* pFile = NULL;
240 
241  if(!x)
242  return ERROR_PTR;
243  if(n < 1)
244  return ERROR_SIZE;
245  if(!fn)
246  return ERROR_FNAME;
247 
248  pFile = fopen(fn, "w+");
249  if(pFile == NULL)
250  return ERROR_FOPEN;
251 
252  if(y)
253  for(k = 0; k < n; k++)
254  fprintf(pFile, "%+.12E\t%+.12E\n", x[k], y[k]);
255  else
256  for(k = 0; k < n; k++)
257  fprintf(pFile, "%+.12E\n", x[k]);
258 
259  fclose(pFile);
260  return RES_OK;
261 }
262 
263 
264 
265 
266 
267 
268 /******************************************************************************
269  * Write a 3d plot data to file "fn" (pgfplots3d accepteble)
270  ******************************************************************************/
271 int DSPL_API writetxt_3d(double* x, int nx, double *y, int ny,
272  double* z, char* fn)
273 {
274  int k, n;
275  FILE* pFile = NULL;
276 
277  if(!x || !y || !z)
278  return ERROR_PTR;
279  if(nx < 1 || ny < 1)
280  return ERROR_SIZE;
281  if(!fn)
282  return ERROR_FNAME;
283 
284  pFile = fopen(fn, "w+");
285  if(pFile == NULL)
286  return ERROR_FOPEN;
287 
288  for(k = 0; k < ny; k++)
289  {
290  for(n = 0; n < nx; n++)
291  fprintf(pFile, "%+.12E\t%+.12E\t%+.12E\n",
292  x[n], y[k], z[n+k*nx]);
293  fprintf(pFile, "\n");
294 
295  }
296  fclose(pFile);
297  return RES_OK;
298 }
299 
300 
301 
302 
303 
304 
305 
306 /******************************************************************************
307  * Write a 3d line data to file "fn" (pgfplots3d accepteble)
308  ******************************************************************************/
309 int DSPL_API writetxt_3dline(double* x, double *y, double* z, int n, char* fn)
310 {
311  int k;
312  FILE* pFile = NULL;
313 
314  if(!x || !y || !z)
315  return ERROR_PTR;
316  if(n < 1)
317  return ERROR_SIZE;
318  if(!fn)
319  return ERROR_FNAME;
320 
321  pFile = fopen(fn, "w+");
322  if(pFile == NULL)
323  return ERROR_FOPEN;
324 
325  for(k = 0; k < n; k++)
326  fprintf(pFile, "%+.12E\t%+.12E\t%+.12E\n", x[k], y[k], z[k]);
327  fprintf(pFile, "\n");
328  fclose(pFile);
329  return RES_OK;
330 }
331 
332 
333 
334 
335 /******************************************************************************
336 Write a real part of coplex array to the text file "fn"
337 *******************************************************************************/
338 int DSPL_API writetxt_cmplx_re(double* x, complex_t *y, int n, char* fn)
339 {
340  int k;
341  FILE* pFile = NULL;
342 
343  if(!x)
344  return ERROR_PTR;
345  if(n < 1)
346  return ERROR_SIZE;
347  if(!fn)
348  return ERROR_FNAME;
349 
350  pFile = fopen(fn, "w+");
351  if(pFile == NULL)
352  return ERROR_FOPEN;
353 
354  if(x)
355  for(k = 0; k < n; k++)
356  fprintf(pFile, "%+.12E\t%+.12E\n", x[k], RE(y[k]));
357  else
358  for(k = 0; k < n; k++)
359  fprintf(pFile, "%+.12E\n", RE(y[k]));
360 
361  fclose(pFile);
362  return RES_OK;
363 }
364 
365 
366 
367 /******************************************************************************
368 Write a image part of coplex array to the text file "fn"
369 *******************************************************************************/
370 int DSPL_API writetxt_cmplx_im(double* x, complex_t *y, int n, char* fn)
371 {
372  int k;
373  FILE* pFile = NULL;
374 
375  if(!x)
376  return ERROR_PTR;
377  if(n < 1)
378  return ERROR_SIZE;
379  if(!fn)
380  return ERROR_FNAME;
381 
382  pFile = fopen(fn, "w+");
383  if(pFile == NULL)
384  return ERROR_FOPEN;
385 
386  if(x)
387  for(k = 0; k < n; k++)
388  fprintf(pFile, "%+.12E\t%+.12E\n", x[k], IM(y[k]));
389  else
390  for(k = 0; k < n; k++)
391  fprintf(pFile, "%+.12E\n", IM(y[k]));
392 
393  fclose(pFile);
394  return RES_OK;
395 }
396 
#define ERROR_FOPEN
Ошибка открытия файла. Файл с заданным именем не может быть открыт для записи и чтения.
Definition: dspl.h:119
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
Definition: dspl.h:148
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:41
int writetxt(double *x, double *y, int n, char *fn)
Сохранить вещественные данные в текстовый файл
Definition: inout.c:236
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:140
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:78
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:77
int gnuplot_script(int argc, char *argv[], char *fn)
Функция вызова скрипта пакета GNUPLOT для построения графика.
Definition: inout.c:48
int writebin(void *x, int n, int dtype, char *fn)
Сохранить данные в бинарный файл
Definition: inout.c:163
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:94
#define ERROR_FNAME
Ошибка в имени файла. Необходимо задать корректное имя файла.
Definition: dspl.h:118