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

Структуры данных

struct  fft_t
 Структура данных объекта быстрого преобразования Фурье Подробнее...
 

Функции

int dft (double *x, int n, complex_t *y)
 Дискретное преобразование Фурье вещественного сигнала. Подробнее...
 
int dft_cmplx (complex_t *x, int n, complex_t *y)
 Дискретное преобразование Фурье комплексного сигнала. Подробнее...
 
int ifft_cmplx (complex_t *x, int n, fft_t *pfft, complex_t *y)
 Обратное быстрое преобразование Фурье Подробнее...
 
int fft (double *x, int n, fft_t *pfft, complex_t *y)
 Быстрое преобразование Фурье вещественного сигнала Подробнее...
 
int fft_cmplx (complex_t *x, int n, fft_t *pfft, complex_t *y)
 Быстрое преобразование Фурье комплексного сигнала Подробнее...
 
int fft_create (fft_t *pfft, int n)
 Заполнение структуры fft_t для алгоритма БПФ Подробнее...
 
void fft_free (fft_t *pfft)
 Очистить структуру fft_t алгоритма БПФ Подробнее...
 
int fft_shift (double *x, int n, double *y)
 Перестановка спектральных отсчетов дискретного преобразования Фурье Подробнее...
 
int fourier_series_dec (double *t, double *s, int nt, double period, int nw, double *w, complex_t *y)
 Расчет коэффициентов разложения в ряд Фурье Подробнее...
 
int goertzel (double *x, int n, int *ind, int k, complex_t *y)
 Алгоритм Герцеля для расчета отдельных спектральных отсчетов дискретного преобразования Фурье вещественного сигнала x. Подробнее...
 
int goertzel_cmplx (complex_t *x, int n, int *ind, int k, complex_t *y)
 Алгоритм Герцеля для расчета отдельных спектральных отсчетов дискретного преобразования Фурье комплексного сигнала x. Подробнее...
 

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

Алгоритмы дискретного и быстрого преобразования Фурье.

Функции

◆ dft()

int dft ( double *  x,
int  n,
complex_t y 
)

Дискретное преобразование Фурье вещественного сигнала.


Функция рассчитывает $ n $-точечное дискретное преобразование Фурье вещественного сигнала $ x(m) $, $ m = 0 \ldots n-1 $.

\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]

где $ k = 0 \ldots n-1 $.

Аргументы
[in]xУказатель на вектор вещественного входного сигнала $x(m)$, $ m = 0 \ldots n-1 $.
Размер вектора [n x 1].

[in]nРазмер ДПФ $n$ (размер векторов входного сигнала и результата ДПФ).

[out]yУказатель на комплексный вектор результата ДПФ $Y(k)$, $ k = 0 \ldots n-1 $. Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK если ДПФ рассчитана успешно.
В противном случае код ошибки.

Пример использования функции dft:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 16
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double x[N]; // real input signal
complex_t y[N]; // DFT
int k;
for(k = 0; k < N; k++)
x[k] = (double)k;
dft(x, N, y);
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
dspl_free(handle); // remember to free the resource
return 0;
}

Результат работы программы:

      y[ 0] =   120.000    0.000
      y[ 1] =    -8.000   40.219
      y[ 2] =    -8.000   19.314
      y[ 3] =    -8.000   11.973
      y[ 4] =    -8.000    8.000
      y[ 5] =    -8.000    5.345
      y[ 6] =    -8.000    3.314
      y[ 7] =    -8.000    1.591
      y[ 8] =    -8.000    0.000
      y[ 9] =    -8.000   -1.591
      y[10] =    -8.000   -3.314
      y[11] =    -8.000   -5.345
      y[12] =    -8.000   -8.000
      y[13] =    -8.000  -11.973
      y[14] =    -8.000  -19.314
      y[15] =    -8.000  -40.219
