diff --git a/dox/doxyfile_ru b/dox/doxyfile_ru
index 002fa7b..1309413 100644
--- a/dox/doxyfile_ru
+++ b/dox/doxyfile_ru
@@ -781,7 +781,12 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched.
-INPUT = ../
+INPUT = ru \
+ ../dspl/dox/ru \
+ ../dspl/src \
+ ../include \
+ ../test/dox/ru \
+ ../test/src
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -896,7 +901,8 @@ EXCLUDE_SYMBOLS =
# that contain example code fragments that are included (see the \include
# command).
-EXAMPLE_PATH =
+EXAMPLE_PATH = ../test/src \
+ ../test/dox
# If the value of the EXAMPLE_PATH tag contains directories, you can use the
# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -910,7 +916,7 @@ EXAMPLE_PATTERNS = *
# irrespective of the value of the RECURSIVE tag.
# The default value is: NO.
-EXAMPLE_RECURSIVE = NO
+EXAMPLE_RECURSIVE = YES
# The IMAGE_PATH tag can be used to specify one or more files or directories
# that contain images that are to be included in the documentation (see the
@@ -1582,7 +1588,7 @@ MATHJAX_CODEFILE =
# The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES.
-SEARCHENGINE = YES
+SEARCHENGINE = NO
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using Javascript. There
@@ -2197,7 +2203,7 @@ DIA_PATH =
# and usage relations if the target is undocumented or is not a class.
# The default value is: YES.
-HIDE_UNDOC_RELATIONS = YES
+HIDE_UNDOC_RELATIONS = NO
# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
# available from the path. This tool is part of Graphviz (see:
@@ -2206,7 +2212,7 @@ HIDE_UNDOC_RELATIONS = YES
# set to NO
# The default value is: YES.
-HAVE_DOT = YES
+HAVE_DOT = NO
# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
# to run in parallel. When set to 0 doxygen will base this on the number of
diff --git a/dox/ru/groups_define.dox b/dox/ru/groups_define.dox
index 818dc8c..1a3c805 100644
--- a/dox/ru/groups_define.dox
+++ b/dox/ru/groups_define.dox
@@ -18,7 +18,7 @@
\defgroup DFT_GROUP Алгоритмы дискретного и быстрого преобразования Фурье
\ingroup SPECTRAL_GROUP
- Алгоритмы дискретного и быстрого преобразования Фурье используют функции из библиотеки FFTW
+ Алгоритмы дискретного и быстрого преобразования Фурье.
\defgroup WIN_GROUP Функции оконного взвешивания
diff --git a/dspl/dox/ru/dft.dox b/dspl/dox/ru/dft.dox
index e7108ac..1c8f0e0 100644
--- a/dspl/dox/ru/dft.dox
+++ b/dspl/dox/ru/dft.dox
@@ -7,7 +7,7 @@
Функция рассчитывает \f$ n \f$-точечное дискретное преобразование Фурье
вещественного сигнала \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$.
\f[
- Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right),
+ Y(k) = \sum_{m = 0}^{n-1} x(m) \cdot \exp \left( -j \cdot \frac{2\pi}{n} \cdot m \cdot k \right),
\f]
где \f$ k = 0 \ldots n-1 \f$.
@@ -47,7 +47,7 @@
Функция рассчитывает \f$ n \f$-точечное дискретное преобразование Фурье
комплексного сигнала \f$ x(m) \f$, \f$ m = 0 \ldots n-1 \f$.
\f[
- Y(k) = \sum_{m = 0}^{n-1} x(m) \exp \left( -j \frac{2\pi}{n} m k \right),
+ Y(k) = \sum_{m = 0}^{n-1} x(m) \cdot \exp \left( -j \cdot \frac{2\pi}{n} \cdot m \cdot k \right),
\f]
где \f$ k = 0 \ldots n-1 \f$.
diff --git a/dspl/dox/ru/fillarray.dox b/dspl/dox/ru/fillarray.dox
index 1f8fb28..48e2888 100644
--- a/dspl/dox/ru/fillarray.dox
+++ b/dspl/dox/ru/fillarray.dox
@@ -1,16 +1,133 @@
-/**************************************************************************************************
-Linspace array filling
-int linspace(double x0, double x1, int n, int type, double* x)
-***************************************************************************************************/
+/*! *************************************************************************************************
+ \ingroup SPEC_MATH_COMMON_GROUP
+ \fn int linspace(double x0, double x1, int n, int type, double* x)
+ \brief Функция заполняет массив линейно-нарастающими, равноотстоящими значениями
+ от `x0` до `x1`
+
+ Заполняет массив `x` длиной `n` значениями в диапазоне от \f$x_0\f$ до \f$x_1\f$.
+ Функция поддерживает два типа заполнения в соответствии с параметром `type`:
+
+ Симметричное заполнение согласно выражению (параметр `type=DSPL_SYMMETRIC`):
+
+ \f$x(k) = x_0 + k \cdot dx\f$, here \f$dx = \frac{x_1 - x_0}{n-1}\f$, \f$k = 0 \ldots n-1.\f$
+
+ Периодическое заполнение (параметр `type=DSPL_PERIODIC`) согласно выражению:
+
+ \f$x(k) = x_0 + k \cdot dx\f$, here \f$dx = \frac{x_1 - x_0}{n}\f$, \f$k = 0 \ldots n-1.\f$
+
+ \param[in] x0 Начальное показателя \f$x_0\f$.
+
+ \param[in] x1 Конечное значение \f$x_1\f$.
+
+ \param[in] n Количество точек массива `x`.
+
+ \param[in] type Тип заполнения:
+ `DSPL_SYMMETRIC` - симметричное заполнение,
+ `DSPL_PERIODIC` - периодическое заполнение.
+
+ \param[in,out] x Указатель на вектор равноотстоящих значений .
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+ \return
+ `RES_OK` - функция выполнена успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+ \note
+ Отличие периодического и симметричного заполнения можно понять из следующих примеров.
+ Пример 1. Периодическое заполнение.
+ \code
+ double x[5];
+ dspl_linspace(0, 5, 5, DSPL_PERIODIC, x);
+ \endcode
+ В массиве `x` будут лежать значения:
+ \code
+ 0, 1, 2, 3, 4
+ \endcode
+
+ Пример 2. Симметричное заполнение.
+ \code
+ double x[5];
+ dspl_linspace(0, 5, 5, DSPL_SYMMETRIC, x);
+ \endcode
+ В массиве `x` будут лежать значения:
+ \code
+ 0, 1.25, 2.5, 3.75, 5
+ \endcode
+
+ \author
+ Бахурин Сергей.
+ www.dsplib.org
+
+**************************************************************************************************** */
-/**************************************************************************************************
-Logspace array filling
-int logspace(double x0, double x1, int n, int type, double* x)
-***************************************************************************************************/
+/*! *************************************************************************************************
+ \ingroup SPEC_MATH_COMMON_GROUP
+ \fn int logspace(double x0, double x1, int n, int type, double* x)
+ \brief Функция заполняет массив значениями логарифмической шкале
+
+ Заполняет массив `x` длиной `n` значениями в диапазоне от \f$10^{x_0}\f$ до \f$10^{x_1}\f$.
+ Функция поддерживает два типа заполнения в соответствии с параметром `type`:
+
+ Симметричное заполнение согласно выражению:
+
+ \f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n-1]{10^{x_1 - x_0}}\f$,
+ \f$k = 0 \ldots n-1.\f$
+
+ Периодическое заполнение согласно выражению:
+
+ \f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n]{10^{x_1 - x_0}}\f$,
+ \f$k = 0 \ldots n-1.\f$
+
+ \param[in] x0 Начальное значение показателя \f$x_0\f$.
+
+ \param[in] x1 Конечное значение показателя \f$x_1\f$.
+
+ \param[in] n Количество точек массива `x`.
+
+ \param[in] type Тип заполнения:
+ `DSPL_SYMMETRIC` - симметричное заполнение,
+ `DSPL_PERIODIC` - периодическое заполнение.
+
+ \param[in,out] x Указатель на вектор значений в логарифмической шкале.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+ \return
+ `RES_OK` - функция выполнена успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+ \note
+ Отличие периодического и симметричного заполнения можно понять из следующих примеров.
+ Пример 1. Периодическое заполнение.
+ \code
+ double x[5];
+ dspl_logspace(-2, 3, 5, DSPL_PERIODIC, x);
+ \endcode
+ В массиве `x` будут лежать значения:
+ \code
+ 0.01, 0.1, 1, 10, 100
+ \endcode
+
+ Пример 2. Симметричное заполнение.
+ \code
+ double x[5];
+ dspl_logspace(-2, 3, 5, DSPL_SYMMETRIC, x);
+ \endcode
+ В массиве `x` будут лежать значения:
+ \code
+ 0.01 0.178 3.162 56.234 1000
+ \endcode
+
+ \author
+ Бахурин Сергей.
+ www.dsplib.org
+
+**************************************************************************************************** */
diff --git a/dspl/dox/ru/polyval.dox b/dspl/dox/ru/polyval.dox
index e402992..648bf03 100644
--- a/dspl/dox/ru/polyval.dox
+++ b/dspl/dox/ru/polyval.dox
@@ -1,18 +1,106 @@
+/*! *************************************************************************************************
+ \ingroup SPEC_MATH_COMMON_GROUP
+ \fn int polyval(double* a, int ord, double* x, int n, double* y)
+ \brief Расчет вещественного полинома
+
+ Функция рассчитывает полином \f$P_N(x)\f$ \f$N-\f$ого порядка для вещественного
+ аргумента, заданного вектором `x`.
+ \f[
+ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
+ \f]
+ Для расчета используется формула Горнера:
+ \f[
+ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
+ \f]
+
+ \param[in] a Указатель на вектор вещественных коэффициентов полинома.
+ Размер вектора `[ord+1 x 1]`.
+ Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$.
+
+ \param[in] ord Порядок полинома \f$N\f$.
+
+ \param[in] x Указатель на вектор аргумента полинома.
+ Размер вектора `[n x 1]`.
+ Значения полинома будут расчитаны для всех
+ значений аргумента вектора `x`.
+
+ \param[in] n Размер вектора агрумента полинома.
+
+ \param[out] y Указатель на значения полинома для аргумента `x`.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
-/**************************************************************************************************
-Real polynomial evaluation
+ \return
+ `RES_OK` Полином расчитан успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+ \author
+ Бахурин Сергей.
+ www.dsplib.org
+
-int polyval(double* a, int ord, double* x, int n, double* y)
-***************************************************************************************************/
+**************************************************************************************************** */
+/*! *************************************************************************************************
+ \ingroup SPEC_MATH_COMMON_GROUP
+ \fn int polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
+ \brief Расчет комплексного полинома
+
+ Функция рассчитывает полином \f$P_N(x)\f$ \f$N-\f$ого порядка комплексного аргумента
+ аргумента, заданного вектором `x`.
+ \f[
+ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
+ \f]
+ Для расчета используется формула Горнера:
+ \f[
+ P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot ( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
+ \f]
+
+ \param[in] aR Указатель на вектор реальной части коэффициентов полинома.
+ Размер вектора `[ord+1 x 1]`.
+ Коэффициент `aR[0]` соответствует коэффициенту полинома \f$a_0\f$.
+
+ \param[in] aI Указатель на вектор мнимой части коэффициентов полинома.
+ Размер вектора `[ord+1 x 1]`.
+ Коэффициент `aI[0]` соответствует коэффициенту полинома \f$a_0\f$.
+
+ \param[in] ord Порядок полинома \f$N\f$.
+
+ \param[in] xR Указатель на вектор реальной части аргумента полинома.
+ Размер вектора `[n x 1]`.
+ Значения полинома будут расчитаны для всех
+ значений аргумента вектора `x`.
+
+ \param[in] xI Указатель на вектор мнимой части аргумента полинома.
+ Размер вектора `[n x 1]`.
+ Значения полинома будут расчитаны для всех
+ значений аргумента вектора `x`.
+
+ \param[in] n Размер вектора агрумента полинома.
+
+ \param[out] yR Указатель вектор реальной части значения
+ полинома для аргумента `x`.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+ \param[out] yI Указатель вектор реальной части значения
+ полинома для аргумента `x`.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+ \return
+ `RES_OK` Полином расчитан успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+ \author
+ Бахурин Сергей.
+ www.dsplib.org
+
+**************************************************************************************************** */
-/**************************************************************************************************
-Complex polynomial evaluation
-int polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
-***************************************************************************************************/
diff --git a/dspl/src/fft.c b/dspl/src/fft.c
new file mode 100644
index 0000000..820b25c
--- /dev/null
+++ b/dspl/src/fft.c
@@ -0,0 +1,95 @@
+/*
+* Copyright (c) 2015-2018 Sergey Bakhurin
+* Digital Signal Processing Library [http://dsplib.org]
+*
+* This file is part of libdspl-2.0.
+*
+* is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* DSPL is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with Foobar. If not, see .
+*/
+
+#include
+#include
+#include "dspl.h"
+
+int fft_bit_reverse(complex_t* x, complex_t* y, int n, int p2);
+int fft_p2(int n);
+
+
+
+
+/**************************************************************************************************
+FFT bit reverse
+**************************************************************************************************/
+int fft_bit_reverse(complex_t* x, complex_t* y, int n, int p2)
+{
+ static unsigned char rb_table[256] =
+ {
+ 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
+ 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
+ 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
+ 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
+ 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
+ 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
+ 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
+ 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
+ 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
+ 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
+ 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
+ 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
+ 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
+ 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
+ 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
+ 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
+ };
+
+ if(!x || !y)
+ return ERROR_PTR;
+ if(n<1 || p2 < 1)
+ return ERROR_SIZE;
+
+ unsigned int v, c;
+
+ for(v = 0; v < n; v++)
+ {
+ c =
+ ((rb_table[ v & 0xff] << 24) |
+ (rb_table[(v >> 8) & 0xff] << 16) |
+ (rb_table[(v >> 16) & 0xff] << 8) |
+ (rb_table[(v >> 24) & 0xff])) >> (32 - p2);
+ RE(y[c]) = RE(x[v]);
+ IM(y[c]) = IM(x[v]);
+ }
+ return RES_OK;
+}
+
+
+
+
+
+
+
+
+/**************************************************************************************************
+FFT power of 2
+**************************************************************************************************/
+int fft_p2(int n)
+{
+ int p = (n>0) ? n : 0;
+ int p2 = 0;
+ while((p = p>>1))
+ p2++;
+ if((1<.
+*/
+
+#include
+#include
+#include "dspl.h"
+
+
+/**************************************************************************************************
+Goertzel algorithm for real vector
+**************************************************************************************************/
+int DSPL_API goertzel(double *x, int n, int *ind, int k, complex_t *y)
+{
+
+ int m, p;
+ double wR, wI;
+ double alpha;
+ double v[3];
+
+ if(!x || !y || !ind)
+ return ERROR_PTR;
+
+ if(n < 1 || k < 1)
+ return ERROR_SIZE;
+
+ for(p = 0; p < k; p++)
+ {
+ wR = cos(M_2PI * (double)ind[p] / (double)n);
+ wI = sin(M_2PI * (double)ind[p] / (double)n);
+
+ alpha = 2.0 * wR;
+ v[0] = v[1] = v[2] = 0.0;
+
+ for(m = 0; m < n; m++)
+ {
+ v[2] = v[1];
+ v[1] = v[0];
+ v[0] = x[m]+alpha*v[1] - v[2];
+ }
+ RE(y[p]) = wR * v[0] - v[1];
+ IM(y[p]) = wI * v[0];
+ }
+
+ return RES_OK;
+}
+
+
+
+
+
+/**************************************************************************************************
+Goertzel algorithm for complex vector
+**************************************************************************************************/
+int DSPL_API goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
+{
+
+ int m, p;
+ complex_t w;
+ double alpha;
+ complex_t v[3];
+
+ if(!x || !y || !ind)
+ return ERROR_PTR;
+
+ if(n < 1 || k < 1)
+ return ERROR_SIZE;
+
+ for(p = 0; p < k; p++)
+ {
+ RE(w) = cos(M_2PI * (double)ind[p] / (double)n);
+ IM(w) = sin(M_2PI * (double)ind[p] / (double)n);
+
+ alpha = 2.0 * RE(w);
+ memset(v, 0, 3*sizeof(complex_t));
+
+ for(m = 0; m < n; m++)
+ {
+ RE(v[2]) = RE(v[1]);
+ RE(v[1]) = RE(v[0]);
+ RE(v[0]) = RE(x[m]) + alpha * RE(v[1]) - RE(v[2]);
+
+ IM(v[2]) = IM(v[1]);
+ IM(v[1]) = IM(v[0]);
+ IM(v[0]) = IM(x[m]) + alpha * IM(v[1]) - IM(v[2]);
+ }
+
+ RE(y[p]) = CMRE(w, v[0]) - RE(v[1]);
+ IM(y[p]) = CMIM(w, v[0]) - IM(v[1]);
+ }
+
+ return RES_OK;
+}
diff --git a/dspl/src/polyval.c b/dspl/src/polyval.c
new file mode 100644
index 0000000..d80cc66
--- /dev/null
+++ b/dspl/src/polyval.c
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2015-2018 Sergey Bakhurin
+* Digital Signal Processing Library [http://dsplib.org]
+*
+* This file is part of libdspl-2.0.
+*
+* is free software: you can redistribute it and/or modify
+* it under the terms of the GNU Lesser General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* DSPL is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public License
+* along with Foobar. If not, see .
+*/
+
+
+#include
+#include
+#include "dspl.h"
+
+
+
+
+
+/**************************************************************************************************
+Real polynomial evaluation
+***************************************************************************************************/
+int DSPL_API polyval(double* a, int ord, double* x, int n, double* y)
+{
+ int k, m;
+
+ if(!a || !x || !y)
+ return ERROR_PTR;
+ if(ord<0)
+ return ERROR_POLY_ORD;
+ if(n<1)
+ return ERROR_SIZE;
+
+ for(k = 0; k < n; k++)
+ {
+ y[k] = a[ord];
+ for(m = ord-1; m>-1; m--)
+ y[k] = y[k]*x[k] + a[m];
+ }
+ return RES_OK;
+}
+
+
+
+
+
+/**************************************************************************************************
+Complex polynomial evaluation
+***************************************************************************************************/
+int DSPL_API polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
+{
+ int k, m;
+ complex_t t;
+
+ if(!a || !x || !y)
+ return ERROR_PTR;
+ if(ord<0)
+ return ERROR_POLY_ORD;
+ if(n<1)
+ return ERROR_SIZE;
+
+ for(k = 0; k < n; k++)
+ {
+ RE(y[k]) = RE(a[ord]);
+ IM(y[k]) = IM(a[ord]);
+ for(m = ord-1; m>-1; m--)
+ {
+ RE(t) = CMRE(y[k], x[k]);
+ IM(t) = CMIM(y[k], x[k]);
+ RE(y[k]) = RE(t) + RE(a[m]);
+ IM(y[k]) = IM(t) + IM(a[m]);
+ }
+ }
+ return RES_OK;
+}
+
+
+
+
+
+
+
+/**************************************************************************************************
+polynomial zeros to coeff reecalc
+***************************************************************************************************/
+int poly_z2a(complex_t *z, int nz, int ord, complex_t *a)
+{
+ int k, ind, res;
+ complex_t x[2];
+
+ if(!z || !a)
+ return ERROR_PTR;
+ if(ord<0)
+ return ERROR_POLY_ORD;
+ if(nz<1 || nz > ord)
+ return ERROR_SIZE;
+
+ memset(a, 0, (ord+1) * sizeof(complex_t));
+ RE(a[0]) = 1.0;
+ IM(a[0]) = 0.0;
+
+ RE(x[1]) = 1.0;
+ IM(x[1]) = 0.0;
+
+
+ ind = 1;
+ for(k=0; k < nz; k++)
+ {
+ RE(x[0]) = -RE(z[k]);
+ IM(x[0]) = -IM(z[k]);
+ res = conv_cmplx(a, ind, x, 2, a);
+ if(res!=RES_OK)
+ return res;
+ ind++;
+ }
+ return RES_OK;
+}
+
+
+
+
+
+
+
+
+
+
diff --git a/include/dspl.c b/include/dspl.c
index 18fdd46..5fd8953 100644
--- a/include/dspl.c
+++ b/include/dspl.c
@@ -42,8 +42,14 @@ p_conv_cmplx conv_cmplx ;
p_dft dft ;
p_dft_cmplx dft_cmplx ;
p_filter_iir filter_iir ;
+p_goertzel goertzel ;
+p_goertzel_cmplx goertzel_cmplx ;
p_linspace linspace ;
p_logspace logspace ;
+p_polyval polyval ;
+p_polyval_cmplx polyval_cmplx ;
+
+
#endif //BUILD_LIB
@@ -103,8 +109,13 @@ void* dspl_load()
LOAD_FUNC(dft);
LOAD_FUNC(dft_cmplx);
LOAD_FUNC(filter_iir);
+ LOAD_FUNC(goertzel);
+ LOAD_FUNC(goertzel_cmplx);
LOAD_FUNC(linspace);
LOAD_FUNC(logspace);
+ LOAD_FUNC(polyval);
+ LOAD_FUNC(polyval_cmplx);
+
diff --git a/include/dspl.h b/include/dspl.h
index 5e87762..01403ef 100644
--- a/include/dspl.h
+++ b/include/dspl.h
@@ -43,13 +43,16 @@ typedef double complex_t[2];
typedef struct
{
- void *pfftw;
- complex_t *in;
- complex_t *out;
- size_t size;
+ complex_t* w;
+ complex_t* t0;
+ complex_t* t1;
+ int n;
+ int p2;
} fft_t;
+
+
#define RE(x) (x[0])
#define IM(x) (x[1])
@@ -66,8 +69,6 @@ typedef struct
-
-
#define RES_OK 0
/* Error codes */
@@ -179,7 +180,7 @@ extern "C" {
#ifdef BUILD_LIB
#define DECLARE_FUNC(type, fn, param)\
- type DSPL_API fn(param);\
+ type DSPL_API fn(param);
#endif
@@ -198,8 +199,15 @@ DECLARE_FUNC(int, conv_cmplx, complex_t* COMMA int COMMA comple
DECLARE_FUNC(int, dft, double* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, dft_cmplx, complex_t* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, filter_iir, double* COMMA double* COMMA int COMMA double* COMMA int COMMA double*);
+DECLARE_FUNC(int, goertzel, double* COMMA int COMMA int* COMMA int COMMA complex_t*);
+DECLARE_FUNC(int, goertzel_cmplx, complex_t* COMMA int COMMA int* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, linspace, double COMMA double COMMA int COMMA int COMMA double*);
DECLARE_FUNC(int, logspace, double COMMA double COMMA int COMMA int COMMA double*);
+DECLARE_FUNC(int, polyval, double* COMMA int COMMA double* COMMA int COMMA double*);
+DECLARE_FUNC(int, polyval_cmplx, complex_t* COMMA int COMMA complex_t* COMMA int COMMA complex_t*);
+
+
+
#ifdef __cplusplus
diff --git a/release/include/dspl.c b/release/include/dspl.c
index 18fdd46..5fd8953 100644
--- a/release/include/dspl.c
+++ b/release/include/dspl.c
@@ -42,8 +42,14 @@ p_conv_cmplx conv_cmplx ;
p_dft dft ;
p_dft_cmplx dft_cmplx ;
p_filter_iir filter_iir ;
+p_goertzel goertzel ;
+p_goertzel_cmplx goertzel_cmplx ;
p_linspace linspace ;
p_logspace logspace ;
+p_polyval polyval ;
+p_polyval_cmplx polyval_cmplx ;
+
+
#endif //BUILD_LIB
@@ -103,8 +109,13 @@ void* dspl_load()
LOAD_FUNC(dft);
LOAD_FUNC(dft_cmplx);
LOAD_FUNC(filter_iir);
+ LOAD_FUNC(goertzel);
+ LOAD_FUNC(goertzel_cmplx);
LOAD_FUNC(linspace);
LOAD_FUNC(logspace);
+ LOAD_FUNC(polyval);
+ LOAD_FUNC(polyval_cmplx);
+
diff --git a/release/include/dspl.h b/release/include/dspl.h
index 5e87762..01403ef 100644
--- a/release/include/dspl.h
+++ b/release/include/dspl.h
@@ -43,13 +43,16 @@ typedef double complex_t[2];
typedef struct
{
- void *pfftw;
- complex_t *in;
- complex_t *out;
- size_t size;
+ complex_t* w;
+ complex_t* t0;
+ complex_t* t1;
+ int n;
+ int p2;
} fft_t;
+
+
#define RE(x) (x[0])
#define IM(x) (x[1])
@@ -66,8 +69,6 @@ typedef struct
-
-
#define RES_OK 0
/* Error codes */
@@ -179,7 +180,7 @@ extern "C" {
#ifdef BUILD_LIB
#define DECLARE_FUNC(type, fn, param)\
- type DSPL_API fn(param);\
+ type DSPL_API fn(param);
#endif
@@ -198,8 +199,15 @@ DECLARE_FUNC(int, conv_cmplx, complex_t* COMMA int COMMA comple
DECLARE_FUNC(int, dft, double* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, dft_cmplx, complex_t* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, filter_iir, double* COMMA double* COMMA int COMMA double* COMMA int COMMA double*);
+DECLARE_FUNC(int, goertzel, double* COMMA int COMMA int* COMMA int COMMA complex_t*);
+DECLARE_FUNC(int, goertzel_cmplx, complex_t* COMMA int COMMA int* COMMA int COMMA complex_t*);
DECLARE_FUNC(int, linspace, double COMMA double COMMA int COMMA int COMMA double*);
DECLARE_FUNC(int, logspace, double COMMA double COMMA int COMMA int COMMA double*);
+DECLARE_FUNC(int, polyval, double* COMMA int COMMA double* COMMA int COMMA double*);
+DECLARE_FUNC(int, polyval_cmplx, complex_t* COMMA int COMMA complex_t* COMMA int COMMA complex_t*);
+
+
+
#ifdef __cplusplus
diff --git a/test/bin/dft_test.exe b/test/bin/dft_test.exe
index 2b3c751..2cb8e66 100755
Binary files a/test/bin/dft_test.exe and b/test/bin/dft_test.exe differ