pull/6/merge
Dsplib 2019-03-12 00:00:48 +03:00
rodzic ef1ba40bfb
commit 516fa73ace
3 zmienionych plików z 99 dodań i 25 usunięć

Wyświetl plik

@ -90,6 +90,82 @@ www.dsplib.org
/*! ****************************************************************************
\ingroup DFT_GROUP
\fn int fft(double* x, int n, fft_t* pfft, complex_t* y)
\brief Быстрое преобразование Фурье вещественного сигнала
Функция рассчитывает \f$ n \f$-точечное быстрое преобразование Фурье
вещественного сигнала \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$.<BR>
\f[
Y(k) = \sum_{m = 0}^{n-1} x(m) \exp
\left( -j \frac{2\pi}{n} m k \right),
\f]
где \f$ k = 0 \ldots n-1 \f$.
Для расчета используется алгоритм БПФ составной длины.
\param[in] x Указатель на вектор вещественного
входного сигнала \f$x(m)\f$,
\f$ m = 0 \ldots n-1 \f$. <BR>
Размер вектора `[n x 1]`. <BR><BR>
\param[in] n Размер БПФ \f$n\f$.<BR>
Размер БПФ может быть составным вида
\f$n = n_0 \times n_1 \times n_2 \times n_3 \times \ldots \times n_p \times m\f$,
где \f$n_i = 2,3,5,7\f$, а \f$m \f$ --
произвольный простой множитель не превосходящий 46340
(см. описание функции \ref fft_create).
<BR><BR>
\param[in] pfft Указатель на структуру `fft_t`. <BR>
Указатель не должен быть `NULL`. <BR>
Структура \ref fft_t должна быть предварительно однократно
заполнена функцией \ref fft_create, и память должна быть
очищена перед выходом функцией \ref fft_free.
<BR><BR>
\param[out] y Указатель на комплексный вектор
результата БПФ \f$Y(k)\f$,
\f$ k = 0 \ldots n-1 \f$.
Размер вектора `[n x 1]`. <BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если расчет произведен успешно. <BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR><BR>
Пример использования функции `fft`:
\include fft_test.c
Результат работы программы:
\verbatim
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
\endverbatim
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
/*! ****************************************************************************
\ingroup DFT_GROUP
\fn int fft_create(fft_t *pfft, int n)

Wyświetl plik

@ -51,7 +51,6 @@
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -114,5 +113,4 @@ s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t)
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

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