Заметки
Данная функция выполняет расчет ДПФ наивным методом и требует $ n^2 $ комплексных умножений.
Для увеличения скорости расчета рекомендуется использовать алгоритмы быстрого преобразования Фурье.
Автор
Бахурин Сергей. www.dsplib.org

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

◆ dft_cmplx()

int dft_cmplx ( complex_t x,
int  n,
complex_t y 
)

Дискретное преобразование Фурье комплексного сигнала.


Функция рассчитывает $ n $-точечное дискретное преобразование Фурье комплексного сигнала $ x(m) $, $ m = 0 \ldots n-1 $.

\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]

где $ k = 0 \ldots n-1 $.

Аргументы
[in]xУказатель на вектор комплексного входного сигнала $x(m)$, $ m = 0 \ldots n-1 $.
Размер вектора [n x 1].

[in]nРазмер ДПФ $n$ (размер векторов входного сигнала и результата ДПФ).

[out]yУказатель на комплексный вектор результата ДПФ $Y(k)$, $ k = 0 \ldots n-1 $. Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK если ДПФ рассчитана успешно.
В противном случае код ошибки.

Пример использования функции dft_cmplx:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 16
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
complex_t y[N]; // DFT
complex_t x[N]; // complex input signal
int k;
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)k;
IM(x[k]) = 0.0;
}
dft_cmplx(x,N,y);
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
dspl_free(handle); // remember to free the resource
return 0;
}

Результат работы программы:

      y[ 0] =   120.000    0.000
      y[ 1] =    -8.000   40.219
      y[ 2] =    -8.000   19.314
      y[ 3] =    -8.000   11.973
      y[ 4] =    -8.000    8.000
      y[ 5] =    -8.000    5.345
      y[ 6] =    -8.000    3.314
      y[ 7] =    -8.000    1.591
      y[ 8] =    -8.000    0.000
      y[ 9] =    -8.000   -1.591
      y[10] =    -8.000   -3.314
      y[11] =    -8.000   -5.345
      y[12] =    -8.000   -8.000
      y[13] =    -8.000  -11.973
      y[14] =    -8.000  -19.314
      y[15] =    -8.000  -40.219
Заметки
Данная функция выполняет расчет ДПФ наивным методом и требует $ n^2 $ комплексных умножений.
Для увеличения скорости расчета рекомендуется использовать алгоритмы быстрого преобразования Фурье.
Автор
Бахурин Сергей. www.dsplib.org

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

◆ fft()

int fft ( double *  x,
int  n,
fft_t pfft,
complex_t y 
)

Быстрое преобразование Фурье вещественного сигнала


Функция рассчитывает $ n $-точечное быстрое преобразование Фурье вещественного сигнала $ x(m) $, $ m = 0 \ldots n-1 $.

\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]

где $ k = 0 \ldots n-1 $.

Для расчета используется алгоритм БПФ составной длины.

Аргументы
[in]xУказатель на вектор вещественного входного сигнала $x(m)$, $ m = 0 \ldots n-1 $.
Размер вектора [n x 1].

[in]nРазмер БПФ $n$.
Размер БПФ может быть составным вида $n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$, где $n_i = 2,3,5,7$, а $m $ – произвольный простой множитель не превосходящий 46340 (см. описание функции fft_create).

[in]pfftУказатель на структуру fft_t.
Указатель не должен быть NULL.
Структура fft_t должна быть предварительно однократно заполнена функцией fft_create, и память должна быть очищена перед выходом функцией fft_free.

[out]yУказатель на комплексный вектор результата БПФ $Y(k)$, $ k = 0 \ldots n-1 $. Размер вектора [n x 1].
Память должна быть выделена.

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

Пример использования функции fft:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 14
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Загрузка DSPL
double x[N]; // массив входного сигнала
complex_t y[N]; // массив результата БПФ
fft_t pfft; // FFT объект
int k;
memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями
fft_create(&pfft, N); // Создаем FFT структуру для длины N
// заполняем массив входного сигнала
for(k = 0; k < N; k++)
x[k] = (double)k;
fft(x, N, &pfft, y); // FFT
// Печать результата
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
fft_free(&pfft); // Очищаем структуру fft_t
dspl_free(handle); // Очищаем dspl handle
return 0;
}

