added documentation and example for filter_iir function

pull/6/merge
Sergey Bakhurin 2019-09-07 16:30:27 +03:00
rodzic 3a5395f1ac
commit 47383385b6
9 zmienionych plików z 239 dodań i 161 usunięć

Wyświetl plik

@ -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

Wyświetl plik

@ -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
***************************************************************************** */

Wyświetl plik

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

Wyświetl plik

@ -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;
}

Wyświetl plik

@ -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,

Wyświetl plik

@ -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

Wyświetl plik

@ -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

Wyświetl plik

@ -0,0 +1,39 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#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");
}

Wyświetl plik

@ -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");
}