diff --git a/dspl.project.win.geany b/dspl.project.win.geany index 90b05e2..f6e5565 100644 --- a/dspl.project.win.geany +++ b/dspl.project.win.geany @@ -19,7 +19,7 @@ indent_mode=2 [project] name=libdspl -base_path=F:\\dsplib.org\\libdspl-2.0 +base_path=./ description= file_patterns= @@ -28,34 +28,12 @@ long_line_behaviour=1 long_line_column=72 [files] -current_page=0 -FILE_NAME_0=4479;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Carray.c;0;4 -FILE_NAME_1=4251;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Ccheby.c;0;4 -FILE_NAME_2=14822;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Ccomplex.c;0;4 -FILE_NAME_3=204;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cconv.c;0;4 -FILE_NAME_4=6950;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cdft.c;0;4 -FILE_NAME_5=0;C++;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cdspl_internal.h;0;4 -FILE_NAME_6=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cellipj.c;0;4 -FILE_NAME_7=2079;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfft.c;0;4 -FILE_NAME_8=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfft_subkernel.c;0;4 -FILE_NAME_9=766;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfillarray.c;0;4 -FILE_NAME_10=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfilter_an.c;0;4 -FILE_NAME_11=1286;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfilter_ap.c;0;4 -FILE_NAME_12=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfilter_fir.c;0;4 -FILE_NAME_13=5715;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfilter_ft.c;0;4 -FILE_NAME_14=2837;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfilter_iir.c;0;4 -FILE_NAME_15=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cfourier_series.c;0;4 -FILE_NAME_16=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cgoertzel.c;0;4 -FILE_NAME_17=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cinout.c;0;4 -FILE_NAME_18=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cmath.c;0;4 -FILE_NAME_19=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cmatrix.c;0;4 -FILE_NAME_20=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cpolyval.c;0;4 -FILE_NAME_21=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Crandgen.c;0;4 -FILE_NAME_22=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cresampling.c;0;4 -FILE_NAME_23=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Csignals.c;0;4 -FILE_NAME_24=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cstatistic.c;0;4 -FILE_NAME_25=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Ctrapint.c;0;4 -FILE_NAME_26=0;C;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cwin.c;0;4 +current_page=4 +FILE_NAME_0=15373;C;0;EUTF-8;0;1;0;%5Cdsplib.org%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Ccomplex.c;0;2 +FILE_NAME_1=218;C;0;EUTF-8;0;1;0;%5Cdsplib.org%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Ciir_test.c;0;2 +FILE_NAME_2=0;C;0;EUTF-8;0;1;0;%5Cdsplib.org%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cconv.c;0;2 +FILE_NAME_3=0;C;0;EUTF-8;0;1;0;%5Cdsplib.org%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Csrc%5Cdft.c;0;2 +FILE_NAME_4=0;None;0;EUTF-8;0;1;0;%5Cdsplib.org%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdox%5Cru%5Cdft.dox;0;2 [build-menu] NF_00_LB=_Собрать @@ -67,3 +45,6 @@ NF_01_WD=%p NF_02_LB=Очистить NF_02_CM=mingw32-make clean NF_02_WD=%p +EX_00_LB=_Execute +EX_00_CM=%e.exe +EX_00_WD=%p/examples/bin diff --git a/dspl/dox/ru/conv.dox b/dspl/dox/ru/conv.dox index f99c926..5f90052 100644 --- a/dspl/dox/ru/conv.dox +++ b/dspl/dox/ru/conv.dox @@ -325,7 +325,7 @@ c[ 18] = -37.00 +484.00j d[ 18] = -37.00 +484.00j Функция рассчитывает выход фильтра заданного выражением \f[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} - {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-n}}, + {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \f] где \f$a_0\f$ не может быть 0, \f$N=M=\f$`ord`. @@ -357,6 +357,28 @@ c[ 18] = -37.00 +484.00j d[ 18] = -37.00 +484.00j `RES_OK` Если фильтрация произведена успешно. \n В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n +Пример использования функции `filter_iir` + +\include filter_iir_test.c + +На входе цифрового фильтра задан сигнал +\f$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)\f$, где \f$n(t)\f$ белый гауссовский +шум, с нулевым средним и единичной дисперсией. \n +Фильтр представляет собой эллиптический ФНЧ 6 порядка. +Входной сигнал фильтруется данным фильтром, и результат сохраняется в файлы: + +\verbatim +dat/s.txt - исходный зашумленный сигнал +dat/sf.txt - сигнал на выходе фильтра. +\endverbatim + +По полученным данным производится построение графиков: + +\image html filter_iir_test.png + +Скрипт GNUPLOT для построения графиков из текстовых файлов: +\include filter_iir.plt + \author Бахурин Сергей www.dsplib.org ***************************************************************************** */ diff --git a/dspl/dox/ru/ellipj.dox b/dspl/dox/ru/ellipj.dox index bdc352f..2ed2de7 100644 --- a/dspl/dox/ru/ellipj.dox +++ b/dspl/dox/ru/ellipj.dox @@ -37,7 +37,6 @@ \author Бахурин Сергей www.dsplib.org - ***************************************************************************** */ @@ -53,38 +52,37 @@ \f$ u = \textrm{cd}^{-1}(w, k)\f$ комплексного аргумента Функция рассчитывает занчения значения обратной эллиптической функции -\f$ u = \textrm{cd}^{-1}(w, k)\f$ для комплексного вектора `w`.
+\f$ u = \textrm{cd}^{-1}(w, k)\f$ для комплексного вектора `w`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] w Указатель на массив вектора переменной \f$ w \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] w Указатель на массив вектора переменной \f$ w \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `w`.