Результат работы программы:

y[ 0] =    91.000    0.000
y[ 1] =    -7.000   30.669
y[ 2] =    -7.000   14.536
y[ 3] =    -7.000    8.778
y[ 4] =    -7.000    5.582
y[ 5] =    -7.000    3.371
y[ 6] =    -7.000    1.598
y[ 7] =    -7.000    0.000
y[ 8] =    -7.000   -1.598
y[ 9] =    -7.000   -3.371
y[10] =    -7.000   -5.582
y[11] =    -7.000   -8.778
y[12] =    -7.000  -14.536
y[13] =    -7.000  -30.669
Автор
Бахурин Сергей. www.dsplib.org

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

◆ fft_cmplx()

int fft_cmplx ( complex_t x,
int  n,
fft_t pfft,
complex_t y 
)

Быстрое преобразование Фурье комплексного сигнала


Функция рассчитывает $ n $-точечное быстрое преобразование Фурье комплексного сигнала $ x(m) $, $ m = 0 \ldots n-1 $.

\[ Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right), \]

где $ k = 0 \ldots n-1 $.

Для расчета используется алгоритм БПФ составной длины.

Аргументы
[in]xУказатель на вектор комплексного входного сигнала $x(m)$, $ m = 0 \ldots n-1 $.
Размер вектора [n x 1].

[in]nРазмер БПФ $n$.
Размер БПФ может быть составным вида $n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$, где $n_i = 2,3,5,7$, а $m $ – произвольный простой множитель не превосходящий 46340 (см. описание функции fft_create).

[in]pfftУказатель на структуру fft_t.
Указатель не должен быть NULL.
Структура fft_t должна быть предварительно однократно заполнена функцией fft_create, и память должна быть очищена перед выходом функцией fft_free.

[out]yУказатель на комплексный вектор результата БПФ $Y(k)$, $ k = 0 \ldots n-1 $. Размер вектора [n x 1].
Память должна быть выделена.

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

Пример использования функции fft:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 18
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Загрузка DSPL
complex_t x[N]; // массив входного сигнала
complex_t y[N]; // массив результата БПФ
fft_t pfft; // FFT объект
int k;
memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями
fft_create(&pfft, N); // Создаем FFT структуру для длины N
// заполняем массив входного сигнала
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)cos((double)k);
IM(x[k]) = (double)sin((double)k);
}
fft_cmplx(x, N, &pfft, y); // FFT
// Печать результата
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
fft_free(&pfft); // Очищаем структуру fft_t
dspl_free(handle); // Очищаем dspl handle
return 0;
}

Результат работы программы:

y[ 0] =    -0.517    0.686
y[ 1] =    -0.943    0.879
y[ 2] =    -2.299    1.492
y[ 3] =    16.078   -6.820
y[ 4] =     2.040   -0.470
y[ 5] =     1.130   -0.059
y[ 6] =     0.786    0.097
y[ 7] =     0.596    0.183
y[ 8] =     0.470    0.240
y[ 9] =     0.375    0.283
y[10] =     0.297    0.318
y[11] =     0.227    0.350
y[12] =     0.161    0.380
y[13] =     0.094    0.410
y[14] =     0.023    0.442
y[15] =    -0.059    0.479
y[16] =    -0.161    0.525
y[17] =    -0.300    0.588
Автор
Бахурин Сергей. www.dsplib.org

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

◆ fft_create()

int fft_create ( fft_t pfft,
int  n 
)

Заполнение структуры fft_t для алгоритма БПФ


Функция производит выделение памяти и рассчет векторов поворотных коэффициентов n-точечного БПФ для структуры fft_t.

