pull/6/merge
Dsplib 2019-06-09 15:25:11 +03:00
rodzic 5da9d064a1
commit 2c1704d505
17 zmienionych plików z 451 dodań i 413 usunięć

Wyświetl plik

@ -227,7 +227,7 @@ Pазархивируем на диск `C:\`.
По завершению компиляции снова нажимаем `Ctrl-O` (возвращаем панели Far),
переходим в директорию `libdspl-2.0/test/bin` и видим скомпилированные exe-файлы:
переходим в директорию `libdspl-2.0/example/bin` и видим скомпилированные exe-файлы:
\image html dspl_exe.png

Wyświetl plik

@ -3,24 +3,23 @@
\typedef complex_t
\brief Описание комплексного типа данных.
Комплексный тип данных в библиотеке DSPL-2.0 определен как
массив из двух элементов типа `double`.
При этом первый элемент массива определяет реальную часть
комплексного числа, а второй - мнимую.
Комплексный тип данных в библиотеке DSPL-2.0 определен как
массив из двух элементов типа `double`.
При этом первый элемент массива определяет реальную часть
комплексного числа, а второй - мнимую.
Например:
Например:
\code
complex_t z;
z[0] = 1.0;
z[1] = -2.0;
\endcode
\code
complex_t z;
z[0] = 1.0;
z[1] = -2.0;
\endcode
Переменная `z = 1-2j`, где `j` - мнимая единица.
Для удобства работы с комплексными числами реализованы
специальные макросы: \ref RE, \ref IM, \ref ABSSQR
Переменная `z = 1-2j`, где `j` - мнимая единица.
Для удобства работы с комплексными числами реализованы
специальные макросы: \ref RE, \ref IM, \ref ABSSQR
***************************************************************************** */
@ -32,26 +31,26 @@
/*! ****************************************************************************
\ingroup TYPES_GROUP
\def ABSSQR(x)
\brief Макрос возвращает квадрат модуля комплексного числа `x`.
\ingroup TYPES_GROUP
\def ABSSQR(x)
\brief Макрос возвращает квадрат модуля комплексного числа `x`.
Квадрата модуля комплексного числа \f$ x = a + j b \f$ равен:
Квадрат модуля комплексного числа \f$ x = a + j b \f$ равен:
\f[
|x|^2 = x x^* = a^2 + b^2.
\f]
\f[
|x|^2 = x x^* = a^2 + b^2.
\f]
Например:
\code
complex_t z;
double y;
RE(z) = 1.0;
IM(z) = -2.0;
y = ABSSQR(z);
\endcode
Например:
\code
complex_t z;
double y;
RE(z) = 1.0;
IM(z) = -2.0;
y = ABSSQR(z);
\endcode
Переменная `z = 1-2j`, где `j` - мнимая единица, а переменная `y = 5`.
Переменная `z = 1-2j`, где `j` - мнимая единица, а переменная `y = 5`.
***************************************************************************** */
@ -62,9 +61,9 @@
/*! ****************************************************************************
\ingroup TYPES_GROUP
\def IM(x)
\brief Макрос определяющий мнимую часть комплексного числа.
\ingroup TYPES_GROUP
\def IM(x)
\brief Макрос определяющий мнимую часть комплексного числа.
Например:
\code

Wyświetl plik

@ -1,35 +1,34 @@
/*! **************************************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv(double* a, int na, double* b, int nb, double* c)
\brief Линейная свертка двух вещественных векторов
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv(double* a, int na, double* b, int nb, double* c)
\brief Линейная свертка двух вещественных векторов
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
Размер вектора `[na x 1]`.<BR><BR>
\param[in] na Размер первого вектора.<BR><BR>
\param[in] b Указатель на второй вектор \f$b\f$.<BR>
Размер вектора `[nb x 1]`.<BR><BR>
\param[in] nb азмер второго вектора.<BR><BR>
\param[out] c Указатель на вектор свертки \f$ c = a * b\f$.<BR>
Размер вектора `[na + nb - 1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если свертка расчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
Размер вектора `[na x 1]`.<BR><BR>
\author
Бахурин Сергей
www.dsplib.org
\param[in] na Размер первого вектора.<BR><BR>
**************************************************************************************************** */
\param[in] b Указатель на второй вектор \f$b\f$.<BR>
Размер вектора `[nb x 1]`.<BR><BR>
\param[in] nb Размер второго вектора.<BR><BR>
\param[out] c Указатель на вектор свертки \f$ c = a * b\f$.<BR>
Размер вектора `[na + nb - 1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если свертка рассчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -38,37 +37,36 @@
/*! **************************************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
\brief Линейная свертка двух комплексных векторов
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
\brief Линейная свертка двух комплексных векторов
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
Размер вектора `[na x 1]`.<BR><BR>
\param[in] na Размер первого вектора.<BR><BR>
\param[in] b Указатель на второй вектор \f$b\f$.<BR>
Размер вектора `[nb x 1]`.<BR><BR>
\param[in] nb Размер второго вектора.<BR><BR>
\param[out] c Указатель на вектор свертки \f$ c = a * b\f$.<BR>
Размер вектора `[na + nb - 1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если свертка расчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
Размер вектора `[na x 1]`.<BR><BR>
\author
Бахурин Сергей
www.dsplib.org
\param[in] na Размер первого вектора.<BR><BR>
*************************************************************************************************** */
\param[in] b Указатель на второй вектор \f$b\f$.<BR>
Размер вектора `[nb x 1]`.<BR><BR>
\param[in] nb Размер второго вектора.<BR><BR>
\param[out] c Указатель на вектор свертки \f$ c = a * b\f$.<BR>
Размер вектора `[na + nb - 1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если свертка рассчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */
@ -77,50 +75,49 @@
/*! **************************************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
\brief Фильтрация вещественного сигнала вещественным БИХ-фильтром
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
\brief Фильтрация вещественного сигнала вещественным БИХ-фильтром
Функция рассчитывает выход фильтра заданного выражением
\f[
H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}}
{1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-n}},
\f]
где \f$a_0\f$ не может быть 0, \f$N=M=\f$`ord`.
Функция рассчитывает выход фильтра заданного выражением
\f[
H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}}
{1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-n}},
\f]
где \f$a_0\f$ не может быть 0, \f$N=M=\f$`ord`.
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции БИХ-фильтра.<BR>
Размер вектора `[ord + 1 x 1]`.<BR><BR>
\param[in] b Указатель на вектор коэффициентов числителя
передаточной функции БИХ-фильтра.<BR>
Размер вектора `[ord + 1 x 1]`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции БИХ-фильтра.<BR>
Размер вектора `[ord + 1 x 1]`.<BR>
Этот указатель может быть `NULL`,
тогда фильтрация производится без использования
рекурсивной части.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов числителя
и знаменателя передаточной функции
БИХ-фильтра равно `ord + 1`.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции БИХ-фильтра.<BR>
Размер вектора `[ord + 1 x 1]`.<BR>
Этот указатель может быть `NULL`,
тогда фильтрация производится без использования
рекурсивной части.<BR><BR>
\param[in] ord Порядок фильтра. Количество коэффициентов числителя
и знаменателя передаточной функции
БИХ-фильтра равно `ord + 1`.<BR><BR>
\param[in] x Указатель на вектор отсчетов входного сигнала.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Длина входного сигнала.<BR><BR>
\param[out] y Указатель на вектор выходных отсчетов фильтра.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена заранее.<BR><BR>
\return
`RES_OK` Если фильтрация произведена успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
\param[in] x Указатель на вектор отсчетов входного сигнала.<BR>
Размер вектора `[n x 1]`.<BR><BR>
\param[in] n Длина входного сигнала.<BR><BR>
\param[out] y Указатель на вектор выходных отсчетов фильтра.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена заранее.<BR><BR>
\return
`RES_OK` если фильтрация произведена успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
\author
Бахурин Сергей
www.dsplib.org
************************************************************************************************** */
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -431,25 +431,21 @@ k_i =
Для расчета используется итерационный алгоритм на основе преобразования
Ландена.<BR>
\param[in] u Указатель на массив вектора переменной \f$ u \f$.<BR>
\param[in] u Указатель на массив вектора переменной \f$ u \f$.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] n Размер вектора `u`. <BR><BR>
\param[in] k Значение эллиптического модуля \f$ k \f$.<BR>
\param[in] n Размер вектора `u`. <BR><BR>
\param[in] k Значение эллиптического модуля \f$ k \f$.<BR>
Эллиптический модуль -- вещественный параметр,
принимающий значения от 0 до 1. <BR><BR>
\param[out] y Указатель на вектор значений эллиптической
функции \f$ y = \textrm{sn}(u K(k), k)\f$.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Расчет произведен успешно.<BR>
В противном случае
@ -457,8 +453,7 @@ k_i =
\author
Бахурин Сергей
www.dsplib.org
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -1,65 +1,68 @@
/*! *************************************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int linspace(double x0, double x1, int n, int type, double* x)
\brief Функция заполняет массив линейно-нарастающими, равноотстоящими значениями
от `x0` до `x1`
Заполняет массив `x` длиной `n` значениями в диапазоне от \f$x_0\f$ до \f$x_1\f$.
Функция поддерживает два типа заполнения в соответствии с параметром `type`:<BR>
Симметричное заполнение согласно выражению (параметр `type=DSPL_SYMMETRIC`):<BR>
\f$x(k) = x_0 + k \cdot dx\f$, here \f$dx = \frac{x_1 - x_0}{n-1}\f$, \f$k = 0 \ldots n-1.\f$
Периодическое заполнение (параметр `type=DSPL_PERIODIC`) согласно выражению:<BR>
\f$x(k) = x_0 + k \cdot dx\f$, here \f$dx = \frac{x_1 - x_0}{n}\f$, \f$k = 0 \ldots n-1.\f$
\param[in] x0 Начальное показателя \f$x_0\f$.<BR><BR>
\param[in] x1 Конечное значение \f$x_1\f$.<BR><BR>
\param[in] n Количество точек массива `x`.<BR><BR>
\param[in] type Тип заполнения:<BR>
`DSPL_SYMMETRIC` - симметричное заполнение,<BR>
`DSPL_PERIODIC` - периодическое заполнение.<BR><BR>
\param[in,out] x Указатель на вектор равноотстоящих значений .<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` - функция выполнена успешно. <BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
linspace(0, 5, 5, DSPL_PERIODIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0, 1, 2, 3, 4
\endcode
<BR><BR>
Пример 2. Симметричное заполнение.
\code
double x[5];
linspace(0, 5, 5, DSPL_SYMMETRIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0, 1.25, 2.5, 3.75, 5
\endcode
\author
Бахурин Сергей.
www.dsplib.org
/*! ****************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int linspace(double x0, double x1, int n, int type, double* x)
\brief Функция заполняет массив линейно-нарастающими,
равноотстоящими значениями от `x0` до `x1`
**************************************************************************************************** */
Заполняет массив `x` длиной `n` значениями в диапазоне
от \f$x_0\f$ до \f$x_1\f$. Функция поддерживает два типа заполнения
в соответствии с параметром `type`:<BR>
Симметричное заполнение согласно выражению (параметр `type=DSPL_SYMMETRIC`):<BR>
\f$x(k) = x_0 + k \cdot dx\f$,
\f$dx = \frac{x_1 - x_0}{n-1}\f$, \f$k = 0 \ldots n-1.\f$
Периодическое заполнение (параметр `type=DSPL_PERIODIC`) согласно выражению:<BR>
\f$x(k) = x_0 + k \cdot dx\f$,
\f$dx = \frac{x_1 - x_0}{n}\f$, \f$k = 0 \ldots n-1.\f$
\param[in] x0 Начальное показателя \f$x_0\f$.<BR><BR>
\param[in] x1 Конечное значение \f$x_1\f$.<BR><BR>
\param[in] n Количество точек массива `x`.<BR><BR>
\param[in] type Тип заполнения:<BR>
`DSPL_SYMMETRIC` - симметричное заполнение,<BR>
`DSPL_PERIODIC` - периодическое заполнение.<BR><BR>
\param[in,out] x Указатель на вектор равноотстоящих значений .<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` - функция выполнена успешно. <BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно
понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
linspace(0, 5, 5, DSPL_PERIODIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0, 1, 2, 3, 4
\endcode
<BR><BR>
Пример 2. Симметричное заполнение.
\code
double x[5];
linspace(0, 5, 5, DSPL_SYMMETRIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0, 1.25, 2.5, 3.75, 5
\endcode
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */
@ -67,67 +70,68 @@
/*! *************************************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int logspace(double x0, double x1, int n, int type, double* x)
\brief Функция заполняет массив значениями логарифмической шкале
Заполняет массив `x` длиной `n` значениями в диапазоне от \f$10^{x_0}\f$ до \f$10^{x_1}\f$.<BR>
Функция поддерживает два типа заполнения в соответствии с параметром `type`:<BR>
Симметричное заполнение согласно выражению:<BR>
\f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n-1]{10^{x_1 - x_0}}\f$,
\f$k = 0 \ldots n-1.\f$
Периодическое заполнение согласно выражению:
\f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n]{10^{x_1 - x_0}}\f$,
\f$k = 0 \ldots n-1.\f$<BR>
\param[in] x0 Начальное значение показателя \f$x_0\f$.<BR><BR>
\param[in] x1 Конечное значение показателя \f$x_1\f$.<BR><BR>
\param[in] n Количество точек массива `x`.<BR><BR>
\param[in] type Тип заполнения:<BR>
`DSPL_SYMMETRIC` - симметричное заполнение,<BR>
`DSPL_PERIODIC` - периодическое заполнение.<BR><BR>
\param[in,out] x Указатель на вектор значений в логарифмической шкале.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` - функция выполнена успешно. <BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
logspace(-2, 3, 5, DSPL_PERIODIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0.01, 0.1, 1, 10, 100
\endcode
<BR><BR>
Пример 2. Симметричное заполнение.
\code
double x[5];
logspace(-2, 3, 5, DSPL_SYMMETRIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0.01 0.178 3.162 56.234 1000
\endcode
\author
Бахурин Сергей.
www.dsplib.org
/*! ****************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int logspace(double x0, double x1, int n, int type, double* x)
\brief Функция заполняет массив значениями логарифмической шкале
**************************************************************************************************** */
Заполняет массив `x` длиной `n` значениями в диапазоне
от \f$10^{x_0}\f$ до \f$10^{x_1}\f$.<BR>
Функция поддерживает два типа заполнения в соответствии с параметром `type`:<BR>
Симметричное заполнение согласно выражению:<BR>
\f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n-1]{10^{x_1 - x_0}}\f$,
\f$k = 0 \ldots n-1.\f$
Периодическое заполнение согласно выражению:
\f$x(k) = 10^{x_0} \cdot dx^k\f$, где \f$dx = \sqrt[n]{10^{x_1 - x_0}}\f$,
\f$k = 0 \ldots n-1.\f$<BR>
\param[in] x0 Начальное значение показателя \f$x_0\f$.<BR><BR>
\param[in] x1 Конечное значение показателя \f$x_1\f$.<BR><BR>
\param[in] n Количество точек массива `x`.<BR><BR>
\param[in] type Тип заполнения:<BR>
`DSPL_SYMMETRIC` - симметричное заполнение,<BR>
`DSPL_PERIODIC` - периодическое заполнение.<BR><BR>
\param[in,out] x Указатель на вектор значений в логарифмической шкале.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` - функция выполнена успешно. <BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно
понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
logspace(-2, 3, 5, DSPL_PERIODIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0.01, 0.1, 1, 10, 100
\endcode
<BR><BR>
Пример 2. Симметричное заполнение.
\code
double x[5];
logspace(-2, 3, 5, DSPL_SYMMETRIC, x);
\endcode
В массиве `x` будут лежать значения:
\code
0.01 0.178 3.162 56.234 1000
\endcode
\author
Бахурин Сергей.
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -1,7 +1,7 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
double* beta, double* alpha)
double* beta, double* alpha)
\brief Частотное преобразование ФНЧ-ФВЧ
Функция производит перобразование передаточной функции \f$ H(s) \f$
@ -11,48 +11,46 @@
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
заграждения и порядок фильтра остаются неизменными.
\param[in] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] ord Порядок исходного фильтра и
фильтра после переобразования.<BR><BR>
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
\param[in] w1 Требуемая частота среза ФВЧ
после преобразования.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФВЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] ord Порядок исходного фильтра и
фильтра после переобразования.<BR><BR>
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
\param[in] w1 Требуемая частота среза ФВЧ
после преобразования.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФВЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
передаточной функции \f$F(s)\f$
аналогового ФВЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
передаточной функции \f$F(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
***************************************************************************** */
@ -64,7 +62,7 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
double* beta, double* alpha)
double* beta, double* alpha)
\brief Частотное преобразование ФНЧ-ФНЧ
Функция производит перобразование передаточной функции \f$ H(s) \f$
@ -74,48 +72,45 @@
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
заграждения и порядок фильтра остаются неизменными.
\param[in] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] b Указатель на вектор коэффициентов
числителя передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] ord Порядок исходного фильтра и
фильтра после переобразования.<BR><BR>
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
\param[in] w1 Требуемая частота среза ФНЧ
после преобразования.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
передаточной функции \f$H(s)\f$
исходного аналогового ФНЧ.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФНЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] ord Порядок исходного фильтра и
фильтра после переобразования.<BR><BR>
\param[in] w0 Частота среза исходного ФНЧ.<BR><BR>
\param[in] w1 Требуемая частота среза ФНЧ
после преобразования.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФНЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
передаточной функции \f$F(s)\f$
аналогового ФНЧ после преобразования.<BR>
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
передаточной функции \f$F(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
***************************************************************************** */
@ -128,9 +123,9 @@
/*! ****************************************************************************
\ingroup IIR_FILTER_DESIGN_GROUP
\fn int ratcompos( double* b, double* a, int n,
double* c, double* d, int p,
double* beta, double* alpha)
\fn int ratcompos( double* b, double* a, int n,
double* c, double* d, int p,
double* beta, double* alpha)
\brief Рациональная композиця
Функция рассчитывает композицию вида \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, где
@ -146,51 +141,49 @@ Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}{\sum\limits_{k = 0}^{n p} \
а также для билинейного преобразования передаточных характеристик аналоговых
фильтров в соответствующие передаточные характеристики цифровых фильтров.
\param[in] b Указатель на вектор коэффициентов
числителя функции \f$H(s)\f$.<BR>
Размер вектора `[n+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] b Указатель на вектор коэффициентов
числителя функции \f$H(s)\f$.<BR>
Размер вектора `[n+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
функции \f$H(s)\f$.<BR>
Размер вектора `[n+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] n Порядок полиномов рациональной
функции \f$H(s)\f$.<BR><BR>
\param[in] c Указатель на вектор коэффициентов
числителя функции \f$F(s)\f$.<BR>
Размер вектора `[p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] d Указатель на вектор коэффициентов знаменателя
функции \f$F(s)\f$.<BR>
Размер вектора `[p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] p Порядок полиномов рациональной
функции \f$F(s)\f$.<BR><BR>
\param[in] a Указатель на вектор коэффициентов знаменателя
функции \f$H(s)\f$.<BR>
Размер вектора `[n+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
Размер вектора `[n*p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] n Порядок полиномов рациональной
функции \f$H(s)\f$.<BR><BR>
\param[in] c Указатель на вектор коэффициентов
числителя функции \f$F(s)\f$.<BR>
Размер вектора `[p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] d Указатель на вектор коэффициентов знаменателя
функции \f$F(s)\f$.<BR>
Размер вектора `[p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in] p Порядок полиномов рациональной
функции \f$F(s)\f$.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
Размер вектора `[n*p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
Размер вектора `[n*p+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\param[in,out] alpha Указатель на вектор коэффициентов знаменателя
функции \f$Y(s) = (H \circ F)(s)\f$.<BR>
Размер вектора `[n*p+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
***************************************************************************** */

Wyświetl plik

@ -26,7 +26,7 @@
/******************************************************************************
Concntenate arrays
Concatenate arrays
*******************************************************************************/
int DSPL_API concat(void* a, size_t na, void *b, size_t nb, void* c)
{
@ -103,6 +103,8 @@ int DSPL_API decimate_cmplx(complex_t* x, int n, int dec,
return RES_OK;
}
/******************************************************************************
Find max(|a|)
*******************************************************************************/
@ -132,6 +134,7 @@ int DSPL_API find_max_abs(double* a, int n, double* m, int* ind)
}
/******************************************************************************
Flip real array in place
*******************************************************************************/

Wyświetl plik

@ -280,6 +280,38 @@ exit_label:
/******************************************************************************
* Analog Normalized Chebyshev type 2 filter with wp = 1 rad/s
******************************************************************************/
int DSPL_API cheby2_ap_wp1(double rp, double rs, int ord, double* b, double* a)
{
int err;
double es, gp, alpha, beta, y, wp;
if(rp <= 0)
return ERROR_FILTER_RP;
err = cheby2_ap(rs, ord, b, a);
if(err!=RES_OK)
goto exit_label;
es = sqrt(pow(10.0, rs*0.1) - 1.0);
gp = pow(10.0, -rp*0.05);
alpha = gp * es / sqrt(1.0 - gp*gp);
beta = alpha + sqrt(alpha * alpha - 1.0);
y = log(beta)/ (double)ord;
wp = 2.0 / (exp(y) + exp(-y));
err = low2low(b, a, ord, wp, 1.0, b, a);
exit_label:
return err;
}
/******************************************************************************
Analog Normalized Chebyshev type 2 filter zeros and poles
*******************************************************************************/

Wyświetl plik

@ -58,7 +58,7 @@ int fir_linphase_lpf(int ord, double wp, int wintype,
error_proc:
if(w)
free(w);
return err;
return err;
}
@ -94,7 +94,7 @@ int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
{
// LPF filter frequency inversion
for(n = 0; n < ord+1; n+=2)
h[n] = -h[n];
h[n] = -h[n];
}
break;
@ -147,7 +147,7 @@ int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
err = fir_linphase(ord, w1, 0.0, DSPL_FILTER_HPF, wintype, winparam, h);
if(err==RES_OK)
{
// Bandstop filter is sum of lowpass nad highpass filters
// Bandstop filter is sum of lowpass and highpass filters
for(n = 0; n < ord+1; n++)
h[n] += h0[n];
}

Wyświetl plik

@ -148,7 +148,7 @@ int iir_ap(double rp, double rs, int ord, int type, double* b, double* a)
err = cheby1_ap(rp, ord, b, a);
break;
case DSPL_FILTER_CHEBY2:
err = cheby2_ap(rs, ord, b, a);
err = cheby2_ap_wp1(rp, rs, ord, b, a);
break;
case DSPL_FILTER_ELLIP:
err = ellip_ap(rp, rs, ord, b, a);

Wyświetl plik

@ -26,8 +26,6 @@
/*******************************************************************************
matrix_create
*******************************************************************************/
@ -59,6 +57,7 @@ int DSPL_API matrix_create(matrix_t* a, int n, int m, int type)
}
/*******************************************************************************
matrix_create eye
*******************************************************************************/

Wyświetl plik

@ -6,7 +6,7 @@
// Порядок фильтра
#define ORD 5
// размер векторов частотной характериситки фильтра
// размер векторов частотной характеристики фильтра
#define N 1000
@ -15,7 +15,7 @@ int main()
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
double a[ORD+1], b[ORD+1]; // коэффицинеты H(s)
double a[ORD+1], b[ORD+1]; // коэффициенты H(s)
double rs = 60.0; // неравномерность в полосе пропускания 3дБ
double rp = 1.0;
// Частота (w), АЧХ (mag), ФЧХ (phi) и ГВЗ (tau)
@ -24,7 +24,7 @@ int main()
// рассчитываем цифровой ФНЧ Чебышева 2 рода
int res = iir(rp, rs, ORD, 0.3, 0.0,
DSPL_FILTER_CHEBY1 | DSPL_FILTER_LPF, b, a);
DSPL_FILTER_CHEBY2 | DSPL_FILTER_LPF, b, a);
if(res != RES_OK)
printf("error code = 0x%8x\n", res);

Wyświetl plik

@ -5,46 +5,46 @@
int main()
{
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
void* handle; // DSPL handle
handle = dspl_load(); // Load DSPL function
matrix_t a, b, c;
matrix_t a, b, c;
memset(&a, 0, sizeof(matrix_t));
memset(&b, 0, sizeof(matrix_t));
memset(&c, 0, sizeof(matrix_t));
memset(&a, 0, sizeof(matrix_t));
memset(&b, 0, sizeof(matrix_t));
memset(&c, 0, sizeof(matrix_t));
matrix_create(&a, 4, 3, DAT_DOUBLE);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)a.dat);
matrix_print(&a, "A", "%8.2f");
matrix_create(&a, 4, 3, DAT_DOUBLE);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)a.dat);
matrix_print(&a, "A", "%8.2f");
matrix_transpose(&a, &b);
matrix_print(&b, "B=A^T", "%8.2f");
matrix_transpose(&a, &b);
matrix_print(&b, "B=A^T", "%8.2f");
matrix_transpose_hermite(&a, &b);
matrix_print(&b, "B=A^H", "%8.2f");
matrix_transpose_hermite(&a, &b);
matrix_print(&b, "B=A^H", "%8.2f");
matrix_create(&c, 2, 3, DAT_COMPLEX);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)c.dat);
matrix_print(&c, "C", "%8.2f%+8.2fj ");
matrix_create(&c, 2, 3, DAT_COMPLEX);
linspace(0, 12, 12, DSPL_PERIODIC, (double*)c.dat);
matrix_print(&c, "C", "%8.2f%+8.2fj ");
matrix_transpose(&c, &b);
matrix_print(&b, "B=C^T", "%8.2f%+8.2fj ");
matrix_transpose(&c, &b);
matrix_print(&b, "B=C^T", "%8.2f%+8.2fj ");
matrix_transpose_hermite(&c, &b);
matrix_print(&b, "B=C^H", "%8.2f%+8.2fj ");
matrix_transpose_hermite(&c, &b);
matrix_print(&b, "B=C^H", "%8.2f%+8.2fj ");
matrix_free(&a);
matrix_free(&b);
matrix_free(&c);
dspl_free(handle); // free dspl handle
matrix_free(&a);
matrix_free(&b);
matrix_free(&c);
dspl_free(handle); // free dspl handle
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot gnuplot/sinc_test.plt");;
// выполнить скрипт GNUPLOT для построения графиков
// по рассчитанным данным
return system("gnuplot gnuplot/sinc_test.plt");;
}

Wyświetl plik

@ -46,6 +46,7 @@ p_cheby_poly2 cheby_poly2 ;
p_cheby1_ap cheby1_ap ;
p_cheby1_ap_zp cheby1_ap_zp ;
p_cheby2_ap cheby2_ap ;
p_cheby2_ap_wp1 cheby2_ap_wp1 ;
p_cheby2_ap_zp cheby2_ap_zp ;
p_cmplx2re cmplx2re ;
p_concat concat ;
@ -207,6 +208,7 @@ void* dspl_load()
LOAD_FUNC(cheby1_ap);
LOAD_FUNC(cheby1_ap_zp);
LOAD_FUNC(cheby2_ap);
LOAD_FUNC(cheby2_ap_wp1);
LOAD_FUNC(cheby2_ap_zp);
LOAD_FUNC(cmplx2re);
LOAD_FUNC(concat);

Wyświetl plik

@ -308,6 +308,12 @@ DECLARE_FUNC(int, cheby2_ap, double rs
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, cheby2_ap_wp1, double rp
COMMA double rs
COMMA int ord
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, cheby2_ap_zp, int
COMMA double
COMMA complex_t*

Wyświetl plik

@ -46,6 +46,7 @@ p_cheby_poly2 cheby_poly2 ;
p_cheby1_ap cheby1_ap ;
p_cheby1_ap_zp cheby1_ap_zp ;
p_cheby2_ap cheby2_ap ;
p_cheby2_ap_wp1 cheby2_ap_wp1 ;
p_cheby2_ap_zp cheby2_ap_zp ;
p_cmplx2re cmplx2re ;
p_concat concat ;
@ -207,6 +208,7 @@ void* dspl_load()
LOAD_FUNC(cheby1_ap);
LOAD_FUNC(cheby1_ap_zp);
LOAD_FUNC(cheby2_ap);
LOAD_FUNC(cheby2_ap_wp1);
LOAD_FUNC(cheby2_ap_zp);
LOAD_FUNC(cmplx2re);
LOAD_FUNC(concat);

Wyświetl plik

@ -308,6 +308,12 @@ DECLARE_FUNC(int, cheby2_ap, double rs
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, cheby2_ap_wp1, double rp
COMMA double rs
COMMA int ord
COMMA double* b
COMMA double* a);
//------------------------------------------------------------------------------
DECLARE_FUNC(int, cheby2_ap_zp, int
COMMA double
COMMA complex_t*