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 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 fourier_series_rec (double *w, complex_t *s, int nw, double *t, int nt, 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. Подробнее...
 
int idft_cmplx (complex_t *x, int n, complex_t *y)
 Обратное дискретное преобразование Фурье комплексного спектра. Подробнее...
 
int ifft_cmplx (complex_t *x, int n, fft_t *pfft, complex_t *y)
 Обратное быстрое преобразование Фурье Подробнее...
 

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

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

Функции

◆ 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"
/* DFT size */
#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 vector */
int k;
/* fill input signal */
for(k = 0; k < N; k++)
x[k] = (double)k;
/* DFT calculation */
dft(x, N, y);
/* Print result */
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
/* remember to free the resource */
dspl_free(handle);
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 строка 161

◆ 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_cmplx.c строка 161

◆ 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 \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"
/* FFT size */
#define N 14
int main()
{
void* handle; /* DSPL handle */
handle = dspl_load(); /* Load libdspl */
double x[N]; /* Input signal array */
complex_t y[N]; /* Output signal array */
fft_t pfft = {0}; /* FFT object (fill zeros) */
int k;
/* Fill FFT structure */
fft_create(&pfft, N);
/* Fill input signal x[k] = k */
for(k = 0; k < N; k++)
x[k] = (double)k;
/* FFT */
fft(x, N, &pfft, y);
/* print result */
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
fft_free(&pfft); /* Clear fft_t object */
dspl_free(handle); /* Clear 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 строка 171

Используется в xcorr() и xcorr_cmplx().

◆ 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"
/* FFT size */
#define N 18
int main()
{
void* handle; /* DSPL handle */
handle = dspl_load(); /* Load libdspl */
complex_t x[N]; /* Input signal array */
complex_t y[N]; /* Output signal array */
fft_t pfft = {0}; /* FFT object (fill zeros) */
int k;
/* Fill FFT structure */
fft_create(&pfft, N);
/* Fill input signal x[k] = exp(j*k) */
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)cos((double)k);
IM(x[k]) = (double)sin((double)k);
}
/* FFT */
fft_cmplx(x, N, &pfft, y);
/* print result */
for(k = 0; k < N; k++)
printf("y[%2d] = %9.3f%9.3f\n", k, RE(y[k]), IM(y[k]));
fft_free(&pfft); /* Clear fft_t object */
dspl_free(handle); /* Clear 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_cmplx.c строка 177

Используется в conv_fft_cmplx().

◆ 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 \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 = {0}; // объявляем объект fft_t
int n = 64; // Размер БПФ
int err;
// создаем объект для 64-точечного БПФ
err = fft_create(&pfft, n);
// ...................................
// очистить память объекта БПФ
fft_free(&pfft);

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

Заметки
Магия числа 46340 заключается в том, что \(\sqrt{2^{31}} = 46340.95\).
Автор
Бахурин Сергей www.dsplib.org

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

Используется в 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_free.c строка 61

Используется в psd_bartlett(), psd_bartlett_cmplx(), psd_periodogram(), psd_periodogram_cmplx(), psd_welch(), psd_welch_cmplx(), xcorr() и xcorr_cmplx().

◆ 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_shift.c строка 93

◆ 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_dec.c строка 146

◆ fourier_series_rec()

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

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


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

\[ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t) \]

Аргументы
[in]wУказатель на массив частот \(\omega_n\) усеченного ряда Фурье.
Размер вектора [nw x 1].
Память должна быть выделена и заполнена.

[in]sУказатель на массив значений спектра \(S(\omega_n)\).
Размер вектора [nw x 1].
Память должна быть выделена и заполнена.

[in]nwКоличество членов усеченного ряда Фурье.
Значение должно быть положительным.

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

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

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

Возвращает
RES_OK — восстановление сигнала прошло успешно.
В противном случае код ошибки.
Заметки
Выходной восстановленный сигнал в общем случае является комплексным. Однако при соблюдении свойств симметрии векторов w и s относительно нулевой частоты получим мнимую часть элементов вектора y на уровне ошибок округления числа с двойной точностью. Ничтожно малую мнимую часть в этом случае можно игнорировать.
Автор
Бахурин Сергей www.dsplib.org

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

◆ 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 строка 123

◆ 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_cmplx.c строка 125

◆ idft_cmplx()

int idft_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 x[N]; /* complex input signal */
complex_t y[N]; /* DFT */
complex_t z[N]; /* IDFT */
int k;
/* Fill input signal */
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)k;
IM(x[k]) = 0.0;
}
/* DFT */
dft_cmplx(x,N,y);
/* IDFT */
idft_cmplx(y,N,z);
/* print result */
for(k = 0; k < N; k++)
printf("x[%2d] = %9.3f%+9.3fj, z[%2d] = %9.3f%+9.3f\n",
k, RE(x[k]), IM(x[k]), k, RE(z[k]), IM(z[k]));
dspl_free(handle); /* remember to free the resource */
return 0;
}

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