+\param[in] n Размер вектора `w`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] u Указатель на вектор значений обратной эллиптической - функции \f$ u = \textrm{cd}^{-1}(w, k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] u Указатель на вектор значений обратной эллиптической + функции \f$ u = \textrm{cd}^{-1}(w, k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей - www.dsplib.org - + www.dsplib.org ***************************************************************************** */ @@ -100,38 +98,37 @@ \f$ u = \textrm{sn}^{-1}(w, k)\f$ вещественного аргумента Функция рассчитывает занчения значения обратной эллиптической функции -\f$ u = \textrm{sn}^{-1}(w, k)\f$ для вещественного вектора `w`.
+\f$ u = \textrm{sn}^{-1}(w, k)\f$ для вещественного вектора `w`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] w Указатель на массив вектора переменной \f$ w \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] w Указатель на массив вектора переменной \f$ w \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `w`.

+\param[in] n Размер вектора `w`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] u Указатель на вектор значений обратной эллиптической - функции \f$ u = \textrm{sn}^{-1}(w, k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] u Указатель на вектор значений обратной эллиптической + функции \f$ u = \textrm{sn}^{-1}(w, k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей www.dsplib.org - ***************************************************************************** */ @@ -147,38 +144,37 @@ \f$ u = \textrm{sn}^{-1}(w, k)\f$ комплексного аргумента Функция рассчитывает занчения значения обратной эллиптической функции -\f$ u = \textrm{sn}^{-1}(w, k)\f$ для комплексного вектора `w`.
+\f$ u = \textrm{sn}^{-1}(w, k)\f$ для комплексного вектора `w`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] w Указатель на массив вектора переменной \f$ w \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] w Указатель на массив вектора переменной \f$ w \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `w`.

+\param[in] n Размер вектора `w`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] u Указатель на вектор значений обратной эллиптической - функции \f$ u = \textrm{sn}^{-1}(w, k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] u Указатель на вектор значений обратной эллиптической + функции \f$ u = \textrm{sn}^{-1}(w, k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей www.dsplib.org - ***************************************************************************** */ @@ -195,38 +191,37 @@ Функция рассчитывает занчения значения эллиптической функции \f$ y = \textrm{cd}(u K(k), k)\f$ для вещественного вектора `u` и -эллиптического модуля `k`.
+эллиптического модуля `k`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] u Указатель на массив вектора переменной \f$ u \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] u Указатель на массив вектора переменной \f$ u \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `u`.

+\param[in] n Размер вектора `u`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] y Указатель на вектор значений эллиптической - функции \f$ y = \textrm{cd}(u K(k), k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] y Указатель на вектор значений эллиптической + функции \f$ y = \textrm{cd}(u K(k), k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей www.dsplib.org - ***************************************************************************** */ @@ -243,38 +238,37 @@ Функция рассчитывает занчения значения эллиптической функции \f$ y = \textrm{cd}(u K(k), k)\f$ для комплексного вектора `u` и -эллиптического модуля `k`.
+эллиптического модуля `k`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] u Указатель на массив вектора переменной \f$ u \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] u Указатель на массив вектора переменной \f$ u \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `u`.

