kopia lustrzana https://github.com/Dsplib/libdspl-2.0
added some docs for ellipj
rodzic
d732d5709c
commit
7a66faf4e0
|
@ -28,23 +28,51 @@ long_line_behaviour=1
|
||||||
long_line_column=72
|
long_line_column=72
|
||||||
|
|
||||||
[files]
|
[files]
|
||||||
current_page=14
|
current_page=43
|
||||||
FILE_NAME_0=360;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Ccheby_poly1_test.c;0;2
|
FILE_NAME_0=463;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Ccheby_poly1_test.c;0;2
|
||||||
FILE_NAME_1=507;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Ciir_test.c;0;2
|
FILE_NAME_1=507;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Ciir_test.c;0;2
|
||||||
FILE_NAME_2=80;None;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Cbin%5Cgnuplot%5Ciir_test.plt;0;2
|
FILE_NAME_2=80;None;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Cbin%5Cgnuplot%5Ciir_test.plt;0;2
|
||||||
FILE_NAME_3=1097;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_dirichlet_ex.c;0;2
|
FILE_NAME_3=1097;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_dirichlet_ex.c;0;2
|
||||||
FILE_NAME_4=2672;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_pimp_spectrum.c;0;2
|
FILE_NAME_4=2672;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_pimp_spectrum.c;0;2
|
||||||
FILE_NAME_5=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_rec.c;0;2
|
FILE_NAME_5=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Cru%5Ccontent%5Cfourier_series%5Cc%5Cfourier_series_rec.c;0;2
|
||||||
FILE_NAME_6=12457;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Carray.c;0;2
|
FILE_NAME_6=714;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Carray.c;0;2
|
||||||
FILE_NAME_7=28861;C++;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cblas.h;0;2
|
FILE_NAME_7=163;C++;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cblas.h;0;2
|
||||||
FILE_NAME_8=42098;C++;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cinclude%5Cdspl.h;0;2
|
FILE_NAME_8=56628;C++;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cinclude%5Cdspl.h;0;2
|
||||||
FILE_NAME_9=12508;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cinclude%5Cdspl.c;0;2
|
FILE_NAME_9=14081;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cinclude%5Cdspl.c;0;2
|
||||||
FILE_NAME_10=323;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Carray_test.c;0;2
|
FILE_NAME_10=323;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Carray_test.c;0;2
|
||||||
FILE_NAME_11=1012;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cmatrix.c;0;2
|
FILE_NAME_11=921;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cmatrix.c;0;2
|
||||||
FILE_NAME_12=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_print.c;0;2
|
FILE_NAME_12=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_print.c;0;2
|
||||||
FILE_NAME_13=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_transpose.c;0;2
|
FILE_NAME_13=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_transpose.c;0;2
|
||||||
FILE_NAME_14=131;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_mul.c;0;2
|
FILE_NAME_14=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_mul.c;0;2
|
||||||
FILE_NAME_15=523;Make;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5CMakefile.dspl;0;2
|
FILE_NAME_15=523;Make;0;EUTF-8;1;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5CMakefile.dspl;0;2
|
||||||
|
FILE_NAME_16=630;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cexamples%5Csrc%5Cmatrix_eig.c;0;2
|
||||||
|
FILE_NAME_17=47;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Ccheby.c;0;2
|
||||||
|
FILE_NAME_18=5878;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Ccomplex.c;0;2
|
||||||
|
FILE_NAME_19=17821;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cconv.c;0;2
|
||||||
|
FILE_NAME_20=8338;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cdft.c;0;2
|
||||||
|
FILE_NAME_21=8117;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cellipj.c;0;2
|
||||||
|
FILE_NAME_22=9969;None;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_dox%5Cru%5Cellipj.dox;0;2
|
||||||
|
FILE_NAME_23=909;None;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_dox%5Cru%5Carray.dox;0;2
|
||||||
|
FILE_NAME_24=1074;C++;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cdspl_internal.h;0;2
|
||||||
|
FILE_NAME_25=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfft.c;0;2
|
||||||
|
FILE_NAME_26=11081;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfft_subkernel.c;0;2
|
||||||
|
FILE_NAME_27=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfillarray.c;0;2
|
||||||
|
FILE_NAME_28=11043;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfilter_an.c;0;2
|
||||||
|
FILE_NAME_29=872;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfilter_ap.c;0;2
|
||||||
|
FILE_NAME_30=4563;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfilter_fir.c;0;2
|
||||||
|
FILE_NAME_31=888;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfilter_ft.c;0;2
|
||||||
|
FILE_NAME_32=5440;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfilter_iir.c;0;2
|
||||||
|
FILE_NAME_33=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cfourier_series.c;0;2
|
||||||
|
FILE_NAME_34=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cgoertzel.c;0;2
|
||||||
|
FILE_NAME_35=1042;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cinout.c;0;2
|
||||||
|
FILE_NAME_36=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cmath.c;0;2
|
||||||
|
FILE_NAME_37=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cpolyval.c;0;2
|
||||||
|
FILE_NAME_38=3428;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Crandgen.c;0;2
|
||||||
|
FILE_NAME_39=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cresampling.c;0;2
|
||||||
|
FILE_NAME_40=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Csignals.c;0;2
|
||||||
|
FILE_NAME_41=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cstatistic.c;0;2
|
||||||
|
FILE_NAME_42=0;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Ctrapint.c;0;2
|
||||||
|
FILE_NAME_43=9115;C;0;EUTF-8;0;1;0;F%3A%5Cdsplib.org%5Clibdspl-2.0%5Cdspl%5Cdspl_src%5Cwin.c;0;2
|
||||||
|
|
||||||
[build-menu]
|
[build-menu]
|
||||||
NF_00_LB=_Собрать
|
NF_00_LB=_Собрать
|
||||||
|
|
|
@ -440,30 +440,6 @@ int DSPL_API flipip_cmplx(complex_t* x, int n)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Vector dot product
|
|
||||||
******************************************************************************/
|
|
||||||
int DSPL_API vector_dot(double* x, double* y, int n, double* p)
|
|
||||||
{
|
|
||||||
int inc = 1;
|
|
||||||
|
|
||||||
if(!x || !y || !p)
|
|
||||||
return ERROR_PTR;
|
|
||||||
if(n<1)
|
|
||||||
return ERROR_SIZE;
|
|
||||||
|
|
||||||
*p = ddot_(&n, x, &inc, y, &inc);
|
|
||||||
|
|
||||||
return RES_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
\ingroup SPEC_MATH_COMMON_GROUP
|
\ingroup SPEC_MATH_COMMON_GROUP
|
||||||
\fn int verif(double* x, double* y, size_t n, double eps, double* err)
|
\fn int verif(double* x, double* y, size_t n, double eps, double* err)
|
||||||
|
|
|
@ -159,14 +159,14 @@ int DSPL_API asin_cmplx(complex_t* x, int n, complex_t *y)
|
||||||
|
|
||||||
for(k = 0; k < n; k++)
|
for(k = 0; k < n; k++)
|
||||||
{
|
{
|
||||||
RE(tmp) = 1.0 - CMRE(x[k], x[k]); // 1-x[k]^2
|
RE(tmp) = 1.0 - CMRE(x[k], x[k]); /* 1-x[k]^2 */
|
||||||
IM(tmp) = - CMIM(x[k], x[k]); // 1-x[k]^2
|
IM(tmp) = - CMIM(x[k], x[k]); /* 1-x[k]^2 */
|
||||||
sqrt_cmplx(&tmp, 1, y+k); // sqrt(1 - x[k]^2)
|
sqrt_cmplx(&tmp, 1, y+k); /* sqrt(1 - x[k]^2) */
|
||||||
RE(y[k]) -= IM(x[k]); // j * x[k] + sqrt(1 - x[k]^2)
|
RE(y[k]) -= IM(x[k]); /* j * x[k] + sqrt(1 - x[k]^2) */
|
||||||
IM(y[k]) += RE(x[k]); // j * x[k] + sqrt(1 - x[k]^2)
|
IM(y[k]) += RE(x[k]); /* j * x[k] + sqrt(1 - x[k]^2) */
|
||||||
log_cmplx(y+k, 1, &tmp); // log( j * x[k] + sqrt(1 - x[k]^2) )
|
log_cmplx(y+k, 1, &tmp); /* log( j * x[k] + sqrt(1 - x[k]^2) ) */
|
||||||
RE(y[k]) = IM(tmp); // -j * log( j * x[k] + sqrt(1 - x[k]^2) )
|
RE(y[k]) = IM(tmp); /* -j * log( j * x[k] + sqrt(1 - x[k]^2) ) */
|
||||||
IM(y[k]) = -RE(tmp); // -j * log( j * x[k] + sqrt(1 - x[k]^2) )
|
IM(y[k]) = -RE(tmp); /* -j * log( j * x[k] + sqrt(1 - x[k]^2) ) */
|
||||||
}
|
}
|
||||||
return RES_OK;
|
return RES_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#define DSPL_RAND_MOD_X1 2147483647
|
#define DSPL_RAND_MOD_X1 2147483647
|
||||||
#define DSPL_RAND_MOD_X2 2145483479
|
#define DSPL_RAND_MOD_X2 2145483479
|
||||||
|
|
||||||
// sqrt(2^31)
|
/* sqrt(2^31) */
|
||||||
#define FFT_COMPOSITE_MAX 46340
|
#define FFT_COMPOSITE_MAX 46340
|
||||||
|
|
||||||
int fft_krn(complex_t* t0, complex_t* t1, fft_t* p, int n, int addr);
|
int fft_krn(complex_t* t0, complex_t* t1, fft_t* p, int n, int addr);
|
||||||
|
|
|
@ -27,7 +27,35 @@
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* inverse cd function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
\fn int ellip_acd(double* w, int n, double k, double* u)
|
||||||
|
\brief Inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$ of real vector argument
|
||||||
|
|
||||||
|
Function calculates inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$ of real vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] w Pointer to the argument vector \f$ w \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] u Pointer to the vector of inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_acd(double* w, int n, double k, double* u)
|
int DSPL_API ellip_acd(double* w, int n, double k, double* u)
|
||||||
{
|
{
|
||||||
|
@ -64,7 +92,35 @@ int DSPL_API ellip_acd(double* w, int n, double k, double* u)
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* inverse cd function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
\fn int ellip_acd_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
|
\brief Inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$ of complex vector argument
|
||||||
|
|
||||||
|
Function calculates inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$ of complex vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] w Pointer to the argument vector \f$ w \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] u Pointer to the vector of inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{cd}^{-1}(w, k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_acd_cmplx(complex_t* w, int n, double k, complex_t* u)
|
int DSPL_API ellip_acd_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
{
|
{
|
||||||
|
@ -121,7 +177,35 @@ int DSPL_API ellip_acd_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* inverse sn function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
\fn int ellip_asn(double* w, int n, double k, double* u)
|
||||||
|
\brief Inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$ of real vector argument
|
||||||
|
|
||||||
|
Function calculates inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$ of real vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] w Pointer to the argument vector \f$ w \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] u Pointer to the vector of inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_asn(double* w, int n, double k, double* u)
|
int DSPL_API ellip_asn(double* w, int n, double k, double* u)
|
||||||
{
|
{
|
||||||
|
@ -158,7 +242,35 @@ int DSPL_API ellip_asn(double* w, int n, double k, double* u)
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* inverse sn function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
\fn int ellip_asn_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
|
\brief Inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$ of complex vector argument
|
||||||
|
|
||||||
|
Function calculates inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$ of complex vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] w Pointer to the argument vector \f$ w \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `w`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] u Pointer to the vector of inverse Jacobi elliptic function
|
||||||
|
\f$ u = \textrm{sn}^{-1}(w, k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_asn_cmplx(complex_t* w, int n, double k, complex_t* u)
|
int DSPL_API ellip_asn_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
{
|
{
|
||||||
|
@ -213,10 +325,37 @@ int DSPL_API ellip_asn_cmplx(complex_t* w, int n, double k, complex_t* u)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Elliptic cd function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
int ellip_cd(double* u, int n, double k, double* y)
|
||||||
|
\brief Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$ of real vector argument
|
||||||
|
|
||||||
|
Function calculates Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$ of real vector `u` and
|
||||||
|
elliptical modulus `k`. \n
|
||||||
|
|
||||||
|
\param[in] u Pointer to the argument vector \f$ u \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `u`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] y Pointer to the vector of Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_cd(double* u, int n, double k, double* y)
|
int DSPL_API ellip_cd(double* u, int n, double k, double* y)
|
||||||
{
|
{
|
||||||
|
@ -249,8 +388,38 @@ int DSPL_API ellip_cd(double* u, int n, double k, double* y)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Elliptic cd function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
int ellip_cd_cmplx(complex_t* u, int n, double k, complex_t* y)
|
||||||
|
\brief Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$ of complex vector argument
|
||||||
|
|
||||||
|
Function calculates Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$ of complex vector `u` and
|
||||||
|
elliptical modulus `k`. \n
|
||||||
|
|
||||||
|
\param[in] u Pointer to the argument vector \f$ u \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `u`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] y Pointer to the vector of Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{cd}(u K(k), k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_cd_cmplx(complex_t* u, int n, double k, complex_t* y)
|
int DSPL_API ellip_cd_cmplx(complex_t* u, int n, double k, complex_t* y)
|
||||||
{
|
{
|
||||||
|
@ -298,7 +467,80 @@ int DSPL_API ellip_cd_cmplx(complex_t* u, int n, double k, complex_t* y)
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Landen transform
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
\fn int ellip_landen(double k, int n, double* y)
|
||||||
|
\brief Function calculates complete elliptical integral
|
||||||
|
coefficients \f$ k_i \f$
|
||||||
|
|
||||||
|
Complete elliptical integral \f$ K(k) \f$ can be described as:
|
||||||
|
|
||||||
|
\f[
|
||||||
|
K(k) = \frac{\pi}{2} \prod_{i = 1}^{\infty}(1+k_i),
|
||||||
|
\f]
|
||||||
|
|
||||||
|
here \f$ k_i \f$ -- coefficients which calculated
|
||||||
|
iterative from \f$ k_0 = k\f$:
|
||||||
|
|
||||||
|
\f[
|
||||||
|
k_i =
|
||||||
|
\left(
|
||||||
|
\frac{k_{i-1}}
|
||||||
|
{
|
||||||
|
1+\sqrt{1-k_{i-1}^2}
|
||||||
|
}
|
||||||
|
\right)^2
|
||||||
|
\f]
|
||||||
|
|
||||||
|
This function calculates `n` fist coefficients \f$ k_i \f$, which can
|
||||||
|
be used for Complete elliptical integral.
|
||||||
|
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[in] n Number of \f$ k_i \f$ which need to calculate.\n
|
||||||
|
Parameter `n` is size of output vector `y`.\n
|
||||||
|
|
||||||
|
\param[out] y pointer to the real vector which keep \f$ k_i \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` -- successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
\include ellip_landen_test.c
|
||||||
|
|
||||||
|
Result:
|
||||||
|
|
||||||
|
\verbatim
|
||||||
|
i k[i]
|
||||||
|
|
||||||
|
1 4.625e-01
|
||||||
|
2 6.009e-02
|
||||||
|
3 9.042e-04
|
||||||
|
4 2.044e-07
|
||||||
|
5 1.044e-14
|
||||||
|
6 2.727e-29
|
||||||
|
7 1.859e-58
|
||||||
|
8 8.640e-117
|
||||||
|
9 1.866e-233
|
||||||
|
10 0.000e+00
|
||||||
|
11 0.000e+00
|
||||||
|
12 0.000e+00
|
||||||
|
13 0.000e+00
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
\note Complete elliptical integral converges enough fast
|
||||||
|
if modulus \f$ k<1 \f$. There are 10 to 20 coefficients \f$ k_i \f$
|
||||||
|
are sufficient for practical applications
|
||||||
|
to ensure complete elliptic integral precision within EPS.
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_landen(double k, int n, double* y)
|
int DSPL_API ellip_landen(double k, int n, double* y)
|
||||||
{
|
{
|
||||||
|
@ -421,7 +663,36 @@ int DSPL_API ellip_rat(double* w, int n, int ord, double k, double* u)
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Elliptic sn function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
int ellip_sn(double* u, int n, double k, double* y)
|
||||||
|
\brief Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$ of real vector argument
|
||||||
|
|
||||||
|
Function calculates Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$ of real vector `u` and
|
||||||
|
elliptical modulus `k`. \n
|
||||||
|
|
||||||
|
\param[in] u Pointer to the argument vector \f$ u \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `u`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] y Pointer to the vector of Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_sn(double* u, int n, double k, double* y)
|
int DSPL_API ellip_sn(double* u, int n, double k, double* y)
|
||||||
{
|
{
|
||||||
|
@ -450,8 +721,39 @@ int DSPL_API ellip_sn(double* u, int n, double k, double* y)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Elliptic sn function
|
\ingroup SPEC_MATH_ELLIP_GROUP
|
||||||
|
int ellip_sn_cmplx(complex_t* u, int n, double k, complex_t* y)
|
||||||
|
\brief Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$ of complex vector argument
|
||||||
|
|
||||||
|
Function calculates Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$ of complex vector `u` and
|
||||||
|
elliptical modulus `k`. \n
|
||||||
|
|
||||||
|
\param[in] u Pointer to the argument vector \f$ u \f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
\param[in] n Size of vector `u`. \n
|
||||||
|
|
||||||
|
\param[in] k Elliptical modulus \f$ k \f$. \n
|
||||||
|
Elliptical modulus is real parameter,
|
||||||
|
which values can be from 0 to 1. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\param[out] y Pointer to the vector of Jacobi elliptic function
|
||||||
|
\f$ y = \textrm{sn}(u K(k), k)\f$. \n
|
||||||
|
Vector size is `[n x 1]`. \n
|
||||||
|
Memory must be allocated. \n \n
|
||||||
|
|
||||||
|
|
||||||
|
\return
|
||||||
|
`RES_OK` successful exit, else \ref ERROR_CODE_GROUP "error code". \n
|
||||||
|
|
||||||
|
\author Sergey Bakhurin www.dsplib.org
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int DSPL_API ellip_sn_cmplx(complex_t* u, int n, double k, complex_t* y)
|
int DSPL_API ellip_sn_cmplx(complex_t* u, int n, double k, complex_t* y)
|
||||||
{
|
{
|
||||||
|
|
|
@ -190,10 +190,10 @@ void dft7 (complex_t *x, complex_t* y)
|
||||||
RE(sum[4]) = RE(x[4]) - RE(x[3]);
|
RE(sum[4]) = RE(x[4]) - RE(x[3]);
|
||||||
IM(sum[4]) = IM(x[4]) - IM(x[3]);
|
IM(sum[4]) = IM(x[4]) - IM(x[3]);
|
||||||
|
|
||||||
// Winograd paper mistake?!
|
/* Winograd paper mistake?! */
|
||||||
RE(sum[5]) = RE(x[2]) + RE(x[5]);
|
RE(sum[5]) = RE(x[2]) + RE(x[5]);
|
||||||
IM(sum[5]) = IM(x[2]) + IM(x[5]);
|
IM(sum[5]) = IM(x[2]) + IM(x[5]);
|
||||||
// Winograd paper mistake?!
|
/* Winograd paper mistake?! */
|
||||||
RE(sum[6]) = RE(x[2]) - RE(x[5]);
|
RE(sum[6]) = RE(x[2]) - RE(x[5]);
|
||||||
IM(sum[6]) = IM(x[2]) - IM(x[5]);
|
IM(sum[6]) = IM(x[2]) - IM(x[5]);
|
||||||
|
|
||||||
|
@ -330,52 +330,52 @@ void dft16 (complex_t *x, complex_t* y)
|
||||||
dft4(t0+8, t1+8);
|
dft4(t0+8, t1+8);
|
||||||
dft4(t0+12, t1+12);
|
dft4(t0+12, t1+12);
|
||||||
|
|
||||||
//#define DFT16_W1 0.923879532511287
|
/* #define DFT16_W1 0.923879532511287 */
|
||||||
//#define DFT16_W2 0.382683432365090
|
/* #define DFT16_W2 0.382683432365090 */
|
||||||
//#define DFT16_W3 0.707106781186548
|
/* #define DFT16_W3 0.707106781186548 */
|
||||||
|
|
||||||
// 0.923879532511287 - 0.382683432365090i
|
/* 0.923879532511287 - 0.382683432365090i */
|
||||||
tmp = RE(t1[5]) * DFT16_W1 + IM(t1[5]) * DFT16_W2;
|
tmp = RE(t1[5]) * DFT16_W1 + IM(t1[5]) * DFT16_W2;
|
||||||
IM(t1[5]) = -RE(t1[5]) * DFT16_W2 + IM(t1[5]) * DFT16_W1;
|
IM(t1[5]) = -RE(t1[5]) * DFT16_W2 + IM(t1[5]) * DFT16_W1;
|
||||||
RE(t1[5]) = tmp;
|
RE(t1[5]) = tmp;
|
||||||
|
|
||||||
// 0.707106781186548 - 0.707106781186547i
|
/* 0.707106781186548 - 0.707106781186547i */
|
||||||
tmp = ( RE(t1[6]) + IM(t1[6])) * DFT16_W3;
|
tmp = ( RE(t1[6]) + IM(t1[6])) * DFT16_W3;
|
||||||
IM(t1[6]) = (-RE(t1[6]) + IM(t1[6])) * DFT16_W3;
|
IM(t1[6]) = (-RE(t1[6]) + IM(t1[6])) * DFT16_W3;
|
||||||
RE(t1[6]) = tmp;
|
RE(t1[6]) = tmp;
|
||||||
|
|
||||||
// 0.382683432365090 - 0.923879532511287i
|
/* 0.382683432365090 - 0.923879532511287i */
|
||||||
tmp = RE(t1[7]) * DFT16_W2 + IM(t1[7]) * DFT16_W1;
|
tmp = RE(t1[7]) * DFT16_W2 + IM(t1[7]) * DFT16_W1;
|
||||||
IM(t1[7]) = -RE(t1[7]) * DFT16_W1 + IM(t1[7]) * DFT16_W2;
|
IM(t1[7]) = -RE(t1[7]) * DFT16_W1 + IM(t1[7]) * DFT16_W2;
|
||||||
RE(t1[7]) = tmp;
|
RE(t1[7]) = tmp;
|
||||||
|
|
||||||
// 0.707106781186548 - 0.707106781186547i
|
/* 0.707106781186548 - 0.707106781186547i */
|
||||||
tmp = ( RE(t1[9]) + IM(t1[9])) * DFT16_W3;
|
tmp = ( RE(t1[9]) + IM(t1[9])) * DFT16_W3;
|
||||||
IM(t1[9]) = (-RE(t1[9]) + IM(t1[9])) * DFT16_W3;
|
IM(t1[9]) = (-RE(t1[9]) + IM(t1[9])) * DFT16_W3;
|
||||||
RE(t1[9]) = tmp;
|
RE(t1[9]) = tmp;
|
||||||
|
|
||||||
// 0.000000000000000 - 1.000000000000000i
|
/* 0.000000000000000 - 1.000000000000000i */
|
||||||
tmp = RE(t1[10]);
|
tmp = RE(t1[10]);
|
||||||
RE(t1[10]) = IM(t1[10]);
|
RE(t1[10]) = IM(t1[10]);
|
||||||
IM(t1[10]) = -tmp;
|
IM(t1[10]) = -tmp;
|
||||||
|
|
||||||
//-0.707106781186547 - 0.707106781186548i
|
/* -0.707106781186547 - 0.707106781186548i */
|
||||||
tmp = (-RE(t1[11]) + IM(t1[11])) * DFT16_W3;
|
tmp = (-RE(t1[11]) + IM(t1[11])) * DFT16_W3;
|
||||||
IM(t1[11]) = (-RE(t1[11]) - IM(t1[11])) * DFT16_W3;
|
IM(t1[11]) = (-RE(t1[11]) - IM(t1[11])) * DFT16_W3;
|
||||||
RE(t1[11]) = tmp;
|
RE(t1[11]) = tmp;
|
||||||
|
|
||||||
// 0.382683432365090 - 0.923879532511287i
|
/* 0.382683432365090 - 0.923879532511287i */
|
||||||
tmp = RE(t1[13]) * DFT16_W2 + IM(t1[13]) * DFT16_W1;
|
tmp = RE(t1[13]) * DFT16_W2 + IM(t1[13]) * DFT16_W1;
|
||||||
IM(t1[13]) = -RE(t1[13]) * DFT16_W1 + IM(t1[13]) * DFT16_W2;
|
IM(t1[13]) = -RE(t1[13]) * DFT16_W1 + IM(t1[13]) * DFT16_W2;
|
||||||
RE(t1[13]) = tmp;
|
RE(t1[13]) = tmp;
|
||||||
|
|
||||||
//-0.707106781186547 - 0.707106781186548i
|
/* -0.707106781186547 - 0.707106781186548i */
|
||||||
tmp = (-RE(t1[14]) + IM(t1[14])) * DFT16_W3;
|
tmp = (-RE(t1[14]) + IM(t1[14])) * DFT16_W3;
|
||||||
IM(t1[14]) = (-RE(t1[14]) - IM(t1[14])) * DFT16_W3;
|
IM(t1[14]) = (-RE(t1[14]) - IM(t1[14])) * DFT16_W3;
|
||||||
RE(t1[14]) = tmp;
|
RE(t1[14]) = tmp;
|
||||||
|
|
||||||
|
|
||||||
//-0.923879532511287 + 0.382683432365090i
|
/* -0.923879532511287 + 0.382683432365090i */
|
||||||
tmp = -RE(t1[15]) * DFT16_W1 - IM(t1[15]) * DFT16_W2;
|
tmp = -RE(t1[15]) * DFT16_W1 - IM(t1[15]) * DFT16_W2;
|
||||||
IM(t1[15]) = RE(t1[15]) * DFT16_W2 - IM(t1[15]) * DFT16_W1;
|
IM(t1[15]) = RE(t1[15]) * DFT16_W2 - IM(t1[15]) * DFT16_W1;
|
||||||
RE(t1[15]) = tmp;
|
RE(t1[15]) = tmp;
|
||||||
|
|
|
@ -468,7 +468,7 @@ int DSPL_API freqz(double* b, double* a, int ord, double* w,
|
||||||
|
|
||||||
if(a)
|
if(a)
|
||||||
{
|
{
|
||||||
// IIR filter if a != NULL
|
/* IIR filter if a != NULL */
|
||||||
ac = (complex_t*) malloc((ord+1) * sizeof(complex_t));
|
ac = (complex_t*) malloc((ord+1) * sizeof(complex_t));
|
||||||
res = re2cmplx(a, ord+1, ac);
|
res = re2cmplx(a, ord+1, ac);
|
||||||
if( res!=RES_OK )
|
if( res!=RES_OK )
|
||||||
|
@ -496,7 +496,7 @@ int DSPL_API freqz(double* b, double* a, int ord, double* w,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// FIR filter if a == NULL
|
/* FIR filter if a == NULL */
|
||||||
for(k = 0; k < n; k++)
|
for(k = 0; k < n; k++)
|
||||||
{
|
{
|
||||||
RE(jw) = cos(w[k]);
|
RE(jw) = cos(w[k]);
|
||||||
|
|
|
@ -82,72 +82,72 @@ int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||||
|
|
||||||
switch(filter_type & DSPL_FILTER_TYPE_MASK)
|
switch(filter_type & DSPL_FILTER_TYPE_MASK)
|
||||||
{
|
{
|
||||||
// Lowpass FIR coefficients calculation
|
/* Lowpass FIR coefficients calculation */
|
||||||
case DSPL_FILTER_LPF:
|
case DSPL_FILTER_LPF:
|
||||||
err = fir_linphase_lpf(ord, w0, wintype, winparam, h);
|
err = fir_linphase_lpf(ord, w0, wintype, winparam, h);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Highpass FIR coefficients calculation
|
/* Highpass FIR coefficients calculation */
|
||||||
case DSPL_FILTER_HPF:
|
case DSPL_FILTER_HPF:
|
||||||
err = fir_linphase_lpf(ord, 1.0-w0, wintype, winparam, h);
|
err = fir_linphase_lpf(ord, 1.0-w0, wintype, winparam, h);
|
||||||
if(err == RES_OK)
|
if(err == RES_OK)
|
||||||
{
|
{
|
||||||
// LPF filter frequency inversion
|
/* LPF filter frequency inversion */
|
||||||
for(n = 0; n < ord+1; n+=2)
|
for(n = 0; n < ord+1; n+=2)
|
||||||
h[n] = -h[n];
|
h[n] = -h[n];
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Bandpass FIR coefficients calculation
|
/* Bandpass FIR coefficients calculation */
|
||||||
case DSPL_FILTER_BPASS:
|
case DSPL_FILTER_BPASS:
|
||||||
if(w1 < w0)
|
if(w1 < w0)
|
||||||
{
|
{
|
||||||
err = ERROR_FILTER_WS;
|
err = ERROR_FILTER_WS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
wc = (w0 + w1) * 0.5; // central frequency
|
wc = (w0 + w1) * 0.5; /* central frequency */
|
||||||
b = w1 - w0; // bandwidth
|
b = w1 - w0; /* bandwidth */
|
||||||
err = fir_linphase_lpf(ord, b*0.5, wintype, winparam, h);
|
err = fir_linphase_lpf(ord, b*0.5, wintype, winparam, h);
|
||||||
if(err == RES_OK)
|
if(err == RES_OK)
|
||||||
{
|
{
|
||||||
// LPF frequency shifting to the central frequency
|
/* LPF frequency shifting to the central frequency */
|
||||||
del = 0.5 * (double)ord;
|
del = 0.5 * (double)ord;
|
||||||
for(n = 0; n < ord+1; n++)
|
for(n = 0; n < ord+1; n++)
|
||||||
h[n] *= 2.0 * cos(M_PI * ((double)n - del) * wc);
|
h[n] *= 2.0 * cos(M_PI * ((double)n - del) * wc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// BandStop FIR coefficients calculation
|
/* BandStop FIR coefficients calculation */
|
||||||
// ATTENTION! Bandstop filter must be even order only!
|
/* ATTENTION! Bandstop filter must be even order only! */
|
||||||
case DSPL_FILTER_BSTOP:
|
case DSPL_FILTER_BSTOP:
|
||||||
{
|
{
|
||||||
double *h0 = NULL;
|
double *h0 = NULL;
|
||||||
|
|
||||||
// check filter order. Return error if order is odd.
|
/* check filter order. Return error if order is odd. */
|
||||||
if(ord%2)
|
if(ord%2)
|
||||||
return ERROR_FILTER_ORD;
|
return ERROR_FILTER_ORD;
|
||||||
|
|
||||||
// check frequency (w1 must be higher than w0)
|
/* check frequency (w1 must be higher than w0) */
|
||||||
if(w1 < w0)
|
if(w1 < w0)
|
||||||
{
|
{
|
||||||
err = ERROR_FILTER_WS;
|
err = ERROR_FILTER_WS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// temp coeff vector
|
/* temp coeff vector */
|
||||||
h0 = (double*)malloc((ord+1) * sizeof(double));
|
h0 = (double*)malloc((ord+1) * sizeof(double));
|
||||||
|
|
||||||
// calculate LPF
|
/* calculate LPF */
|
||||||
err = fir_linphase(ord, w0, 0.0, DSPL_FILTER_LPF, wintype, winparam, h0);
|
err = fir_linphase(ord, w0, 0.0, DSPL_FILTER_LPF, wintype, winparam, h0);
|
||||||
if(err!=RES_OK)
|
if(err!=RES_OK)
|
||||||
{
|
{
|
||||||
free(h0);
|
free(h0);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
// calculate HPF
|
/* calculate HPF */
|
||||||
err = fir_linphase(ord, w1, 0.0, DSPL_FILTER_HPF, wintype, winparam, h);
|
err = fir_linphase(ord, w1, 0.0, DSPL_FILTER_HPF, wintype, winparam, h);
|
||||||
if(err==RES_OK)
|
if(err==RES_OK)
|
||||||
{
|
{
|
||||||
// Bandstop filter is sum of lowpass and highpass filters
|
/* Bandstop filter is sum of lowpass and highpass filters */
|
||||||
for(n = 0; n < ord+1; n++)
|
for(n = 0; n < ord+1; n++)
|
||||||
h[n] += h0[n];
|
h[n] += h0[n];
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,7 +128,7 @@ int DSPL_API iir(double rp, double rs, int ord, double w0, double w1,
|
||||||
if(err != RES_OK)
|
if(err != RES_OK)
|
||||||
goto error_proc;
|
goto error_proc;
|
||||||
|
|
||||||
//frequency transformation
|
/* frequency transformation */
|
||||||
wa0 = tan(w0 * M_PI * 0.5);
|
wa0 = tan(w0 * M_PI * 0.5);
|
||||||
wa1 = tan(w1 * M_PI * 0.5);
|
wa1 = tan(w1 * M_PI * 0.5);
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ int DSPL_API iir(double rp, double rs, int ord, double w0, double w1,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DSPL_FILTER_BSTOP:
|
case DSPL_FILTER_BSTOP:
|
||||||
// need frequency transform ws -> 1 rad/s
|
/* need frequency transform ws -> 1 rad/s */
|
||||||
|
|
||||||
ws = filter_ws1(ord_ap, rp, rs, type);
|
ws = filter_ws1(ord_ap, rp, rs, type);
|
||||||
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
||||||
|
|
|
@ -31,9 +31,11 @@ Print DSPL info
|
||||||
void DSPL_API dspl_info()
|
void DSPL_API dspl_info()
|
||||||
{
|
{
|
||||||
printf("\n\n D S P L - 2.0\n");
|
printf("\n\n D S P L - 2.0\n");
|
||||||
printf(" version 2.19.06.18\n");
|
printf(" version 2.19.10.13\n");
|
||||||
printf("\n Copyright (C) 2015-2019\n");
|
printf("\n Copyright (C) 2015-2019\n");
|
||||||
printf(" Sergey Bakhurin www.dsplib.org\n\n");
|
printf(" Sergey Bakhurin www.dsplib.org\n");
|
||||||
|
printf(" ---------------------------------------------
|
||||||
|
printf(" BLAS and LAPACK ver.: 3.8.0 www.netlib.org\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -418,3 +418,24 @@ int DSPL_API matrix_transpose_hermite(complex_t* a, int n, int m, complex_t* b)
|
||||||
return RES_OK;
|
return RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Vector dot product
|
||||||
|
******************************************************************************/
|
||||||
|
int DSPL_API vector_dot(double* x, double* y, int n, double* p)
|
||||||
|
{
|
||||||
|
int inc = 1;
|
||||||
|
|
||||||
|
if(!x || !y || !p)
|
||||||
|
return ERROR_PTR;
|
||||||
|
if(n<1)
|
||||||
|
return ERROR_SIZE;
|
||||||
|
|
||||||
|
*p = ddot_(&n, x, &inc, y, &inc);
|
||||||
|
|
||||||
|
return RES_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
void DSPL_API random_init(random_t* prnd)
|
void DSPL_API random_init(random_t* prnd)
|
||||||
{
|
{
|
||||||
srand(time(NULL));
|
srand(time(NULL));
|
||||||
// MRG32k3a init
|
/* MRG32k3a init */
|
||||||
prnd->mrg32k3a_x[0] = prnd->mrg32k3a_x[1] = 1.0;
|
prnd->mrg32k3a_x[0] = prnd->mrg32k3a_x[1] = 1.0;
|
||||||
prnd->mrg32k3a_y[0] = prnd->mrg32k3a_y[1] = prnd->mrg32k3a_y[2] = 1.0;
|
prnd->mrg32k3a_y[0] = prnd->mrg32k3a_y[1] = prnd->mrg32k3a_y[2] = 1.0;
|
||||||
prnd->mrg32k3a_x[2] = rand();
|
prnd->mrg32k3a_x[2] = rand();
|
||||||
|
@ -93,36 +93,19 @@ Uniform random numbers generator
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
int DSPL_API randu(double* x, int n, random_t* prnd)
|
int DSPL_API randu(double* x, int n, random_t* prnd)
|
||||||
{
|
{
|
||||||
|
if(prnd)
|
||||||
/*int k,m;
|
return randu_mrg32k3a(x, n, prnd);
|
||||||
unsigned int x1[4], x2[4], y;
|
else
|
||||||
|
{
|
||||||
if(!x)
|
if(!x)
|
||||||
return ERROR_PTR;
|
return ERROR_PTR;
|
||||||
if(n<1)
|
if(n<1)
|
||||||
return ERROR_SIZE;
|
return ERROR_SIZE;
|
||||||
|
int i;
|
||||||
x1[1] = rand();
|
for(i = 0; i < n; i++)
|
||||||
x2[1] = rand();
|
x[n] = (double)rand()/RAND_MAX;
|
||||||
x1[2] = rand();
|
}
|
||||||
x2[2] = rand();
|
return RES_OK;
|
||||||
x1[3] = rand();
|
|
||||||
x2[3] = rand();
|
|
||||||
for(k = 0; k<n; k++)
|
|
||||||
{
|
|
||||||
x1[0] = (63308 * x1[2] - 183326*x1[3]) % DSPL_RAND_MOD_X1;
|
|
||||||
x2[0] = (86098 * x2[1] - 539608*x2[3]) % DSPL_RAND_MOD_X2;
|
|
||||||
y = (x1[0] - x2[0]) % DSPL_RAND_MOD_X1;
|
|
||||||
for(m = 3; m > 0; m--)
|
|
||||||
{
|
|
||||||
x1[m] = x1[m-1];
|
|
||||||
x2[m] = x2[m-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
x[k] = (double)y/DSPL_RAND_MOD_X1;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return randu_mrg32k3a(x, n, prnd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -270,7 +270,7 @@ int win_cheby(double *w, int n, double param)
|
||||||
r1 = pow(10, param/20);
|
r1 = pow(10, param/20);
|
||||||
x0 = cosh((1.0/(double)(n-1)) * acosh(r1));
|
x0 = cosh((1.0/(double)(n-1)) * acosh(r1));
|
||||||
|
|
||||||
// check window length even or odd
|
/* check window length even or odd */
|
||||||
if(n%2==0)
|
if(n%2==0)
|
||||||
{
|
{
|
||||||
dz = 0.5;
|
dz = 0.5;
|
||||||
|
@ -298,12 +298,12 @@ int win_cheby(double *w, int n, double param)
|
||||||
w[k] = r1 + 2.0 * sum;
|
w[k] = r1 + 2.0 * sum;
|
||||||
w[n-1-k] = w[k];
|
w[n-1-k] = w[k];
|
||||||
|
|
||||||
// max value calculation
|
/* max value calculation */
|
||||||
if(w[k]>wmax)
|
if(w[k]>wmax)
|
||||||
wmax=w[k];
|
wmax=w[k];
|
||||||
}
|
}
|
||||||
|
|
||||||
// normalization
|
/* normalization */
|
||||||
for(k=0; k < n; k++)
|
for(k=0; k < n; k++)
|
||||||
w[k] /= wmax;
|
w[k] /= wmax;
|
||||||
|
|
||||||
|
@ -388,7 +388,7 @@ int win_flat_top(double *w, int n, int win_type)
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
Gaussian window function
|
Gaussian window function
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
int win_gaussian(double *w, int n, int win_type, double alpha)
|
int win_gaussian(double *w, int n, int win_type, double alpha)
|
||||||
{
|
{
|
||||||
|
|
|
@ -22,11 +22,11 @@
|
||||||
|
|
||||||
#ifdef WIN_OS
|
#ifdef WIN_OS
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif //WIN_OS
|
#endif /* WIN_OS */
|
||||||
|
|
||||||
#ifdef LINUX_OS
|
#ifdef LINUX_OS
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#endif //LINUX_OS
|
#endif /* LINUX_OS */
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -157,7 +157,7 @@ p_writetxt_cmplx_im writetxt_cmplx_im ;
|
||||||
p_writetxt_cmplx_re writetxt_cmplx_re ;
|
p_writetxt_cmplx_re writetxt_cmplx_re ;
|
||||||
|
|
||||||
|
|
||||||
#endif //BUILD_LIB
|
#endif /* BUILD_LIB */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -192,20 +192,20 @@ void* dspl_load()
|
||||||
printf("libdspl.dll loading ERROR!\n");
|
printf("libdspl.dll loading ERROR!\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif //WIN_OS
|
#endif /* WIN_OS */
|
||||||
|
|
||||||
|
|
||||||
#ifdef LINUX_OS
|
#ifdef LINUX_OS
|
||||||
char* error;
|
char* error;
|
||||||
void *handle;
|
void *handle;
|
||||||
// open the *.so
|
/* open the *.so */
|
||||||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||||||
if (!handle)
|
if (!handle)
|
||||||
{
|
{
|
||||||
printf("libdspl.so loading ERROR!\n");
|
printf("libdspl.so loading ERROR!\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif //LINUX_OS
|
#endif /* LINUX_OS */
|
||||||
|
|
||||||
LOAD_FUNC(acos_cmplx);
|
LOAD_FUNC(acos_cmplx);
|
||||||
LOAD_FUNC(asin_cmplx);
|
LOAD_FUNC(asin_cmplx);
|
||||||
|
@ -332,7 +332,7 @@ void* dspl_load()
|
||||||
if(handle)
|
if(handle)
|
||||||
FreeLibrary(handle);
|
FreeLibrary(handle);
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif //WIN_OS
|
#endif /* WIN_OS */
|
||||||
|
|
||||||
|
|
||||||
#ifdef LINUX_OS
|
#ifdef LINUX_OS
|
||||||
|
@ -342,7 +342,7 @@ void* dspl_load()
|
||||||
if(handle)
|
if(handle)
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
return NULL;
|
return NULL;
|
||||||
#endif //LINUX_OS
|
#endif /* LINUX_OS */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -355,11 +355,11 @@ void dspl_free(void* handle)
|
||||||
{
|
{
|
||||||
#ifdef WIN_OS
|
#ifdef WIN_OS
|
||||||
FreeLibrary((HINSTANCE)handle);
|
FreeLibrary((HINSTANCE)handle);
|
||||||
#endif //WIN_OS
|
#endif /* WIN_OS */
|
||||||
|
|
||||||
#ifdef LINUX_OS
|
#ifdef LINUX_OS
|
||||||
dlclose(handle);
|
dlclose(handle);
|
||||||
#endif //LINUX_OS
|
#endif /* LINUX_OS */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,15 +215,15 @@ typedef struct
|
||||||
|
|
||||||
|
|
||||||
#ifdef BUILD_LIB
|
#ifdef BUILD_LIB
|
||||||
// Declare DSPL_API for Windows OS
|
/* Declare DSPL_API for Windows OS */
|
||||||
#ifdef WIN_OS
|
#ifdef WIN_OS
|
||||||
#define DSPL_API __declspec(dllexport)
|
#define DSPL_API __declspec(dllexport)
|
||||||
#endif // WIN_OS
|
#endif /* WIN_OS */
|
||||||
// Declare DSPL_API for LINUX OS
|
/* Declare DSPL_API for LINUX OS */
|
||||||
#ifdef LINUX_OS
|
#ifdef LINUX_OS
|
||||||
#define DSPL_API
|
#define DSPL_API
|
||||||
#endif //LINUX_OS
|
#endif /* LINUX_OS */
|
||||||
#endif //BUILD_DLL
|
#endif /* BUILD_DLL */
|
||||||
|
|
||||||
#define COMMA ,
|
#define COMMA ,
|
||||||
|
|
||||||
|
@ -918,5 +918,5 @@ void dspl_free(void* handle);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif //DSPL_H
|
#endif /* DSPL_H */
|
||||||
|
|
||||||
|
|
Ładowanie…
Reference in New Issue