added function iir

pull/6/merge
Dsplib 2019-04-28 23:44:51 +03:00
rodzic 90a32fdd21
commit 5da9d064a1
21 zmienionych plików z 1144 dodań i 558 usunięć

Wyświetl plik

@ -31,6 +31,7 @@ $extrastylesheet
<body>
<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function (d, w, c) {

Wyświetl plik

@ -11,51 +11,52 @@
передаточной функции \f$ H(s) \f$:
\f[
H(s) = \frac {\sum_{k = 0}^{N} b_k s^k}
{\sum_{m = 0}^{N} a_m s^m},
H(s) = \frac {\sum_{k = 0}^{N} b_k s^k}
{\sum_{m = 0}^{N} a_m s^m},
\f]
где \f$ N \f$ - порядок фильтра (параметр `ord`).
Комплексный коэффициент передачи рассчитывается путем
подстановки \f$ s = j \omega \f$.
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов числителя и
знаменателя передаточной функции \f$ H(s) \f$
равно `ord+1`.<BR><BR>
\param[in] w Указатель на вектор значений циклической частоты
\f$ \omega \f$ (рад/с), для которого будет рассчитан
комплексный коэффициент передачи
\f$ H(j \omega) \f$.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Размер вектора циклической частоты `w`.<BR><BR>
\param[out] h Указатель на вектор комплексного коэффициента передачи
\f$ H(j \omega) \f$, рассчитанного для
циклической частоты `w`.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR> <BR>
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов числителя и
знаменателя передаточной функции \f$ H(s) \f$
равно `ord+1`.<BR><BR>
\param[in] w Указатель на вектор значений циклической частоты
\f$ \omega \f$ (рад/с), для которого будет рассчитан
комплексный коэффициент передачи
\f$ H(j \omega) \f$.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Размер вектора циклической частоты `w`.<BR><BR>
\param[out] h Указатель на вектор комплексного коэффициента передачи
\f$ H(j \omega) \f$, рассчитанного для
циклической частоты `w`.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR> <BR>
\return
`RES_OK` Комплексноый коэффициент передачи рассчитан
успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Комплексноый коэффициент передачи рассчитан успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -66,82 +67,99 @@
/*! ****************************************************************************
\ingroup FILTER_ANALYSIS_GROUP
\fn int freqs_resp( double* b, double* a, int ord, double* w, int n,
int flag, double *h, double* phi, double* tau)
\fn int filter_freq_resp(double* b, double* a, int ord, double* w, int n,
int flag, double* mag, double* phi, double* tau)
\brief Расчет амплитудно-частотной (АЧХ),
фазочастотной характеристик (ФЧХ),
а также группового времени запаздывания (ГВЗ) аналогового фильтра.
фазочастотной характеристик (ФЧХ), а также группового
времени запаздывания (ГВЗ) цифрового или аналогового или фильтра.
Функция рассчитывает АЧХ, ФЧХ и ГВЗ аналоговго фильтра,
заданного передаточной характеристикой \f$ H(s) \f$
Функция рассчитывает АЧХ, ФЧХ и ГВЗ аналогового или цифрового фильтра, заданного
передаточной характеристикой \f$H(s)\f$, или \f$H(z)\f$ соответственно
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов
числителя и знаменателя передаточной
функции \f$ H(s) \f$ равно `ord+1`.<BR> <BR>
\param[in] w Указатель на вектор значений циклической частоты
\f$ \omega \f$ (рад/с), для которого будет рассчитаны
АЧХ, ФЧХ и ГВЗ.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Размер вектора циклической частоты `w`.<BR> <BR>
\param[in] flag Комбинация флагов, которые задают расчет параметров:<BR>
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$ H(s) \f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов
числителя и знаменателя передаточной
функции \f$ H(s) \f$ равно `ord+1`.<BR> <BR>
\param[in] w Указатель на вектор значений циклической частоты
\f$ \omega \f$ (рад/с), для которого будет рассчитаны
АЧХ, ФЧХ и ГВЗ аналогового фильтра, если установлен
флаг `DSPL_FLAG_ANALOG`.<BR>
Размер вектора `[n x 1]`.<BR>
В случае если флаг `DSPL_FLAG_ANALOG` не установлен, то
вектор частоты `w` используется как нормированная частота
комплексного коэффициента передачи
\f$ H \left(\mathrm{e}^{j\omega} \right) \f$
цифрового фильтра.<BR>
В этом случае характеристика цифрового фильтра является
\f$ 2\pi \f$-периодической, и вектор частоты может содержать
произвольные значения, однако целесообразно задавать
его от 0 до \f$ \pi \f$, а такжет от 0 до \f$ 2\pi \f$, или
от \f$ -\pi \f$ до \f$ \pi \f$.<BR><BR>
\param[in] n Размер вектора циклической частоты `w`.<BR> <BR>
\param[in] flag Комбинация флагов, которые задают расчет параметров:<BR>
<pre>
DSPL_FLAG_LOG АЧХ рассчитывать в логарифмическом масштабе
DSPL_FLAG_UNWRAP раскрывать периодичность ФЧХ
</pre>
DSPL_FLAG_ABALOG Коэффициенты относятся к аналоговому фильтру
DSPL_FLAG_LOGMAG АЧХ рассчитывать в логарифмическом масштабе
DSPL_FLAG_UNWRAP раскрывать периодичность ФЧХ
</pre>
\param[out] h Указатель на вектор АЧХ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет АЧХ не производится.
<BR><BR>
\param[out] mag Указатель на вектор АЧХ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет АЧХ не производится.
<BR><BR>
\param[out] phi Указатель на вектор ФЧХ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет ФЧХ не производится.
<BR><BR>
\param[out] phi Указатель на вектор ФЧХ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет ФЧХ не производится.
<BR><BR>
\param[out] tau Указатель на вектор ГВЗ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет ГВЗ не производится.
<BR><BR>
\param[out] tau Указатель на вектор ГВЗ.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR>
Если указатель `NULL`, то расчет ГВЗ не производится.
<BR><BR>
Пример использования функции `freqs_resp`:
\return
`RES_OK` Параметры фильтра рассчитаны успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
Пример использования функции `filter_freq_resp`:
\include butter_ap_test.c
Результат работы программы:
\verbatim
b[ 0] = 1.002 a[ 0] = 1.002
b[ 1] = 0.000 a[ 1] = 2.618
b[ 2] = 0.000 a[ 2] = 3.418
b[ 3] = 0.000 a[ 3] = 2.615
b[ 4] = 0.000 a[ 4] = 1.000
b[ 0] = 1.002 a[ 0] = 1.002
b[ 1] = 0.000 a[ 1] = 2.618
b[ 2] = 0.000 a[ 2] = 3.418
b[ 3] = 0.000 a[ 3] = 2.615
b[ 4] = 0.000 a[ 4] = 1.000
\endverbatim
<BR><BR>
В каталоге `dat` будут созданы три файла:<BR>
<pre>
butter_ap_test_mag.txt АЧХ фильтра
butter_ap_test_phi.txt ФЧХ фильтра
butter_ap_test_tau.txt ГВЗ фильтра
butter_ap_test_mag.txt АЧХ фильтра
butter_ap_test_phi.txt ФЧХ фильтра
butter_ap_test_tau.txt ГВЗ фильтра
</pre>
Кроме того программа GNUPLOT произведет построение следующих графиков
@ -149,16 +167,9 @@ butter_ap_test_tau.txt ГВЗ фильтра
\image html butter_ap_test.png
\return
`RES_OK` Параметры фильтра рассчитаны успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -174,16 +185,16 @@ butter_ap_test_tau.txt ГВЗ фильтра
\ingroup FILTER_ANALYSIS_GROUP
\fn int freqz(double* b, double* a, int ord, double* w, int n, complex_t *h)
\brief Расчет комплексного коэффициента передачи
\f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра.
\brief Расчет комплексного коэффициента передачи
\f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра.
Функция рассчитывает значения комплексного коэффициента передачи
\f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра, заданного
\f$ H \left(e^{j \omega} \right)\f$ цифрового фильтра, заданного
коэффициентами передаточной функции \f$H(z)\f$:
\f[
H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}}
{\sum_{m = 0}^{N} a_m z^{-m}},
H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}}
{\sum_{m = 0}^{N} a_m z^{-m}},
\f]
где \f$N\f$ - порядок фильтра (параметр `ord`).<BR>
@ -191,38 +202,36 @@ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}}
Комплексный коэффициент передачи рассчитывается путем
подстановки \f$z = e^{j \omega} \f$.<BR>
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(z)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(z)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов
числителя и знаменателя передаточной
функции \f$H(z)\f$ равно `ord+1`.<BR><BR>
\param[in] w Указатель на вектор значений нормированной
циклической частоты \f$\omega\f$,
для которого будет рассчитан комплексный коэффициент
передачи \f$ H \left(e^{j \omega} \right)\f$.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Размер вектора нормированной циклической частоты `w`.
<BR><BR>
\param[out] h Указатель на вектор комплексного коэффициента передачи
\f$ H \left(e^{j \omega} \right)\f$, рассчитанного для
циклической частоты `w`.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(z)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(z)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов
числителя и знаменателя передаточной
функции \f$H(z)\f$ равно `ord+1`.<BR><BR>
\param[in] w Указатель на вектор значений нормированной
циклической частоты \f$\omega\f$,
для которого будет рассчитан комплексный коэффициент
передачи \f$ H \left(e^{j \omega} \right)\f$.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Размер вектора нормированной циклической частоты `w`.<BR><BR>
\param[out] h Указатель на вектор комплексного коэффициента передачи
\f$ H \left(e^{j \omega} \right)\f$, рассчитанного для
циклической частоты `w`.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Комплексный коэффициент передачи расcчитан успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Комплексный коэффициент передачи расcчитан успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\note
Комплексный коэффициент передачи \f$ H \left(e^{j \omega} \right)\f$
@ -237,6 +246,6 @@ H(z) = \frac {\sum_{k = 0}^{N} b_k z^{-k}}
достаточно вести для нормированной частоты \f$\omega\f$ от 0 до \f$\pi\f$.
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -5,41 +5,40 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int butter_ap(double Rp, int ord, double* b, double* a)
\fn int butter_ap(double Rp, int ord, double* b, double* a)
\brief Расчет передаточной характеристики \f$ H(s) \f$ аналогового
нормированного ФНЧ Баттерворта.
нормированного ФНЧ Баттерворта.
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
аналогового нормированного ФНЧ Баттерворта порядка `ord` с частотой среза
1 рад/с по уровню \f$ -R_p \f$ дБ.
\param[in] Rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[in] Rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[in] ord Порядок фильтра.<BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[in] ord Порядок фильтра.<BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -52,8 +51,8 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int butter_ap_zp(int ord, double rp, complex_t *z, int* nz,
complex_t* p, int* np)
complex_t* p, int* np)
\brief Расчет массивов нулей и полюсов передаточной функции
\f$ H(s) \f$ аналогового нормированного ФНЧ Баттерворта.
@ -62,42 +61,40 @@
с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ.<BR>
\param[in] ord Порядок фильтра. <BR>
\param[in] ord Порядок фильтра. <BR>
\param[in] rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений в
полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей
передаточной характеристики \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были рассчитны и
помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов
передаточной характеристики \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были рассчитны и
помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений в
полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей
передаточной характеристики \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были рассчитны и
помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов
передаточной характеристики \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были рассчитны и
помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\note
Нормированный ФНЧ Баттерворта не имеет нулей,
@ -105,9 +102,8 @@
а по указателю `nz` будет записан 0.<BR>
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -122,7 +118,7 @@
\fn int cheby1_ap(double Rp, int ord, double* b, double* a)
\brief Расчет передаточной характеристики \f$ H(s) \f$ аналогового
нормированного ФНЧ Чебышёва первого рода.
нормированного ФНЧ Чебышёва первого рода.
Функция рассчитывает коэффициенты передаточной характеристики
\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода
@ -131,31 +127,30 @@
Особенностью фильтра Чебышёва первого рода являются
равноволновые пульсации АЧХ в полосе пропускания.
\param[in] Rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[in] ord Порядок фильтра.<BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$ H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] Rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[in] ord Порядок фильтра.<BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$ H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
Пример использования функции `cheby1_ap`:
\include cheby1_ap_test.c
@ -174,9 +169,9 @@ b[ 4] = 0.000 a[ 4] = 1.000
В каталоге `dat` будут созданы три файла:<BR>
<pre>
cheby1_ap_test_mag.txt АЧХ фильтра
cheby1_ap_test_phi.txt ФЧХ фильтра
cheby1_ap_test_tau.txt ГВЗ фильтра
cheby1_ap_test_mag.txt АЧХ фильтра
cheby1_ap_test_phi.txt ФЧХ фильтра
cheby1_ap_test_tau.txt ГВЗ фильтра
</pre>
Кроме того программа GNUPLOT произведет построение следующих графиков
@ -184,15 +179,12 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
\image html cheby1_ap_test.png
Скрипт GNUPLOT для построения графиков из текстовых файлов:
\include cheby1_ap_test.plt
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -204,54 +196,52 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int cheby1_ap_zp( int ord, double rp, complex_t *z, int* nz,
complex_t* p, int* np)
\fn int cheby1_ap_zp( int ord, double rp, complex_t *z, int* nz,
complex_t* p, int* np)
\brief Расчет массивов нулей и полюсов передаточной функции
\f$ H(s) \f$ аналогового нормированного ФНЧ Чебышёва первого рода.
\f$ H(s) \f$ аналогового нормированного ФНЧ Чебышёва первого рода.
Функция рассчитывает значения нулей и полюсов передаточной функции
\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода
\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода
порядка `ord` с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ, с
неравномерностью в полосе пропускания \f$ R_p \f$ дБ.<BR>
\param[in] ord Порядок фильтра. <BR>
\param[in] ord Порядок фильтра. <BR>
\param[in] rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей
передаточной функции \f$H(s)\f$.<BR>
По данному указателю будет записано количество
нулей фильтра, которые были
рассчитаны и помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов
передаточной характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов
передаточной функции \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были
рассчитны и помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] rp Неравномерность АЧХ в полосе пропускания (дБ).<BR>
Параметр задает уровень искажений
в полосе от 0 до 1 рад/с.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей
передаточной характеристики \f$ H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей
передаточной функции \f$H(s)\f$.<BR>
По данному указателю будет записано количество
нулей фильтра, которые были
рассчитаны и помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов
передаточной характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов
передаточной функции \f$ H(s)\f$.<BR>
По данному укащзателю будет записано количество
нулей фильтра, которые были
рассчитны и помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\note
Нормированный ФНЧ Чебышёва первого рода не имеет нулей,
@ -259,9 +249,8 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
а по указателю `nz` будет записан 0.<BR>
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -274,41 +263,39 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
\fn int cheby2_ap(double Rs, int ord, double *b, double *a)
\brief Расчет передаточной характеристики \f$ H(s) \f$ аналогового
нормированного ФНЧ Чебышёва второго рода.
нормированного ФНЧ Чебышёва второго рода.
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord`
с частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ.<BR>
Особенностью фильтра Чебышёва второго рода являются: <BR>
1) равноволновые пульсации АЧХ в полосе заграждения.<BR>
1) равноволновые пульсации АЧХ в полосе заграждения.<BR>
2) уровень АЧХ \f$H(j\cdot 1) = -R_s\f$ дБ.<BR>
\param[in] Rs Уровень подавления в полосе пропускания (дБ).<BR>
Значение должно быть положительным.<BR><BR>
\param[in] ord Порядок фильтра. <BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Фильтр рассчитан успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
www.dsplib.org
\param[in] Rs Уровень подавления в полосе пропускания (дБ).<BR>
Значение должно быть положительным.<BR><BR>
\param[in] ord Порядок фильтра. <BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Фильтр рассчитан успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -317,55 +304,53 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int cheby2_ap_zp( int ord, double rs, complex_t *z, int* nz,
complex_t* p, int* np)
\fn int cheby2_ap_zp( int ord, double rs, complex_t *z, int* nz,
complex_t* p, int* np)
\brief Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$
аналогового нормированного ФНЧ Чебышёва второго рода.
\brief Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$
аналогового нормированного ФНЧ Чебышёва второго рода.
Функция рассчитывает значения нулей и полюсов передаточной функции
\f$H(s)\f$ аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord` с
частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ.<BR>
\param[in] ord Порядок фильтра. <BR>
частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ.<BR>
\param[in] ord Порядок фильтра. <BR>
\param[in] rs Уровень подавления АЧХ в полосе загражения (дБ).<BR>
Параметр задает уровень подавления сигнала
в полосе частот от 1 рад/с и выше.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей передаточной
характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей передаточной
функции \f$H(s)\f$.<BR>
По данному укащзателю будет записано количество нулей
фильтра, которые были
рассчитны и помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов передаточной
характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов передаточной
функции \f$H(s)\f$.<BR>
По данному укащзателю будет записано количество нулей
фильтра, которые были
рассчитны и помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] rs Уровень подавления АЧХ в полосе загражения (дБ).<BR>
Параметр задает уровень подавления сигнала
в полосе частот от 1 рад/с и выше.<BR>
Значение должно быть положительным.<BR><BR>
\param[out] z Указатель на массив комплексных нулей передаточной
характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] nz Указатель на переменную количества нулей передаточной
функции \f$H(s)\f$.<BR>
По данному укащзателю будет записано количество нулей
фильтра, которые были
рассчитны и помещены в вектор `z`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] p Указатель на массив комплексных полюсов передаточной
характеристики \f$H(s)\f$.<BR>
Максимальный размер вектора вектора `[ord x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] np Указатель на переменную количества полюсов передаточной
функции \f$H(s)\f$.<BR>
По данному укащзателю будет записано количество нулей
фильтра, которые были
рассчитны и помещены в вектор `p`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Массивы нулей и полюсов рассчитаны успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
Пример использования функции `cheby2_ap_zp`:
\include cheby2_ap_zp_test.c
@ -373,28 +358,28 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
Результат работы программы:
\verbatim
Chebyshev type 2 zeros:
z[ 0] = 0.000 1.026 j
z[ 1] = 0.000 -1.026 j
z[ 2] = 0.000 1.279 j
z[ 3] = 0.000 -1.279 j
z[ 4] = 0.000 2.305 j
z[ 5] = 0.000 -2.305 j
Chebyshev type 2 zeros:
z[ 0] = 0.000 1.026 j
z[ 1] = 0.000 -1.026 j
z[ 2] = 0.000 1.279 j
z[ 3] = 0.000 -1.279 j
z[ 4] = 0.000 2.305 j
z[ 5] = 0.000 -2.305 j
Chebyshev type 2 poles:
p[ 0] = -1.203 0.000 j
p[ 1] = -0.113 0.772 j
p[ 2] = -0.113 -0.772 j
p[ 3] = -0.398 0.781 j
p[ 4] = -0.398 -0.781 j
p[ 5] = -0.852 0.642 j
p[ 6] = -0.852 -0.642 j
Chebyshev type 2 poles:
p[ 0] = -1.203 0.000 j
p[ 1] = -0.113 0.772 j
p[ 2] = -0.113 -0.772 j
p[ 3] = -0.398 0.781 j
p[ 4] = -0.398 -0.781 j
p[ 5] = -0.852 0.642 j
p[ 6] = -0.852 -0.642 j
\endverbatim
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -409,69 +394,63 @@ cheby1_ap_test_tau.txt ГВЗ фильтра
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int filter_zp2ab( complex_t *z, int nz, complex_t *p, int np, int ord,
double* b, double* a)
\brief Функция пересчета нулей и полюсов аналогового фильтра в коэффициенты
передаточной характеристики \f$ H(s) \f$
\fn int filter_zp2ab(complex_t *z, int nz, complex_t *p, int np, int ord,
double* b, double* a)
\brief Функция пересчета нулей и полюсов аналогового фильтра в коэффициенты
передаточной характеристики \f$ H(s) \f$
\f[
H(s) =
\frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} =
\frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)}
\f]
\param[in] z Указатель на массив нулей
передаточной характеристики.<BR>
Размер вектора `[nz x 1]`.<BR>
Указатель может быть `NULL` если фильтр не
имеет конечных нулей (`nz=0`).<BR><BR>
\param[in] nz Размер вектора нулей передаточной характеристики
(может быть равен 0).<BR><BR>
\param[in] p Указатель на массив полюсов
передаточной характеристики.<BR>
Размер вектора `[np x 1]`.<BR>
Указатель не может быть `NULL`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] np Размер вектора полюсов передаточной характеристики
(не может быть равен 0).<BR><BR>
\param[in] ord Порядок фильтра для которого
рассчитаны нули и полюса. <BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[in] z Указатель на массив нулей
передаточной характеристики.<BR>
Размер вектора `[nz x 1]`.<BR>
Указатель может быть `NULL` если фильтр не
имеет конечных нулей (`nz=0`).<BR><BR>
\param[in] nz Размер вектора нулей передаточной характеристики
(может быть равен 0).<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] p Указатель на массив полюсов
передаточной характеристики.<BR>
Размер вектора `[np x 1]`.<BR>
Указатель не может быть `NULL`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] np Размер вектора полюсов передаточной характеристики
(не может быть равен 0).<BR><BR>
\param[in] ord Порядок фильтра для которого
рассчитаны нули и полюса. <BR>
Количество коэффициентов числителя и знаменателя
передаточной функции \f$H(s)\f$ равно `ord+1`.<BR><BR>
\param[out] b Указатель на вектор коэффициентов числителя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Пересчет произведен успешно.<BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
`RES_OK` Пересчет произведен успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\note Функция возвращает вещественные значения коэффициентов `b` и
\note Функция возвращает вещественные значения коэффициентов `b` и
`a` передаточной функции. Это означает, что вектора нулей и полюсов
должны хранить вещественные значения или комплексно-сопряженные пары
нулей и полюсов, потому что мнимая часть коэффициентов `b` и `a`
игнорируется и не сохраняется.
\author
Бахурин Сергей
www.dsplib.org
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -0,0 +1,92 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int bilinear(double* bs, double* as, int ord, double* bz, double* az)
\brief Билинейное преобразование передаточной характеристики
аналогового фильтра \f$H(s)\f$, в передаточную характеристику
цифрового фильтра \f$H(z)\f$.
Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$
цифрового фильтра путем дробно-рациональной подстановки вида
\f[
s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}.
\f]
Порядок цифрового фильтра при этом остается равным порядку аналогового фильтра,
а ось частот \f$\Omega\f$ аналогового фильтра связана c осью частот
\f$\omega\f$ цифрового фильтра соотношением:
\f[
\Omega = \tan(\omega / 2).
\f]
\param[in] bs Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$
исходного аналогового фильтра.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] as Указатель на вектор коэффициентов
знаменателя передаточной функции \f$H(s)\f$
исходного аналогового фильтра.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] ord Порядок фильтра.<BR>
Количество коэффициентов числителя и знаменателя
передаточных функций \f$H(s)\f$ и \f$H(z)\f$
аналогового и цифрового фильтров равно `ord+1`.<BR><BR>
\param[out] bz Указатель на вектор коэффициентов
числителя передаточной функции \f$H(z)\f$
полученного цифрового фильтра.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[out] az Указатель на вектор коэффициентов
знаменателя передаточной функции \f$H(z)\f$
полученного цифрового фильтра.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Фильтр рассчитан успешно.<BR><BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
<h3>Пример использования функции `bilinear`</h3>
\include bilinear_test.c
Данная программа производит расчет передаточной характеристики аналогового фильта
Чебышева первого рода, с частотой среза равной 1 рад/с, и производит билинейное
преобразование в цифровой, с частотой среза равной 0.5.
Результат работы программы:
\verbatim
bz[0] = 0.246 az[0] = 4.425
bz[1] = 0.983 az[1] = -3.318
bz[2] = 1.474 az[2] = 4.746
bz[3] = 0.983 az[3] = -2.477
bz[4] = 0.246 az[4] = 1.034
err = 0
\endverbatim
Кроме этого производится расчет АЧХ полученного цифрового фильтра и строится
график АЧХ пакетом GNUPLOT^
\image html bilinear.png
Скрипт GNUPLOT для построения графиков из текстовых файлов:
\include bilinear_test.plt
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -39,16 +39,16 @@ int fft_krn(complex_t* t0, complex_t* t1, fft_t* p, int n, int addr);
void dft2 (complex_t *x, complex_t* y);
#define DFT3_W 0.866025403784439
#define DFT3_W 0.866025403784439
void dft3 (complex_t *x, complex_t* y);
void dft4 (complex_t *x, complex_t* y);
#define DFT5_W1 -1.250000000000000
#define DFT5_W2 0.559016994374947
#define DFT5_W3 1.538841768587630
#define DFT5_W4 0.587785252292473
#define DFT5_W5 0.363271264002680
#define DFT5_W1 -1.250000000000000
#define DFT5_W2 0.559016994374947
#define DFT5_W3 1.538841768587630
#define DFT5_W4 0.587785252292473
#define DFT5_W5 0.363271264002680
void dft5 (complex_t *x, complex_t* y);
#define DFT7_W1 -1.166666666666666518636930
@ -91,7 +91,6 @@ int fir_linphase_lpf(int ord, double wp, int wintype,
#define MATRIX_SINGULAR_THRESHOLD 1E-14
/* random MRG32K3A algorithm constants */
#define MRG32K3A_NORM 2.328306549295728e-10
#define MRG32K3A_M1 4294967087.0
@ -101,6 +100,8 @@ int fir_linphase_lpf(int ord, double wp, int wintype,
#define MRG32K3A_A21 527612.0
#define MRG32K3A_A23 1370589.0
int iir_ap(double rp, double rs, int ord, int type, double* b, double* a);
#endif

Wyświetl plik

@ -330,7 +330,7 @@ int DSPL_API ellip_landen(double k, int n, double* y)
******************************************************************************/
int DSPL_API ellip_modulareq(double rp, double rs, int ord, double *k)
{
double ep, es, ke, kp, t, sn;
double ep, es, ke, kp, t, sn = 0.0;
int i, L, r;
if(rp < 0 || rp == 0)

Wyświetl plik

@ -27,6 +27,113 @@
/******************************************************************************
Magnitude, phase response and group delay of a digital filter H(z) or
analog filter H(s)
*******************************************************************************/
int DSPL_API filter_freq_resp(double* b, double* a, int ord,
double* w, int n, int flag,
double* mag, double* phi, double* tau)
{
int res, k, flag_analog;
complex_t *hc = NULL;
double *phi0 = NULL;
double *phi1 = NULL;
double *w0 = NULL;
double *w1 = NULL;
if(!b || !a || !w)
return ERROR_PTR;
if(ord < 1)
return ERROR_FILTER_ORD;
if(n < 1)
return ERROR_SIZE;
flag_analog = flag & DSPL_FLAG_ANALOG;
hc = (complex_t*) malloc (n*sizeof(complex_t));
res = flag_analog ? freqs(b, a, ord, w, n, hc) : freqz(b, a, ord, w, n, hc);
if(res != RES_OK)
goto exit_label;
if(mag)
{
if(flag & DSPL_FLAG_LOGMAG)
{
for(k = 0; k < n; k++)
mag[k] = 10.0 * log10(ABSSQR(hc[k]));
}
else
{
for(k = 0; k < n; k++)
mag[k] = sqrt(ABSSQR(hc[k]));
}
}
if(phi)
{
for(k = 0; k < n; k++)
phi[k] = atan2(IM(hc[k]), RE(hc[k]));
if(flag & DSPL_FLAG_UNWRAP)
{
res = unwrap(phi, n, M_2PI, 0.8);
if(res != RES_OK)
goto exit_label;
}
}
if(tau)
{
phi0 = (double*) malloc(n*sizeof(double));
phi1 = (double*) malloc(n*sizeof(double));
w0 = (double*) malloc(n*sizeof(double));
w1 = (double*) malloc(n*sizeof(double));
w0[0] = w[0] - (w[1] - w[0])*0.02;
w1[0] = w[0] + (w[1] - w[0])*0.02;
for(k = 1; k < n; k++)
{
w0[k] = w[k] - (w[k] - w[k-1])*0.02;
w1[k] = w[k] + (w[k] - w[k-1])*0.02;
}
res = filter_freq_resp(b, a, ord, w0, n,
DSPL_FLAG_UNWRAP | flag_analog, NULL, phi0, NULL);
if(res != RES_OK)
goto exit_label;
res = filter_freq_resp(b, a, ord, w1, n,
DSPL_FLAG_UNWRAP | flag_analog, NULL, phi1, NULL);
if(res != RES_OK)
goto exit_label;
for(k = 0; k < n; k++)
tau[k] = (phi0[k] - phi1[k])/(w1[k] - w0[k]);
}
exit_label:
if(hc)
free(hc);
if(phi0)
free(phi0);
if(phi1)
free(phi1);
if(w0)
free(w0);
if(w1)
free(w1);
return res;
}
/******************************************************************************
Complex frequency response of an analog filter H(s)
*******************************************************************************/
@ -224,9 +331,10 @@ exit_label:
/******************************************************************************
Magnitude, phase response and group delay of an analog filter H(s)
*******************************************************************************/
int DSPL_API freqs_resp(double* b, double* a, int ord,
double* w, int n, int flag,
double *h, double* phi, double* tau)
@ -322,6 +430,10 @@ exit_label:
return res;
}
*******************************************************************************/

Wyświetl plik

@ -0,0 +1,166 @@
/*
* Copyright (c) 2015-2019 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 <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "dspl.h"
#include "dspl_internal.h"
/******************************************************************************
Bilinear transform H(s) -> H(z)
*******************************************************************************/
int DSPL_API bilinear(double* bs, double* as, int ord, double* bz, double* az)
{
double c[2] = {1.0, -1.0};
double d[2] = {1.0, 1.0};
return ratcompos(bs, as, ord, c, d, 1, bz, az);
}
/******************************************************************************
Digital IIR filter coefficients calculation
*******************************************************************************/
int DSPL_API iir(double rp, double rs, int ord, double w0, double w1,
int type, double* b, double* a)
{
double *bs = NULL;
double *as = NULL;
double *bt = NULL;
double *at = NULL;
double wa0, wa1;
int err, ord_ap = ord;
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_LPF) ||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_HPF))
{
bs = (double*)malloc((ord_ap+1)*sizeof(double));
as = (double*)malloc((ord_ap+1)*sizeof(double));
bt = (double*)malloc((ord_ap+1)*sizeof(double));
at = (double*)malloc((ord_ap+1)*sizeof(double));
}
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BPASS) ||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BSTOP))
{
if(ord % 2)
return ERROR_FILTER_ORD_BP;
else
{
ord_ap = ord / 2;
bs = (double*)malloc((ord_ap + 1)*sizeof(double));
as = (double*)malloc((ord_ap + 1)*sizeof(double));
bt = (double*)malloc((ord + 1)*sizeof(double));
at = (double*)malloc((ord + 1)*sizeof(double));
}
}
err = iir_ap(rp, rs, ord_ap, type, bs, as);
if(err != RES_OK)
goto error_proc;
//frequency transformation
wa0 = tan(w0 * M_PI * 0.5);
wa1 = tan(w1 * M_PI * 0.5);
switch(type & DSPL_FILTER_TYPE_MASK)
{
case DSPL_FILTER_LPF:
err = low2low(bs, as, ord_ap, 1.0, wa0, bt, at);
break;
case DSPL_FILTER_HPF:
err = low2high(bs, as, ord_ap, 1.0, wa0, bt, at);
break;
case DSPL_FILTER_BPASS:
err = low2bp(bs, as, ord_ap, 1.0, wa0, wa1, bt, at);
break;
// case DSPL_FILTER_BSTOP:
// break;
default:
err = ERROR_FILTER_TYPE;
break;
}
if(err != RES_OK)
goto error_proc;
err = bilinear(bt, at, ord, b, a);
error_proc:
if(bs)
free(bs);
if(as)
free(as);
if(bt)
free(bt);
if(at)
free(at);
return err;
}
/******************************************************************************
Analog prototype for IIR
*******************************************************************************/
int iir_ap(double rp, double rs, int ord, int type, double* b, double* a)
{
int err;
switch(type & DSPL_FILTER_APPROX_MASK)
{
case DSPL_FILTER_BUTTER:
err = butter_ap(rp, ord, b, a);
break;
case DSPL_FILTER_CHEBY1:
err = cheby1_ap(rp, ord, b, a);
break;
case DSPL_FILTER_CHEBY2:
err = cheby2_ap(rs, ord, b, a);
break;
case DSPL_FILTER_ELLIP:
err = ellip_ap(rp, rs, ord, b, a);
break;
default:
err = ERROR_FILTER_APPROX;
}
return err;
}

