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

@ -20,7 +20,6 @@
Для удобства работы с комплексными числами реализованы
специальные макросы: \ref RE, \ref IM, \ref ABSSQR
***************************************************************************** */
@ -36,7 +35,7 @@
\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.

Wyświetl plik

@ -1,5 +1,5 @@
/*! **************************************************************************************************
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv(double* a, int na, double* b, int nb, double* c)
\brief Линейная свертка двух вещественных векторов
@ -15,21 +15,20 @@
\param[in] b Указатель на второй вектор \f$b\f$.<BR>
Размер вектора `[nb x 1]`.<BR><BR>
\param[in] nb азмер второго вектора.<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>
`RES_OK` если свертка рассчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\author
Бахурин Сергей
www.dsplib.org
**************************************************************************************************** */
***************************************************************************** */
@ -38,7 +37,7 @@
/*! **************************************************************************************************
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
\brief Линейная свертка двух комплексных векторов
@ -61,14 +60,13 @@
Память должна быть выделена.<BR><BR>
\return
`RES_OK` если свертка расчитана успешно.<BR>
`RES_OK` если свертка рассчитана успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\author
Бахурин Сергей
www.dsplib.org
*************************************************************************************************** */
***************************************************************************** */
@ -77,7 +75,7 @@
/*! **************************************************************************************************
/*! ****************************************************************************
\ingroup FILTER_CONV_GROUP
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
\brief Фильтрация вещественного сигнала вещественным БИХ-фильтром
@ -113,14 +111,13 @@
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена заранее.<BR><BR>
\return
`RES_OK` Если фильтрация произведена успешно.<BR>
`RES_OK` если фильтрация произведена успешно.<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки":<BR>
\author
Бахурин Сергей
www.dsplib.org
************************************************************************************************** */
***************************************************************************** */

Wyświetl plik

@ -432,7 +432,6 @@ k_i =
Для расчета используется итерационный алгоритм на основе преобразования
Ландена.<BR>
\param[in] u Указатель на массив вектора переменной \f$ u \f$.<BR>
Размер вектора `[n x 1]`.<BR>
Память должна быть выделена.<BR><BR>
@ -443,13 +442,10 @@ k_i =
Эллиптический модуль -- вещественный параметр,
принимающий значения от 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>
В противном случае
@ -458,7 +454,6 @@ k_i =
\author
Бахурин Сергей
www.dsplib.org
***************************************************************************** */

Wyświetl plik

@ -1,19 +1,22 @@
/*! *************************************************************************************************
/*! ****************************************************************************
\ingroup SPEC_MATH_COMMON_GROUP
\fn int linspace(double x0, double x1, int n, int type, double* x)
\brief Функция заполняет массив линейно-нарастающими, равноотстоящими значениями
от `x0` до `x1`
\brief Функция заполняет массив линейно-нарастающими,
равноотстоящими значениями от `x0` до `x1`
Заполняет массив `x` длиной `n` значениями в диапазоне от \f$x_0\f$ до \f$x_1\f$.
Функция поддерживает два типа заполнения в соответствии с параметром `type`:<BR>
Заполняет массив `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$
\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$, here \f$dx = \frac{x_1 - x_0}{n}\f$, \f$k = 0 \ldots n-1.\f$
\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>
@ -34,7 +37,8 @@
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно понять из следующих примеров. <BR>
Отличие периодического и симметричного заполнения можно
понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
@ -58,8 +62,7 @@
\author
Бахурин Сергей.
www.dsplib.org
**************************************************************************************************** */
***************************************************************************** */
@ -67,12 +70,13 @@
/*! *************************************************************************************************
/*! ****************************************************************************
\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>
Заполняет массив `x` длиной `n` значениями в диапазоне
от \f$10^{x_0}\f$ до \f$10^{x_1}\f$.<BR>
Функция поддерживает два типа заполнения в соответствии с параметром `type`:<BR>
Симметричное заполнение согласно выражению:<BR>
@ -104,7 +108,8 @@
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
\note
Отличие периодического и симметричного заполнения можно понять из следующих примеров. <BR>
Отличие периодического и симметричного заполнения можно
понять из следующих примеров. <BR>
Пример 1. Периодическое заполнение.
\code
double x[5];
@ -128,6 +133,5 @@
\author
Бахурин Сергей.
www.dsplib.org
**************************************************************************************************** */
***************************************************************************** */

Wyświetl plik

@ -31,7 +31,6 @@
\param[in] w1 Требуемая частота среза ФВЧ
после преобразования.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФВЧ после преобразования.<BR>
@ -47,8 +46,7 @@
\return
`RES_OK` Преоборазование расчитано успешно.<BR><BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
@ -94,7 +92,6 @@
\param[in] w1 Требуемая частота среза ФНЧ
после преобразования.<BR><BR>
\param[in,out] beta Указатель на вектор коэффициентов
числителя передаточной функции \f$F(s)\f$
ФНЧ после преобразования.<BR>
@ -107,11 +104,9 @@
Размер вектора `[ord+1 x 1]`.<BR>
Память должна быть выделена.<BR><BR>
\return
`RES_OK` Преоборазование расчитано успешно.<BR><BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей
@ -159,7 +154,6 @@ Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}{\sum\limits_{k = 0}^{n p} \
\param[in] n Порядок полиномов рациональной
функции \f$H(s)\f$.<BR><BR>
\param[in] c Указатель на вектор коэффициентов
числителя функции \f$F(s)\f$.<BR>
Размер вектора `[p+1 x 1]`.<BR>
@ -186,8 +180,7 @@ Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}{\sum\limits_{k = 0}^{n p} \
\return
`RES_OK` Рациональная композиция рассчитана успешно.<BR><BR>
В противном случае
\ref ERROR_CODE_GROUP "код ошибки".<BR>
В противном случае \ref ERROR_CODE_GROUP "код ошибки".<BR>
\author
Бахурин Сергей

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

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

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