libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
dft.c
1 /*
2 * Copyright (c) 2015-2019 Sergey Bakhurin
3 * Digital Signal Processing Library [http://dsplib.org]
4 *
5 * This file is part of libdspl-2.0.
6 *
7 * is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser 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 Lesser General Public License
18 * along with Foobar. If not, see <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #include <stdlib.h>
23 #include <math.h>
24 #include "dspl.h"
25 
26 
27 
28 #ifdef DOXYGEN_ENGLISH
29 
95 #endif
96 #ifdef DOXYGEN_RUSSIAN
97 
162 #endif
163 int DSPL_API dft(double* x, int n, complex_t* y)
164 {
165  int k;
166  int m;
167  double divn;
168  double phi;
169 
170 
171  if(!x || !y)
172  return ERROR_PTR;
173 
174  if(n<1)
175  return ERROR_SIZE;
176 
177  divn = 1.0 / (double)n;
178 
179  for(k = 0; k < n; k++)
180  {
181  RE(y[k]) = IM(y[k]) = 0.0;
182  for(m = 0; m < n; m++)
183  {
184  phi = -M_2PI * divn * (double)k * (double)m;
185  RE(y[k]) += x[m] * cos(phi);
186  IM(y[k]) += x[m] * sin(phi);
187  }
188  }
189  return RES_OK;
190 }
191 
192 
193 
194 #ifdef DOXYGEN_ENGLISH
195 
261 #endif
262 #ifdef DOXYGEN_RUSSIAN
263 
328 #endif
329 int DSPL_API dft_cmplx(complex_t* x, int n, complex_t* y)
330 {
331  int k;
332  int m;
333  double divn;
334  double phi;
335  complex_t e;
336 
337  if(!x || !y)
338  return ERROR_PTR;
339 
340  if(n<1)
341  return ERROR_SIZE;
342 
343  divn = 1.0 / (double)n;
344 
345  for(k = 0; k < n; k++)
346  {
347  RE(y[k]) = IM(y[k]) = 0.0;
348  for(m = 0; m < n; m++)
349  {
350  phi = -M_2PI * divn * (double)k * (double)m;
351  RE(e) = cos(phi);
352  IM(e) = sin(phi);
353  RE(y[k]) += CMRE(x[m], e);
354  IM(y[k]) += CMIM(x[m], e);
355  }
356  }
357  return RES_OK;
358 }
359 
360 
361 
362 
363 
364 #ifdef DOXYGEN_ENGLISH
365 
432 #endif
433 #ifdef DOXYGEN_RUSSIAN
434 
499 #endif
500 int DSPL_API idft_cmplx(complex_t* x, int n, complex_t* y)
501 {
502  int k;
503  int m;
504  double divn;
505  double phi;
506  complex_t e;
507 
508  if(!x || !y)
509  return ERROR_PTR;
510 
511  if(n<1)
512  return ERROR_SIZE;
513 
514  divn = 1.0 / (double)n;
515 
516  for(k = 0; k < n; k++)
517  {
518  RE(y[k]) = IM(y[k]) = 0.0;
519  for(m = 0; m < n; m++)
520  {
521  phi = M_2PI * divn * (double)k * (double)m;
522  RE(e) = cos(phi);
523  IM(e) = sin(phi);
524  RE(y[k]) += CMRE(x[m], e);
525  IM(y[k]) += CMIM(x[m], e);
526  }
527  RE(y[k]) /= (double)n;
528  IM(y[k]) /= (double)n;
529  }
530  return RES_OK;
531 }
532 
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:359
#define ERROR_PTR
Ошибка указателя. Данная ошибка означает, что один из обязательных указателей (память под который дол...
Definition: dspl.h:545
int idft_cmplx(complex_t *x, int n, complex_t *y)
Обратное дискретное преобразование Фурье комплексного спектра.
Definition: dft.c:500
#define ERROR_SIZE
Ошибка при передаче размера массива. Данная ошибка возникает когда помимо указателя на массив входных...
Definition: dspl.h:553
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
#define RES_OK
Функция завершилась корректно. Ошибки отсутствуют.
Definition: dspl.h:497
int dft_cmplx(complex_t *x, int n, complex_t *y)
Дискретное преобразование Фурье комплексного сигнала.
Definition: dft.c:329
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:417
int dft(double *x, int n, complex_t *y)
Дискретное преобразование Фурье вещественного сигнала.
Definition: dft.c:163