Wyświetl plik

@ -118,7 +118,7 @@ matrix LU decomposition
int DSPL_API matrix_lu(matrix_t* a, matrix_t* L, matrix_t* U, matrix_t* P)
{
int err, k, n, m, N, ind;
double *ra, *rl, *ru, mu, ukk, gmax;
double *rl, *ru, mu, ukk, gmax;
if(!a || !L || !U || !P)
return ERROR_PTR;

Wyświetl plik

@ -25,7 +25,9 @@
#include "dspl.h"
/*******************************************************************************
Histogram calculation
*******************************************************************************/
int DSPL_API histogram(double* x, int n, int nh, double* pedges, double* ph)
{
double xmin, xmax;
@ -60,6 +62,9 @@ int DSPL_API histogram(double* x, int n, int nh, double* pedges, double* ph)
/*******************************************************************************
Histogram normalization
*******************************************************************************/
int DSPL_API histogram_norm(double* y, int n, int nh, double* x, double* w)
{
double *pedges = NULL;
@ -95,6 +100,9 @@ exit_label:
/*******************************************************************************
minimum and maximum values
*******************************************************************************/
int DSPL_API minmax(double* x, int n, double* xmin, double* xmax)
{
int k;

Wyświetl plik

@ -0,0 +1,13 @@
unset key
set grid
set xlabel "normalized frequency"
set terminal pngcairo size 520, 380 enhanced font 'Verdana,8'
set output 'img/bilinear.png'
set ylabel "Magnitude, dB"
set yrange [-80:5]
plot 'dat/bilinear.txt' with lines

Wyświetl plik

@ -0,0 +1,21 @@
unset key
set grid
set xlabel " normalized frequency"
set terminal pngcairo size 920, 260 enhanced font 'Verdana,8'
set output 'img/iir_lpf.png'
set multiplot layout 1,3 rowsfirst
set ylabel "Magnitude, dB"
set yrange [-100:5]
plot 'dat/iir_lpf_mag.txt' with lines
set ylabel "Phase response, rad"
unset yrange
plot 'dat/iir_lpf_phi.txt' with lines
set ylabel "Groupdelay, samples"
unset yrange
plot 'dat/iir_lpf_tau.txt' with lines
unset multiplot

Wyświetl plik

@ -0,0 +1,61 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
#define N 1000
#define ORD 4
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double w[N], h[N];
complex_t hz[N];
double bs[ORD+1], as[ORD+1];
double bz[ORD+1], az[ORD+1];
int err, k;
// расчет аналогового фильтра Чебышева первого рода
err = cheby1_ap(1.0, ORD, bs, as);
if(err != RES_OK)
{
printf("cheby1_ap error code %d\n", err);
return err;
}
// Билинейное преобразование
err = bilinear(bs, as, ORD, bz, az);
if(err != RES_OK)
{
printf("bilinear error code %d\n", err);
return err;
}
// Печать коэффициентов
for(k = 0; k < ORD+1; k++)
printf("bz[%d] = %7.3f az[%d] = %7.3f\n", k, bz[k], k, az[k]);
// Расчет АЧХ полученного цифрового фильтра
linspace(0, M_PI, N, DSPL_PERIODIC, w);
freqz(bz, az, ORD, w, N, hz);
for(k = 0; k < N; k++)
{
h[k] = 10.0 * log10 (ABSSQR(hz[k])); // АЧХ в дБ
w[k] /= M_PI; // нормировка частоты от 0 до 1
}
writetxt(w,h,N,"dat/bilinear.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
err = system("gnuplot -p gnuplot/bilinear_test.plt");
printf("err = %d\n", err);
return err;
}

Wyświetl plik

@ -27,7 +27,9 @@ int main()
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
freqs_resp(b, a, ORD, w, N, DSPL_FLAG_LOG|DSPL_FLAG_UNWRAP, mag, phi, tau);
filter_freq_resp(b, a, ORD, w, N,
DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP|DSPL_FLAG_ANALOG,
mag, phi, tau);
writetxt(w, mag, N, "dat/butter_ap_test_mag.txt");
writetxt(w, phi, N, "dat/butter_ap_test_phi.txt");

Wyświetl plik

@ -12,41 +12,42 @@
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double a[ORD+1], b[ORD+1]; // коэффицинеты H(s)
double Rp = 3.0; // неравномерность в полосе пропускания 3дБ
// Частота (w), АЧХ (mag), ФЧХ (phi) и ГВЗ (tau)
double w[N], mag[N], phi[N], tau[N];
int k;
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double a[ORD+1], b[ORD+1]; // коэффицинеты H(s)
double Rp = 3.0; // неравномерность в полосе пропускания 3дБ
// Частота (w), АЧХ (mag), ФЧХ (phi) и ГВЗ (tau)
double w[N], mag[N], phi[N], tau[N];
int k;
// рассчитываем нормированный ФНЧ Чебышева 1 рода
int res = cheby1_ap(Rp, ORD, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
// печать коэффициентов фильтра
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
// вектор частоты в логарифмической шакале от 0.01 до 100 рад/c
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
//частотные характеристика фильтра
freqs_resp(b, a, ORD, w, N, DSPL_FLAG_LOG|DSPL_FLAG_UNWRAP,
mag, phi, tau);
// Сохранить характеристики для построения графиков
writetxt(w, mag, N, "dat/cheby1_ap_test_mag.txt");
writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt");
writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot -p gnuplot/cheby1_ap_test.plt");;
// рассчитываем нормированный ФНЧ Чебышева 1 рода
int res = cheby1_ap(Rp, ORD, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
// печать коэффициентов фильтра
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
// вектор частоты в логарифмической шакале от 0.01 до 100 рад/c
logspace(-2.0, 2.0, N , DSPL_SYMMETRIC, w);
//частотные характеристика фильтра
filter_freq_resp(b, a, ORD, w, N,
DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP | DSPL_FLAG_ANALOG,
mag, phi, tau);
// Сохранить характеристики для построения графиков
writetxt(w, mag, N, "dat/cheby1_ap_test_mag.txt");
writetxt(w, phi, N, "dat/cheby1_ap_test_phi.txt");
writetxt(w, tau, N, "dat/cheby1_ap_test_tau.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot -p gnuplot/cheby1_ap_test.plt");;
}

Wyświetl plik

@ -0,0 +1,56 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dspl.h"
// Порядок фильтра
#define ORD 5
// размер векторов частотной характериситки фильтра
#define N 1000
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double a[ORD+1], b[ORD+1]; // коэффицинеты H(s)
double rs = 60.0; // неравномерность в полосе пропускания 3дБ
double rp = 1.0;
// Частота (w), АЧХ (mag), ФЧХ (phi) и ГВЗ (tau)
double w[N], mag[N], phi[N], tau[N];
int k;
// рассчитываем цифровой ФНЧ Чебышева 2 рода
int res = iir(rp, rs, ORD, 0.3, 0.0,
DSPL_FILTER_CHEBY1 | DSPL_FILTER_LPF, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);
// печать коэффициентов фильтра
for(k = 0; k < ORD+1; k++)
printf("b[%2d] = %9.3f a[%2d] = %9.3f\n", k, b[k], k, a[k]);
// вектор нормированной частоты от 0 до pi
linspace(0, M_PI, N , DSPL_PERIODIC, w);
//частотные характеристика фильтра
filter_freq_resp(b, a, ORD, w, N, DSPL_FLAG_LOGMAG|DSPL_FLAG_UNWRAP,
mag, phi, tau);
for(k = 0; k < N; k++)
w[k] /= M_PI;
// Сохранить характеристики для построения графиков
writetxt(w, mag, N, "dat/iir_lpf_mag.txt");
writetxt(w, phi, N, "dat/iir_lpf_phi.txt");
writetxt(w, tau, N, "dat/iir_lpf_tau.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot -p gnuplot/iir_lpf.plt");;
}

Wyświetl plik

@ -8,29 +8,29 @@
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double x[N], y[N];
linspace(-10.0, 10.0, N , DSPL_SYMMETRIC, x);
sinc(x, N, 1.0, y);
writetxt(x, y, N, "dat/sinc_test_1.0.txt");
sinc(x, N, M_PI, y);
writetxt(x, y, N, "dat/sinc_test_pi.txt");
sinc(x, N, 2.0*M_PI, y);
writetxt(x, y, N, "dat/sinc_test_2pi.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
int err = system("gnuplot -p gnuplot/sinc_test.plt");
printf("err = %d\n", err);
return err;
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double x[N], y[N];
linspace(-10.0, 10.0, N , DSPL_SYMMETRIC, x);
sinc(x, N, 1.0, y);
writetxt(x, y, N, "dat/sinc_test_1.0.txt");
sinc(x, N, M_PI, y);
writetxt(x, y, N, "dat/sinc_test_pi.txt");
sinc(x, N, 2.0*M_PI, y);
writetxt(x, y, N, "dat/sinc_test_2pi.txt");
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
int err = system("gnuplot -p gnuplot/sinc_test.plt");
printf("err = %d\n", err);
return err;
}

Wyświetl plik

@ -39,6 +39,7 @@ p_acos_cmplx acos_cmplx ;
p_asin_cmplx asin_cmplx ;
p_butter_ap butter_ap ;
p_bessel_i0 bessel_i0 ;
p_bilinear bilinear ;
p_butter_ap_zp butter_ap_zp ;
p_cheby_poly1 cheby_poly1 ;
p_cheby_poly2 cheby_poly2 ;
@ -57,6 +58,7 @@ p_decimate_cmplx decimate_cmplx ;
p_dft dft ;
p_dft_cmplx dft_cmplx ;
p_dmod dmod ;
p_dspl_info dspl_info ;
p_ellip_acd ellip_acd ;
p_ellip_acd_cmplx ellip_acd_cmplx ;
p_ellip_ap ellip_ap ;
@ -70,9 +72,6 @@ p_ellip_modulareq ellip_modulareq ;
p_ellip_rat ellip_rat ;
p_ellip_sn ellip_sn ;
p_ellip_sn_cmplx ellip_sn_cmplx ;
p_idft_cmplx idft_cmplx ;
p_ifft_cmplx ifft_cmplx ;
p_dspl_info dspl_info ;
p_farrow_lagrange farrow_lagrange ;
p_farrow_spline farrow_spline ;
p_fft fft ;
@ -81,6 +80,7 @@ p_fft_create fft_create ;
p_fft_free fft_free ;
p_fft_shift fft_shift ;
p_fft_shift_cmplx fft_shift_cmplx ;
p_filter_freq_resp filter_freq_resp ;
p_filter_iir filter_iir ;
p_filter_zp2ab filter_zp2ab ;
p_find_max_abs find_max_abs ;
@ -93,13 +93,15 @@ p_fourier_series_dec_cmplx fourier_series_dec_cmplx ;
p_fourier_series_rec fourier_series_rec ;
p_freqs freqs ;
p_freqs_cmplx freqs_cmplx ;
p_freqs_resp freqs_resp ;
p_freqs2time freqs2time ;
p_freqz freqz ;
p_goertzel goertzel ;
p_goertzel_cmplx goertzel_cmplx ;
p_histogram histogram ;
p_histogram_norm histogram_norm ;
p_idft_cmplx idft_cmplx ;
p_ifft_cmplx ifft_cmplx ;
p_iir iir ;
p_linspace linspace ;
p_log_cmplx log_cmplx ;
p_logspace logspace ;
@ -197,6 +199,7 @@ void* dspl_load()
LOAD_FUNC(acos_cmplx);
LOAD_FUNC(asin_cmplx);
LOAD_FUNC(bessel_i0);
LOAD_FUNC(bilinear);
LOAD_FUNC(butter_ap);
LOAD_FUNC(butter_ap_zp);
LOAD_FUNC(cheby_poly1);
@ -216,6 +219,7 @@ void* dspl_load()
LOAD_FUNC(dft);
LOAD_FUNC(dft_cmplx);
LOAD_FUNC(dmod);
LOAD_FUNC(dspl_info);
LOAD_FUNC(ellip_acd);
LOAD_FUNC(ellip_acd_cmplx);
LOAD_FUNC(ellip_ap);
@ -229,9 +233,6 @@ void* dspl_load()
LOAD_FUNC(ellip_rat);
LOAD_FUNC(ellip_sn);
LOAD_FUNC(ellip_sn_cmplx);
LOAD_FUNC(idft_cmplx);
LOAD_FUNC(ifft_cmplx);
LOAD_FUNC(dspl_info);
LOAD_FUNC(farrow_lagrange);
LOAD_FUNC(farrow_spline);
LOAD_FUNC(fft);
@ -240,6 +241,7 @@ void* dspl_load()
LOAD_FUNC(fft_free);
LOAD_FUNC(fft_shift);
LOAD_FUNC(fft_shift_cmplx);
LOAD_FUNC(filter_freq_resp);
LOAD_FUNC(filter_iir);
LOAD_FUNC(filter_zp2ab);
LOAD_FUNC(find_max_abs);
@ -253,12 +255,14 @@ void* dspl_load()
LOAD_FUNC(freqz);
LOAD_FUNC(freqs);
LOAD_FUNC(freqs_cmplx);
LOAD_FUNC(freqs_resp);
LOAD_FUNC(freqs2time);
LOAD_FUNC(goertzel);
LOAD_FUNC(goertzel_cmplx);
LOAD_FUNC(histogram);
LOAD_FUNC(histogram_norm);
LOAD_FUNC(idft_cmplx);
LOAD_FUNC(ifft_cmplx);
LOAD_FUNC(iir);
LOAD_FUNC(linspace);
LOAD_FUNC(log_cmplx);
LOAD_FUNC(logspace);

Wyświetl plik

@ -105,13 +105,16 @@ typedef struct
/* F 0x06xxxxxx*/
#define ERROR_FFT_CREATE 0x06060318
#define ERROR_FFT_SIZE 0x06062021
#define ERROR_FILTER_A0 0x06100100
#define ERROR_FILTER_FT 0x06100620
#define ERROR_FILTER_ORD 0x06101518
#define ERROR_FILTER_RP 0x06101816
#define ERROR_FILTER_RS 0x06101819
#define ERROR_FILTER_WP 0x06102316
#define ERROR_FILTER_WS 0x06102319
#define ERROR_FILTER_A0 0x06090100
#define ERROR_FILTER_APPROX 0x06090116
#define ERROR_FILTER_FT 0x06090620
#define ERROR_FILTER_ORD 0x06091518
#define ERROR_FILTER_ORD_BP 0x06091519
#define ERROR_FILTER_RP 0x06091816
#define ERROR_FILTER_RS 0x06091819
#define ERROR_FILTER_TYPE 0x06092025
#define ERROR_FILTER_WP 0x06092316
#define ERROR_FILTER_WS 0x06092319
#define ERROR_FNAME 0x06140113
#define ERROR_FOPEN 0x06151605
#define ERROR_FREAD_SIZE 0x06180501
@ -163,9 +166,12 @@ typedef struct
#define DSPL_SYMMETRIC 0x00000000
#define DSPL_PERIODIC 0x00000001
#define DSPL_FLAG_DIGITAL 0x00000000
#define DSPL_FLAG_ANALOG 0x00000001
#define DSPL_FLAG_LOGMAG 0x00000002
#define DSPL_FLAG_UNWRAP 0x00000004
#define DSPL_FLAG_LOG 0x00000001
#define DSPL_FLAG_UNWRAP 0x00000002
#define DSPL_WIN_SYM_MASK 0x00000001
#define DSPL_WIN_MASK 0x00FFFFFE
@ -190,12 +196,19 @@ typedef struct
#define DSPL_WIN_CHEBY 0x00080000
#define DSPL_WIN_KAISER 0x00100000
#define DSPL_FILTER_TYPE_MASK 0x0000000F
#define DSPL_FILTER_TYPE_MASK 0x000000FF
#define DSPL_FILTER_LPF 0x00000001
#define DSPL_FILTER_HPF 0x00000002
#define DSPL_FILTER_BPASS 0x00000004
#define DSPL_FILTER_BSTOP 0x00000008
#define DSPL_FILTER_APPROX_MASK 0x0000FF00
#define DSPL_FILTER_BUTTER 0x00000100
#define DSPL_FILTER_CHEBY1 0x00000200
#define DSPL_FILTER_CHEBY2 0x00000400
#define DSPL_FILTER_ELLIP 0x00000800
#define ELLIP_ITER 16
@ -250,6 +263,12 @@ DECLARE_FUNC(int, bessel_i0, double* x
COMMA int n
COMMA double* y);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, bilinear, double* bs
COMMA double* as
COMMA int ord
COMMA double* bz
COMMA double* az);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, butter_ap, double
COMMA int
COMMA double*
@ -424,15 +443,6 @@ DECLARE_FUNC(int, ellip_sn_cmplx, complex_t* u
COMMA double k
COMMA complex_t* y);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, idft_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, ifft_cmplx, complex_t*
COMMA int
COMMA fft_t*
COMMA complex_t* );
//------------------------------------------------------------------------------
DECLARE_FUNC(int, farrow_lagrange, double*
COMMA int
COMMA double
@ -472,6 +482,16 @@ DECLARE_FUNC(int, fft_shift_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, filter_freq_resp, double* b
COMMA double* a
COMMA int ord
COMMA double* w
COMMA int n
COMMA int flag
COMMA double* mag
COMMA double* phi
COMMA double* tau);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, filter_iir, double*
COMMA double*
COMMA int
@ -550,16 +570,6 @@ DECLARE_FUNC(int, freqs_cmplx, double* b
COMMA int n
COMMA complex_t* h);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, freqs_resp, double*
COMMA double*
COMMA int
COMMA double*
COMMA int
COMMA int
COMMA double*
COMMA double*
COMMA double*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, freqs2time, double*
COMMA double*
COMMA int
@ -588,18 +598,36 @@ DECLARE_FUNC(int, goertzel_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, histogram, double* x
DECLARE_FUNC(int, histogram, double* x
COMMA int n
COMMA int nh
COMMA double* pedges
COMMA double* ph);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, histogram_norm, double* y
DECLARE_FUNC(int, histogram_norm, double* y
COMMA int n
COMMA int nh
COMMA double* x
COMMA double* w);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, idft_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, ifft_cmplx, complex_t*
COMMA int
COMMA fft_t*
COMMA complex_t* );
//------------------------------------------------------------------------------
DECLARE_FUNC(int, iir, double rp
COMMA double rs
COMMA int ord
COMMA double w0
COMMA double w1
COMMA int type
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, linspace, double
COMMA double
COMMA int
@ -705,7 +733,7 @@ DECLARE_FUNC(int, randn, double*
COMMA double
COMMA random_t* prnd);
//------------------------------------------------------------------------------
DECLARE_FUNC(void, random_init, random_t* prnd);
DECLARE_FUNC(void, random_init, random_t* prnd);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, randu, double*
COMMA int

Wyświetl plik

@ -39,6 +39,7 @@ p_acos_cmplx acos_cmplx ;
p_asin_cmplx asin_cmplx ;
p_butter_ap butter_ap ;
p_bessel_i0 bessel_i0 ;
p_bilinear bilinear ;
p_butter_ap_zp butter_ap_zp ;
p_cheby_poly1 cheby_poly1 ;
p_cheby_poly2 cheby_poly2 ;
@ -57,6 +58,7 @@ p_decimate_cmplx decimate_cmplx ;
p_dft dft ;
p_dft_cmplx dft_cmplx ;
p_dmod dmod ;
p_dspl_info dspl_info ;
p_ellip_acd ellip_acd ;
p_ellip_acd_cmplx ellip_acd_cmplx ;
p_ellip_ap ellip_ap ;
@ -70,9 +72,6 @@ p_ellip_modulareq ellip_modulareq ;
p_ellip_rat ellip_rat ;
p_ellip_sn ellip_sn ;
p_ellip_sn_cmplx ellip_sn_cmplx ;
p_idft_cmplx idft_cmplx ;
p_ifft_cmplx ifft_cmplx ;
p_dspl_info dspl_info ;
p_farrow_lagrange farrow_lagrange ;
p_farrow_spline farrow_spline ;
p_fft fft ;
@ -81,6 +80,7 @@ p_fft_create fft_create ;
p_fft_free fft_free ;
p_fft_shift fft_shift ;
p_fft_shift_cmplx fft_shift_cmplx ;
p_filter_freq_resp filter_freq_resp ;
p_filter_iir filter_iir ;
p_filter_zp2ab filter_zp2ab ;
p_find_max_abs find_max_abs ;
@ -93,13 +93,15 @@ p_fourier_series_dec_cmplx fourier_series_dec_cmplx ;
p_fourier_series_rec fourier_series_rec ;
p_freqs freqs ;
p_freqs_cmplx freqs_cmplx ;
p_freqs_resp freqs_resp ;
p_freqs2time freqs2time ;
p_freqz freqz ;
p_goertzel goertzel ;
p_goertzel_cmplx goertzel_cmplx ;
p_histogram histogram ;
p_histogram_norm histogram_norm ;
p_idft_cmplx idft_cmplx ;
p_ifft_cmplx ifft_cmplx ;
p_iir iir ;
p_linspace linspace ;
p_log_cmplx log_cmplx ;
p_logspace logspace ;
@ -197,6 +199,7 @@ void* dspl_load()
LOAD_FUNC(acos_cmplx);
LOAD_FUNC(asin_cmplx);
LOAD_FUNC(bessel_i0);
LOAD_FUNC(bilinear);
LOAD_FUNC(butter_ap);
LOAD_FUNC(butter_ap_zp);
LOAD_FUNC(cheby_poly1);
@ -216,6 +219,7 @@ void* dspl_load()
LOAD_FUNC(dft);
LOAD_FUNC(dft_cmplx);
LOAD_FUNC(dmod);
LOAD_FUNC(dspl_info);
LOAD_FUNC(ellip_acd);
LOAD_FUNC(ellip_acd_cmplx);
LOAD_FUNC(ellip_ap);
@ -229,9 +233,6 @@ void* dspl_load()
LOAD_FUNC(ellip_rat);
LOAD_FUNC(ellip_sn);
LOAD_FUNC(ellip_sn_cmplx);
LOAD_FUNC(idft_cmplx);
LOAD_FUNC(ifft_cmplx);
LOAD_FUNC(dspl_info);
LOAD_FUNC(farrow_lagrange);
LOAD_FUNC(farrow_spline);
LOAD_FUNC(fft);
@ -240,6 +241,7 @@ void* dspl_load()
LOAD_FUNC(fft_free);
LOAD_FUNC(fft_shift);
LOAD_FUNC(fft_shift_cmplx);
LOAD_FUNC(filter_freq_resp);
LOAD_FUNC(filter_iir);
LOAD_FUNC(filter_zp2ab);
LOAD_FUNC(find_max_abs);
@ -253,12 +255,14 @@ void* dspl_load()
LOAD_FUNC(freqz);
LOAD_FUNC(freqs);
LOAD_FUNC(freqs_cmplx);
LOAD_FUNC(freqs_resp);
LOAD_FUNC(freqs2time);
LOAD_FUNC(goertzel);
LOAD_FUNC(goertzel_cmplx);
LOAD_FUNC(histogram);
LOAD_FUNC(histogram_norm);
LOAD_FUNC(idft_cmplx);
LOAD_FUNC(ifft_cmplx);
LOAD_FUNC(iir);
LOAD_FUNC(linspace);
LOAD_FUNC(log_cmplx);
LOAD_FUNC(logspace);

Wyświetl plik

@ -105,13 +105,16 @@ typedef struct
/* F 0x06xxxxxx*/
#define ERROR_FFT_CREATE 0x06060318
#define ERROR_FFT_SIZE 0x06062021
#define ERROR_FILTER_A0 0x06100100
#define ERROR_FILTER_FT 0x06100620
#define ERROR_FILTER_ORD 0x06101518
#define ERROR_FILTER_RP 0x06101816
#define ERROR_FILTER_RS 0x06101819
#define ERROR_FILTER_WP 0x06102316
#define ERROR_FILTER_WS 0x06102319
#define ERROR_FILTER_A0 0x06090100
#define ERROR_FILTER_APPROX 0x06090116
#define ERROR_FILTER_FT 0x06090620
#define ERROR_FILTER_ORD 0x06091518
#define ERROR_FILTER_ORD_BP 0x06091519
#define ERROR_FILTER_RP 0x06091816
#define ERROR_FILTER_RS 0x06091819
#define ERROR_FILTER_TYPE 0x06092025
#define ERROR_FILTER_WP 0x06092316
#define ERROR_FILTER_WS 0x06092319
#define ERROR_FNAME 0x06140113
#define ERROR_FOPEN 0x06151605
#define ERROR_FREAD_SIZE 0x06180501
@ -163,9 +166,12 @@ typedef struct
#define DSPL_SYMMETRIC 0x00000000
#define DSPL_PERIODIC 0x00000001
#define DSPL_FLAG_DIGITAL 0x00000000
#define DSPL_FLAG_ANALOG 0x00000001
#define DSPL_FLAG_LOGMAG 0x00000002
#define DSPL_FLAG_UNWRAP 0x00000004
#define DSPL_FLAG_LOG 0x00000001
#define DSPL_FLAG_UNWRAP 0x00000002
#define DSPL_WIN_SYM_MASK 0x00000001
#define DSPL_WIN_MASK 0x00FFFFFE
@ -190,12 +196,19 @@ typedef struct
#define DSPL_WIN_CHEBY 0x00080000
#define DSPL_WIN_KAISER 0x00100000
#define DSPL_FILTER_TYPE_MASK 0x0000000F
#define DSPL_FILTER_TYPE_MASK 0x000000FF
#define DSPL_FILTER_LPF 0x00000001
#define DSPL_FILTER_HPF 0x00000002
#define DSPL_FILTER_BPASS 0x00000004
#define DSPL_FILTER_BSTOP 0x00000008
#define DSPL_FILTER_APPROX_MASK 0x0000FF00
#define DSPL_FILTER_BUTTER 0x00000100
#define DSPL_FILTER_CHEBY1 0x00000200
#define DSPL_FILTER_CHEBY2 0x00000400
#define DSPL_FILTER_ELLIP 0x00000800
#define ELLIP_ITER 16
@ -250,6 +263,12 @@ DECLARE_FUNC(int, bessel_i0, double* x
COMMA int n
COMMA double* y);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, bilinear, double* bs
COMMA double* as
COMMA int ord
COMMA double* bz
COMMA double* az);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, butter_ap, double
COMMA int
COMMA double*
@ -424,15 +443,6 @@ DECLARE_FUNC(int, ellip_sn_cmplx, complex_t* u
COMMA double k
COMMA complex_t* y);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, idft_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, ifft_cmplx, complex_t*
COMMA int
COMMA fft_t*
COMMA complex_t* );
//------------------------------------------------------------------------------
DECLARE_FUNC(int, farrow_lagrange, double*
COMMA int
COMMA double
@ -472,6 +482,16 @@ DECLARE_FUNC(int, fft_shift_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, filter_freq_resp, double* b
COMMA double* a
COMMA int ord
COMMA double* w
COMMA int n
COMMA int flag
COMMA double* mag
COMMA double* phi
COMMA double* tau);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, filter_iir, double*
COMMA double*
COMMA int
@ -550,16 +570,6 @@ DECLARE_FUNC(int, freqs_cmplx, double* b
COMMA int n
COMMA complex_t* h);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, freqs_resp, double*
COMMA double*
COMMA int
COMMA double*
COMMA int
COMMA int
COMMA double*
COMMA double*
COMMA double*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, freqs2time, double*
COMMA double*
COMMA int
@ -588,18 +598,36 @@ DECLARE_FUNC(int, goertzel_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, histogram, double* x
DECLARE_FUNC(int, histogram, double* x
COMMA int n
COMMA int nh
COMMA double* pedges
COMMA double* ph);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, histogram_norm, double* y
DECLARE_FUNC(int, histogram_norm, double* y
COMMA int n
COMMA int nh
COMMA double* x
COMMA double* w);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, idft_cmplx, complex_t*
COMMA int
COMMA complex_t*);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, ifft_cmplx, complex_t*
COMMA int
COMMA fft_t*
COMMA complex_t* );
//------------------------------------------------------------------------------
DECLARE_FUNC(int, iir, double rp
COMMA double rs
COMMA int ord
COMMA double w0
COMMA double w1
COMMA int type
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, linspace, double
COMMA double
COMMA int
@ -705,7 +733,7 @@ DECLARE_FUNC(int, randn, double*
COMMA double
COMMA random_t* prnd);
//------------------------------------------------------------------------------
DECLARE_FUNC(void, random_init, random_t* prnd);
DECLARE_FUNC(void, random_init, random_t* prnd);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, randu, double*
COMMA int