+\param[in] n Размер вектора `u`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] y Указатель на вектор значений эллиптической - функции \f$ y = \textrm{cd}(u K(k), k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] y Указатель на вектор значений эллиптической + функции \f$ y = \textrm{cd}(u K(k), k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей www.dsplib.org - ***************************************************************************** */ @@ -310,24 +304,24 @@ k_i = эллиптических функций. -\param[in] k Эллиптический модуль \f$ k \f$.
+\param[in] k Эллиптический модуль \f$ k \f$. \n \param[in] n Размер вектора `y` соответсвующих - коэффициентам \f$ k_i \f$.

+ коэффициентам \f$ k_i \f$. \n \n -\param[out] y Указатель на вектор значений - коэффициентов \f$ k_i \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] y Указатель на вектор значений + коэффициентов \f$ k_i \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n Пример использования функции `ellip_landen`: @@ -352,7 +346,7 @@ k_i = 12 0.000e+00 13 0.000e+00 \endverbatim - + \note Ряд полного эллиптического интеграла сходится при значениях эллиптического модуля \f$ k<1 \f$. При этом сходимость ряда достаточно быстрая и для практический приложений достаточно от 10 до 20 значений @@ -362,8 +356,7 @@ k_i = \author Бахурин Сергей www.dsplib.org - -***************************************************************************** */ +***************************************************************************** */ @@ -378,33 +371,33 @@ k_i = Функция рассчитывает занчения значения эллиптической функции \f$ y = \textrm{sn}(u K(k), k)\f$ для вещественного вектора `u` и -эллиптического модуля `k`.
+эллиптического модуля `k`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] u Указатель на массив вектора переменной \f$ u \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] u Указатель на массив вектора переменной \f$ u \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `u`.