x[ 0] =     0.000   +0.000j,    z[ 0] =     0.000   -0.000
x[ 1] =     1.000   +0.000j,    z[ 1] =     1.000   -0.000
x[ 2] =     2.000   +0.000j,    z[ 2] =     2.000   -0.000
x[ 3] =     3.000   +0.000j,    z[ 3] =     3.000   -0.000
x[ 4] =     4.000   +0.000j,    z[ 4] =     4.000   -0.000
x[ 5] =     5.000   +0.000j,    z[ 5] =     5.000   -0.000
x[ 6] =     6.000   +0.000j,    z[ 6] =     6.000   -0.000
x[ 7] =     7.000   +0.000j,    z[ 7] =     7.000   -0.000
x[ 8] =     8.000   +0.000j,    z[ 8] =     8.000   -0.000
x[ 9] =     9.000   +0.000j,    z[ 9] =     9.000   -0.000
x[10] =    10.000   +0.000j,    z[10] =    10.000   -0.000
x[11] =    11.000   +0.000j,    z[11] =    11.000   +0.000
x[12] =    12.000   +0.000j,    z[12] =    12.000   +0.000
x[13] =    13.000   +0.000j,    z[13] =    13.000   +0.000
x[14] =    14.000   +0.000j,    z[14] =    14.000   +0.000
x[15] =    15.000   +0.000j,    z[15] =    15.000   -0.000
Заметки
Данная функция выполняет расчет ОДПФ наивным методом и требует \( n^2 \) комплексных умножений.
Для увеличения скорости расчета рекомендуется использовать алгоритмы быстрого преобразования Фурье.
Автор
Бахурин Сергей www.dsplib.org

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

◆ 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 \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(); /* Load libdspl */
complex_t x[N]; /* Input signal array */
complex_t y[N]; /* FFT Output signal array */
complex_t z[N]; /* IFFT Output signal array */
fft_t pfft = {0}; /* FFT object (fill zeros) */
int k;
/* Fill FFT structure */
fft_create(&pfft, N);
/* Fill input signal x[k] = exp(j*k) */
for(k = 0; k < N; k++)
{
RE(x[k]) = (double)cos((double)k);
IM(x[k]) = (double)sin((double)k);
}
/* FFT */
fft_cmplx(x, N, &pfft, y);
/* FFT */
ifft_cmplx(y, N, &pfft, z);
/* print result */
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); /* Clear fft_t object */
dspl_free(handle); /* Clear 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

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

Используется в conv_fft_cmplx().

#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:420
int idft_cmplx(complex_t *x, int n, complex_t *y)
Обратное дискретное преобразование Фурье комплексного спектра.
Definition: idft_cmplx.c:161
int fft_create(fft_t *pfft, int n)
Заполнение структуры fft_t для алгоритма БПФ
Definition: fft_create.c:159
int fft_cmplx(complex_t *x, int n, fft_t *pfft, complex_t *y)
Быстрое преобразование Фурье комплексного сигнала
Definition: fft_cmplx.c:177
int ifft_cmplx(complex_t *x, int n, fft_t *pfft, complex_t *y)
Обратное быстрое преобразование Фурье
Definition: ifft_cmplx.c:177
void fft_free(fft_t *pfft)
Очистить структуру fft_t алгоритма БПФ
Definition: fft_free.c:61
void * dspl_load()
Произвести динамическую линковку и загрузить функции libdspl-2.0.
Структура данных объекта быстрого преобразования Фурье
Definition: dspl.h:277
int fft(double *x, int n, fft_t *pfft, complex_t *y)
Быстрое преобразование Фурье вещественного сигнала
Definition: fft.c:171
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
void dspl_free(void *handle)
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
int dft_cmplx(complex_t *x, int n, complex_t *y)
Дискретное преобразование Фурье комплексного сигнала.
Definition: dft_cmplx.c:161
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:478
int dft(double *x, int n, complex_t *y)
Дискретное преобразование Фурье вещественного сигнала.
Definition: dft.c:161