diff --git a/Makefile b/Makefile
index f8b082a..a21095a 100644
--- a/Makefile
+++ b/Makefile
@@ -32,7 +32,6 @@ all:
clean:
$(MAKE) -f Makefile.dspl clean
- $(MAKE) -f Makefile.test clean
$(MAKE) -f Makefile.verif clean
$(MAKE) -f Makefile.examples clean
diff --git a/dspl/dox/ru/complex.dox b/dspl/dox/ru/complex.dox
index f89c762..83d2e63 100644
--- a/dspl/dox/ru/complex.dox
+++ b/dspl/dox/ru/complex.dox
@@ -31,7 +31,7 @@
-/*! *************************************************************************************************
+/*! ****************************************************************************
\ingroup TYPES_GROUP
\def ABSSQR(x)
\brief Макрос возвращает квадрат модуля комплексного числа `x`.
@@ -51,12 +51,8 @@
y = ABSSQR(z);
\endcode
- Переменная `z = 1-2j`, где `j` - мнимая единица, а переменная `y = 5`.
-
-
-
-
-**************************************************************************************************** */
+ Переменная `z = 1-2j`, где `j` - мнимая единица, а переменная `y = 5`.
+***************************************************************************** */
@@ -65,31 +61,30 @@
-/*! *************************************************************************************************
+/*! ****************************************************************************
\ingroup TYPES_GROUP
\def IM(x)
\brief Макрос определяющий мнимую часть комплексного числа.
- Например:
- \code
- complex_t z;
- RE(z) = 1.0;
- IM(z) = -2.0;
- \endcode
+Например:
+\code
+ complex_t z;
+ RE(z) = 1.0;
+ IM(z) = -2.0;
+\endcode
- Переменная `z = 1-2j`, где `j` - мнимая единица.
+Переменная `z = 1-2j`, где `j` - мнимая единица.
- Аналогично, макрос можно использовать для получения мнимой части комплексного числа:
-
- \code
- complex_t z = {3.0, -4.0};
- double r;
- r = IM(z);
- \endcode
- В данном примере переменная `z = 3-4i`, а в переменой `r` будет храниться число -4.
-
-
-**************************************************************************************************** */
+Аналогично, макрос можно использовать для получения
+мнимой части комплексного числа:
+\code
+ complex_t z = {3.0, -4.0};
+ double r;
+ r = IM(z);
+\endcode
+В данном примере переменная `z = 3-4i`,
+а в переменой `r` будет храниться число -4.
+***************************************************************************** */
@@ -100,31 +95,32 @@
-/*! *************************************************************************************************
- \ingroup TYPES_GROUP
- \def RE(x)
- \brief Макрос определяющий реальную часть комплексного числа.
+/*! ****************************************************************************
+\ingroup TYPES_GROUP
+\def RE(x)
+\brief Макрос определяющий реальную часть комплексного числа.
- Например:
- \code
- complex_t z;
- RE(z) = 1.0;
- IM(z) = -2.0;
- \endcode
+Например:
+\code
+ complex_t z;
+ RE(z) = 1.0;
+ IM(z) = -2.0;
+\endcode
- Переменная `z = 1-2j`, где `j` - мнимая единица.
+Переменная `z = 1-2j`, где `j` - мнимая единица.
- Аналогично, макрос можно использовать для получения реальной части комплексного числа:
+Аналогично, макрос можно использовать для получения
+реальной части комплексного числа:
- \code
- complex_t z = {3.0, -4.0};
- double r;
- r = RE(z);
- \endcode
- В данном примере переменная `z = 3-4i`, а в переменой `r` будет храниться число 3.
-
-
-**************************************************************************************************** */
+ \code
+ complex_t z = {3.0, -4.0};
+ double r;
+ r = RE(z);
+\endcode
+В данном примере переменная `z = 3-4i`, а в переменой `r`
+будет храниться число 3.
+
+***************************************************************************** */
@@ -134,108 +130,104 @@
-/*! *************************************************************************************************
- \ingroup TYPES_GROUP
- \fn int re2cmplx(double* x, int n, complex_t *y)
- \brief Преобразование массива вещественных данных в массив комплексных данных.
+/*! ****************************************************************************
+\ingroup TYPES_GROUP
+\fn int re2cmplx(double* x, int n, complex_t *y)
+\brief Преобразование массива вещественных данных в массив комплексных данных.
- Функция заполняет реальные части массива `y` данных соответсвующими значениями
- исходного вещественного массива `x`.
-
-
- \param[in] x Указатель на массв вещественных данных.
- Размер массива `[n x 1]`.
-
- \param[in] n Размер массивов входных и выходных данных.
-
- \param[out] y Указатель на адрес массива комплексных данных.
- Размер массива `[n x 1]`.
- Память должна быть выделена.
+Функция заполняет реальные части массива `y` данных соответсвующими значениями
+исходного вещественного массива `x`.
- \return
- `RES_OK` если преобразование произведено успешно.
- В противном случае \ref ERROR_CODE_GROUP "код ошибки":
+\param[in] x Указатель на массв вещественных данных.
+ Размер массива `[n x 1]`.
+
+\param[in] n Размер массивов входных и выходных данных.
+
+\param[out] y Указатель на адрес массива комплексных данных.
+ Размер массива `[n x 1]`.
+ Память должна быть выделена.
+
+
+\return
+`RES_OK` если преобразование произведено успешно.
+В противном случае \ref ERROR_CODE_GROUP "код ошибки":
- Например при выполнении следующего кода
- \code{.cpp}
- double x[3] = {1.0, 2.0, 3.0};
- complex_t y[3];
+Например при выполнении следующего кода
+\code{.cpp}
+ double x[3] = {1.0, 2.0, 3.0};
+ complex_t y[3];
- re2cmplx(x, 3, y);
- \endcode
-
- Значениям `y` будут присвоены значения:
-
- \verbatim
- y[0] = 1+0j;
- y[1] = 2+0j;
- y[2] = 3+0j.
- \endverbatim
+ re2cmplx(x, 3, y);
+\endcode
- \author
- Бахурин Сергей.
- www.dsplib.org
+Значениям `y` будут присвоены значения:
+\verbatim
+ y[0] = 1+0j;
+ y[1] = 2+0j;
+ y[2] = 3+0j.
+\endverbatim
-**************************************************************************************************** */
+\author
+Бахурин Сергей.
+www.dsplib.org
+***************************************************************************** */
-/*! *************************************************************************************************
- \ingroup TYPES_GROUP
- \fn int cmplx2re(complex_t* x, int n, double *re, double *im)
- \brief Преобразование массива комплексных данных в два массива
- вещественных данных, содержащих реальную и мнимую части
- исходного массива
+/*! ****************************************************************************
+\ingroup TYPES_GROUP
+\fn int cmplx2re(complex_t* x, int n, double *re, double *im)
+\brief Преобразование массива комплексных данных в два массива
+ вещественных данных, содержащих реальную и мнимую части
+ исходного массива
- Функция заполняет реальные массивы `re` и `im` соответсвующими значениями
- ральной и мнимой частей исходного комплексного массива `x`.
-
-
- \param[in] x Указатель на массв комплексных данных.
- Размер массива `[n x 1]`.
-
- \param[in] n Размер массивов входных и выходных данных.
-
- \param[out] re Указатель на адрес массива реальной части данных.
- Размер массива `[n x 1]`.
- Память должна быть выделена.
-
- \param[out] im Указатель на адрес массива мнимой части данных.
- Размер массива `[n x 1]`.
- Память должна быть выделена.
-
- \return
- `RES_OK` если преобразование произведено успешно.
- В противном случае \ref ERROR_CODE_GROUP "код ошибки":
-
- Например при выполнении следующего кода
- \code{.cpp}
- complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
- double re[3], im[3];
-
- cmplx2re(x, 3, re, im);
- \endcode
-
- Элементам массивов `re` и `im` будут присвоены значения:
-
- \verbatim
- re[0] = 1.0; im[0] = 2.0;
- re[1] = 3.0; im[1] = 4.0;
- re[2] = 5.0; im[2] = 6.0;
- \endverbatim
-
- \author
- Бахурин Сергей.
- www.dsplib.org
+Функция заполняет реальные массивы `re` и `im` соответсвующими значениями
+ральной и мнимой частей исходного комплексного массива `x`.
-**************************************************************************************************** */
+\param[in] x Указатель на массв комплексных данных.
+ Размер массива `[n x 1]`.
+
+\param[in] n Размер массивов входных и выходных данных.
+
+\param[out] re Указатель на адрес массива реальной части данных.
+ Размер массива `[n x 1]`.
+ Память должна быть выделена.
+
+\param[out] im Указатель на адрес массива мнимой части данных.
+ Размер массива `[n x 1]`.
+ Память должна быть выделена.
+
+\return
+ `RES_OK` если преобразование произведено успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки":
+
+Например при выполнении следующего кода
+\code{.cpp}
+ complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
+ double re[3], im[3];
+
+ cmplx2re(x, 3, re, im);
+\endcode
+
+Элементам массивов `re` и `im` будут присвоены значения:
+
+\verbatim
+re[0] = 1.0; im[0] = 2.0;
+re[1] = 3.0; im[1] = 4.0;
+re[2] = 5.0; im[2] = 6.0;
+\endverbatim
+
+\author
+Бахурин Сергей.
+www.dsplib.org
+***************************************************************************** */
diff --git a/dspl/dox/ru/fft.dox b/dspl/dox/ru/fft.dox
index 49c9c14..6c9033a 100644
--- a/dspl/dox/ru/fft.dox
+++ b/dspl/dox/ru/fft.dox
@@ -3,159 +3,166 @@
-/*! *************************************************************************************************
- \ingroup DFT_GROUP
- \struct fft_t
- \brief Структура данных объекта быстрого преобразования Фурье
-
- Структура хранит указатели на массивы поворотных коэффициентов и массивы промежуточных данных
- алгоритма быстрого преобразования Фурье.
-
- Библиотека DSPL использует для БПФ алгоритм для составной длины
-
-
+/*! ****************************************************************************
+\ingroup DFT_GROUP
+\struct fft_t
+\brief Структура данных объекта быстрого преобразования Фурье
- \param n Размер вектора БПФ, для которого выделена память в массивах структуры.
- Парметр `n` должен быть равен целой степени двойки.
+Структура хранит указатели на массивы поворотных коэффициентов
+и массивы промежуточных данных алгоритма быстрого преобразования Фурье.
+
+Библиотека DSPL использует для БПФ алгоритм для составной длины
- \param w Указатель на вектор поворотных коэффициентов алгоритма БПФ.
- Размер вектора `[n x 1]`.
- Память должна быть выделена и массив поворотных коэффициентов должен
- быть заполнен функцией \ref fft_create.
-
-
- \param t0 Указатель на вектор промежуточных вычислений алгоритма БПФ.
- Размер вектора `[n x 1]`.
- Память должна быть выделена функцией \ref fft_create.
+
+\param n Размер вектора БПФ, для которого выделена память
+ в массивах структуры.
+ Парметр `n` должен быть равен целой степени двойки.
- \param t1 Указатель на вектор промежуточных вычислений алгоритма БПФ.
- Размер вектора `[n x 1]`.
- Память должна быть выделена функцией \ref fft_create.
-
+\param w Указатель на вектор поворотных коэффициентов алгоритма БПФ.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена и массив поворотных коэффициентов
+ должен быть заполнен функцией \ref fft_create.
- Структура заполняется функцией \ref fft_create один раз до использования алгоритма БПФ.
- Указатель на объект данной структуры может быть многократно использован при вызвове функций БПФ.
- Перед выходом из программы выделенную память под поворотные коэффициенты и массивы промежуточных данных
- необходимо очистить функцией \ref fft_free. Например:
+
+\param t0 Указатель на вектор промежуточных вычислений алгоритма БПФ.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена функцией \ref fft_create.
+
+
+\param t1 Указатель на вектор промежуточных вычислений алгоритма БПФ.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена функцией \ref fft_create.
+
+
+Структура заполняется функцией \ref fft_create один раз
+до использования алгоритма БПФ.
+Указатель на объект данной структуры может быть
+многократно использован при вызове функций БПФ.
+Перед выходом из программы выделенную память под поворотные
+коэффициенты и массивы промежуточных данных
+необходимо очистить функцией \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`,
+то он может быть использован только для БПФ размера `n`.
+
+
+Также необходимо заметить, что функции БПФ самостоятельно контролируют размер,
+и самостоятельно выделяют память объекта БПФ при необходимости.
+Так если вызвать любую функцию использующую структуру `fft_t` с заполненными
+данными для длины БПФ `k` для расчета БПФ длины `n`,
+то массивы стуктуры будут автоматически пересозданы для длины `n`.
+
+
+\author
+Бахурин Сергей.
+www.dsplib.org
+***************************************************************************** */
+
+
+
+
+
+
+
+/*! ****************************************************************************
+\ingroup DFT_GROUP
+\fn int fft_create(fft_t *pfft, int n)
+\brief Заполнение структуры `fft_t` для алгоритма БПФ
+
+Функция производит выделение памяти и рассчет векторов
+поворотных коэффициентов `n`-точечного БПФ для структуры `fft_t`.
+
+
+
+\param[in,out] pfft Указатель на структуру `fft_t`.
+ Указатель не должен быть `NULL`.
+
+\param[in] n Размер БПФ \f$n\f$.
+ Размер БПФ может быть составным вида
+ \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.
+
+ Таким образом алгоритм БПФ поддерживает произвольные
+ длины, равные целой степени чисел 2,3,5,7,
+ а также различные их комбинации.
+ Так например, при \f$ n = 725760 \f$ структура
+ будет успешно заполнена, отому что
+ \f$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 \f$,
+ т.е. получается как произведение множителей 2,3,5,7.
+
+ При \f$ n = 172804 = 43201 \cdot 4 \f$ структура также
+ будет успешно заполнена, потому что простой множитель
+ входящий в \f$n\f$ не превосходит 46340.
+
+ Для размера
+ \f$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 \f$
+ функция вернет ошибку, поскольку 66079 больше 46340
+ и не является результатом произведения чисел 2,3,5,7.
+
+
+\return
+`RES_OK` если структура заполнена успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+\note Некоторые компиляторы при создании структуры не обнуляют ее содержимое.
+Поэтому рекомендуется произвести обнуление структуры после ее объявления:
+\code
+ fft_t pfft; // объявляем объект fft_t
+ int n = 64; // Размер БПФ
- \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
-
+ // обнуляем все поля и указатели.
+ // Данные шаг рекомендуется ввиду того, что некоторые
+ // компиляторы при создании переменной не инициализируют ее нулем.
+ memset(&pfft, 0, sizeof(fft_t));
- Важно отметить, что если объект `fft_t` был создан для размера БПФ равного `n`,
- то он может быть использован только для БПФ размера `n`.
+ int err;
-
- Также необходимо заметить, что функции БПФ самостоятельно контроллируют размер,
- и самостоятельно выделяют память объекта БПФ при необходимости. Так если вызвать
- любую функцию использующую структуру `fft_t` с заполненными данными для длины
- БПФ `k` для расчета БПФ длины `n`, то массивы стуктуры будут автоматически
- пересозданы для длины `n`.
-
-
- \author
- Бахурин Сергей.
- www.dsplib.org
+ //создаем объект для 64-точечного БПФ
+ err = fft_create(&pfft, n);
-**************************************************************************************************** */
+ // .....
+
+ //очистить память объекта БПФ
+ fft_free(&pfft);
+\endcode
+Перед выходом из программы выделенную в структуре память
+необходимо очистить функцией \ref fft_free .
+\note Магия числа 46340 заключается в том, что
+\f$\sqrt{2^{31}} = 46340.95\f$.
+
-
-
-
-
-
-/*! *************************************************************************************************
- \ingroup DFT_GROUP
- \fn int fft_create(fft_t *pfft, int n)
- \brief Заполнение структуры `fft_t` для алгоритма БПФ
-
- Функция производит выделение памяти и рассчет векторов поворотных коэффициентов
- `n`-точечного БПФ для структуры `fft_t`.
-
-
-
- \param[in,out] pfft Указатель на структуру `fft_t`.
- Указатель не должен быть `NULL`.
-
- \param[in] n Размер БПФ \f$n\f$.
- Размер БПФ может быть составным вида
- \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.
- Таким образом алгоритм БПФ поддерживает произвольный длины, равные целой степени чисел 2,3,5,7,
- а таже различные их комбинации.
- Так например, при \f$ n = 725760 \f$ структура будет успешно заполнена,
- потому что \f$725760 = 2 \cdot 3 \cdot 4 \cdot 5 \cdot 6 \cdot 7 \cdot 9 \cdot 16 \f$,
- т.е. получается как произведение множителей 2,3,5,7.
- При \f$ n = 172804 = 43201 \cdot 4 \f$ структура также будет успешно заполнена,
- потому что простой множитель входящий в \f$n\f$ не превосходит 46340.
- Для размера \f$ n = 13 \cdot 17 \cdot 23 \cdot 13 = 66079 \f$ функция вернет ошибку,
- поскольку 66079 больше 46340 и не является результатом произведения чисел 2,3,5,7.
-
-
-
-
-
- \return
- `RES_OK` если структура заполнена успешно.
- В противном случае \ref ERROR_CODE_GROUP "код ошибки".
-
- \note Некоторые компиляторы при создании структуры не обнуляют ее содержимое.
- Поэтому рекомендуется произвести обнуление структуры после ее объявления:
- \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
- Перед выходом из программы выделенную в структуре память необходимо очистить функцией \ref fft_free .
-
- \note Магия числа 46340 заключается в том, что \f$\sqrt{2^{31}} = 46340.95\f$.
-
-
-
- \author
- Бахурин Сергей.
- www.dsplib.org
-
-
-**************************************************************************************************** */
+\author
+Бахурин Сергей.
+www.dsplib.org
+***************************************************************************** */
@@ -165,24 +172,20 @@
-/*! *************************************************************************************************
- \ingroup DFT_GROUP
- \fn void fft_free(fft_t *pfft)
- \brief Очистить структуру `fft_t` алгоритма БПФ
+/*! ****************************************************************************
+\ingroup DFT_GROUP
+\fn void fft_free(fft_t *pfft)
+\brief Очистить структуру `fft_t` алгоритма БПФ
- Функция производит очищение памяти промежуточных данных
- и векторов поворотных коэффициентов структуры `fft_t`.
+Функция производит очищение памяти промежуточных данных
+и векторов поворотных коэффициентов структуры `fft_t`.
+\param[in] pfft Указатель на структуру `fft_t`.
-
- \param[in] pfft Указатель на структуру `fft_t`.
-
- \author
- Бахурин Сергей.
- www.dsplib.org
-
-
-**************************************************************************************************** */
+\author
+Бахурин Сергей.
+www.dsplib.org
+***************************************************************************** */
@@ -191,38 +194,35 @@
-/*! *************************************************************************************************
- \ingroup DFT_GROUP
- \fn int fft_shift(double* x, int n, double* y)
- \brief Перестановка спектральных отсчетов дискретного преобразования Фурье
+/*! ****************************************************************************
+\ingroup DFT_GROUP
+\fn int fft_shift(double* x, int n, double* y)
+\brief Перестановка спектральных отсчетов дискретного преобразования Фурье
- Функция производит
-
- перестановку спектральных отсчетов ДПФ
- и переносит нулевую частоту в центр вектора ДПФ.
- Данная функция обрабатывает вещественные входные и выходные вектора и может применяться для перестановки
- амплитудного или фазового спектра.
+Функция производит
+
+перестановку спектральных отсчетов ДПФ
+ и переносит нулевую частоту в центр вектора ДПФ.
+Данная функция обрабатывает вещественные входные и выходные вектора
+и может применяться для перестановки
+амплитудного или фазового спектра.
+
+\param[in] x Указатель на исходный вектор ДПФ.
+ Размер вектора `[n x 1]`.
+
+\param[in] n Размер ДПФ \f$n\f$ (размер векторов до и после перестановки).
+
+
+\param[out] y Указатель на вектор результата перестановки.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+\return
+`RES_OK` если перестановка произведена успешно.
+ В противном случае \ref ERROR_CODE_GROUP "код ошибки":
-
- \param[in] x Указатель на исходный вектор ДПФ.
- Размер вектора `[n x 1]`.
-
- \param[in] n Размер ДПФ \f$n\f$ (размер векторов до и после перестановки).
-
- \param[out] y Указатель на вектор результата перестановки.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.
-
-
- \return
- `RES_OK` если перестановка произведена успешно.
- В противном случае \ref ERROR_CODE_GROUP "код ошибки":
-
- \author
- Бахурин Сергей.
- www.dsplib.org
-
-
-**************************************************************************************************** */
+\author
+ Бахурин Сергей.
+ www.dsplib.org
+***************************************************************************** */
diff --git a/dspl/dox/ru/math.dox b/dspl/dox/ru/math.dox
index 797f8f8..07425e3 100644
--- a/dspl/dox/ru/math.dox
+++ b/dspl/dox/ru/math.dox
@@ -1,35 +1,84 @@
+/*! ****************************************************************************
+\ingroup SPEC_MATH_TRANSCEND
+\fn int bessel_i0(double* x, int n, double* y)
+\brief Модифицированная функция Бесселя первого рода \f$ I_0(x)\f$
+
+Функция рассчитывает значения функции для вещественного вектора `x`,
+который должен принимать неотрицательные значения.
+
+
+\param[in] x Указатель на вектор переменной \f$ x \f$.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+\param[in] n Размер входного вектора `x`.
+
+\param[out] y Указатель на вектор значений функции \f$ I_0(x)\f$.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
+
+\return
+`RES_OK` Расчет произведен успешно.
+В противном случае \ref ERROR_CODE_GROUP "код ошибки".
+
+\note Для расчета используется аппроксимация приведенная в статье:
+
+ Rational Approximations for the Modified Bessel Function
+ of the First Kind – I0(x) for Computations with Double Precision
+ by PAVEL HOLOBORODKO on NOVEMBER 11, 2015
+
+
+
+Пример использования функции `bessel_i0`:
+
+\include bessel_i0.c
+
+Данная программа рассчитывает значения функции \f$ I_0(x)\f$ переменной `x`
+в интервале \f$[0 \ 3]\f$.
+Рассчитанные данные сохраняются в текстовый файл `dat/dat0.txt`
+и выводятся на график `img/bessel_i0.png`
+
+\image html bessel_i0.png
+
+Скрипт GNUPLOT для построения графиков из текстовых файлов:
+\include bessel_i0.plt
+
+\author
+Бахурин Сергей
+www.dsplib.org
+***************************************************************************** */
+
+
+
/*! ****************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int sinc(double* x, int n, double a, double* y)
-\brief Функция \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
+\brief Функция \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
-Функция рассчитывает занчения значения функции для вещественного вектора `x`.
+Функция рассчитывает значения функции для вещественного вектора `x`.
-\param[in] x Указатель на вектор переменной \f$ x \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.
+\param[in] x Указатель на вектор переменной \f$ x \f$.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
-\param[in] n Размер входного вектора `x`.
+\param[in] n Размер входного вектора `x`.
-\param[in] a Параметр функции
- \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
+\param[in] a Параметр функции
+ \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
-\param[out] y Указатель на вектор значений функции.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.
+\param[out] y Указатель на вектор значений функции.
+ Размер вектора `[n x 1]`.
+ Память должна быть выделена.
\return
- `RES_OK` Расчет произведен успешно.
- В противном случае
- \ref ERROR_CODE_GROUP "код ошибки".
-
+`RES_OK` Расчет произведен успешно.
+В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\author
- Бахурин Сергей
- www.dsplib.org
-
+Бахурин Сергей
+www.dsplib.org
***************************************************************************** */
@@ -78,12 +127,9 @@
Скрипт GNUPLOT для построения графиков из текстовых файлов:
\include sine_int.plt
-расчет функции производится на осове
-
\author
- Бахурин Сергей
- www.dsplib.org
-
+Бахурин Сергей
+www.dsplib.org
***************************************************************************** */
diff --git a/dspl/dox/ru/win.dox b/dspl/dox/ru/win.dox
index 9aac914..ae02fc4 100644
--- a/dspl/dox/ru/win.dox
+++ b/dspl/dox/ru/win.dox
@@ -38,6 +38,7 @@
`DSPL_WIN_GAUSSIAN` |Параметрическое окно Гаусса
`DSPL_WIN_HAMMING` |Непараметрическое окно Хемминга
`DSPL_WIN_HANN` |Непараметрическое окно Ханна
+ `DSPL_WIN_KAISER` |Параметрическое окно Кайзера
`DSPL_WIN_LANCZOS` |Непараметрическое окно Ланкзоса
`DSPL_WIN_NUTTALL` |Непараметрическое окно Натталла
`DSPL_WIN_RECT` |Непараметрическое прямоугольное окно
diff --git a/dspl/src/dspl_internal.h b/dspl/src/dspl_internal.h
index 373132c..ee677ea 100644
--- a/dspl/src/dspl_internal.h
+++ b/dspl/src/dspl_internal.h
@@ -81,6 +81,7 @@ int win_flat_top (double *w, int n, int win_type);
int win_gaussian (double *w, int n, int win_type, double sigma);
int win_hamming (double *w, int n, int win_type);
int win_hann (double *w, int n, int win_type);
+int win_kaiser (double* w, int n, int win_type, double param);
int win_lanczos (double *w, int n, int win_type);
int win_nuttall (double *w, int n, int win_type);
int win_rect (double *w, int n);
diff --git a/dspl/src/math.c b/dspl/src/math.c
index 939b147..38fc0a1 100644
--- a/dspl/src/math.c
+++ b/dspl/src/math.c
@@ -33,7 +33,7 @@ Modified Bessel Function of the First Kind – I0(x) [1]
https://www.advanpix.com/2015/11/11/
*******************************************************************************/
-int DSPL_API bessel_i0(double *x, int n, double* y)
+int DSPL_API bessel_i0(double* x, int n, double* y)
{
double P16[17] = { 1.0000000000000000000000801e+00,
2.4999999999999999999629693e-01,
diff --git a/dspl/src/win.c b/dspl/src/win.c
index 61c81d5..773cd98 100644
--- a/dspl/src/win.c
+++ b/dspl/src/win.c
@@ -55,6 +55,8 @@ int window(double* w, int n, int win_type, double param)
return win_hamming(w, n, win_type);
case DSPL_WIN_HANN:
return win_hann(w, n, win_type);
+ case DSPL_WIN_KAISER:
+ return win_kaiser(w, n, win_type, param);
case DSPL_WIN_LANCZOS:
return win_lanczos(w, n, win_type);
case DSPL_WIN_NUTTALL:
@@ -168,68 +170,6 @@ int win_blackman(double *w, int n, int win_type)
-/******************************************************************************
-Chebyshev parametric window function
-param sets spectrum sidelobes level in dB
-ATTENTION! ONLY SYMMETRIC WINDOW
-*******************************************************************************/
-int win_cheby(double *w, int n, double param)
-{
- int k, i, m;
- double z, dz, sum = 0, wmax=0, r1, x0, chx, chy, in;
-
- if(!w)
- return ERROR_PTR;
-
- if(n<2)
- return ERROR_SIZE;
-
- if(param <= 0.0)
- return ERROR_WIN_PARAM;
-
- r1 = pow(10, param/20);
- x0 = cosh((1.0/(double)(n-1)) * acosh(r1));
-
- // check window length even or odd
- if(n%2==0)
- {
- dz = 0.5;
- m = n/2-1;
- }
- else
- {
- m = (n-1)/2;
- dz = 0.0;
- }
-
- for(k = 0; k < m+2; k++)
- {
- z = (double)(k - m) - dz;
- sum = 0;
-
- for(i = 1; i <= m; i++)
- {
- in = (double)i / (double)n;
- chx = x0 * cos(M_PI * in);
- cheby_poly1(&chx, 1, n-1, &chy);
- sum += chy * cos(2.0 * z * M_PI * in);
- }
-
- w[k] = r1 + 2.0 * sum;
- w[n-1-k] = w[k];
-
- // max value calculation
- if(w[k]>wmax)
- wmax=w[k];
- }
-
- // normalization
- for(k=0; k < n; k++)
- w[k] /= wmax;
-
- return RES_OK;
-}
-
/******************************************************************************
Blackman - Harris window function
@@ -308,6 +248,68 @@ int win_blackman_nuttall(double *w, int n, int win_type)
+/******************************************************************************
+Chebyshev parametric window function
+param sets spectrum sidelobes level in dB
+ATTENTION! ONLY SYMMETRIC WINDOW
+*******************************************************************************/
+int win_cheby(double *w, int n, double param)
+{
+ int k, i, m;
+ double z, dz, sum = 0, wmax=0, r1, x0, chx, chy, in;
+
+ if(!w)
+ return ERROR_PTR;
+
+ if(n<2)
+ return ERROR_SIZE;
+
+ if(param <= 0.0)
+ return ERROR_WIN_PARAM;
+
+ r1 = pow(10, param/20);
+ x0 = cosh((1.0/(double)(n-1)) * acosh(r1));
+
+ // check window length even or odd
+ if(n%2==0)
+ {
+ dz = 0.5;
+ m = n/2-1;
+ }
+ else
+ {
+ m = (n-1)/2;
+ dz = 0.0;
+ }
+
+ for(k = 0; k < m+2; k++)
+ {
+ z = (double)(k - m) - dz;
+ sum = 0;
+
+ for(i = 1; i <= m; i++)
+ {
+ in = (double)i / (double)n;
+ chx = x0 * cos(M_PI * in);
+ cheby_poly1(&chx, 1, n-1, &chy);
+ sum += chy * cos(2.0 * z * M_PI * in);
+ }
+
+ w[k] = r1 + 2.0 * sum;
+ w[n-1-k] = w[k];
+
+ // max value calculation
+ if(w[k]>wmax)
+ wmax=w[k];
+ }
+
+ // normalization
+ for(k=0; k < n; k++)
+ w[k] /= wmax;
+
+ return RES_OK;
+}
+
/******************************************************************************
@@ -486,6 +488,40 @@ int win_hann(double *w, int n, int win_type)
}
+/******************************************************************************
+Kaiser window function
+******************************************************************************/
+int win_kaiser(double* w, int n, int win_type, double param)
+{
+ double num, den, x, y;
+ int i, err;
+ if(!w)
+ return ERROR_PTR;
+ if(n<2)
+ return ERROR_SIZE;
+
+ switch(win_type & DSPL_WIN_SYM_MASK)
+ {
+ case DSPL_WIN_SYMMETRIC: x = 1.0/(double)(n-1); break;
+ case DSPL_WIN_PERIODIC : x = 1.0/(double)n; break;
+ default: return ERROR_WIN_SYM;
+ }
+
+ err = bessel_i0(¶m, 1, &den);
+ if(err != RES_OK)
+ return err;
+ for(i = 0; i < n; i++)
+ {
+ y = (double)(2*i) / x - 1.0;
+ y = param * sqrt(1.0 - y*y);
+ err = bessel_i0(&y, 1, &num);
+ if(err != RES_OK)
+ return err;
+ w[i] = num / den;
+ }
+ return err;
+}
+
/******************************************************************************
diff --git a/examples/bin/gnuplot/bessel_i0.plt b/examples/bin/gnuplot/bessel_i0.plt
new file mode 100644
index 0000000..1ec3b5c
--- /dev/null
+++ b/examples/bin/gnuplot/bessel_i0.plt
@@ -0,0 +1,11 @@
+set grid
+set xlabel "x"
+
+set lmargin at screen 0.10
+set key left top
+set terminal pngcairo size 560,380 enhanced font 'Verdana,8'
+set output 'img/bessel_i0.png'
+set ylabel "I_0(x)"
+set yrange [0:5]
+plot 'dat/dat0.txt' with lines
+
diff --git a/examples/src/bessel_i0.c b/examples/src/bessel_i0.c
new file mode 100644
index 0000000..be7ee75
--- /dev/null
+++ b/examples/src/bessel_i0.c
@@ -0,0 +1,24 @@
+#include
+#include
+#include
+#include "dspl.h"
+
+#define N 50
+
+int main()
+{
+ void* handle; // DSPL handle
+ handle = dspl_load(); // Load DSPL function
+
+ double x[N], y[N];
+
+ linspace(0.0, 3.0, N, DSPL_SYMMETRIC, x);
+
+ bessel_i0(x, N, y);
+
+ writetxt(x, y, N, "dat/dat0.txt");
+
+ dspl_free(handle); // free dspl handle
+
+ return system("gnuplot gnuplot/bessel_i0.plt");
+}
\ No newline at end of file
diff --git a/ide/visualstudio/.vs/libdspl-2.0/v15/.suo b/ide/visualstudio/.vs/libdspl-2.0/v15/.suo
new file mode 100644
index 0000000..2e7f468
Binary files /dev/null and b/ide/visualstudio/.vs/libdspl-2.0/v15/.suo differ
diff --git a/ide/visualstudio/.vs/libdspl-2.0/v15/Browse.VC.db b/ide/visualstudio/.vs/libdspl-2.0/v15/Browse.VC.db
new file mode 100644
index 0000000..f1f3d19
Binary files /dev/null and b/ide/visualstudio/.vs/libdspl-2.0/v15/Browse.VC.db differ
diff --git a/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db
new file mode 100644
index 0000000..9c58795
Binary files /dev/null and b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db differ
diff --git a/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-shm b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-shm
new file mode 100644
index 0000000..13856a0
Binary files /dev/null and b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-shm differ
diff --git a/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-wal b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-wal
new file mode 100644
index 0000000..16b320f
Binary files /dev/null and b/ide/visualstudio/.vs/libdspl-2.0/v15/Solution.VC.db-wal differ
diff --git a/include/dspl.h b/include/dspl.h
index c13f9db..24ca435 100644
--- a/include/dspl.h
+++ b/include/dspl.h
@@ -173,6 +173,7 @@ typedef struct
#define DSPL_WIN_RECT 0x00010000
#define DSPL_WIN_COS 0x00040000
#define DSPL_WIN_CHEBY 0x00080000
+#define DSPL_WIN_KAISER 0x00100000
#define DSPL_FILTER_TYPE_MASK 0x0000000F
#define DSPL_FILTER_LPF 0x00000001
diff --git a/release/include/dspl.h b/release/include/dspl.h
index c13f9db..24ca435 100644
--- a/release/include/dspl.h
+++ b/release/include/dspl.h
@@ -173,6 +173,7 @@ typedef struct
#define DSPL_WIN_RECT 0x00010000
#define DSPL_WIN_COS 0x00040000
#define DSPL_WIN_CHEBY 0x00080000
+#define DSPL_WIN_KAISER 0x00100000
#define DSPL_FILTER_TYPE_MASK 0x0000000F
#define DSPL_FILTER_LPF 0x00000001