Аргументы
[in,out]pfftУказатель на структуру fft_t.
Указатель не должен быть NULL.

[in]nРазмер БПФ $n$.
Размер БПФ может быть составным вида $n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$, где $n_i = 2,3,5,7$, а $m $ – произвольный простой множитель не превосходящий 46340.

Таким образом алгоритм БПФ поддерживает произвольные длины, равные целой степени чисел 2,3,5,7, а также различные их комбинации.

Так например, при $ n = 725760 $ структура будет успешно заполнена, отому что $725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 $, т.е. получается как произведение множителей 2,3,5,7.

При $ n = 172804 = 43201 \cdot 4 $ структура также будет успешно заполнена, потому что простой множитель входящий в $n$ не превосходит 46340.

Для размера $ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 $ функция вернет ошибку, поскольку 66079 больше 46340 и не является результатом произведения чисел 2,3,5,7.

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

Заметки
Некоторые компиляторы при создании структуры не обнуляют ее содержимое. Поэтому рекомендуется произвести обнуление структуры после ее объявления:
fft_t pfft; // объявляем объект fft_t
int n = 64; // Размер БПФ
// обнуляем все поля и указатели.
// Данные шаг рекомендуется ввиду того, что некоторые
// компиляторы при создании переменной не инициализируют ее нулем.
memset(&pfft, 0, sizeof(fft_t));
int err;
//создаем объект для 64-точечного БПФ
err = fft_create(&pfft, n);
// .....
//очистить память объекта БПФ
fft_free(&pfft);
Перед выходом из программы выделенную в структуре память необходимо очистить функцией fft_free .

Магия числа 46340 заключается в том, что $\sqrt{2^{31}} = 46340.95$.

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

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

Используется в fft(), fft_cmplx() и ifft_cmplx().

◆ fft_free()

void fft_free ( fft_t pfft)

Очистить структуру fft_t алгоритма БПФ


Функция производит очищение памяти промежуточных данных и векторов поворотных коэффициентов структуры fft_t.

Аргументы
[in]pfftУказатель на структуру fft_t.
Автор
Бахурин Сергей. www.dsplib.org

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

◆ fft_shift()

int fft_shift ( double *  x,
int  n,
double *  y 
)

Перестановка спектральных отсчетов дискретного преобразования Фурье


Функция производит перестановку спектральных отсчетов ДПФ и переносит нулевую частоту в центр вектора ДПФ.
Данная функция обрабатывает вещественные входные и выходные вектора и может применяться для перестановки амплитудного или фазового спектра.

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

[in]nРазмер ДПФ $n$ (размер векторов до и после перестановки).

[out]yУказатель на вектор результата перестановки.
Размер вектора [n x 1].
Память должна быть выделена.

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

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

◆ fourier_series_dec()

int fourier_series_dec ( double *  t,
double *  s,
int  nt,
double  period,
int  nw,
double *  w,
complex_t y 
)

Расчет коэффициентов разложения в ряд Фурье


Функция рассчитывает спектр периодического сигнала при усечении ряда Фурье

Аргументы
[in]tУказатель на массив моментов времени дискретизации исходного сигнала s
размер вектора вектора [nt x 1].
Память должна быть выделена.

[in]sУказатель на массив значений исходного сигналаs.
Размер вектора [nt x 1].
Память должна быть выделена.

[in]ntРазмер выборки исходного сигнала.
Значение должно быть положительным.

[in]periodПериод повторения сигнала.

[in]nwРазмер усеченного ряда Фурье.

[out]wУказатель на массив частот спектра периодического сигнала.
Размер вектора [nw x 1].
Память должна быть выделена.

[out]yУказатель массив комплексных значений спектра периодического сигнала.
Размер вектора [nw x 1].
Память должна быть выделена.

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

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

◆ goertzel()

int goertzel ( double *  x,
int  n,
int *  ind,
int  k,
complex_t y 
)

