kopia lustrzana https://github.com/Dsplib/libdspl-2.0
merged 2 versions
commit
e09b960286
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
|
||||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
|
||||
|
||||
|
||||
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
|
||||
Размер вектора `[na x 1]`.<BR><BR>
|
||||
|
||||
|
@ -36,7 +35,6 @@ www.dsplib.org
|
|||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
|
||||
|
@ -45,6 +43,7 @@ www.dsplib.org
|
|||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
|
||||
|
||||
|
||||
|
||||
\param[in] a Указатель на первый вектор \f$a\f$.<BR>
|
||||
Размер вектора `[na x 1]`.<BR><BR>
|
||||
|
||||
|
@ -69,12 +68,6 @@ www.dsplib.org
|
|||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
|
||||
|
@ -87,6 +80,7 @@ www.dsplib.org
|
|||
\f]
|
||||
где \f$a_0\f$ не может быть 0, \f$N=M=\f$`ord`.
|
||||
|
||||
|
||||
\param[in] b Указатель на вектор коэффициентов числителя
|
||||
передаточной функции БИХ-фильтра.<BR>
|
||||
Размер вектора `[ord + 1 x 1]`.<BR><BR>
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
|
@ -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
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
|
@ -146,6 +146,8 @@ int DSPL_API decimate_cmplx(complex_t* x, int n, int dec,
|
|||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Find max(|a|)
|
||||
*******************************************************************************/
|
||||
|
@ -175,6 +177,7 @@ int DSPL_API find_max_abs(double* a, int n, double* m, int* ind)
|
|||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Flip real array in place
|
||||
*******************************************************************************/
|
||||
|
|
|
@ -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
|
||||
*******************************************************************************/
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -196,7 +196,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);
|
||||
|
|
|
@ -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
|
||||
*******************************************************************************/
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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*
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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*
|
||||
|
|
Ładowanie…
Reference in New Issue