kopia lustrzana https://github.com/Dsplib/libdspl-2.0
fixed FFT and added some dox
rodzic
8afc35f068
commit
43b72c39bf
|
@ -657,14 +657,14 @@ MAX_INITIALIZER_LINES = 30
|
|||
# list will mention the files that were used to generate the documentation.
|
||||
# The default value is: YES.
|
||||
|
||||
SHOW_USED_FILES = YES
|
||||
SHOW_USED_FILES = NO
|
||||
|
||||
# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
|
||||
# will remove the Files entry from the Quick Index and from the Folder Tree View
|
||||
# (if specified).
|
||||
# The default value is: YES.
|
||||
|
||||
SHOW_FILES = YES
|
||||
SHOW_FILES = NO
|
||||
|
||||
# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
|
||||
# page. This will remove the Namespaces entry from the Quick Index and from the
|
||||
|
|
|
@ -12,19 +12,45 @@
|
|||
где \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>
|
||||
\f$ m = 0 \ldots n-1 \f$. <BR>
|
||||
Размер вектора `[n x 1]`. <BR><BR>
|
||||
|
||||
\param[in] n Размер ДПФ \f$n\f$ (размер векторов входного сигнала и результата ДПФ).<BR><BR>
|
||||
|
||||
\param[out] y Указатель на комплексный вектор результата ДПФ \f$Y(k)\f$,
|
||||
\f$ k = 0 \ldots n-1 \f$. Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
\f$ k = 0 \ldots n-1 \f$. Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` если ДПФ рассчитана успешно. <BR>
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции `dft`:
|
||||
|
||||
\include dft_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
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
|
||||
\endverbatim
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
|
@ -52,19 +78,49 @@
|
|||
где \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>
|
||||
\f$ m = 0 \ldots n-1 \f$. <BR>
|
||||
Размер вектора `[n x 1]`. <BR><BR>
|
||||
|
||||
\param[in] n Размер ДПФ \f$n\f$ (размер векторов входного сигнала и результата ДПФ).<BR><BR>
|
||||
|
||||
\param[out] y Указатель на комплексный вектор результата ДПФ \f$Y(k)\f$,
|
||||
\f$ k = 0 \ldots n-1 \f$. Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена.<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>
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Пример использования функции `dft_cmplx`:
|
||||
|
||||
\include dft_cmplx_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
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
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
|
|
|
@ -1,9 +1,96 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! *************************************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fft_shift(double* x, int n, double* y)
|
||||
\brief Перестановка спектральных отсчетов дискретного преобразования Фурье
|
||||
\ingroup DFT_GROUP
|
||||
\struct fft_t
|
||||
\brief Структура данных объекта быстрого преобразования Фурье
|
||||
|
||||
Структура хранит указатели на массивы поворотных коэффициентов и массивов промежуточных данных
|
||||
алгоритма быстрого преобразования Фурье с прореживанием по времени.
|
||||
|
||||
\param n Размер вектора БПФ, для которого выделена память в массивах структуры. <BR>
|
||||
Парметр `n` должен быть равен целой степени двойки. <BR><BR>
|
||||
|
||||
\param p2 Целая степень двойки, образующая размер БПФ.<BR><BR>
|
||||
Так \f$2^{p2} = n\f$.
|
||||
|
||||
\param w Указатель на вектор поворотных коэффициентов алгоритма БПФ.<BR>
|
||||
Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена и массив поворотных коэффициентов должен
|
||||
быть заполнен функцией \ref fft_create. <BR><BR>
|
||||
|
||||
|
||||
\param t0 Указатель на вектор промежуточных вычислений алгоритма БПФ.<BR>
|
||||
Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена функцией \ref fft_create. <BR><BR>
|
||||
|
||||
|
||||
\param t1 Указатель на вектор промежуточных вычислений алгоритма БПФ.<BR>
|
||||
Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена функцией \ref fft_create. <BR><BR>
|
||||
|
||||
|
||||
Структура заполняется функцией \ref fft_create один раз до использования алгоритма БПФ. <BR>
|
||||
Указатель на объект данной структуры может быть многократно использован при вызвове функций БПФ.<BR>
|
||||
Перед выходом из программы выделенную память под поворотные коэффициенты и массивы промежуточных данных
|
||||
необходимо очистить функцией \ref fft_free. Например:
|
||||
|
||||
\code
|
||||
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);
|
||||
\endcode
|
||||
|
||||
|
||||
Важно отметить, что если объект `fft_t` был создан для размера БПФ равного `n`,
|
||||
то он может быть использован для любого размера БПФ `k` меньшего размера. <BR>
|
||||
|
||||
Например, если мы создали `fft_t` для БПФ размера `n = 64`, то мы можем использовать
|
||||
этот же объект для 32, 16, 8, 4 -точечных БПФ без необходимости пересчета поворотных коэффициентов.<BR>
|
||||
|
||||
Также необходимо заметить, что функции БПФ самостоятельно контроллируют размер,
|
||||
и самостоятельно выделяют память объекта БПФ при необходимости.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
|
||||
**************************************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! *************************************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fft_shift(double* x, int n, double* y)
|
||||
\brief Перестановка спектральных отсчетов дискретного преобразования Фурье
|
||||
|
||||
Функция производит
|
||||
<a href="http://ru.dsplib.org/content/dft_freq/dft_freq.html">
|
||||
|
@ -12,26 +99,26 @@
|
|||
Данная функция обрабатывает вещественные входные и выходные вектора и может применяться для перестановки
|
||||
амплитудного или фазового спектра.
|
||||
|
||||
|
||||
|
||||
|
||||
\param[in] x Указатель на исходный вектор ДПФ. <BR>
|
||||
Размер вектора `[n x 1]`. <BR><BR>
|
||||
|
||||
\param[in] n Размер ДПФ \f$n\f$ (размер векторов до и после перестановки).<BR><BR>
|
||||
|
||||
\param[out] y Указатель на вектор результата перестановки.<BR>
|
||||
Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` если перестановка произведена успешно. <BR>
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
|
||||
\param[in] x Указатель на исходный вектор ДПФ. <BR>
|
||||
Размер вектора `[n x 1]`. <BR><BR>
|
||||
|
||||
\param[in] n Размер ДПФ \f$n\f$ (размер векторов до и после перестановки).<BR><BR>
|
||||
|
||||
\param[out] y Указатель на вектор результата перестановки.<BR>
|
||||
Размер вектора `[n x 1]`. <BR>
|
||||
Память должна быть выделена.<BR><BR>
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` если перестановка произведена успешно. <BR>
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
|
||||
|
||||
**************************************************************************************************** */
|
||||
|
|
|
@ -112,7 +112,7 @@ int fft_bit_reverse(complex_t* x, complex_t* y, int n, int p2)
|
|||
|
||||
for(v = 0; v < n; v++)
|
||||
{
|
||||
c =
|
||||
c = (unsigned int)
|
||||
((rb_table[ v & 0xff] << 24) |
|
||||
(rb_table[(v >> 8) & 0xff] << 16) |
|
||||
(rb_table[(v >> 16) & 0xff] << 8) |
|
||||
|
@ -208,12 +208,12 @@ int fft_dit(fft_t *pfft, int n, complex_t* y)
|
|||
for(k = 0; k < n; k+=dm)
|
||||
{
|
||||
fft_dit_krn(t0+k, t0+k+m, w+waddr, m, t1+k, t1+k+m);
|
||||
t = t1;
|
||||
t1 = t0;
|
||||
t0 = t;
|
||||
waddr+=m;
|
||||
m <<= 1;
|
||||
}
|
||||
t = t1;
|
||||
t1 = t0;
|
||||
t0 = t;
|
||||
waddr+=m;
|
||||
m <<= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Plik binarny nie jest wyświetlany.
|
@ -0,0 +1,32 @@
|
|||
#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
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
{
|
||||
RE(x[k]) = (double)k;
|
||||
IM(x[k]) = 0.0;
|
||||
}
|
||||
|
||||
dft_cmplx(x,N,y);
|
||||
|
||||
for(int 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;
|
||||
}
|
||||
|
||||
|
|
@ -6,28 +6,23 @@
|
|||
#define N 16
|
||||
int main()
|
||||
{
|
||||
void* handle;
|
||||
handle = dspl_load();
|
||||
|
||||
complex_t x[N];
|
||||
complex_t y[N];
|
||||
//complex_t z[N];
|
||||
|
||||
|
||||
|
||||
void* handle; // DSPL handle
|
||||
handle = dspl_load(); // Load DSPL function
|
||||
|
||||
double x[N]; // real input signal
|
||||
complex_t y[N]; // DFT
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
{
|
||||
RE(x[k]) = (double)k;
|
||||
IM(x[k]) = 0.0;
|
||||
}
|
||||
x[k] = (double)k;
|
||||
|
||||
dft_cmplx(x,N,y);
|
||||
dft(x, N, y);
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
for(int 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);
|
||||
|
||||
dspl_free(handle); // remember to free the resource
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
#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
|
||||
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++)
|
||||
{
|
||||
RE(x[k]) = (double)k;
|
||||
IM(x[k]) = 0.0;
|
||||
}
|
||||
|
||||
//FFT
|
||||
fft_cmplx(x, N, &pfft, y);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
@ -6,30 +6,30 @@
|
|||
#define N 16
|
||||
int main()
|
||||
{
|
||||
void* handle;
|
||||
handle = dspl_load();
|
||||
|
||||
complex_t x[N];
|
||||
complex_t y[N];
|
||||
fft_t pfft;
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
{
|
||||
RE(x[k]) = (double)k;
|
||||
IM(x[k]) = 0.0;
|
||||
}
|
||||
void* handle; // DSPL handle
|
||||
handle = dspl_load(); // Load DSPL function
|
||||
|
||||
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));
|
||||
|
||||
fft_create(&pfft, N);
|
||||
// Create FFT object
|
||||
fft_create(&pfft, N);
|
||||
|
||||
for(int k = 0; k < N; k++)
|
||||
x[k] = (double)k;
|
||||
|
||||
//FFT
|
||||
fft(x, N, &pfft, y);
|
||||
|
||||
fft_cmplx(x, N, &pfft, y);
|
||||
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);
|
||||
|
||||
dspl_free(handle);
|
||||
fft_free(&pfft); // clear FFT object
|
||||
dspl_free(handle); // free dspl handle
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue