kopia lustrzana https://github.com/Dsplib/libdspl-2.0
commit
rodzic
5da9d064a1
commit
2c1704d505
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
||||
************************************************************************************************** */
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
**************************************************************************************************** */
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
|
@ -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
|
||||
Бахурин Сергей
|
||||
|
|
|
@ -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
|
||||
*******************************************************************************/
|
||||
|
|
|
@ -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
|
||||
*******************************************************************************/
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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