kopia lustrzana https://github.com/Dsplib/libdspl-2.0
added function iir
rodzic
90a32fdd21
commit
5da9d064a1
|
@ -31,6 +31,7 @@ $extrastylesheet
|
|||
<body>
|
||||
|
||||
|
||||
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript" >
|
||||
(function (d, w, c) {
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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");
|
||||
|
|
|
@ -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");;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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");;
|
||||
}
|
||||
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Ładowanie…
Reference in New Issue