Алгоритм Герцеля для расчета отдельных спектральных отсчетов дискретного преобразования Фурье вещественного сигнала x.


Данный алгоритм позволяет рассчитать k спектральных отсчетов n-точечного ДПФ, заданных вектором индексов ind.

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

[in]nРазмер вектора входного сигнала.

[in]indУказатель на вектор индексов спектральных отсчетов для расчета которых будет использоваться алгоритм Герцеля.
Размер вектора [k x 1].

[in]kРазмер вектора индексов спектральных отсчетов ind.

[out]yУказатель на вектор спектральных отсчетов,

соответствующих номерам ind.
Размер вектора [k x 1].
Память должна быть выделена.

Возвращает
RES_OK Функция выполнена успешно.
В противном случае код ошибки.
Заметки
Алгоритм Герцеля эффективен когда необходимо рассчитать несколько спектральных отсчетов сигнала большой длительности.
Однако, размер k вектора индексов ind может быть произвольным, в том числе больше длины сигнала n. В этом случае некоторые спектральные отсчеты будут повторяться, но это не повлечет за собой ошибки выполнения.
Значения индексов спектральных отсчетов ind также могут быть произвольными целыми, в том числе и отрицательными. В этом случае будут рассчитаны спектральные отсчеты с индексами по модулю n.
Автор
Бахурин Сергей. www.dsplib.org
 

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

◆ goertzel_cmplx()

int goertzel_cmplx ( complex_t x,
int  n,
int *  ind,
int  k,
complex_t y 
)

Алгоритм Герцеля для расчета отдельных спектральных отсчетов дискретного преобразования Фурье комплексного сигнала x.


Данный алгоритм позволяет рассчитать k спектральных отсчетов n-точечного ДПФ, заданных вектором индексов ind.

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

[in]nРазмер вектора входного сигнала.

[in]indУказатель на вектор индексов спектральных отсчетов для расчета которых будет использоваться алгоритм Герцеля.
Размер вектора [k x 1].

[in]kРазмер вектора индексов спектральных отсчетов ind.

[out]yУказатель на вектор спектральных отсчетов,

соответствующих номерам ind.
Размер вектора [k x 1].
Память должна быть выделена.

Возвращает
RES_OK Функция выполнена успешно.
В противном случае код ошибки.
Заметки
Алгоритм Герцеля эффективен когда необходимо рассчитать несколько спектральных отсчетов сигнала большой длительности.
Однако, размер k вектора индексов ind может быть произвольным, в том числе больше длины сигнала n. В этом случае некоторые спектральные отсчеты будут повторяться, но это не повлечет за собой ошибки выполнения.
Значения индексов спектральных отсчетов ind также могут быть произвольными целыми, в том числе и отрицательными. В этом случае будут рассчитаны спектральные отсчеты с индексами по модулю n.

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

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

◆ ifft_cmplx()

int ifft_cmplx ( complex_t x,
int  n,
fft_t pfft,
complex_t y 
)

Обратное быстрое преобразование Фурье


Функция рассчитывает $ n $-точечное обратное быстрое преобразование Фурье от $ x(m) $, $ m = 0 \ldots n-1 $.

\[ Y(k) = \frac{1}{N} \sum_{m = 0}^{n-1} x(m) \exp \left( j \frac{2\pi}{n} m k \right), \]

где $ k = 0 \ldots n-1 $.

Для расчета используется алгоритм БПФ составной длины.

Аргументы
[in]xУказатель на входной комплексный вектор $x(m)$, $ m = 0 \ldots n-1 $.
Размер вектора [n x 1].

[in]nРазмер ОБПФ $n$.
Размер ОБПФ может быть составным вида $n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m$, где $n_i = 2,3,5,7$, а $m $ – произвольный простой множитель не превосходящий 46340 (см. описание функции fft_create).

[in]pfftУказатель на структуру fft_t.
Указатель не должен быть NULL.
Структура fft_t должна быть предварительно однократно заполнена функцией fft_create, и память должна быть очищена перед выходом функцией fft_free.