+\param[in] n Размер вектора `u`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] y Указатель на вектор значений эллиптической - функции \f$ y = \textrm{sn}(u K(k), k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] y Указатель на вектор значений эллиптической + функции \f$ y = \textrm{sn}(u K(k), k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей @@ -426,29 +419,29 @@ k_i = Функция рассчитывает занчения значения эллиптической функции \f$ y = \textrm{sn}(u K(k), k)\f$ для комплексного вектора `u` и -эллиптического модуля `k`.
+эллиптического модуля `k`. \n Для расчета используется итерационный алгоритм на основе преобразования -Ландена.
+Ландена. \n -\param[in] u Указатель на массив вектора переменной \f$ u \f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[in] u Указатель на массив вектора переменной \f$ u \f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n -\param[in] n Размер вектора `u`.

+\param[in] n Размер вектора `u`. \n \n -\param[in] k Значение эллиптического модуля \f$ k \f$.
+\param[in] k Значение эллиптического модуля \f$ k \f$. \n Эллиптический модуль -- вещественный параметр, - принимающий значения от 0 до 1.

+ принимающий значения от 0 до 1. \n \n -\param[out] y Указатель на вектор значений эллиптической - функции \f$ y = \textrm{sn}(u K(k), k)\f$.
- Размер вектора `[n x 1]`.
- Память должна быть выделена.

+\param[out] y Указатель на вектор значений эллиптической + функции \f$ y = \textrm{sn}(u K(k), k)\f$. \n + Размер вектора `[n x 1]`. \n + Память должна быть выделена. \n \n \return - `RES_OK` Расчет произведен успешно.
+ `RES_OK` Расчет произведен успешно. \n В противном случае - \ref ERROR_CODE_GROUP "код ошибки".
+ \ref ERROR_CODE_GROUP "код ошибки". \n \author Бахурин Сергей diff --git a/dspl/src/complex.c b/dspl/src/complex.c index 221e31d..5bb8133 100644 --- a/dspl/src/complex.c +++ b/dspl/src/complex.c @@ -598,13 +598,20 @@ int DSPL_API sqrt_cmplx(complex_t* x, int n, complex_t *y) for(k = 0; k < n; k++) { r = ABS(x[k]); - RE(t) = RE(x[k]) + r; - IM(t) = IM(x[k]); - zr = 1.0 / ABS(t); - r = sqrt(r); - RE(y[k]) = RE(t) * zr * r; - IM(y[k]) = IM(t) * zr * r; - + if(r == 0.0) + { + RE(y[k]) = 0.0; + IM(y[k]) = 0.0; + } + else + { + RE(t) = RE(x[k]) + r; + IM(t) = IM(x[k]); + zr = 1.0 / ABS(t); + r = sqrt(r); + RE(y[k]) = RE(t) * zr * r; + IM(y[k]) = IM(t) * zr * r; + } } return RES_OK; } diff --git a/dspl/src/conv.c b/dspl/src/conv.c index d224574..dd567b6 100644 --- a/dspl/src/conv.c +++ b/dspl/src/conv.c @@ -546,9 +546,32 @@ here \f$a_0\f$ cannot be equals zeros, \f$N=M=\f$`ord`. Vector size is `[n x 1]`. /n Memory must be allocated. /n /n \return -`RES_OK` if filter output is calculted successfully. /n +`RES_OK` if filter output is calculated successfully. /n Else \ref ERROR_CODE_GROUP "code error": /n +Example: + +\include filter_iir_test.c + +Input signal is +\f$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)\f$, here \f$n(t)\f$ white Gaussian +noise with zero mean value and unit standard deviation. \n + +Input signal is filtered by elliptic LPF order 6 and output signal and data +saves in the txt-files + +\verbatim +dat/s.txt - input signal + noise +dat/sf.txt - filter output. +\endverbatim + +Plots: + +\image html filter_iir_test.png + +GNUPLOT script for make plots is: +\include filter_iir.plt + \author Sergey Bakhurin www.dsplib.org *******************************************************************************/ int DSPL_API filter_iir(double* b, double* a, int ord, diff --git a/examples/bin/gnuplot/filter_iir.plt b/examples/bin/gnuplot/filter_iir.plt new file mode 100644 index 0000000..06f6810 --- /dev/null +++ b/examples/bin/gnuplot/filter_iir.plt @@ -0,0 +1,18 @@ +unset key +set grid +set xlabel "n" + +set terminal pngcairo size 820, 340 enhanced font 'Verdana,8' +set output 'img/filter_iir_test.png' +set ylabel "s(n)" +set yrange [-3:3] + +set multiplot layout 2,1 rowsfirst + +plot 'dat/s.txt' with lines + +set ylabel "s_f(n)" +plot 'dat/sf.txt' with lines + + +unset multiplot \ No newline at end of file diff --git a/examples/bin/gnuplot/iir_test.plt b/examples/bin/gnuplot/iir_test.plt index 45da514..d76bd56 100644 --- a/examples/bin/gnuplot/iir_test.plt +++ b/examples/bin/gnuplot/iir_test.plt @@ -14,19 +14,16 @@ plot 'dat/iir_butter_hpf.txt' with lines plot 'dat/iir_butter_bpf.txt' with lines plot 'dat/iir_butter_bsf.txt' with lines - plot 'dat/iir_cheby1_lpf.txt' with lines plot 'dat/iir_cheby1_hpf.txt' with lines plot 'dat/iir_cheby1_bpf.txt' with lines plot 'dat/iir_cheby1_bsf.txt' with lines - plot 'dat/iir_cheby2_lpf.txt' with lines plot 'dat/iir_cheby2_hpf.txt' with lines plot 'dat/iir_cheby2_bpf.txt' with lines plot 'dat/iir_cheby2_bsf.txt' with lines - plot 'dat/iir_ellip_lpf.txt' with lines plot 'dat/iir_ellip_hpf.txt' with lines plot 'dat/iir_ellip_bpf.txt' with lines diff --git a/examples/src/filter_iir_test.c b/examples/src/filter_iir_test.c new file mode 100644 index 0000000..9cb493d --- /dev/null +++ b/examples/src/filter_iir_test.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include "dspl.h" + +#define ORD 6 +#define N 1000 +int main() +{ + void* handle; // DSPL handle + handle = dspl_load(); // Load DSPL function + double b[ORD+1], a[ORD+1]; + double t[N], s[N], n[N], sf[N]; + random_t rnd; + int k; + + random_init(&rnd); // random generator init + linspace(0, N, N, DSPL_PERIODIC, t); // fill t vector + randn(n, N, 0, 1.0, &rnd); // generate noise + + // input signal s = sin(2*pi*t) + n(t) + for(k = 0; k < N; k++) + s[k] = sin(M_2PI*0.02*t[k]) + n[k]; + + // iir filter calculation + iir(1.0, 70.0, ORD, 0.06, 0.0, DSPL_FILTER_ELLIP | DSPL_FILTER_LPF, b, a); + + // input signal filtration + filter_iir(b, a, ORD, s, N, sf); + + // save input signal and filter output to the txt-files + writetxt(t,s, N, "dat/s.txt"); + writetxt(t,sf,N, "dat/sf.txt"); + + dspl_free(handle); // free dspl handle + + // run GNUPLOT script + return system("gnuplot -p gnuplot/filter_iir.plt"); +} \ No newline at end of file diff --git a/examples/src/iit_test.c b/examples/src/iir_test.c similarity index 98% rename from examples/src/iit_test.c rename to examples/src/iir_test.c index ec047f4..2c43936 100644 --- a/examples/src/iit_test.c +++ b/examples/src/iir_test.c @@ -13,7 +13,7 @@ #define RP 1.0 // размер векторов частотной характеристики фильтра -#define N 2048 +#define N 1024 void freq_resp_write2txt(double* b, double* a, int ord, int n, char* fn) { @@ -116,13 +116,11 @@ int main() freq_resp_write2txt(b, a, BSF_ORD, N, "dat/iir_ellip_bsf.txt"); - - dspl_free(handle); // free dspl handle // выполнить скрипт GNUPLOT для построения графиков // по рассчитанным данным - return system("gnuplot -p gnuplot/iir_test.plt");; + return system("gnuplot -p gnuplot/iir_test.plt"); }