[out]yУказатель на вектор результата ОБПФ $Y(k)$, $ k = 0 \ldots n-1 $. Размер вектора [n x 1].
Память должна быть выделена.

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

Пример использования функции fft:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 18
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Загрузка DSPL
complex_t x[N]; // массив входного сигнала
complex_t y[N]; // массив результата БПФ
complex_t z[N]; // массив результата ОБПФ
fft_t pfft; // FFT объект
int k;
memset(&pfft, 0, sizeof(fft_t)); // Заполняем FFT структуру нулями
fft_create(&pfft, N); // Создаем FFT структуру для длины N
// заполняем массив входного сигнала
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)cos((double)k);
IM(x[k]) = (double)sin((double)k);
}
fft_cmplx(x, N, &pfft, y); // FFT
ifft_cmplx(y, N, &pfft, z); // IFFT
// Печать результата
for(k = 0; k < N; k++)
{
printf("| x[%2d] = %9.3f%9.3f ", k, RE(x[k]), IM(x[k]));
printf("| y[%2d] = %9.3f%9.3f ", k, RE(y[k]), IM(y[k]));
printf("| z[%2d] = %9.3f%9.3f |\n", k, RE(z[k]), IM(z[k]));
}
fft_free(&pfft); // Очищаем структуру fft_t
dspl_free(handle); // Очищаем dspl handle
return 0;
}

Результат работы программы:

| x[ 0] =     1.000    0.000 | y[ 0] =    -0.517    0.686 | z[ 0] =     1.000    0.000 |
| x[ 1] =     0.540    0.841 | y[ 1] =    -0.943    0.879 | z[ 1] =     0.540    0.841 |
| x[ 2] =    -0.416    0.909 | y[ 2] =    -2.299    1.492 | z[ 2] =    -0.416    0.909 |
| x[ 3] =    -0.990    0.141 | y[ 3] =    16.078   -6.820 | z[ 3] =    -0.990    0.141 |
| x[ 4] =    -0.654   -0.757 | y[ 4] =     2.040   -0.470 | z[ 4] =    -0.654   -0.757 |
| x[ 5] =     0.284   -0.959 | y[ 5] =     1.130   -0.059 | z[ 5] =     0.284   -0.959 |
| x[ 6] =     0.960   -0.279 | y[ 6] =     0.786    0.097 | z[ 6] =     0.960   -0.279 |
| x[ 7] =     0.754    0.657 | y[ 7] =     0.596    0.183 | z[ 7] =     0.754    0.657 |
| x[ 8] =    -0.146    0.989 | y[ 8] =     0.470    0.240 | z[ 8] =    -0.146    0.989 |
| x[ 9] =    -0.911    0.412 | y[ 9] =     0.375    0.283 | z[ 9] =    -0.911    0.412 |
| x[10] =    -0.839   -0.544 | y[10] =     0.297    0.318 | z[10] =    -0.839   -0.544 |
| x[11] =     0.004   -1.000 | y[11] =     0.227    0.350 | z[11] =     0.004   -1.000 |
| x[12] =     0.844   -0.537 | y[12] =     0.161    0.380 | z[12] =     0.844   -0.537 |
| x[13] =     0.907    0.420 | y[13] =     0.094    0.410 | z[13] =     0.907    0.420 |
| x[14] =     0.137    0.991 | y[14] =     0.023    0.442 | z[14] =     0.137    0.991 |
| x[15] =    -0.760    0.650 | y[15] =    -0.059    0.479 | z[15] =    -0.760    0.650 |
| x[16] =    -0.958   -0.288 | y[16] =    -0.161    0.525 | z[16] =    -0.958   -0.288 |
| x[17] =    -0.275   -0.961 | y[17] =    -0.300    0.588 | z[17] =    -0.275   -0.961 |
Автор
Бахурин Сергей. www.dsplib.org

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