kopia lustrzana https://github.com/Dsplib/libdspl-2.0
Doxygen doc moved to src
Changes to be committed: deleted: dspl/dox/en/conv.dox deleted: dspl/dox/en/dspl_load.dox deleted: dspl/dox/en/filter_ap.dox deleted: dspl/dox/en/filter_fir.dox deleted: dspl/dox/en/filter_ft.dox deleted: dspl/dox/en/filter_iir.dox deleted: dspl/dox/en/fourier_series.dox deleted: dspl/dox/en/gnuplot.dox deleted: dspl/dox/en/goertzel.dox deleted: dspl/dox/en/inout.dox deleted: dspl/dox/en/math.dox deleted: dspl/dox/en/matrix.dox deleted: dspl/dox/en/polyval.dox deleted: dspl/dox/en/randgen.dox deleted: dspl/dox/en/resampling.dox deleted: dspl/dox/en/win.dox modified: dspl/dox/footer_en.html modified: dspl/dox/footer_ru.html modified: dspl/dox/header_en.html modified: dspl/dox/header_ru.html deleted: dspl/dox/ru/conv.dox deleted: dspl/dox/ru/dspl_load.dox deleted: dspl/dox/ru/filter_ap.dox deleted: dspl/dox/ru/filter_fir.dox deleted: dspl/dox/ru/filter_ft.dox deleted: dspl/dox/ru/filter_iir.dox deleted: dspl/dox/ru/fourier_series.dox deleted: dspl/dox/ru/gnuplot.dox deleted: dspl/dox/ru/goertzel.dox deleted: dspl/dox/ru/inout.dox deleted: dspl/dox/ru/math.dox deleted: dspl/dox/ru/matrix.dox deleted: dspl/dox/ru/polyval.dox deleted: dspl/dox/ru/randgen.dox deleted: dspl/dox/ru/resampling.dox deleted: dspl/dox/ru/statistic.dox deleted: dspl/dox/ru/win.dox modified: dspl/src/conv.c modified: dspl/src/filter_ap.c modified: dspl/src/filter_fir.c modified: dspl/src/filter_ft.c modified: dspl/src/filter_iir.c modified: dspl/src/fourier_series.c modified: dspl/src/gnuplot.c modified: dspl/src/goertzel.c modified: dspl/src/inout.c modified: dspl/src/math.c modified: dspl/src/matrix.c modified: dspl/src/polyval.c modified: dspl/src/randgen.c modified: dspl/src/resampling.c modified: dspl/src/signals.c modified: dspl/src/statistic.c modified: dspl/src/trapint.c modified: dspl/src/win.c modified: examples/src/polyroots_test.c modified: ide/codeblocks/dspl.layout modified: ide/codeblocks/dspl.workspace.layout modified: ide/codeblocks/examples.layout modified: include/dspl.c modified: include/dspl.hpull/6/merge
rodzic
333d86eb8f
commit
1deab12d69
|
@ -1,369 +0,0 @@
|
|||
|
||||
/*! ******************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv(double* a, int na, double* b, int nb, double* c)
|
||||
\brief Real vectors linear convolution.
|
||||
|
||||
Function convolves two real vectors \f$ c = a * b\f$ length `na` and `nb`.
|
||||
The output convolution is a vector `c` with length equal to `na + nb - 1`.
|
||||
|
||||
\param[in] a
|
||||
Pointer to the first vector `a`. \n
|
||||
Vector size is `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Size of the first vector `a`. \n \n
|
||||
|
||||
\param[in] b
|
||||
Pointer to the second vector `b`. \n
|
||||
Vector size is `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Size of the second vector `b`. \n \n
|
||||
|
||||
\param[out] c
|
||||
Pointer to the convolution output vector \f$ c = a * b\f$. \n
|
||||
Vector size is `[na + nb - 1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return `RES_OK` if convolution is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note If vectors `a` and `b` are coefficients of two polynomials,
|
||||
then convolution of the vectors `a` and `b` returns polynomial product
|
||||
coefficients.
|
||||
|
||||
Example:
|
||||
\code{.cpp}
|
||||
double ar[3] = {1.0, 2.0, 3.0};
|
||||
double br[4] = {3.0, -1.0, 2.0, 4.0};
|
||||
double cr[6];
|
||||
|
||||
int n;
|
||||
|
||||
conv(ar, 3, br, 4, cr);
|
||||
|
||||
for(n = 0; n < 6; n++)
|
||||
printf("cr[%d] = %5.1f\n", n, cr[n]);
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output:
|
||||
\verbatim
|
||||
cr[0] = 3.0
|
||||
cr[1] = 5.0
|
||||
cr[2] = 9.0
|
||||
cr[3] = 5.0
|
||||
cr[4] = 14.0
|
||||
cr[5] = 12.0
|
||||
\endverbatim
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
****************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! *****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
|
||||
\brief Complex vectors linear convolution.
|
||||
|
||||
Function convolves two complex vectors \f$ c = a * b\f$ length `na` and `nb`.
|
||||
The output convolution is a vector `c` with length equal to `na + nb - 1`.
|
||||
|
||||
\param[in] a
|
||||
Pointer to the first vector `a`. \n
|
||||
Vector size is `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Size of the first vector `a`. \n \n
|
||||
|
||||
\param[in] b
|
||||
Pointer to the second vector `b`. \n
|
||||
Vector size is `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Size of the second vector `b`. \n \n
|
||||
|
||||
\param[out] c
|
||||
Pointer to the convolution output vector \f$ c = a * b\f$. \n
|
||||
Vector size is `[na + nb - 1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return `RES_OK` if convolution is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note If vectors `a` and `b` are coefficients of two polynomials,
|
||||
then convolution of the vectors `a` and `b` returns polynomial product
|
||||
coefficients.
|
||||
|
||||
Example:
|
||||
\code{.cpp}
|
||||
complex_t ac[3] = {{0.0, 1.0}, {1.0, 1.0}, {2.0, 2.0}};
|
||||
complex_t bc[4] = {{3.0, 3.0}, {4.0, 4.0}, {5.0, 5.0}, {6.0, 6.0}};
|
||||
complex_t cc[6];
|
||||
|
||||
int n;
|
||||
|
||||
conv_cmplx(ac, 3, bc, 4, cc);
|
||||
|
||||
for(n = 0; n < 6; n++)
|
||||
printf("cc[%d] = %5.1f%+5.1fj\n", n, RE(cc[n]),IM(cc[n]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output:
|
||||
\verbatim
|
||||
cc[0] = -3.0 +3.0j
|
||||
cc[1] = -4.0+10.0j
|
||||
cc[2] = -5.0+25.0j
|
||||
cc[3] = -6.0+32.0j
|
||||
cc[4] = 0.0+32.0j
|
||||
cc[5] = 0.0+24.0j
|
||||
\endverbatim
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
****************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! *****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_fft(double* a, int na, double* b, int nb,
|
||||
fft_t* pfft, int nfft, double* c)
|
||||
\brief Real vectors fast linear convolution by using fast Fourier
|
||||
transform algorithms
|
||||
|
||||
Function convolves two real vectors \f$ c = a * b\f$ length `na` and `nb`
|
||||
in the frequency domain by using FFT algorithms. This approach provide
|
||||
high-performance convolution which increases with `na` and `nb` increasing.
|
||||
The output convolution is a vector `c` with length equal to `na + nb - 1`.
|
||||
|
||||
\param[in] a
|
||||
Pointer to the first vector `a`. \n
|
||||
Vector size is `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Size of the first vector `a`. \n \n
|
||||
|
||||
\param[in] b
|
||||
Pointer to the second vector `b`. \n
|
||||
Vector size is `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Size of the second vector `b`. \n \n
|
||||
|
||||
\param[in] pfft
|
||||
Pointer to the structure `fft_t`. \n
|
||||
Function changes `fft_t` structure fields so `fft_t` must
|
||||
be clear before program returns. \n \n
|
||||
|
||||
\param[in] nfft
|
||||
FFT size. \n
|
||||
This parameter set which FFT size will be used
|
||||
for overlapped frequency domain convolution. \n
|
||||
FFT size must be more of minimal `na` and `nb` value.
|
||||
For example if `na = 10`, `nb = 4` then `nfft` parameter must
|
||||
be more than 4. \n
|
||||
|
||||
\param[out] c
|
||||
Pointer to the convolution output vector \f$ c = a * b\f$. \n
|
||||
Vector size is `[na + nb - 1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return `RES_OK` if convolution is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n \n
|
||||
|
||||
Example:
|
||||
\include conv_fft_test.c
|
||||
|
||||
Program output:
|
||||
|
||||
\verbatim
|
||||
conv_fft error: 0x00000000
|
||||
conv error: 0x00000000
|
||||
c[ 0] = -0.00 d[ 0] = 0.00
|
||||
c[ 1] = -0.00 d[ 1] = 0.00
|
||||
c[ 2] = 1.00 d[ 2] = 1.00
|
||||
c[ 3] = 4.00 d[ 3] = 4.00
|
||||
c[ 4] = 10.00 d[ 4] = 10.00
|
||||
c[ 5] = 20.00 d[ 5] = 20.00
|
||||
c[ 6] = 35.00 d[ 6] = 35.00
|
||||
c[ 7] = 56.00 d[ 7] = 56.00
|
||||
c[ 8] = 77.00 d[ 8] = 77.00
|
||||
c[ 9] = 98.00 d[ 9] = 98.00
|
||||
c[ 10] = 119.00 d[ 10] = 119.00
|
||||
c[ 11] = 140.00 d[ 11] = 140.00
|
||||
c[ 12] = 161.00 d[ 12] = 161.00
|
||||
c[ 13] = 182.00 d[ 13] = 182.00
|
||||
c[ 14] = 190.00 d[ 14] = 190.00
|
||||
c[ 15] = 184.00 d[ 15] = 184.00
|
||||
c[ 16] = 163.00 d[ 16] = 163.00
|
||||
c[ 17] = 126.00 d[ 17] = 126.00
|
||||
c[ 18] = 72.00 d[ 18] = 72.00
|
||||
\endverbatim
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
****************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! *****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_fft_cmplx(complex_t* a, int na, complex_t* b, int nb,
|
||||
fft_t* pfft, int nfft, complex_t* c)
|
||||
\brief Complex vectors fast linear convolution by using fast Fourier
|
||||
transform algorithms
|
||||
|
||||
Function convolves two complex vectors \f$ c = a * b\f$ length `na` and `nb`
|
||||
in the frequency domain by using FFT algorithms. This approach provide
|
||||
high-performance convolution which increases with `na` and `nb` increasing.
|
||||
The output convolution is a vector `c` with length equal to `na + nb - 1`.
|
||||
|
||||
\param[in] a
|
||||
Pointer to the first vector `a`. \n
|
||||
Vector size is `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Size of the first vector `a`. \n \n
|
||||
|
||||
\param[in] b
|
||||
Pointer to the second vector `b`. \n
|
||||
Vector size is `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Size of the second vector `b`. \n \n
|
||||
|
||||
\param[in] pfft
|
||||
Pointer to the structure `fft_t`. \n
|
||||
Function changes `fft_t` structure fields so `fft_t` must
|
||||
be clear before program returns. \n \n
|
||||
|
||||
\param[in] nfft
|
||||
FFT size. \n
|
||||
This parameter set which FFT size will be used
|
||||
for overlapped frequency domain convolution. \n
|
||||
FFT size must be more of minimal `na` and `nb` value.
|
||||
For example if `na = 10`, `nb = 4` then `nfft` parameter must
|
||||
be more than 4. \n
|
||||
|
||||
\param[out] c
|
||||
Pointer to the convolution output vector \f$ c = a * b\f$. \n
|
||||
Vector size is `[na + nb - 1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return `RES_OK` if convolution is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n \n
|
||||
|
||||
Example:
|
||||
\include conv_fft_cmplx_test.c
|
||||
|
||||
Program output:
|
||||
|
||||
\verbatim
|
||||
c[ 0] = -1.00 -0.00j d[ 0] = -1.00 +0.00j
|
||||
c[ 1] = -6.00 +4.00j d[ 1] = -6.00 +4.00j
|
||||
c[ 2] = -15.00 +20.00j d[ 2] = -15.00 +20.00j
|
||||
c[ 3] = -28.00 +56.00j d[ 3] = -28.00 +56.00j
|
||||
c[ 4] = -45.00 +120.00j d[ 4] = -45.00 +120.00j
|
||||
c[ 5] = -55.00 +210.00j d[ 5] = -55.00 +210.00j
|
||||
c[ 6] = -65.00 +300.00j d[ 6] = -65.00 +300.00j
|
||||
c[ 7] = -75.00 +390.00j d[ 7] = -75.00 +390.00j
|
||||
c[ 8] = -85.00 +480.00j d[ 8] = -85.00 +480.00j
|
||||
c[ 9] = -95.00 +570.00j d[ 9] = -95.00 +570.00j
|
||||
c[ 10] = -105.00 +660.00j d[ 10] = -105.00 +660.00j
|
||||
c[ 11] = -115.00 +750.00j d[ 11] = -115.00 +750.00j
|
||||
c[ 12] = -125.00 +840.00j d[ 12] = -125.00 +840.00j
|
||||
c[ 13] = -135.00 +930.00j d[ 13] = -135.00 +930.00j
|
||||
c[ 14] = -145.00 +1020.00j d[ 14] = -145.00 +1020.00j
|
||||
c[ 15] = -124.00 +1080.00j d[ 15] = -124.00 +1080.00j
|
||||
c[ 16] = -99.00 +1016.00j d[ 16] = -99.00 +1016.00j
|
||||
c[ 17] = -70.00 +820.00j d[ 17] = -70.00 +820.00j
|
||||
c[ 18] = -37.00 +484.00j d[ 18] = -37.00 +484.00j
|
||||
\endverbatim
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
****************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ******************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
|
||||
\brief Real IIR filtration
|
||||
|
||||
Function calculates real IIR filter output for real signal. The real filter
|
||||
contains real coefficients of the transfer function \f$H(z)\f$
|
||||
numerator and denominator:
|
||||
\f[
|
||||
H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}}
|
||||
{1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-n}},
|
||||
\f]
|
||||
here \f$a_0\f$ cannot be equals zeros, \f$N=M=\f$`ord`.
|
||||
|
||||
|
||||
\param[in] b
|
||||
Pointer to the vector \f$b\f$ of IIR filter
|
||||
transfer function numerator coefficients. \n
|
||||
Vector size is `[ord + 1 x 1]`. \n \n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the vector \f$a\f$ of IIR filter
|
||||
transfer function denominator coefficients. \n
|
||||
Vector size is `[ord + 1 x 1]`. \n
|
||||
This pointer can be `NULL` if filter is FIR. \n \n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. Number of the transfer function
|
||||
numerator and denominator coefficients
|
||||
(length of vectors `b` and `a`) is `ord + 1`. \n \n
|
||||
|
||||
\param[in] x
|
||||
Pointer to the input signal vector. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Size of the input signal vector `x`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the IIR filter output vector. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter output is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error": \n
|
||||
|
||||
Example:
|
||||
|
||||
\include filter_iir_test.c
|
||||
|
||||
Input signal is
|
||||
\f$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)\f$, here \f$n(t)\f$ white Gaussian
|
||||
noise with zero mean value and unit standard deviation. \n
|
||||
|
||||
Input signal is filtered by elliptic LPF order 6 and output signal and data
|
||||
saves in the txt-files
|
||||
|
||||
\verbatim
|
||||
dat/s.txt - input signal + noise
|
||||
dat/sf.txt - filter output.
|
||||
\endverbatim
|
||||
|
||||
Plots:
|
||||
|
||||
\image html filter_iir_test.png
|
||||
|
||||
GNUPLOT script for make plots is:
|
||||
\include filter_iir.plt
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
****************************************************************************** */
|
|
@ -1,85 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void* dspl_load()
|
||||
\brief
|
||||
Perform dynamic linking and load DSPL-2.0 functions.
|
||||
|
||||
This function attempts to link to the library `libdspl.dll` in
|
||||
Windows system and the `libdspl.so` library on the Linux system.
|
||||
The library is assumed to be in the same directory as the application.
|
||||
user, or the path to the library is registered in the operating path variables
|
||||
system.
|
||||
|
||||
Upon successful binding and loading of library functions, the handle is returned
|
||||
libraries, as well as in the address space of the application appear
|
||||
pointers to DSPL-2.0 functions.
|
||||
|
||||
\note
|
||||
The returned handle is of type `void *`, which can be cast on Windows
|
||||
to type `HINSTANCE`. In practice, this is not necessary, because this
|
||||
the type is cast to `HINSTANCE` automatically if the compiler flag is set,
|
||||
indicating that the application is being built on Windows.
|
||||
|
||||
An example of a simple program that implements dynamic binding with DSPL-2.0.
|
||||
|
||||
\code
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "dspl.h"
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
void * hdspl; /* DSPL handle */
|
||||
hdspl = dspl_load (); /* Dynamic linking */
|
||||
|
||||
/* Check the pointer. If `NULL`, then the link failed */
|
||||
if (! hdspl)
|
||||
{
|
||||
printf ("libdspl loading error! \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
The link was successful, you can call the functions of DSPL-2.0
|
||||
*/
|
||||
|
||||
/*
|
||||
Before correctly terminating the application, you must unlink
|
||||
library and clear memory.
|
||||
*/
|
||||
dspl_free (hdspl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
\endcode
|
||||
|
||||
|
||||
|
||||
\author
|
||||
Bakhurin Sergey
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void dspl_free(void* handle)
|
||||
\brief
|
||||
Cleans up the previously linked DSPL-2.0 dynamic library.
|
||||
|
||||
This cross-platform function clears the library `libdspl.dll` in
|
||||
Windows system and from the library `libdspl.so` on the Linux system.
|
||||
After cleaning the library, all functions will become unavailable.
|
||||
|
||||
\param [in] handle
|
||||
Handle of the previously linked DSPL-2.0 library. \n
|
||||
This pointer can be `NULL`, in this case no action
|
||||
are being produced.
|
||||
|
||||
\author
|
||||
Bakhurin Sergey
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,766 +0,0 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int butter_ap(double Rp, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Function calculates the transfer function \f$ H(s) \f$ coefficients of
|
||||
analog normalized lowpass Butterworth filter.
|
||||
|
||||
Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB
|
||||
for angular frequency \f$ \omega \f$ from 0 to 1 rad/s.
|
||||
|
||||
\param[in] Rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Filter coefficients number equals `ord+1` for numerator and denominator
|
||||
of transfer function \f$ H(s) \f$ \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
numerator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
denominator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example:
|
||||
|
||||
\include butter_ap_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 1.965 a[ 0] = 1.965
|
||||
b[ 1] = 0.000 a[ 1] = 3.138
|
||||
b[ 2] = 0.000 a[ 2] = 2.505
|
||||
b[ 3] = 0.000 a[ 3] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created 3 files: \n
|
||||
|
||||
\verbatim
|
||||
butter_ap_test_mag.txt magnitude
|
||||
butter_ap_test_phi.txt phase response
|
||||
butter_ap_test_tau.txt group delay
|
||||
\endverbatim
|
||||
|
||||
In addition, GNUPLOT will build the following graphs from data stored in files:
|
||||
|
||||
\image html butter_ap_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int butter_ap_zp(int ord, double rp, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Function calculates arrays of zeros and poles for analog normlized lowpass
|
||||
Batterworth filter transfer function \f$ H(s) \f$ order `ord` .
|
||||
|
||||
Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB
|
||||
for angular frequency \f$ \omega \f$ from 0 to 1 rad/s.
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of zeros and poles of filter can be less or equal `ord`. \n
|
||||
\n
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Pointer to the \f$ H(s) \f$ zeros array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n
|
||||
Number of finite zeros which was calculated and saved in vector `z`. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Pointer to the \f$ H(s) \f$ poles array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Pointer to the variable which keep number of
|
||||
calculated poles of \f$ H(s) \f$. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if zeros and poles is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
\note
|
||||
Normalized Butterworth lowpass filter has no finite zeros.
|
||||
So `z` vector will not changed and in pointer `nz` will write 0 value. \n
|
||||
|
||||
Example of normalized Butterworth lowpass filter zeros and poles calculation:
|
||||
\include butter_ap_zp_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
Butterworth filter zeros: 0
|
||||
Butterworth filter poles: 7
|
||||
p[ 0] = -1.101 +0.000 j
|
||||
p[ 1] = -0.245 +1.074 j
|
||||
p[ 2] = -0.245 -1.074 j
|
||||
p[ 3] = -0.687 +0.861 j
|
||||
p[ 4] = -0.687 -0.861 j
|
||||
p[ 5] = -0.992 +0.478 j
|
||||
p[ 6] = -0.992 -0.478 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created `butter_ap_zp.txt` file. \n
|
||||
|
||||
In addition, GNUPLOT will build the following graphs
|
||||
from data stored in `dat/butter_ap_zp.txt` file:
|
||||
|
||||
\image html butter_ap_zp_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby1_ap(double Rp, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Function calculates the transfer function \f$ H(s) \f$ coefficients of
|
||||
analog normalized lowpass Chebyshev type 1 filter.
|
||||
|
||||
Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB
|
||||
for angular frequency \f$ \omega \f$ from 0 to 1 rad/s.
|
||||
|
||||
\param[in] Rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Filter coefficients number equals `ord+1` for numerator and denominator
|
||||
of transfer function \f$ H(s) \f$ \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
numerator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
denominator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example:
|
||||
|
||||
\include cheby1_ap_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.125 a[ 0] = 0.177
|
||||
b[ 1] = 0.000 a[ 1] = 0.405
|
||||
b[ 2] = 0.000 a[ 2] = 1.169
|
||||
b[ 3] = 0.000 a[ 3] = 0.582
|
||||
b[ 4] = 0.000 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created 3 files: \n
|
||||
|
||||
\verbatim
|
||||
cheby1_ap_test_mag.txt magnitude
|
||||
cheby1_ap_test_phi.txt phase response
|
||||
cheby1_ap_test_tau.txt group delay
|
||||
\endverbatim
|
||||
|
||||
In addition, GNUPLOT will build the following graphs from data stored in files:
|
||||
|
||||
\image html cheby1_ap_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby1_ap_zp( int ord, double rp, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
\brief
|
||||
Function calculates arrays of zeros and poles for analog normlized lowpass
|
||||
Chebyshev type 1 filter transfer function \f$ H(s) \f$ order `ord` .
|
||||
|
||||
Analog normalized lowpass filter magnitude ripple equals \f$ -R_p \f$ dB
|
||||
for angular frequency \f$ \omega \f$ from 0 to 1 rad/s.
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of zeros and poles of filter can be less or equal `ord`. \n
|
||||
\n
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Pointer to the \f$ H(s) \f$ zeros array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n
|
||||
Number of finite zeros which was calculated and saved in vector `z`. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Pointer to the \f$ H(s) \f$ poles array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Pointer to the variable which keep number of
|
||||
calculated poles of \f$ H(s) \f$. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if zeros and poles is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
\note
|
||||
Normalized Chebyshev type 1 lowpass filter has no finite zeros.
|
||||
So `z` vector will not changed and in pointer `nz` will write 0 value. \n
|
||||
|
||||
Example of normalized Chebyshev type 1 lowpass filter
|
||||
zeros and poles calculation:
|
||||
\include cheby1_ap_zp_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
Chebyshev type 1 filter zeros: 0
|
||||
Chebyshev type 1 filter poles: 7
|
||||
p[ 0] = -0.256 +0.000 j
|
||||
p[ 1] = -0.057 +1.006 j
|
||||
p[ 2] = -0.057 -1.006 j
|
||||
p[ 3] = -0.160 +0.807 j
|
||||
p[ 4] = -0.160 -0.807 j
|
||||
p[ 5] = -0.231 +0.448 j
|
||||
p[ 6] = -0.231 -0.448 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created `cheby1_ap_zp.txt` file. \n
|
||||
|
||||
In addition, GNUPLOT will build the following graphs
|
||||
from data stored in `dat/cheby1_ap_zp.txt` file:
|
||||
|
||||
\image html cheby1_ap_zp_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby2_ap(double Rs, int ord, double *b, double *a)
|
||||
|
||||
\brief
|
||||
Function calculates the transfer function \f$ H(s) \f$ coefficients of
|
||||
analog normalized lowpass Chebyshev type 2 filter.
|
||||
|
||||
Analog normalized Chebyshev type 2 filter lowpass filter has \f$Rs\f$ dB
|
||||
suppression in stopband.
|
||||
Also analog normalized Chebyshev type 2 filter magnitude equals \f$-Rs\f$ dB
|
||||
for angular frequency \f$\omega = 1\f$ rad/s.
|
||||
|
||||
\param[in] Rs
|
||||
Suppression level in stopband (dB). \n
|
||||
This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Filter coefficients number equals `ord+1` for numerator and denominator
|
||||
of transfer function \f$ H(s) \f$ \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
numerator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
denominator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example:
|
||||
|
||||
\include cheby2_ap_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.008 a[ 0] = 0.008
|
||||
b[ 1] = 0.000 a[ 1] = 0.068
|
||||
b[ 2] = 0.008 a[ 2] = 0.300
|
||||
b[ 3] = 0.000 a[ 3] = 0.774
|
||||
b[ 4] = 0.001 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created 3 files: \n
|
||||
|
||||
\verbatim
|
||||
cheby2_ap_test_mag.txt magnitude
|
||||
cheby2_ap_test_phi.txt phase response
|
||||
cheby2_ap_test_tau.txt group delay
|
||||
\endverbatim
|
||||
|
||||
In addition, GNUPLOT will build the following graphs from data stored in files:
|
||||
|
||||
\image html cheby2_ap_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby2_ap_zp(int ord, double rs, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Function calculates arrays of zeros and poles for analog normlized lowpass
|
||||
Chebyshev type 2 filter transfer function \f$ H(s) \f$ order `ord` .
|
||||
|
||||
Analog normalized Chebyshev type 2 filter lowpass filter has \f$Rs\f$ dB
|
||||
suppression in stopband.
|
||||
Also analog normalized Chebyshev type 2 filter magnitude equals \f$-Rs\f$ dB
|
||||
for angular frequency \f$\omega = 1\f$ rad/s.
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of zeros and poles of filter can be less or equal `ord`. \n
|
||||
\n
|
||||
|
||||
\param[in] rs
|
||||
Suppression level in stopband (dB). \n
|
||||
This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Pointer to the \f$ H(s) \f$ zeros array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n
|
||||
Number of finite zeros which was calculated and saved in vector `z`. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Pointer to the \f$ H(s) \f$ poles array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Pointer to the variable which keep number of
|
||||
calculated poles of \f$ H(s) \f$. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if zeros and poles is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example of normalized Chebyshev type 2 lowpass filter
|
||||
zeros and poles calculation:
|
||||
\include cheby2_ap_zp_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
Chebyshev type 2 filter zeros: 6
|
||||
z[ 0] = 0.000 +1.026 j
|
||||
z[ 1] = 0.000 -1.026 j
|
||||
z[ 2] = 0.000 +1.279 j
|
||||
z[ 3] = 0.000 -1.279 j
|
||||
z[ 4] = 0.000 +2.305 j
|
||||
z[ 5] = 0.000 -2.305 j
|
||||
Chebyshev type 2 filter poles: 7
|
||||
p[ 0] = -1.203 +0.000 j
|
||||
p[ 1] = -0.113 +0.772 j
|
||||
p[ 2] = -0.113 -0.772 j
|
||||
p[ 3] = -0.398 +0.781 j
|
||||
p[ 4] = -0.398 -0.781 j
|
||||
p[ 5] = -0.852 +0.642 j
|
||||
p[ 6] = -0.852 -0.642 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created `cheby2_ap_z.txt` and
|
||||
`cheby2_ap_z.txt` files which keeps zeros and poles vectors. \n
|
||||
|
||||
In addition, GNUPLOT will build the following graphs
|
||||
from data stored in the files:
|
||||
|
||||
\image html cheby2_ap_zp_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ellip_ap(double rp, double rs, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Function calculates the transfer function \f$ H(s) \f$ coefficients of
|
||||
analog normalized lowpass elliptic filter order `ord` with passband ripple
|
||||
`rp` dB and stopband suppression equals `rs` dB.
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rs
|
||||
Suppression level in stopband (dB). \n
|
||||
This parameter sets filter supression for \f$\omega \geq 1\f$ rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Filter coefficients number equals `ord+1` for numerator and denominator
|
||||
of transfer function \f$ H(s) \f$ \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
numerator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
denominator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example:
|
||||
|
||||
\include ellip_ap_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.268 a[ 0] = 0.301
|
||||
b[ 1] = 0.000 a[ 1] = 0.764
|
||||
b[ 2] = 0.045 a[ 2] = 1.472
|
||||
b[ 3] = 0.000 a[ 3] = 0.948
|
||||
b[ 4] = 0.001 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created 3 files: \n
|
||||
|
||||
\verbatim
|
||||
ellip_ap_test_mag.txt magnitude
|
||||
ellip_ap_test_phi.txt phase response
|
||||
ellip_ap_test_tau.txt group delay
|
||||
\endverbatim
|
||||
|
||||
In addition, GNUPLOT will build the following graphs from data stored in files:
|
||||
|
||||
\image html ellip_ap_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ellip_ap_zp(int ord, double rp, double rs, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Function calculates arrays of zeros and poles for analog normlized lowpass
|
||||
elliptic filter transfer function \f$ H(s) \f$ order `ord` .
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of zeros and poles of filter can be less or equal `ord`. \n
|
||||
\n
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
This parameter sets maximum filter distortion from 0 to 1 rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] rs
|
||||
Suppression level in stopband (dB). \n
|
||||
This parameter sets filter suppression
|
||||
for \f$\omega \geq 1\f$ rad/s frequency. \n
|
||||
Parameter must be positive. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Pointer to the \f$ H(s) \f$ zeros array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Pointer to the variable which keep number of finite zeros \f$ H(s) \f$. \n
|
||||
Number of finite zeros which was calculated and saved in vector `z`. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Pointer to the \f$ H(s) \f$ poles array. \n
|
||||
Maximum vector size is `[ord x 1]`. \n
|
||||
Memory must be allocated for maximum vector size. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Pointer to the variable which keep number of
|
||||
calculated poles of \f$ H(s) \f$. \n
|
||||
Pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if zeros and poles is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
Example of normalized elliptic lowpass filter zeros and poles calculation:
|
||||
\include ellip_ap_zp_test.c
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
Elliptic filter zeros: 6
|
||||
z[ 0] = 0.000 +1.053 j
|
||||
z[ 1] = 0.000 -1.053 j
|
||||
z[ 2] = 0.000 +1.136 j
|
||||
z[ 3] = 0.000 -1.136 j
|
||||
z[ 4] = 0.000 +1.626 j
|
||||
z[ 5] = 0.000 -1.626 j
|
||||
Elliptic filter poles: 7
|
||||
p[ 0] = -0.358 +0.000 j
|
||||
p[ 1] = -0.011 +1.000 j
|
||||
p[ 2] = -0.011 -1.000 j
|
||||
p[ 3] = -0.060 +0.940 j
|
||||
p[ 4] = -0.060 -0.940 j
|
||||
p[ 5] = -0.206 +0.689 j
|
||||
p[ 6] = -0.206 -0.689 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
In `dat` folder will be created `ellip_ap_z.txt` and
|
||||
`ellip_ap_z.txt` files which keeps zeros and poles vectors. \n
|
||||
|
||||
In addition, GNUPLOT will build the following graphs
|
||||
from data stored in the files:
|
||||
|
||||
\image html ellip_ap_zp_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int filter_zp2ab(complex_t *z, int nz, complex_t *p, int np, int ord,
|
||||
double* b, double* a)
|
||||
\brief
|
||||
Function recalculates complex zeros and poles of transfer function \f$ H(s) \f$
|
||||
to the coefficients of \f$ H(s) \f$ numerator and denominator polynomials.
|
||||
|
||||
Transfer function can we described as:
|
||||
\f[
|
||||
H(s) =
|
||||
\frac{\sum\limits_{n = 0}^{N_z} b_n s^n}{\sum\limits_{m = 0}^{N_p} a_m s^m} =
|
||||
\frac{\prod\limits_{n = 0}^{N_z}(s-z_n)}{\prod\limits_{m = 0}^{N_p} (s-p_m)}
|
||||
\f]
|
||||
|
||||
\param[in] z
|
||||
Pointer to the vector of transfer function zeros. \n
|
||||
Vector size is `[nz x 1]`. \n
|
||||
Pointer can be `NULL` if filter has no finite zeros (`nz=0`). \n
|
||||
\n
|
||||
|
||||
\param[in] nz
|
||||
Number of fitite zeros (can be zero). \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Pointer to the vector of transfer function poles. \n
|
||||
Vector size is `[np x 1]`. \n
|
||||
This pointer cannot be `NULL`. \n
|
||||
\n
|
||||
|
||||
\param[in] np
|
||||
Size of vector of transfer function poles (`p` vector size). \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of \f$H(s)\f$ numerator and denominator coefficients equals `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
numerator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the vector of transfer function \f$H(s)\f$
|
||||
denominator coefficient. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
\n
|
||||
|
||||
\note
|
||||
Function calculates real `b` and `a` coefficients of \f$H(s)\f$.
|
||||
It means that zeros and poles vectors must have real values or conjugate pairs
|
||||
to get zeros image part of `b` and `a` coefficients. This function ignores
|
||||
image part of `b` and `a` coeeffitients if the requirements for zeros
|
||||
and poles are not fulfilled.
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -1,123 +0,0 @@
|
|||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FIR_FILTER_DESIGN_GROUP
|
||||
\fn int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||
int win_type, double win_param, double* h)
|
||||
\brief
|
||||
Function calculates linear-phase FIR filter coefficients by window method
|
||||
|
||||
FIR filter transfer function is
|
||||
\f[
|
||||
H(z) = \sum_{n = 0}^{ord} h_n z^{-n}.
|
||||
\f]
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of FIR filter coefficients is `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Normalized cutoff frequency for lowpass and highpass filter,
|
||||
or left cutoff frequency for bandpass or bandstop filter. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Right normalized cutoff frequency for bandpass or bandstop filter. \n
|
||||
This parameter is ignored for lowpass or highpass filters. \n
|
||||
Frequecny `w1` must be higher than `w0`. \n
|
||||
\n
|
||||
|
||||
\param[in] filter_type
|
||||
Filter type. \n
|
||||
This parameter can be one of follow: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - lowpass filter;
|
||||
DSPL_FILTER_HPF - highpass filter;
|
||||
DSPL_FILTER_BPASS - bandpass filter;
|
||||
DSPL_FILTER_BSTOP - bandstop filter.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Window function type. \n
|
||||
This parameter can be one of follow: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
win_type | Description
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Nonparametric Bartlett window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Nonparametric Bartlett-Hann window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Nonparametric Blackman window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Nonparametric Blackman-Harris window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Nonparametric Blackman-Nuttall
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Parametric Dolph-Chebyshev window.
|
||||
| Parametr `win_param` sets sidelobe attenuation
|
||||
| level in dB.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Nonparametric Cosine window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Nonparametric maxflat window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Nonparametric Gauss window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Nonparametric Hamming window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Nonparametric Hann window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Parametric Kaiser window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Nonparametric Lanczos window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Nonparametric Nuttall window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Nonparametric rectangular window
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_param
|
||||
Parameter value for parametric windows. \n
|
||||
This parameter is used for parametric windows only and is ignored for
|
||||
nonparametric windows. \n
|
||||
\n
|
||||
|
||||
\param[out] h
|
||||
Pointer to the linear-phase FIR filter coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memoru must be allocated. \n
|
||||
\n
|
||||
|
||||
\note
|
||||
Only symmetric windows can achieve linear-phase FIR filter. \n \n
|
||||
Bandstop filter type (`filter_type = DSPL_FILTER_BSTOP`) requires
|
||||
only even filter order `ord`.
|
||||
If `filter_type = DSPL_FILTER_BSTOP` and `ord` is odd then function
|
||||
returns `ERROR_FILTER_ORD` code.
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
\include fir_linphase_test.c
|
||||
|
||||
This function calculates coeffictiens of lowpass, highpass, bandpass
|
||||
and bandstop linear-phase FIR filters by using different kind of windows.
|
||||
Also program calculates filter magnitudes and plots. \n
|
||||
|
||||
\image html fir_linphase_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,204 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Lowpass to highpass filter frequency transform
|
||||
|
||||
Function transforms lowpass filter transfer function \f$ H(s) \f$
|
||||
to the highpass filter transfer function \f$ F(s) \f$.
|
||||
|
||||
Filter order, magnitude ripple in passband and stopband
|
||||
supression still the same.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the lowpass filter transfer function \f$H(s)\f$ numerator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the lowpass filter transfer function \f$H(s)\f$ denominator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Lowpass filter cutoff frequency. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Highpass filter cutoff frequency after transformation. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the highwpass filter transfer function \f$F(s)\f$ numerator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the highwpass filter transfer function \f$F(s)\f$ denominator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
|
||||
Lowpass to lowpass filter frequency transform
|
||||
|
||||
Function transforms lowpass filter transfer function \f$ H(s) \f$
|
||||
to the lowpass filter transfer function \f$ F(s) \f$
|
||||
with other cutoff frequency.
|
||||
|
||||
Filter order, magnitude ripple in passband and stopband
|
||||
supression still the same.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the input lowpass filter transfer function \f$H(s)\f$ numerator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the input lowpass filter transfer function \f$H(s)\f$ denominator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Input lowpass filter cutoff frequency. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Lowpass filter cutoff frequency after transformation. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the lowpass filter transfer function \f$F(s)\f$ numerator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the lowpass filter transfer function \f$F(s)\f$ denominator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ratcompos( double* b, double* a, int n,
|
||||
double* c, double* d, int p,
|
||||
double* beta, double* alpha)
|
||||
\brief Rational composition
|
||||
|
||||
Function calcultes composition \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, here
|
||||
|
||||
\f[
|
||||
H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}
|
||||
{\sum\limits_{k = 0}^{n} a_k s^k}, \quad
|
||||
F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}
|
||||
{\sum\limits_{k = 0}^{p} c_k s^k}, \quad
|
||||
Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}
|
||||
{\sum\limits_{k = 0}^{n p} \alpha_k s^k}
|
||||
\f]
|
||||
|
||||
This function is using for filter frequency transform.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the \f$H(s)\f$ polynomial function
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `[n+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the \f$H(s)\f$ polynomial function
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `[n+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Order of \f$H(s)\f$ numerator and denominator polynomials. \n
|
||||
\n
|
||||
|
||||
\param[in] c
|
||||
Pointer to the \f$F(s)\f$ polynomial function
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `[p+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] d
|
||||
Pointer to the \f$F(s)\f$ polynomial function
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `[p+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Order of \f$F(s)\f$ numerator and denominator polynomials. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the numerator coefficients vector of
|
||||
\f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Vector size is `[n*p+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the denominator coefficients vector of
|
||||
\f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Vector size is `[n*p+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if rational composition is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -1,184 +0,0 @@
|
|||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int bilinear(double* bs, double* as, int ord, double* bz, double* az)
|
||||
|
||||
\brief
|
||||
Transform a s-plane analog filter transfer function \f$H(s)\f$ to the
|
||||
digital filter transfer function \f$H(z)\f$.
|
||||
|
||||
Bilinear transform is rational composition:
|
||||
|
||||
\f[
|
||||
s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}.
|
||||
\f]
|
||||
|
||||
Digital filter order, passband magnitude ripple and stopband suppression
|
||||
still the same after bilinear transform as analog filter.
|
||||
|
||||
Frequency \f$\Omega\f$ of analog filter and frequency
|
||||
\f$\omega\f$ of digital filter relations:
|
||||
|
||||
\f[
|
||||
\Omega = \tan(\omega / 2).
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] bs
|
||||
Pointer to the vector of analog filter \f$H(s)\f$
|
||||
numerator coefficients.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] as
|
||||
Pointer to the vector of analog filter \f$H(s)\f$
|
||||
denominator coefficients vector.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Analog and digital filters order. \n
|
||||
\n
|
||||
|
||||
\param[out] bz
|
||||
Pointer to the vector of digital filter \f$H(z)\f$
|
||||
numerator coefficients after bilinear transform.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] az
|
||||
Pointer to the vector of digital filter \f$H(z)\f$
|
||||
denominator coefficients after bilinear transform.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if bilinear transform is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
\include bilinear_test.c
|
||||
|
||||
This program calculates the transfer function \f$H(s)\f$ of analog
|
||||
Chebyshev filter of the first kind, with a cutoff frequency of 1 rad/s,
|
||||
and produces bilinear trandform to digital filter,
|
||||
with a normilized cutoff frequency equals 0.5.
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
bz[0] = 0.246 az[0] = 4.425
|
||||
bz[1] = 0.983 az[1] = -3.318
|
||||
bz[2] = 1.474 az[2] = 4.746
|
||||
bz[3] = 0.983 az[3] = -2.477
|
||||
bz[4] = 0.246 az[4] = 1.034
|
||||
err = 0
|
||||
\endverbatim
|
||||
|
||||
In addition, the frequency response of the resulting digital filter
|
||||
is calculated and plotted by GNUPLOT package.
|
||||
|
||||
\image html bilinear.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
\brief
|
||||
Digital IIR filter design.
|
||||
|
||||
The function calculates the coefficients of the digital IIR filter
|
||||
transfer fucntion \f$ H(z) \f$.
|
||||
Filter coeffitients can be used in \ref filter_iir function
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rs
|
||||
Suppression level in stopband (dB). \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of \f$H(z)\f$ numerator and denominator coefficients is `ord+1`. \n
|
||||
For bandpass and bandstop filters `ord` must be even. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Normalized cutoff frequency (from 0 to 1) for lowpass or highpass filter. \n
|
||||
Or left normalized cutoff frequency (from 0 to 1) for
|
||||
bandpass and bandstop filter. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] w1
|
||||
Right normalized cutoff frequency (from 0 to 1) for
|
||||
bandpass and bandstop filter. \n
|
||||
This parameter is ingnored for lowpass and highpass filters.
|
||||
\n
|
||||
|
||||
\param[in] type
|
||||
Filter type. \n
|
||||
This patameter sets combination of filter type (one of follow): \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - lowpass filter;
|
||||
DSPL_FILTER_HPF - highpass filter;
|
||||
DSPL_FILTER_BPASS - bandpass filter;
|
||||
DSPL_FILTER_BSTOP - bandstop filter,
|
||||
\endverbatim
|
||||
and of filter approximation type (one of follow):
|
||||
\verbatim
|
||||
DSPL_FILTER_BUTTER - Butterworth filter;
|
||||
DSPL_FILTER_CHEBY1 - Chebyshev of the first kind filter;
|
||||
DSPL_FILTER_CHEBY2 - Chebyshev of the second kind filter;
|
||||
DSPL_FILTER_ELLIP - Elliptic filter.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Pointer to the transfer function \f$H(z)\f$
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `ord+1`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Pointer to the transfer function \f$H(z)\f$
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `ord+1`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
Example:
|
||||
|
||||
\include iir_test.c
|
||||
|
||||
This program calcultes filter coefficients for different flags `type`.
|
||||
|
||||
In addition, the filters magnitudes
|
||||
is calculated and plotted by GNUPLOT package.
|
||||
|
||||
\image html iir_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,119 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_dec(double* t, double* s, int nt, double period,
|
||||
int nw, double* w, complex_t* y)
|
||||
|
||||
\brief
|
||||
Fourier series coefficient calculation for periodic signal
|
||||
|
||||
\param[in] t
|
||||
Pointer to the time vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Pointer to the signal corresponds to time `t`. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Size of time and signal vectors. \n
|
||||
This value must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] period
|
||||
Signal time period. \n
|
||||
\n
|
||||
|
||||
\param[in] nw
|
||||
Number of Fourie series coefficients. \n
|
||||
\n
|
||||
|
||||
\param[out] w
|
||||
Pointer to the frequency vector (rad/s). \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the complex Fourier series coefficients vector. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Numerical integration is used for Fourier series coefficients calculation.
|
||||
This function is not effective.
|
||||
To increase the speed of calculation of the signal spectrum
|
||||
it is more expedient to use fast Fourier transform algorithms.
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_rec(double* w, complex_t* s, int nw,
|
||||
double* t, int nt, complex_t* y)
|
||||
\brief Time signal reconstruction from Fourier series coefficients.
|
||||
|
||||
Function reconstructs the time signal:
|
||||
|
||||
\f[
|
||||
s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t)
|
||||
\f]
|
||||
|
||||
\param[in] w
|
||||
Pointer to the Fourier series spectrum frequency vector \f$\omega_n\f$. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Pointer to the Fourier series coefficients vector \f$S(\omega_n)\f$. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nw
|
||||
Number of Fourier series coefficients. \n
|
||||
This value must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] t
|
||||
Pointer to the reconstructed signal time vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Size of time vector and reconstructed signal vector . \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the reconstructed signal vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
The output reconstructed signal is generally complex.
|
||||
However, subject to the symmetry properties of the vectors `w` and` s`
|
||||
with respect to zero frequency we get the imaginary part of the vector `y`
|
||||
at the EPS level. The negligible imaginary part in this case
|
||||
can be ignored.
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,160 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn int gnuplot_create(int argc, char* argv[], int w, int h, char* fn_png,
|
||||
void** hplot)
|
||||
|
||||
\brief
|
||||
Create GNUPLOT chart.
|
||||
|
||||
This function opens the GNUPLOT package depending on the `argv` parameters
|
||||
passed to the program. After calling this function, the handle of the graph
|
||||
will be written to the address `hplot` and it becomes possible to send GNUPLOT
|
||||
commands to display the graphs.
|
||||
|
||||
\note From a system point of view, `hplot` is a pointer to an open file
|
||||
in which you can write commands for execution by the GNUPLOT package.
|
||||
|
||||
|
||||
|
||||
\param[in] argc
|
||||
The number of arguments to invoke the program. \n
|
||||
(number of `argv` variables). \n
|
||||
This value cannot be less than one, because `argv [0]`
|
||||
keeps the program executable file name. \n
|
||||
\n
|
||||
|
||||
\param[in] argv
|
||||
Pointer to a strings array of the executable file parameters . \n
|
||||
The size of the array is `argc`. \n
|
||||
`argv [0]` keeps the executable file name. \n
|
||||
`argv [1]` sets the graph display format: \n
|
||||
\verbatim
|
||||
|
||||
--plotwin display the graph in a individual window
|
||||
(this parameter is used by default);
|
||||
|
||||
--plotpng save the plot to a `fn_png` png file;
|
||||
|
||||
--noplot plot not to create, ignore all GNUPLOT commands.
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
\param[in] w
|
||||
The width of the graph window or png file in pixels. \n
|
||||
\n
|
||||
|
||||
\param[in] h
|
||||
The height of the graph window or png file in pixels. \n
|
||||
\n
|
||||
|
||||
\param[in] fn_png
|
||||
Plot png-file name. \n
|
||||
|
||||
\param[in, out] hplot
|
||||
Pointer to the handle address of the GNUPLOT package. \n
|
||||
A pointer to the current graph will be recorded at this address. This pointer
|
||||
is required to send GNUPLOT commands. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
The `hplot` pointer sets in `NULL` if function returns error. \n
|
||||
\note
|
||||
If `argv[1]` parameter equals `--noplot`, then function returns `RES_OK`, but
|
||||
`hplot` will be set as `NULL`. \n
|
||||
|
||||
GNUPLOT handle must be closed by \ref gnuplot_close after plotting.\n
|
||||
|
||||
An example of plotting sine and cosine is given in the following listing:
|
||||
|
||||
\include gnuplot_script_test.c
|
||||
|
||||
This program calculates the values of the sine and cosine functions,
|
||||
and also saves the text files `dat / cosine.txt` and` dat / sine.txt`. \n
|
||||
|
||||
The saved data is displayed on three graphs
|
||||
(with sine, cosine data by both data):
|
||||
|
||||
\image html gnuplot_script_sin.png
|
||||
|
||||
\image html gnuplot_script_cos.png
|
||||
|
||||
\image html gnuplot_script_sincos.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_close(void* h)
|
||||
|
||||
\brief
|
||||
Close GNUPLOT handle.
|
||||
|
||||
This function closes the previously opened GNUPLOT handle after transferring all
|
||||
commands.
|
||||
|
||||
\note
|
||||
From a system point of view, `h` is a pointer to an open file in which
|
||||
You can write commands for execution by the GNUPLOT package.
|
||||
This function closes this file. \n
|
||||
It is important to note that closing the handle does not mean closing the
|
||||
plot window.
|
||||
After closing the package handle, the user cannot send build commands,
|
||||
but the plot window remains open, as it is processed by the package
|
||||
GNUPLOT regardless.
|
||||
|
||||
|
||||
\param[in] h
|
||||
GNUPLOT handle which will be closed. \n
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_cmd(void* h, char* cmd)
|
||||
|
||||
\brief
|
||||
Function sends `cmd` command to GNUPLOT corresponds to `h` handle.
|
||||
|
||||
|
||||
\note From a system point of view, `h` is a pointer to an open file,
|
||||
into which you can write commands for execution by the GNUPLOT package. This
|
||||
function writes the string `cmd` to the given file. \n
|
||||
\n
|
||||
From the user's point of view, calling the `gnuplot_cmd` function is
|
||||
GNUPLOT script one line executing. \n
|
||||
\n
|
||||
A comprehensive description of the graphing capabilities of the GNUPLOT package,
|
||||
with examples of commands can be found on
|
||||
<a href = "http://gnuplot.sourceforge.net/demo_5.2/"> GNUPLOT project </a>.
|
||||
|
||||
\param[in] h
|
||||
GNUPLOT handle. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] cmd
|
||||
GNUPLOT command string. \n
|
||||
\n
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,120 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel(double *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief
|
||||
<a href = "http://en.dsplib.org/content/goertzel/goertzel.html">
|
||||
Goertzel algorithmf
|
||||
</a>
|
||||
individual DFT samples calculation for the real input vector `x`.
|
||||
|
||||
Goertzel algorithm calculates `k` samples of `n`-point DFT, according to
|
||||
`ind` indexes vector.
|
||||
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the real input vector `x` \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of vector `x`. \n
|
||||
\n
|
||||
|
||||
\param[in] ind
|
||||
Pointer to the DFT samples indexes which need
|
||||
to calculate by Goertzel algorithm. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] k
|
||||
Size of vector `ind`. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the DFT samples vector corresponds to indexes `ind`. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Goertzel's algorithm is effective when it is necessary to calculate
|
||||
several DFT samples of a signal of long duration. \n
|
||||
However, the size `k` of the vector of indices` ind` can be arbitrary,
|
||||
including more than the length of the signal `n`.
|
||||
In this case, some DFT samples will be repeated, but this will not entail
|
||||
a runtime error. \n
|
||||
The values of the indices of the DFT spectral samples `ind`
|
||||
can also be arbitrary integers, including negative ones.
|
||||
In this case, the DFT samples will be calculated.
|
||||
with indices modulo `n`. \n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief
|
||||
<a href = "http://en.dsplib.org/content/goertzel/goertzel.html">
|
||||
Goertzel algorithmf
|
||||
</a>
|
||||
individual DFT samples calculation for the complex input vector `x`.
|
||||
|
||||
Goertzel algorithm calculates `k` samples of `n`-point DFT, according to
|
||||
`ind` indexes vector.
|
||||
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the complex input vector `x` \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of vector `x`. \n
|
||||
\n
|
||||
|
||||
\param[in] ind
|
||||
Pointer to the DFT samples indexes which need
|
||||
to calculate by Goertzel algorithm. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] k
|
||||
Size of vector `ind`. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the DFT samples vector corresponds to indexes `ind`. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Goertzel's algorithm is effective when it is necessary to calculate
|
||||
several DFT samples of a signal of long duration. \n
|
||||
However, the size `k` of the vector of indices` ind` can be arbitrary,
|
||||
including more than the length of the signal `n`.
|
||||
In this case, some DFT samples will be repeated, but this will not entail
|
||||
a runtime error. \n
|
||||
The values of the indices of the DFT spectral samples `ind`
|
||||
can also be arbitrary integers, including negative ones.
|
||||
In this case, the DFT samples will be calculated.
|
||||
with indices modulo `n`. \n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,301 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writebin(void* x, int n, int dtype, char* fn)
|
||||
|
||||
\brief
|
||||
Save 1D vector to the binary file
|
||||
|
||||
Function saves real or complex 1D vector size `n` to the binary file `fn`.
|
||||
\n \n
|
||||
|
||||
File format supports 1D and 2D arrays and has follow format: \n\n
|
||||
|
||||
\verbatim
|
||||
|
||||
type 4 bytes type int.
|
||||
Can take on value:
|
||||
DAT_DOUBLE, if x pointer to the real vector;
|
||||
DAT_COMPLEX, if x pointer to the complex vector;
|
||||
|
||||
n 4 bytes type int.
|
||||
Number of array rows.
|
||||
|
||||
m 4 bytes type int.
|
||||
Number of array columns.
|
||||
This parameter equals 1 because this function saves 1D vector.
|
||||
|
||||
data Data in binary raw.
|
||||
Data size is:
|
||||
n * sizeof(double), if dtype==DAT_DOUBLE;
|
||||
n * sizeof(complex_t), if dtype==DAT_COMPLEX.
|
||||
\endverbatim
|
||||
|
||||
Binary file can be used for algorithms verification by external packages like
|
||||
GNU Octave, Matlab, Python because the function writes to a file
|
||||
without loss of accuracy. \n \n
|
||||
|
||||
\param[in] x
|
||||
Pointer to the input vector. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of input vector. \n
|
||||
\n
|
||||
|
||||
\param[in] dtype
|
||||
Type of data. \n
|
||||
|
||||
Can be one of follow: \n
|
||||
`DAT_DOUBLE` -- real data; \n
|
||||
`DAT_COMPLEX` -- complex data. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
File name. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if file is saved successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
Reading saved binary file from GNU Octave or Matlab:
|
||||
\code{.m}
|
||||
function [dat, n, m] = readbin(fn)
|
||||
fid = fopen(fn);
|
||||
if(~fid)
|
||||
error('cannot to open file');
|
||||
end
|
||||
type = fread(fid, 1, 'int32');
|
||||
n = fread(fid, 1, 'int32');
|
||||
m = fread(fid, 1, 'int32');
|
||||
|
||||
if(type==0)
|
||||
dat = fread(fid, [n*m, 1], 'double');
|
||||
end
|
||||
|
||||
if(type==1)
|
||||
y = fread(fid, [n*m*2, 1], 'double');
|
||||
dat = y(1:2:end) + 1i * y(2:2:end);
|
||||
end
|
||||
|
||||
dat = reshape(dat, n, m);
|
||||
|
||||
fclose(fid);
|
||||
end
|
||||
\endcode
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt(double* x, double* y, int n, char* fn)
|
||||
|
||||
\brief
|
||||
Save real data \f$y(x)\f$ to the text file `fn`. \n
|
||||
|
||||
File format
|
||||
|
||||
\verbatim
|
||||
x[0] y[0]
|
||||
x[1] y[1]
|
||||
... ...
|
||||
x[n-1] y[n-1]
|
||||
\endverbatim
|
||||
|
||||
Text file can be used to plotting data with a third-party program
|
||||
for example, the GNUPLOT package (see \ref PLOT_GROUP). \n
|
||||
|
||||
\param[in] x
|
||||
Pointer to the vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] y
|
||||
Pointer to the vector `y`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
This pointer can be `NULL`.
|
||||
File will have only one column corresponds to `x` vector in this case. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of vectors `x` and `y`. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
File name. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if file is saved successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
This function rounds data when writing to a file.
|
||||
So, it is not recommended to use it to verify algorithms.
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt_3d(double* x, int nx, double* y, int ny, double* z, char* fn)
|
||||
|
||||
\brief
|
||||
Save data \f$ z(x,y)\f$ to the text file `fn` for 3D surface plotting.
|
||||
|
||||
Function \f$ z(x,y)\f$ describes as matrix `z[x[n], y[n]]` as it showed on the
|
||||
follow figure:
|
||||
|
||||
\image html writetxt_3d_matrix.png
|
||||
|
||||
Matrix `z` writen in the memory by columns as it it showed on the figure by
|
||||
red arrow. \n
|
||||
|
||||
Text file fas follow format: \n
|
||||
|
||||
\verbatim
|
||||
x[0] y[0] z[0, 0]
|
||||
x[1] y[0] z[1, 0]
|
||||
x[2] y[0] z[2, 0]
|
||||
... ... ...
|
||||
x[nx-1] y[0] z[nx-1, 0]
|
||||
|
||||
x[0] y[1] z[0, 1]
|
||||
x[1] y[1] z[1, 1]
|
||||
x[2] y[1] z[2, 1]
|
||||
... ... ...
|
||||
x[nx-1] y[1] z[nx-1, 1]
|
||||
|
||||
... ... ...
|
||||
... ... ...
|
||||
... ... ...
|
||||
|
||||
x[0] y[ny-1] z[0, ny-1]
|
||||
x[1] y[ny-1] z[1, ny-1]
|
||||
x[2] y[ny-1] z[2, ny-1]
|
||||
... ... ...
|
||||
x[nx-1] y[ny-1] z[nx-1, ny-1]
|
||||
\endverbatim
|
||||
Each `z` matrix value is writen on individual line corresponds to `x`
|
||||
and `y` values. Matrix columns are separated from each other by an empty line.
|
||||
|
||||
The file can be used to build a 3D surface with a third-party program
|
||||
for example, the GNUPLOT package (see \ref PLOT_GROUP). Also this format
|
||||
supported by pgfplot3d packages of the Latex system. \n
|
||||
|
||||
\param[in] x
|
||||
Pointer to the vector `x`. \n
|
||||
Vector size is `[nx x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nx
|
||||
Size of vector `x`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] y
|
||||
Pointer to the vector `y`. \n
|
||||
Vector size is `[ny x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ny
|
||||
Size of vector `y`. \n
|
||||
\n
|
||||
|
||||
\param[in] z
|
||||
Pointer to the matrix `z(x, y)`. \n
|
||||
Size of matrix is `[nx x ny]`.
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
3D data file name. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if file is saved successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
Example of 3D surface plotting:
|
||||
|
||||
\include writetxt_3d_test.c
|
||||
|
||||
Program calcultes function
|
||||
|
||||
\f[
|
||||
z(x,y) = x \exp(-x^2 -y^2)
|
||||
\f]
|
||||
|
||||
and save data to the `dat/data3d.txt` file.\n
|
||||
In addition, GNUPLOT built a 3D surface by data
|
||||
saved to the `dat/data3d.txt` file:
|
||||
|
||||
\image html writetxt_3d.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt_int(int* x, int* y, int n, char* fn)
|
||||
|
||||
\brief
|
||||
Save interger data \f$y(x)\f$ to the text file `fn`. \n
|
||||
|
||||
File format
|
||||
|
||||
\verbatim
|
||||
x[0] y[0]
|
||||
x[1] y[1]
|
||||
... ...
|
||||
x[n-1] y[n-1]
|
||||
\endverbatim
|
||||
|
||||
Text file can be used to plotting data with a third-party program
|
||||
for example, the GNUPLOT package (see \ref PLOT_GROUP). \n
|
||||
|
||||
\param[in] x
|
||||
Pointer to the interger vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] y
|
||||
Pointer to the interger vector `y`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
This pointer can be `NULL`.
|
||||
File will have only one column corresponds to `x` vector in this case. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of vectors `x` and `y`. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
File name. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if file is saved successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,506 +0,0 @@
|
|||
/*****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int acos_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief The inverse of the cosine function the complex vector argument `x`
|
||||
|
||||
Function calculates the inverse of the cosine function as: \n
|
||||
|
||||
\f[
|
||||
\textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) =
|
||||
\frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right)
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the argument vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Input vector `x` and the inverse cosine vector `y` size. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the output complex vector `y`,
|
||||
corresponds to the input vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example: \n
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
acos_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("acos_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output is: \n
|
||||
\verbatim
|
||||
acos_cmplx(1.0+2.0j) = 1.144-1.529j
|
||||
acos_cmplx(3.0+4.0j) = 0.937-2.306j
|
||||
acos_cmplx(5.0+6.0j) = 0.880-2.749j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int asin_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief The inverse of the sine function the complex vector argument `x`
|
||||
|
||||
Function calculates the inverse of the sine function as: \n
|
||||
|
||||
\f[
|
||||
\textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right)
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the argument vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Input vector `x` and the inverse sine vector `y` size. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the output complex vector `y`,
|
||||
corresponds to the input vector `x`.\n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully.\n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example: \n
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
asin_cmplx(x, 3, y);
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("asin_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output is: \n
|
||||
\verbatim
|
||||
asin_cmplx(1.0+2.0j) = 0.427+1.529j
|
||||
asin_cmplx(3.0+4.0j) = 0.634+2.306j
|
||||
asin_cmplx(5.0+6.0j) = 0.691+2.749j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRANSCEND
|
||||
\fn int bessel_i0(double* x, int n, double* y)
|
||||
\brief
|
||||
Modified Bessel Function of the First Kind – \f$ I_0(x)\f$ [1]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the function argument vector \f$ x \f$. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Input vector must contain nonnegative values. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Input vector size `x`. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to \f$ I_0(x)\f$ function vector. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
\note
|
||||
[1] Rational Approximations for the Modified Bessel Function
|
||||
of the First Kind – I0(x) for Computations with Double Precision
|
||||
by PAVEL HOLOBORODKO on NOVEMBER 11, 2015
|
||||
|
||||
Example:
|
||||
|
||||
\include bessel_i0.c
|
||||
|
||||
Program calcultes \f$ I_0(x)\f$ function for `x`
|
||||
in \f$[0 \ 3]\f$ interval.
|
||||
Data saved if `dat/dat0.txt` file and shows on the plot
|
||||
|
||||
\image html bessel_i0.png
|
||||
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int cos_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief The cosine function the complex vector argument `x`
|
||||
|
||||
Function calculates the cosine function as: \n
|
||||
|
||||
\f[
|
||||
\textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2}
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the argument vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Input vector `x` and the cosine vector `y` size. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the output complex vector `y`,
|
||||
corresponds to the input vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example: \n
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
cos_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("cos_cmplx(%.1f%+.1fj) = %9.3f%+9.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output is: \n
|
||||
\verbatim
|
||||
cos_cmplx(1.0+2.0j) = 2.033 -3.052j
|
||||
cos_cmplx(3.0+4.0j) = -27.035 -3.851j
|
||||
cos_cmplx(5.0+6.0j) = 57.219 +193.428j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int log_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief The logarithm function the complex vector argument `x`
|
||||
|
||||
Function calculates the logarithm function as: \n
|
||||
|
||||
\f[
|
||||
\textrm{Ln}(x) = j \varphi + \ln(|x|),
|
||||
\f]
|
||||
here \f$\varphi\f$ - the complex number phase.
|
||||
|
||||
\param[in] x
|
||||
Pointer to the argument vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Input vector `x` and the logarithm vector `y` size. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the output complex vector `y`,
|
||||
corresponds to the input vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example: \n
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
log_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("log_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output is: \n
|
||||
\verbatim
|
||||
log_cmplx(1.0+2.0j) = 0.805+1.107j
|
||||
log_cmplx(3.0+4.0j) = 1.609+0.927j
|
||||
log_cmplx(5.0+6.0j) = 2.055+0.876j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int sin_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief The sine function the complex vector argument `x`
|
||||
|
||||
Function calculates the sine function as: \n
|
||||
|
||||
\f[
|
||||
\textrm{cos}(x) = \frac{\exp(jx) - \exp(-jx)}{2j}
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the argument vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Input vector `x` and the sine vector `y` size. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the output complex vector `y`,
|
||||
corresponds to the input vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example: \n
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
sin_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("sin_cmplx(%.1f%+.1fj) = %9.3f%+9.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Output is: \n
|
||||
\verbatim
|
||||
sin_cmplx(1.0+2.0j) = 3.166 +1.960j
|
||||
sin_cmplx(3.0+4.0j) = 3.854 -27.017j
|
||||
sin_cmplx(5.0+6.0j) = -193.430 +57.218j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int sinc(double* x, int n, double a, double* y)
|
||||
|
||||
\brief
|
||||
Function \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
|
||||
for the real vector `x`.
|
||||
|
||||
\param[in] x
|
||||
Pointer to the input vector \f$ x \f$. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Input and output vectors size. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Function parameter \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the `sinc` function output vector. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRANSCEND
|
||||
\fn int sine_int(double* x, int n, double* si)
|
||||
|
||||
\brief
|
||||
Sine integral function \f$\textrm{Si}(x)\f$ for the real vector `x`.
|
||||
|
||||
\f[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\f]
|
||||
|
||||
This function uses
|
||||
<a href = "https://www.sciencedirect.com/science/article/pii/S221313371500013X?via%3Dihub">
|
||||
Padé approximants of the convergent Taylor series.
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the input vector \f$ x \f$. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Size of input vector `x`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] si
|
||||
Pointer to the `Si` function vector. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example:
|
||||
|
||||
\include sine_int_test.c
|
||||
|
||||
This program calcultes sine integral \f$\textrm{Si}(x)\f$ and
|
||||
\f$\textrm{sinc}(x)\f$ functions for input `x` vector in interval
|
||||
\f$[-6\pi \ 6\pi]\f$.
|
||||
Functions values saved to th
|
||||
`dat/dat0.txt` and `dat/dat1.txt` files and showed on the figure:
|
||||
|
||||
\image html sine_int.png
|
||||
|
||||
\author
|
||||
Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int sqrt_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Square root of the complex vector argguument `x`.
|
||||
|
||||
Function calculates square root value of vector `x` length `n`: \n
|
||||
\f[
|
||||
y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1.
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Pointer to the input complex vector `x`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Size of input and output vectors `x` and `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Pointer to the square root vector `y`. \n
|
||||
Vector size is `[n x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return `RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
|
||||
Example
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3]
|
||||
int k;
|
||||
|
||||
sqrt_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("sqrt_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
sqrt_cmplx(1.0+2.0j) = 1.272+0.786j
|
||||
sqrt_cmplx(3.0+4.0j) = 2.000+1.000j
|
||||
sqrt_cmplx(5.0+6.0j) = 2.531+1.185j
|
||||
\endverbatim
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eig_cmplx(complex_t* a, int n, complex_t* v, int* info)
|
||||
|
||||
\brief
|
||||
Расчет собственных значений квадратной комплексной матрицы.
|
||||
|
||||
Данная функция производит расчет `n` собственных значений квадратной матрицы
|
||||
размером `n x n`.
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на комплексную матрицу размерности `n x n`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размерность квадратной матрицы.\n
|
||||
|
||||
\param[out] v
|
||||
Указатель на вектор собственных значений матрицы. \n
|
||||
Размер вектора `n x 1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] info
|
||||
Указатель на код возврата функции `zgees` пакета LAPACK. \n
|
||||
В случае возникновения ошибки при расчете вектора собственных значений,
|
||||
пакет LAPACK возвращает код ошибки, который может быть прочитан по данному
|
||||
указателю.
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
При возникновении ошибки `ERROR_LAPACK` по адресу
|
||||
`info` будет записан код ошибки пакета LAPACK. \n
|
||||
|
||||
|
||||
\include matrix_eig.c
|
||||
|
||||
Данная программа рассчитывает собственные значения матрицы размерности `3 x 3`
|
||||
и выводит собственные значения на печать. \n
|
||||
|
||||
Результат работы программы:
|
||||
\verbatim
|
||||
A = [ % size [3 x 3] type: complex
|
||||
1.00 +0.00i, 2.00 +0.00i, 3.00 +0.00i;
|
||||
1.00 +0.00i, 0.00 +0.00i, 0.00 +0.00i;
|
||||
0.00 +0.00i, 1.00 +0.00i, 0.00 +0.00i;];
|
||||
|
||||
v = [ % size [3 x 1] type: complex
|
||||
2.374424 -0.000000i;
|
||||
-0.687212 +0.889497i;
|
||||
-0.687212 -0.889497i;];
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eye(double* a, int n, int m)
|
||||
|
||||
\brief
|
||||
Генерирование единичной вещественой матрицы размерности `n x m`.
|
||||
|
||||
Данная функция заполняет матрицу нулями
|
||||
и записывает единицы на главной диагонали
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на вещественную матрицу размерности `n x m`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Количество строк матрицы. \n
|
||||
\n
|
||||
|
||||
\param[in] m
|
||||
Количество столбцов матрицы. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,195 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyroots(double* a, int ord, complex_t* r, int* info)
|
||||
|
||||
\brief
|
||||
Расчет корней вещественного полинома
|
||||
|
||||
Функция рассчитывает корни полинома \f$P_N(x)\f$ \f$N-\f$ого
|
||||
порядка, заданного вектором коэффициентов `a`.
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ... a_N x^N.
|
||||
\f]
|
||||
|
||||
Корни полинома рассчитываются как собственные числа характеристической
|
||||
матрицы полинома. Для расчета собственных чисел используется подпрограмма
|
||||
пакета LAPACK.
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
Коэффициент `a[ord]` не должен быть равен нулю. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[out] r
|
||||
Указатель на вектор комплексных корней полинома. \n
|
||||
Размер вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] info
|
||||
Указатель наа код возврата пакета LAPACK. \n
|
||||
Данный код возвращается подпрограммой LAPACK и транслируется через данную
|
||||
переменную для возможности анализа. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- корни полинома рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
Пример расчета корней полинома:
|
||||
|
||||
Пример использования функции `bilinear`:
|
||||
|
||||
\include polyroots_test.c
|
||||
|
||||
Данная программа производит расчет корней полинома
|
||||
\f[
|
||||
P(x) = 2 + 2x + x^2
|
||||
\f]
|
||||
и выводит рассчитанные корни на печать.
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
Error code: 0x00000000
|
||||
r[0] = -1.00000 1.00000 j
|
||||
r[1] = -1.00000-1.00000 j
|
||||
\endverbatim
|
||||
|
||||
Получили пару комплексно-сопряженных корней полинома.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval(double* a, int ord, double* x, int n, double* y)
|
||||
|
||||
\brief
|
||||
Расчет вещественного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N-\f$ого порядка для вещественного
|
||||
аргумента, заданного вектором `x`.
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера:
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
|
||||
|
||||
\brief
|
||||
Расчет комплексного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N\f$-го порядка
|
||||
комплексного аргумента, заданного вектором `x`. \n
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера: \n
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор комплексных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель вектор значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином расчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
|
@ -1,385 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\struct random_t
|
||||
\brief Структура параметров датчиков псевдослучайных чисел.
|
||||
|
||||
Структура хранит инициализацию и текущие регистры различных датчиков
|
||||
псевдослучайных чисел. В библиотеке используются следующие датчики:
|
||||
\li MRG32K3A -- 32 битный датчик разработан Пьером Лекуэром [1].
|
||||
\li MT19937-64 -- 64-битный датчик
|
||||
<a href = "https://en.wikipedia.org/wiki/Mersenne_Twister">
|
||||
Вихрь Мерсенна
|
||||
</a> [2, 3].
|
||||
|
||||
\note
|
||||
[1] Pierre L'Ecuyer, (1999) Good Parameters and Implementations for Combined
|
||||
Multiple Recursive Random Number Generators. Operations Research
|
||||
47(1):159-164. https://doi.org/10.1287/opre.47.1.159 \n\n
|
||||
[2] T. Nishimura, ``Tables of 64-bit Mersenne Twisters // ACM Transactions
|
||||
on Modeling and Computer Simulation 10. (2000) 348--357. \n\n
|
||||
[3] M. Matsumoto and T. Nishimura Mersenne Twister: a 623-dimensionally
|
||||
equidistributed uniform pseudorandom number generator // ACM Transactions
|
||||
on Modeling and Computer Simulation 8. (Jan. 1998) 3--30. \n\n
|
||||
|
||||
\param mrg32k3a_seed
|
||||
Начальная инициализация датчика MRG32K3A. \n \n
|
||||
|
||||
|
||||
\param mrg32k3a_x
|
||||
Первый вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mrg32k3a_y
|
||||
Второй вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mt19937_mt
|
||||
Первый вектор состояния рекурсивного датчика MT19937-64. \n \n
|
||||
|
||||
\param mt19937_mti
|
||||
Текущий индекс в векторе состояния датчика MT19937-64. \n \n
|
||||
|
||||
Параметры данной структуры заполняются автоматически функцией `random_init`
|
||||
и используются функциями генерации псевдослучайных векторов.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int random_init(random_t* prnd, int type, void* seed)
|
||||
\brief
|
||||
Инициализация датчиков псевдослучайных чисел.
|
||||
|
||||
\param[in,out] prnd
|
||||
Указатель на структуру параметров и векторов состояния
|
||||
датчиков псевдослучайных чисел, которая будет инициализирована. \n\n
|
||||
|
||||
\param[in] type
|
||||
Тип датчика псевдослучайных чисел:
|
||||
\verbatim
|
||||
RAND_TYPE_MRG32K3A - 32-битный датчик MRG32K3A
|
||||
RAND_TYPE_MT19937 - 64-битный датчик MT19937-64
|
||||
\endverbatim
|
||||
|
||||
\param[in] seed
|
||||
Указатель на начальную инициализацию датчика. \n
|
||||
Данный указатель имеет тип `void*`, поскольку параметр инициализации
|
||||
зависит от типа датчика. Например если инициализируем датчик MRG32K3A,
|
||||
т.е. параметр `type` задан как `RAND_TYPE_MRG32K3A`, то данный указатель
|
||||
приводится к типу `double`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
double seed = 1234.0;
|
||||
random_init(&rnd, RAND_TYPE_MRG32K3A, (void*)&seed);
|
||||
\endcode
|
||||
Если же используется 64-битный датчик Вихрь Мерсенна
|
||||
(`type` задан как `RAND_TYPE_MT19937`), то `seed` приводится к типу
|
||||
`unsigned long long`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
unsigned long long seed = 1234353456;
|
||||
random_init(&rnd, RAND_TYPE_MT19937, (void*)&seed);
|
||||
\endcode
|
||||
При фиксированном начальном значении датчика, псевдослучайные числа будут
|
||||
повторяться при каждом запуске программы. \n
|
||||
Указатель `seed` может быть `NULL`. В этом случае начальная инициализация
|
||||
датчиков будет задаваться случайными значениями и генерируемые псевдослучайные
|
||||
числа будут различными при каждом запуске программы.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация бинарного униполярного [0, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует униполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение 0 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb2(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация бинарного биполярного [-1, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует биполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение -1 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randi(int* x, int n, int start, int stop, random_t* prnd)
|
||||
\brief
|
||||
Генерация целочисленного вектора равномерно
|
||||
распределенных псевдослучайных чисел.
|
||||
|
||||
Функция генерирует псевдослучайный вектор целых чисел в диапазоне от `start`
|
||||
до `stop` включительно.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] start
|
||||
Начало диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] stop
|
||||
Конец диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randi_test.c
|
||||
|
||||
Программа рассчитывает целочисленный вектор
|
||||
псевдослучайных чисел в диапазоне [-4, 3].
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randi_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randn(double* x, int n, double mu, double sigma, random_t* prnd)
|
||||
\brief
|
||||
Генерация вектора нормально распределенных псевдослучайных чисел.
|
||||
|
||||
Функция использует преобразование Бокса-Мюллера для приведения
|
||||
равномерно-распределенных псевдослучайных чисел к нормальному распределению
|
||||
с математическим ожиданием \f$\mu\f$ и средневадратическим
|
||||
отклонением \f$\sigma\f$.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] mu
|
||||
Математическое ожидание \f$\mu\f$. \n\n
|
||||
|
||||
|
||||
\param[in] sigma
|
||||
Cредневадратическое отклонение \f$\sigma\f$. \n
|
||||
Дисперсия сгенерированных чисел равна \f$\sigma^2\f$. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор нормально распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randn_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы нормально распределенных
|
||||
псевдослучайных чисел, \f$\mu = 0\f$ и \f$\sigma=1\f$.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randn_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randu(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация вектора равномерно-распределенных в интервале
|
||||
от 0 до 1 псевдослучайных чисел.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор равномерно-распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции с различными датчиками псевдослучайных чисел
|
||||
приведен в следующем листинге:
|
||||
|
||||
\include randu_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы равномерно-распределенных
|
||||
от 0 до 1 псевдослучайных чисел и выводит их на график для трех различных
|
||||
датчиков: MRG32K3A, MT19937-64 и встроенный датчик, определенный
|
||||
стандартом языка Си.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
|
||||
\image html randu_test.png
|
||||
|
||||
Однако при детальном исследовании датчиков, можно обнаружить, что встроенный
|
||||
датчик, определенный стандартом языка Си,
|
||||
выдает значения на фиксированной сетке.
|
||||
|
||||
Чтобы проверить это можно выполнить следующую программу:
|
||||
|
||||
\include randu_accuracy_test.c
|
||||
|
||||
Данная программа аккумулирует только значения датчиков в интервале
|
||||
от 0 до 0.001 и выводит их на график:
|
||||
|
||||
\image html randu_acc_test.png
|
||||
|
||||
Из графика хорошо видно, что данные встроенного датчика выдаются на
|
||||
равноотстоящей сетке значений, в отличии от датчиков MRG32K3A и MT19937-64,
|
||||
которые сохранили псевдослучайный характер.
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
/*!*****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int farrow_lagrange(double *s, int n, double p, double q,
|
||||
double frd, double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе
|
||||
полиномиальной Лагранжевой интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию входного сигнала `s` в `p/q` раз
|
||||
со смещением дробной задержки `frd`. \n
|
||||
|
||||
Для передискретизации используется
|
||||
<a href = "http://ru.dsplib.org/content/resampling_lagrange/resampling_lagrange.html">
|
||||
полиномиальная Лагранжева интерполяция
|
||||
</a>
|
||||
(структура Фарроу для полиномиальной интерполяции). \n
|
||||
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n
|
||||
\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n
|
||||
\n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int int farrow_spline(double *s, int n, double p, double q, double frd,
|
||||
double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе сплайн интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию
|
||||
входного сигнала `s` в `p/q` раз со смещением дробной задержки `frd`. \n
|
||||
Для передискретизации используются
|
||||
<a href = "http://ru.dsplib.org/content/resampling_spline/resampling_spline.html">
|
||||
кубические сплайны Эрмита
|
||||
</a>
|
||||
(структура Фарроу для для сплайн-интерполяции). \n
|
||||
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n
|
||||
\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n
|
||||
\n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,100 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup WIN_GROUP
|
||||
\fn int window(double* w, int n, int win_type, double param)
|
||||
\brief
|
||||
Расчет функции оконного взвешивания
|
||||
|
||||
Функция рассчитывает периодическую или симметричную оконную функцию
|
||||
в соответствии с параметром `win_type`. \n
|
||||
|
||||
Периодическая оконная функция используется для спектрального анализа,
|
||||
а симметричная оконная функция может быть использована для синтеза
|
||||
КИХ-фильтров.
|
||||
|
||||
\param [in,out] w
|
||||
Указатель на вектор оконной функции. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
Рассчитанная оконная функция будет помещена по данному адресу. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора `w` оконной функции. \n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Комбинация флагов для задания типа оконной функции. \n
|
||||
Для задания типа окна используется комбинация битовых масок
|
||||
`DSPL_WIN_MASK | DSPL_WIN_SYM_MASK`. \n
|
||||
Маска `DSPL_WIN_MASK` задает тип оконной функции.
|
||||
Может принимать следующие значения: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева.
|
||||
| Данное окно всегда является симметричным и
|
||||
| игнорирует параметр DSPL_WIN_SYM_MASK .
|
||||
| Параметр param задает уровень боковых
|
||||
| лепестков в дБ.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Непараметрическое косинус-окно
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально
|
||||
| плоской вершиной
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Непараметрическое окно Хемминга
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Непараметрическое окно Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Параметрическое окно Кайзера
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Непараметрическое окно Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Непараметрическое прямоугольное окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
Маска `DSPL_WIN_SYM_MASK` задает симметричное
|
||||
или периодическое окно: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_SYM_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_SYMMETRIC | Симметричное окно (по умолчанию)
|
||||
DSPL_WIN_PERIODIC | Периодическое окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n \n
|
||||
|
||||
|
||||
\param [in] param
|
||||
Параметр окна. \n
|
||||
Данный параметр применяется только для параметрических оконных функций. \n
|
||||
Для непараметрических окон игнорируется. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` если оконная функция рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -30,9 +30,11 @@ $generatedby  <a href="http://www.doxygen.org/index.html">
|
|||
|
||||
|
||||
</ul>
|
||||
|
||||
<HR>
|
||||
</div>
|
||||
<div class = "copyright-dsplib">
|
||||
libdspl-2.0 documentation is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">Creative Commons Attribution-ShareAlike 4.0 International License.</a>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
@ -36,13 +36,14 @@ $generatedby  <a href="http://www.doxygen.org/index.html">
|
|||
alt="" style="border:0" width="88" height="31"/></a><!--/LiveInternet-->
|
||||
</div>
|
||||
</ul>
|
||||
|
||||
<div class = "copyright-dsplib">
|
||||
<HR>
|
||||
© Бахурин Сергей 2015 - 2020. Все права защищены. <BR>
|
||||
Копирование материалов сайта без разрешения автора запрещено.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class = "copyright-dsplib">
|
||||
Документация libdspl-2.0 доступна по <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">лицензии Creative Commons «Attribution-ShareAlike» («Атрибуция-СохранениеУсловий») 4.0 Всемирная</a>.
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -101,17 +101,8 @@ screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
|
|||
<li><a href="http://en.dsplib.org">Content</a></li>
|
||||
<li><a href="http://en.dsplib.org/dspl">DSPL–2.0</a></li>
|
||||
<li><a href="http://en.dsplib.org/forum">Forum</a></li>
|
||||
<li class = "lang-link">
|
||||
<table cellpadding ="0px", style = "margin-bottom:2px; margin-right:2px;">
|
||||
<tr>
|
||||
<td style = "border: solid; border-color:white; border-width:1px;">
|
||||
<a href="http://en.dsplib.org/dspl">En</a>
|
||||
</td>
|
||||
<td style = "border: solid; border-color:var(--menu-bar-color); border-width:1px;">
|
||||
<a href="http://ru.dsplib.org/dspl">Ru</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<li class = "lang-link">
|
||||
<div class = "lang-link-en"> <a href="http://ru.dsplib.org/dspl">Русский</a> </div>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
|
|
@ -102,17 +102,8 @@ screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+
|
|||
<li><a href="http://ru.dsplib.org">Содержание</a></li>
|
||||
<li><a href="http://ru.dsplib.org/dspl">DSPL–2.0</a></li>
|
||||
<li><a href="http://ru.dsplib.org/forum">Форум</a></li>
|
||||
<li class = "lang-link">
|
||||
<table cellpadding ="0px", style = "margin-bottom:2px; margin-right:2px;">
|
||||
<tr>
|
||||
<td style = "border: solid; border-color:var(--menu-bar-color); border-width:1px;">
|
||||
<a href="http://en.dsplib.org/dspl">En</a>
|
||||
</td>
|
||||
<td style = "border: solid; border-color:white; border-width:1px;">
|
||||
<a href="http://ru.dsplib.org/dspl">Ru</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<li class = "lang-link">
|
||||
<div class = "lang-link-en"> <a href="http://en.dsplib.org/dspl">English</a> </div>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
|
|
@ -1,419 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv(double* a, int na, double* b, int nb, double* c)
|
||||
\brief Линейная свертка двух вещественных векторов
|
||||
|
||||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
|
||||
|
||||
\param[in] a
|
||||
Указатель на первый вектор \f$a\f$. \n
|
||||
Размер вектора `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Размер первого вектора. \n \n
|
||||
|
||||
\param[in] b
|
||||
Указатель на второй вектор \f$b\f$. \n
|
||||
Размер вектора `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Размер второго вектора. \n \n
|
||||
|
||||
\param[out] c
|
||||
Указатель на вектор свертки \f$ c = a * b\f$. \n
|
||||
Размер вектора `[na + nb - 1 x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если свертка расчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\note
|
||||
Если вектора `a` и `b` представляют собой коэффициенты двух полиномов,
|
||||
то результат линейной свертки представляет собой коэффициенты произведения
|
||||
исходных полиномов.
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\code{.cpp}
|
||||
double ar[3] = {1.0, 2.0, 3.0};
|
||||
double br[4] = {3.0, -1.0, 2.0, 4.0};
|
||||
double cr[6];
|
||||
|
||||
int n;
|
||||
|
||||
conv(ar, 3, br, 4, cr);
|
||||
|
||||
for(n = 0; n < 6; n++)
|
||||
printf("cr[%d] = %5.1f \n ", n, cr[n]);
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результат работы:
|
||||
\verbatim
|
||||
cr[0] = 3.0
|
||||
cr[1] = 5.0
|
||||
cr[2] = 9.0
|
||||
cr[3] = 5.0
|
||||
cr[4] = 14.0
|
||||
cr[5] = 12.0
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_cmplx(complex_t* a, int na, complex_t* b, int nb, complex_t* c)
|
||||
\brief Линейная свертка двух комплексных векторов
|
||||
|
||||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$.
|
||||
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на первый вектор \f$a\f$. \n
|
||||
Размер вектора `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Размер первого вектора. \n \n
|
||||
|
||||
\param[in] b
|
||||
Указатель на второй вектор \f$b\f$. \n
|
||||
Размер вектора `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Размер второго вектора. \n \n
|
||||
|
||||
\param[out] c
|
||||
Указатель на вектор свертки \f$ c = a * b\f$. \n
|
||||
Размер вектора `[na + nb - 1 x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если свертка рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
\note
|
||||
Если векторы `a` и `b` представляют собой коэффициенты двух полиномов,
|
||||
то результат линейной свертки представляет собой коэффициенты произведения
|
||||
исходных полиномов.
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\code{.cpp}
|
||||
complex_t ac[3] = {{0.0, 1.0}, {1.0, 1.0}, {2.0, 2.0}};
|
||||
complex_t bc[4] = {{3.0, 3.0}, {4.0, 4.0}, {5.0, 5.0}, {6.0, 6.0}};
|
||||
complex_t cc[6];
|
||||
|
||||
int n;
|
||||
|
||||
conv_cmplx(ac, 3, bc, 4, cc);
|
||||
|
||||
for(n = 0; n < 6; n++)
|
||||
printf("cc[%d] = %5.1f%+5.1fj \n ", n, RE(cc[n]),IM(cc[n]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результат работы:
|
||||
\verbatim
|
||||
cc[0] = -3.0 +3.0j
|
||||
cc[1] = -4.0+10.0j
|
||||
cc[2] = -5.0+25.0j
|
||||
cc[3] = -6.0+32.0j
|
||||
cc[4] = 0.0+32.0j
|
||||
cc[5] = 0.0+24.0j
|
||||
\endverbatim
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_fft(double* a, int na, double* b, int nb,
|
||||
fft_t* pfft, double* c)
|
||||
\brief Линейная свертка двух вещественных векторов с использованием алгоритмов
|
||||
быстрого преобразования Фурье
|
||||
|
||||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$ используя
|
||||
секционную обработку с перекрытием в частотной области. Это позволяет сократить
|
||||
вычислительные операции при расчете длинных сверток.
|
||||
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на первый вектор \f$a\f$. \n
|
||||
Размер вектора `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Размер первого вектора. \n \n
|
||||
|
||||
\param[in] b
|
||||
Указатель на второй вектор \f$b\f$. \n
|
||||
Размер вектора `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Размер второго вектора. \n \n
|
||||
|
||||
\param[in] pfft
|
||||
Указатель на структуру `fft_t` алгоритма
|
||||
быстрого преобразования Фурье. \n
|
||||
Функция изменит состояние полей структуры `fft_t`,
|
||||
поэтому структура должна быть очищена перед выходом из
|
||||
программы для исключения утечек памяти. \n
|
||||
|
||||
\param[in] nfft
|
||||
Размер алгоритма БПФ который будет использован для расчета
|
||||
секционной свертки с перекрытием. \n
|
||||
Данный параметр должен быть больше чем минимальное значение
|
||||
размеров сворачиваемых векторов. \n
|
||||
Например если `na=10`, а `nb=4`, то параметр `nfft` должен быть больше 4. \n
|
||||
Библиотека поддерживает алгоритмы БПФ составной длины
|
||||
\f$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\f$,
|
||||
где \f$n_i = 2,3,5,7\f$, а \f$m \f$ --- произвольный простой множитель
|
||||
не превосходящий 46340 (см. описание функции \ref fft_create).
|
||||
Однако, максимальное быстродействие достигается при использовании длин равных
|
||||
степени двойки.
|
||||
|
||||
\param[out] c
|
||||
Указатель на вектор свертки \f$ c = a * b\f$. \n
|
||||
Размер вектора `[na + nb - 1 x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если свертка рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
\note
|
||||
Данная функция наиболее эффективна при вычислении длинных сверток.
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include conv_fft_test.c
|
||||
|
||||
Результат работы:
|
||||
\verbatim
|
||||
|
||||
conv_fft error: 0x00000000
|
||||
conv error: 0x00000000
|
||||
c[ 0] = -0.00 d[ 0] = 0.00
|
||||
c[ 1] = -0.00 d[ 1] = 0.00
|
||||
c[ 2] = 1.00 d[ 2] = 1.00
|
||||
c[ 3] = 4.00 d[ 3] = 4.00
|
||||
c[ 4] = 10.00 d[ 4] = 10.00
|
||||
c[ 5] = 20.00 d[ 5] = 20.00
|
||||
c[ 6] = 35.00 d[ 6] = 35.00
|
||||
c[ 7] = 56.00 d[ 7] = 56.00
|
||||
c[ 8] = 77.00 d[ 8] = 77.00
|
||||
c[ 9] = 98.00 d[ 9] = 98.00
|
||||
c[ 10] = 119.00 d[ 10] = 119.00
|
||||
c[ 11] = 140.00 d[ 11] = 140.00
|
||||
c[ 12] = 161.00 d[ 12] = 161.00
|
||||
c[ 13] = 182.00 d[ 13] = 182.00
|
||||
c[ 14] = 190.00 d[ 14] = 190.00
|
||||
c[ 15] = 184.00 d[ 15] = 184.00
|
||||
c[ 16] = 163.00 d[ 16] = 163.00
|
||||
c[ 17] = 126.00 d[ 17] = 126.00
|
||||
c[ 18] = 72.00 d[ 18] = 72.00
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int conv_fft_cmplx(complex_t* a, int na, complex_t* b, int nb,
|
||||
fft_t* pfft, complex_t* c)
|
||||
\brief Линейная свертка двух комплексных векторов с использованием алгоритмов
|
||||
быстрого преобразования Фурье
|
||||
|
||||
Функция рассчитывает линейную свертку двух векторов \f$ c = a * b\f$ используя
|
||||
секционную обработку с перекрытием в частотной области. Это позволяет сократить
|
||||
вычислительные операции при расчете длинных сверток.
|
||||
|
||||
\param[in] a
|
||||
Указатель на первый вектор \f$a\f$. \n
|
||||
Размер вектора `[na x 1]`. \n \n
|
||||
|
||||
\param[in] na
|
||||
Размер первого вектора. \n \n
|
||||
|
||||
\param[in] b
|
||||
Указатель на второй вектор \f$b\f$. \n
|
||||
Размер вектора `[nb x 1]`. \n \n
|
||||
|
||||
\param[in] nb
|
||||
Размер второго вектора. \n \n
|
||||
|
||||
\param[in] pfft
|
||||
Указатель на структуру `fft_t` алгоритма
|
||||
быстрого преобразования Фурье. \n
|
||||
Функция изменит состояние полей структуры `fft_t`,
|
||||
поэтому структура должна быть очищена перед выходом из
|
||||
программы для исключения утечек памяти. \n
|
||||
|
||||
\param[in] nfft
|
||||
Размер алгоритма БПФ который будет использован для расчета
|
||||
секционной свертки с перекрытием. \n
|
||||
Данный параметр должен быть больше чем минимальное значение
|
||||
размеров сворачиваемых векторов. \n
|
||||
Например если `na=10`, а `nb=4`, то параметр `nfft` должен быть больше 4. \n
|
||||
Библиотека поддерживает алгоритмы БПФ составной длины
|
||||
\f$n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\f$,
|
||||
где \f$n_i = 2,3,5,7\f$, а \f$m \f$ --- произвольный простой множитель
|
||||
не превосходящий 46340 (см. описание функции \ref fft_create).
|
||||
Однако, максимальное быстродействие достигается при использовании длин равных
|
||||
степени двойки.
|
||||
|
||||
\param[out] c
|
||||
Указатель на вектор свертки \f$ c = a * b\f$. \n
|
||||
Размер вектора `[na + nb - 1 x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если свертка рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
\note
|
||||
Данная функция наиболее эффективна при вычислении длинных сверток.
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include conv_fft_cmplx_test.c
|
||||
|
||||
Результат работы:
|
||||
\verbatim
|
||||
c[ 0] = -1.00 -0.00j d[ 0] = -1.00 +0.00j
|
||||
c[ 1] = -6.00 +4.00j d[ 1] = -6.00 +4.00j
|
||||
c[ 2] = -15.00 +20.00j d[ 2] = -15.00 +20.00j
|
||||
c[ 3] = -28.00 +56.00j d[ 3] = -28.00 +56.00j
|
||||
c[ 4] = -45.00 +120.00j d[ 4] = -45.00 +120.00j
|
||||
c[ 5] = -55.00 +210.00j d[ 5] = -55.00 +210.00j
|
||||
c[ 6] = -65.00 +300.00j d[ 6] = -65.00 +300.00j
|
||||
c[ 7] = -75.00 +390.00j d[ 7] = -75.00 +390.00j
|
||||
c[ 8] = -85.00 +480.00j d[ 8] = -85.00 +480.00j
|
||||
c[ 9] = -95.00 +570.00j d[ 9] = -95.00 +570.00j
|
||||
c[ 10] = -105.00 +660.00j d[ 10] = -105.00 +660.00j
|
||||
c[ 11] = -115.00 +750.00j d[ 11] = -115.00 +750.00j
|
||||
c[ 12] = -125.00 +840.00j d[ 12] = -125.00 +840.00j
|
||||
c[ 13] = -135.00 +930.00j d[ 13] = -135.00 +930.00j
|
||||
c[ 14] = -145.00 +1020.00j d[ 14] = -145.00 +1020.00j
|
||||
c[ 15] = -124.00 +1080.00j d[ 15] = -124.00 +1080.00j
|
||||
c[ 16] = -99.00 +1016.00j d[ 16] = -99.00 +1016.00j
|
||||
c[ 17] = -70.00 +820.00j d[ 17] = -70.00 +820.00j
|
||||
c[ 18] = -37.00 +484.00j d[ 18] = -37.00 +484.00j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FILTER_CONV_GROUP
|
||||
\fn int filter_iir(double* b, double* a, int ord, double* x, int n, double* y)
|
||||
\brief Фильтрация вещественного сигнала вещественным БИХ-фильтром
|
||||
|
||||
Функция рассчитывает выход фильтра заданного выражением
|
||||
\f[
|
||||
H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}}
|
||||
{1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}},
|
||||
\f]
|
||||
где \f$a_0\f$ не может быть 0, \f$N=M=\f$`ord`.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$H(z)\f$ БИХ-фильтра. \n
|
||||
Размер вектора `[ord + 1 x 1]`. \n \n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(z)\f$ БИХ-фильтра. \n
|
||||
Размер вектора `[ord + 1 x 1]`. \n
|
||||
Этот указатель может быть `NULL`, тогда фильтрация производится
|
||||
без использования рекурсивной части
|
||||
(вектор коэффициентов `b` задает КИХ-фильтр). \n \n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$H(z)\f$ БИХ-фильтра равно `ord + 1`. \n \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор отсчетов входного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Длина входного сигнала. \n \n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор выходных отсчетов фильтра. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена заранее. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` Если фильтрация произведена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции `filter_iir`:
|
||||
|
||||
\include filter_iir_test.c
|
||||
|
||||
На входе цифрового фильтра задан сигнал
|
||||
\f$s(t) = \sin(2\pi \cdot 0.05 t) + n(t)\f$, где \f$n(t)\f$ белый гауссовский
|
||||
шум, с нулевым средним и единичной дисперсией. \n
|
||||
Фильтр представляет собой эллиптический ФНЧ 6 порядка.
|
||||
Входной сигнал фильтруется данным фильтром, и результат сохраняется в файлы:
|
||||
|
||||
\verbatim
|
||||
dat/s.txt - исходный зашумленный сигнал
|
||||
dat/sf.txt - сигнал на выходе фильтра.
|
||||
\endverbatim
|
||||
|
||||
По полученным данным производится построение графиков:
|
||||
|
||||
\image html filter_iir_test.png
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,86 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void* dspl_load()
|
||||
\brief
|
||||
Произвести динамическую линковку и загрузить функции DSPL-2.0.
|
||||
|
||||
Данная функция производит попытку связывания с библиотекой `libdspl.dll` в
|
||||
системе Windows и с библиотекой `libdspl.so` в системе Linux.
|
||||
Предполагается, что библиотека находится в одной директории с приложением
|
||||
пользователя, или путь к библиотеке прописан в переменных пути операционной
|
||||
системы.
|
||||
|
||||
При удачном связывании и загрузке функций библиотеки возвращается хэндл
|
||||
библиотеки, а также в адресном пространстве приложения появляются
|
||||
указатели на функции DSPL-2.0.
|
||||
|
||||
\note
|
||||
Возвращаемый хэндл имеет тип `void*`, который в ОС Windows может быть приведен
|
||||
к типу `HINSTANCE`. На практике необходимости в этом, нет, потому что данный
|
||||
тип приводится к `HINSTANCE` автоматически, если выставлен флаг компилятора,
|
||||
указывающий, что сборка приложения производится в ОС Windows.
|
||||
|
||||
Пример простейшей программы реализующей динамическое связывание с DSPL-2.0.
|
||||
|
||||
\code
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
void* hdspl; /* DSPL хэндл */
|
||||
hdspl = dspl_load(); /* Динамическая линковка */
|
||||
|
||||
/* Проверяем указатель. Если `NULLL`, то линковка прошла неудачно */
|
||||
if(!hdspl)
|
||||
{
|
||||
printf("libdspl loading error!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
Линковка прошла успешно можно вызывать функции DSPL-2.0
|
||||
*/
|
||||
|
||||
/*
|
||||
Перед корректным завершением приложения необходимо разлинковать
|
||||
библиотеку и очистить память.
|
||||
*/
|
||||
dspl_free(hdspl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
\endcode
|
||||
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void dspl_free(void* handle)
|
||||
\brief
|
||||
Очищает связанную ранее динамическую библиотеку DSPL-2.0.
|
||||
|
||||
Данная кроссплатформенная функция производит очистку библиотеки `libdspl.dll` в
|
||||
системе Windows и с библиотеки `libdspl.so` в системе Linux.
|
||||
После очистки библиотеки все функции станут недоступны.
|
||||
|
||||
\param[in] handle
|
||||
Хэндл прилинкованной ранее библиотеки DSPL-2.0. \n
|
||||
Данный указатель может быть `NULL`, в этом случае никакие действия не
|
||||
производятся.
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,820 +0,0 @@
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int butter_ap(double Rp, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Расчет передаточной характеристики \f$ H(s) \f$ аналогового
|
||||
нормированного ФНЧ Баттерворта.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
|
||||
аналогового нормированного ФНЧ Баттерворта порядка `ord` с частотой среза
|
||||
1 рад/с по уровню \f$ -R_p \f$ дБ.
|
||||
|
||||
\param[in] Rp
|
||||
Неравномерность АЧХ в полосе пропускания (дБ). \n
|
||||
Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$H(s)\f$ равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
\n
|
||||
|
||||
Пример использования функции `butter_ap`:
|
||||
|
||||
\include butter_ap_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 1.965 a[ 0] = 1.965
|
||||
b[ 1] = 0.000 a[ 1] = 3.138
|
||||
b[ 2] = 0.000 a[ 2] = 2.505
|
||||
b[ 3] = 0.000 a[ 3] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будут созданы три файла: \n
|
||||
|
||||
\verbatim
|
||||
butter_ap_test_mag.txt АЧХ фильтра
|
||||
butter_ap_test_phi.txt ФЧХ фильтра
|
||||
butter_ap_test_tau.txt ГВЗ фильтра
|
||||
\endverbatim
|
||||
|
||||
Кроме того программа GNUPLOT произведет построение следующих графиков
|
||||
по сохраненным в файлах данным:
|
||||
|
||||
\image html butter_ap_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int butter_ap_zp(int ord, double rp, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Расчет массивов нулей и полюсов передаточной функции
|
||||
\f$ H(s) \f$ аналогового нормированного ФНЧ Баттерворта.
|
||||
|
||||
Функция рассчитывает значения нулей и полюсов передаточной функции
|
||||
\f$ H(s)\f$ аналогового нормированного ФНЧ Баттерворта порядка `ord`
|
||||
с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
\n
|
||||
|
||||
\param[in] rp
|
||||
Неравномерность АЧХ в полосе пропускания (дБ). \n
|
||||
Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Указатель на массив комплексных нулей
|
||||
передаточной характеристики \f$ H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Указатель на переменную количества нулей
|
||||
передаточной характеристики \f$ H(s)\f$. \n
|
||||
По данному указателю будет записано количество
|
||||
нулей фильтра, которые были рассчитаны и
|
||||
помещены в вектор `z`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Указатель на массив комплексных полюсов
|
||||
передаточной характеристики \f$ H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Указатель на переменную количества полюсов
|
||||
передаточной характеристики \f$ H(s)\f$. \n
|
||||
По данному укащзателю будет записано количество нулей фильтра, которые
|
||||
были рассчитны и помещены в вектор `p`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
\n
|
||||
|
||||
\note
|
||||
Нормированный ФНЧ Баттерворта не имеет нулей, поэтому массив нулей `z`
|
||||
не будет изменен, а по указателю `nz` будет записан 0. \n
|
||||
|
||||
|
||||
Пример программы рассчета нулей и полюсов нормированного ФНЧ Баттерворта:
|
||||
\include butter_ap_zp_test.c
|
||||
|
||||
Результат выполнения программы:
|
||||
|
||||
\verbatim
|
||||
Butterworth filter zeros: 0
|
||||
Butterworth filter poles: 7
|
||||
p[ 0] = -1.101 +0.000 j
|
||||
p[ 1] = -0.245 +1.074 j
|
||||
p[ 2] = -0.245 -1.074 j
|
||||
p[ 3] = -0.687 +0.861 j
|
||||
p[ 4] = -0.687 -0.861 j
|
||||
p[ 5] = -0.992 +0.478 j
|
||||
p[ 6] = -0.992 -0.478 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будет создан файл `butter_ap_zp.txt`. \n
|
||||
|
||||
Пакет GNUPLOT произведет построение карты полюсов по
|
||||
сохранненным в `dat/butter_ap_zp.txt` данным:
|
||||
|
||||
\image html butter_ap_zp_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby1_ap(double Rp, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Расчет передаточной характеристики \f$ H(s) \f$ аналогового
|
||||
нормированного ФНЧ Чебышёва первого рода.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики
|
||||
\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода
|
||||
порядка `ord` с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n
|
||||
|
||||
Особенностью фильтра Чебышёва первого рода являются
|
||||
равноволновые пульсации АЧХ в полосе пропускания.
|
||||
|
||||
\param[in] Rp
|
||||
Неравномерность АЧХ в полосе пропускания (дБ). \n
|
||||
Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$ H(s)\f$ равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
\n
|
||||
|
||||
Пример использования функции `cheby1_ap`:
|
||||
|
||||
\include cheby1_ap_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.125 a[ 0] = 0.177
|
||||
b[ 1] = 0.000 a[ 1] = 0.405
|
||||
b[ 2] = 0.000 a[ 2] = 1.169
|
||||
b[ 3] = 0.000 a[ 3] = 0.582
|
||||
b[ 4] = 0.000 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будут созданы три файла: \n
|
||||
|
||||
\verbatim
|
||||
cheby1_ap_test_mag.txt АЧХ фильтра
|
||||
cheby1_ap_test_phi.txt ФЧХ фильтра
|
||||
cheby1_ap_test_tau.txt ГВЗ фильтра
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
Кроме того программа GNUPLOT произведет построение следующих графиков
|
||||
по сохраненным в файлах данным:
|
||||
|
||||
\image html cheby1_ap_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby1_ap_zp(int ord, double rp, complex_t* z, int* nz, complex_t* p, int* np)
|
||||
\brief
|
||||
Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$
|
||||
аналогового нормированного ФНЧ Чебышёва первого рода.
|
||||
|
||||
Функция рассчитывает значения нулей и полюсов передаточной функции
|
||||
\f$ H(s)\f$ аналогового нормированного ФНЧ Чебышёва первого рода
|
||||
порядка `ord` с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ, с
|
||||
неравномерностью в полосе пропускания \f$ R_p \f$ дБ. \n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
\n
|
||||
|
||||
\param[in] rp
|
||||
Неравномерность АЧХ в полосе пропускания (дБ). \n
|
||||
Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Указатель на массив комплексных нулей
|
||||
передаточной характеристики \f$ H(s)\f$. \n
|
||||
Максимальный размер вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Указатель на переменную количества нулей
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей фильтра,
|
||||
которые были рассчитаны и помещены в вектор `z`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Указатель на массив комплексных полюсов
|
||||
передаточной характеристики \f$H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Указатель на переменную количества полюсов передаточной функции \f$ H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей фильтра, которые были
|
||||
рассчитаны и помещены в вектор `p`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Нормированный ФНЧ Чебышёва первого рода не имеет нулей, поэтому массив
|
||||
нулей `z` не будет изменен, а по указателю `nz` будет записан 0. \n
|
||||
|
||||
|
||||
Пример программы рассчета нулей и полюсов нормированного
|
||||
ФНЧ Чебышева первого рода:
|
||||
\include cheby1_ap_zp_test.c
|
||||
|
||||
Результат выполнения программы:
|
||||
|
||||
\verbatim
|
||||
Chebyshev type 1 filter zeros: 0
|
||||
Chebyshev type 1 filter poles: 7
|
||||
p[ 0] = -0.256 +0.000 j
|
||||
p[ 1] = -0.057 +1.006 j
|
||||
p[ 2] = -0.057 -1.006 j
|
||||
p[ 3] = -0.160 +0.807 j
|
||||
p[ 4] = -0.160 -0.807 j
|
||||
p[ 5] = -0.231 +0.448 j
|
||||
p[ 6] = -0.231 -0.448 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будет создан файл `cheby1_ap_zp.txt`. \n
|
||||
|
||||
Пакет GNUPLOT произведет построение карты полюсов по
|
||||
сохранненным в `dat/cheby1_ap_zp.txt` данным:
|
||||
|
||||
\image html cheby1_ap_zp_test.png
|
||||
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby2_ap(double Rs, int ord, double *b, double *a)
|
||||
|
||||
\brief
|
||||
Расчет передаточной характеристики \f$ H(s) \f$ аналогового
|
||||
нормированного ФНЧ Чебышёва второго рода.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
|
||||
аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord`
|
||||
с частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ. \n
|
||||
|
||||
Особенностью фильтра Чебышёва второго рода являются: \n
|
||||
1) равноволновые пульсации АЧХ в полосе заграждения. \n
|
||||
2) уровень АЧХ \f$H(j\cdot 1) = -R_s\f$ дБ. \n
|
||||
|
||||
\param[in] Rs
|
||||
Уровень подавления в полосе пропускания (дБ). \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$H(s)\f$ равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
Пример использования функции `cheby1_ap`:
|
||||
|
||||
\include cheby2_ap_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.008 a[ 0] = 0.008
|
||||
b[ 1] = 0.000 a[ 1] = 0.068
|
||||
b[ 2] = 0.008 a[ 2] = 0.300
|
||||
b[ 3] = 0.000 a[ 3] = 0.774
|
||||
b[ 4] = 0.001 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будут созданы три файла: \n
|
||||
|
||||
\verbatim
|
||||
cheby2_ap_test_mag.txt АЧХ фильтра
|
||||
cheby2_ap_test_phi.txt ФЧХ фильтра
|
||||
cheby2_ap_test_tau.txt ГВЗ фильтра
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
Кроме того программа GNUPLOT произведет построение следующих графиков
|
||||
по сохраненным в файлах данным:
|
||||
|
||||
\image html cheby2_ap_test.png
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int cheby2_ap_zp(int ord, double rs, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$
|
||||
аналогового нормированного ФНЧ Чебышёва второго рода.
|
||||
|
||||
Функция рассчитывает значения нулей и полюсов передаточной функции
|
||||
\f$H(s)\f$ аналогового нормированного ФНЧ Чебышёва второго рода порядка `ord` с
|
||||
частотой заграждения 1 рад/с по уровню \f$-R_s\f$ дБ. \n
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
\n
|
||||
|
||||
\param[in] rs
|
||||
Уровень подавления АЧХ в полосе загражения (дБ). \n
|
||||
Параметр задает уровень подавления сигнала в полосе частот от 1 рад/с и выше. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Указатель на массив комплексных нулей передаточной функции \f$H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Указатель на переменную количества нулей передаточной функции \f$H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей фильтра, которые были
|
||||
рассчитаны и помещены в вектор `z`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Указатель на массив комплексных полюсов передаточной функции \f$H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Указатель на переменную количества полюсов передаточной функции \f$H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей
|
||||
фильтра, которые были
|
||||
рассчитаны и помещены в вектор `p`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции `cheby2_ap_zp`:
|
||||
|
||||
Пример программы рассчета нулей и полюсов нормированного
|
||||
ФНЧ Чебышева первого рода:
|
||||
\include cheby2_ap_zp_test.c
|
||||
|
||||
Результат выполнения программы:
|
||||
|
||||
\verbatim
|
||||
Chebyshev type 2 filter zeros: 6
|
||||
z[ 0] = 0.000 +1.026 j
|
||||
z[ 1] = 0.000 -1.026 j
|
||||
z[ 2] = 0.000 +1.279 j
|
||||
z[ 3] = 0.000 -1.279 j
|
||||
z[ 4] = 0.000 +2.305 j
|
||||
z[ 5] = 0.000 -2.305 j
|
||||
Chebyshev type 2 filter poles: 7
|
||||
p[ 0] = -1.203 +0.000 j
|
||||
p[ 1] = -0.113 +0.772 j
|
||||
p[ 2] = -0.113 -0.772 j
|
||||
p[ 3] = -0.398 +0.781 j
|
||||
p[ 4] = -0.398 -0.781 j
|
||||
p[ 5] = -0.852 +0.642 j
|
||||
p[ 6] = -0.852 -0.642 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будет создан файлы `cheby2_ap_z.txt` и `cheby2_ap_z.txt`,
|
||||
хранящие наборы нулей и полюсов на комплексной плоскости. \n
|
||||
|
||||
Пакет GNUPLOT произведет построение карты полюсов по
|
||||
сохранненным в `dat/cheby2_ap_z.txt` и `dat/cheby2_ap_p.txt` данным:
|
||||
|
||||
\image html cheby2_ap_zp_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ellip_ap(double rp, double rs, int ord, double* b, double* a)
|
||||
|
||||
\brief
|
||||
Расчет передаточной характеристики \f$ H(s) \f$ аналогового
|
||||
нормированного эллиптического ФНЧ.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(s)\f$
|
||||
аналогового нормированного эллиптического ФНЧ порядка `ord`
|
||||
с частотой среза 1 рад/с по уровню \f$-R_p\f$ дБ. \n
|
||||
|
||||
Особенностью эллиптического фильтра являются равноволновые пульсации
|
||||
АЧХ как в полосе пропускания, так и в полосе заграждения, в результате
|
||||
чего обеспечиваеся минимальная переходная полоса фильтра. \n
|
||||
|
||||
\param[in] rp
|
||||
Уровень пульсаций в полосе пропускания (дБ). \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] rs
|
||||
Уровень подавления в полосе заграждения (дБ). \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$H(s)\f$ равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
Пример использования функции `ellip_ap`:
|
||||
|
||||
\include ellip_ap_test.c
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
b[ 0] = 0.268 a[ 0] = 0.301
|
||||
b[ 1] = 0.000 a[ 1] = 0.764
|
||||
b[ 2] = 0.045 a[ 2] = 1.472
|
||||
b[ 3] = 0.000 a[ 3] = 0.948
|
||||
b[ 4] = 0.001 a[ 4] = 1.000
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будут созданы три файла: \n
|
||||
|
||||
\verbatim
|
||||
ellip_ap_test_mag.txt АЧХ фильтра
|
||||
ellip_ap_test_phi.txt ФЧХ фильтра
|
||||
ellip_ap_test_tau.txt ГВЗ фильтра
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
Кроме того программа GNUPLOT произведет построение следующих графиков
|
||||
по сохраненным в файлах данным:
|
||||
|
||||
\image html ellip_ap_test.png
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ellip_ap_zp(int ord, double rp, double rs, complex_t* z, int* nz,
|
||||
complex_t* p, int* np)
|
||||
|
||||
\brief
|
||||
Расчет массивов нулей и полюсов передаточной функции \f$ H(s) \f$
|
||||
аналогового нормированного эллиптического ФНЧ.
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rp
|
||||
Неравномерность АЧХ в полосе пропускания (дБ). \n
|
||||
Параметр задает уровень искажений в полосе от 0 до 1 рад/с. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] rs
|
||||
Уровень подавления АЧХ в полосе загражения (дБ). \n
|
||||
Параметр задает уровень подавления сигнала в полосе частот от 1 рад/с и выше. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[out] z
|
||||
Указатель на массив комплексных нулей передаточной функции \f$H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] nz
|
||||
Указатель на переменную количества нулей передаточной функции \f$H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей фильтра, которые были
|
||||
рассчитаны и помещены в вектор `z`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] p
|
||||
Указатель на массив комплексных полюсов передаточной функции \f$H(s)\f$. \n
|
||||
Максимальный размер вектора вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] np
|
||||
Указатель на переменную количества полюсов передаточной функции \f$H(s)\f$. \n
|
||||
По данному указателю будет записано количество нулей
|
||||
фильтра, которые были
|
||||
рассчитаны и помещены в вектор `p`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- массивы нулей и полюсов рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции `cheby2_ap_zp`:
|
||||
|
||||
Пример программы рассчета нулей и полюсов нормированного
|
||||
эллиптического ФНЧ :
|
||||
\include ellip_ap_zp_test.c
|
||||
|
||||
Результат выполнения программы:
|
||||
|
||||
\verbatim
|
||||
Elliptic filter zeros: 6
|
||||
z[ 0] = 0.000 +1.053 j
|
||||
z[ 1] = 0.000 -1.053 j
|
||||
z[ 2] = 0.000 +1.136 j
|
||||
z[ 3] = 0.000 -1.136 j
|
||||
z[ 4] = 0.000 +1.626 j
|
||||
z[ 5] = 0.000 -1.626 j
|
||||
Elliptic filter poles: 7
|
||||
p[ 0] = -0.358 +0.000 j
|
||||
p[ 1] = -0.011 +1.000 j
|
||||
p[ 2] = -0.011 -1.000 j
|
||||
p[ 3] = -0.060 +0.940 j
|
||||
p[ 4] = -0.060 -0.940 j
|
||||
p[ 5] = -0.206 +0.689 j
|
||||
p[ 6] = -0.206 -0.689 j
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
В каталоге `dat` будет создан файлы `ellip_ap_z.txt` и `ellip_ap_z.txt`,
|
||||
хранящие наборы нулей и полюсов на комплексной плоскости. \n
|
||||
|
||||
Пакет GNUPLOT произведет построение карты полюсов по
|
||||
сохранненным в `dat/ellip_ap_z.txt` и `dat/ellip_ap_p.txt` данным:
|
||||
|
||||
\image html ellip_ap_zp_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int filter_zp2ab(complex_t *z, int nz, complex_t *p, int np, int ord,
|
||||
double* b, double* a)
|
||||
\brief Функция пересчета нулей и полюсов аналогового фильтра в коэффициенты
|
||||
передаточной характеристики \f$ H(s) \f$
|
||||
|
||||
\f[
|
||||
H(s) =
|
||||
\frac{\sum_{n = 0}^{N_z} b_n \cdot s^n}{\sum_{m = 0}^{N_p} a_m \cdot s^m} =
|
||||
\frac{\prod_{n = 0}^{N_z}(s-z_n)}{\prod_{m = 0}^{N_p} (s-p_m)}
|
||||
\f]
|
||||
|
||||
\param[in] z
|
||||
Указатель на массив нулей передаточной характеристики. \n
|
||||
Размер вектора `[nz x 1]`. \n
|
||||
Указатель может быть `NULL` если фильтр не имеет конечных нулей (`nz=0`). \n
|
||||
\n
|
||||
|
||||
\param[in] nz
|
||||
Размер вектора нулей передаточной характеристики (может быть равен 0). \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Указатель на массив полюсов передаточной характеристики. \n
|
||||
Размер вектора `[np x 1]`. \n
|
||||
Указатель не может быть `NULL`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] np
|
||||
Размер вектора полюсов передаточной характеристики (не может быть равен 0). \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра для которого рассчитаны нули и полюса. \n
|
||||
Количество коэффициентов числителя и знаменателя
|
||||
передаточной функции \f$H(s)\f$ равно `ord+1`. \n \n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
передаточной функции \f$H(s)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- пересчет произведен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Функция возвращает вещественные значения коэффициентов `b` и `a`
|
||||
передаточной функции. Это означает, что вектора нулей и полюсов
|
||||
должны хранить вещественные значения или комплексно-сопряженные пары
|
||||
нулей и полюсов, потому что мнимая часть коэффициентов `b` и `a`
|
||||
игнорируется и не сохраняется.
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -1,132 +0,0 @@
|
|||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup FIR_FILTER_DESIGN_GROUP
|
||||
\fn int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||
int win_type, double win_param, double* h)
|
||||
\brief
|
||||
Расчет коэффициентов линейно-фазового КИХ-фильтра
|
||||
методом оконного взвешивания.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики
|
||||
\f[
|
||||
H(z) = \sum_{n = 0}^{ord} h_n z^{-n}
|
||||
\f]
|
||||
цифрового линейно-фазового КИХ-фильтра фильтра.
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра (количество элементов задержки). \n
|
||||
Количество коэффициентов фильтра равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Нормированная частота среза ФНЧ или ФВЧ,
|
||||
или левая частота среза для полосового и режекторного фильтра. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Правая частота среза полосового и режекторного фильтра. \n
|
||||
Данный параметр игнорируется для ФНЧ и ФВЧ. \n
|
||||
Частота `w1` должна быть больше `w0`. \n
|
||||
\n
|
||||
|
||||
\param[in] filter_type
|
||||
Тип фильтра. \n
|
||||
Данный параметр определяет тип фильтра
|
||||
и может принимать одно из значений: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - фильтр нижних частот;
|
||||
DSPL_FILTER_HPF - фильтр верхних частот;
|
||||
DSPL_FILTER_BPASS - полосовой фильтр;
|
||||
DSPL_FILTER_BSTOP - режекторный фильтр.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Тип оконной функции. \n
|
||||
Может принимать одно из следующих значений: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение win_type | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева.
|
||||
| Параметр win_param задает уровень
|
||||
| боковых лепестков в дБ.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Непараметрическое косинус-окно
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально
|
||||
| плоской вершиной
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Непараметрическое окно Хемминга
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Непараметрическое окно Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Параметрическое окно Кайзера
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Непараметрическое окно Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Непараметрическое прямоугольное окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_param
|
||||
Параметр окна. \n
|
||||
Данный параметр применяется только для параметрических оконных функций. \n
|
||||
Для непараметрических окон игнорируется. \n
|
||||
\n
|
||||
|
||||
\param[out] h
|
||||
Указатель на вектор коэффициентов линейно-фазового КИХ-фильтраю \f$H(z)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\note
|
||||
Для соблюдения условия линейной ФЧХ используются
|
||||
только симметричные окна. \n \n
|
||||
Расчет режекторного линейно-фазового КИХ-фильтра
|
||||
(если `filter_type = DSPL_FILTER_BSTOP`) производится только
|
||||
для фильтров чётного порядка `ord`.
|
||||
В случае нечетного порядка `ord` функция вернет код ошибки `ERROR_FILTER_ORD`.
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK`
|
||||
Фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include fir_linphase_test.c
|
||||
|
||||
Программа расчитывает коэффициенты и АЧХ линейно-фазовых КИХ-фильтрова нижних,
|
||||
верхних частот, полосовых и режекторных с применением различных весовых окон:
|
||||
прямоугольное, Хемминга, Илэкмана и Блэкмана-Харриса. \n
|
||||
Полученные АЧХ выводятся на график
|
||||
|
||||
\image html fir_linphase_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,217 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФВЧ
|
||||
|
||||
Функция производит перобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФВЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок исходного фильтра и фильтра после переобразования. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Частота среза исходного ФНЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Требуемая частота среза ФВЧ после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$F(s)\f$
|
||||
ФВЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$
|
||||
аналогового ФВЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- преобразование рассчитано успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФНЧ
|
||||
|
||||
Функция производит преобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФНЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок исходного фильтра и фильтра после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Частота среза исходного ФНЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Требуемая частота среза ФНЧ после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$F(s)\f$ ФНЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$
|
||||
аналогового ФНЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- Преоборазование расчитано успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\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$, где
|
||||
|
||||
\f[
|
||||
H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}
|
||||
{\sum\limits_{k = 0}^{n} a_k s^k}, \quad
|
||||
F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}
|
||||
{\sum\limits_{k = 0}^{p} c_k s^k}, \quad
|
||||
Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}
|
||||
{\sum\limits_{k = 0}^{n p} \alpha_k s^k}
|
||||
\f]
|
||||
|
||||
Функция рациональной композиции необходима для произведения частотных
|
||||
преобразований передаточных характеристик аналоговых и цифровых фильтров,
|
||||
а также для билинейного преобразования передаточных характеристик аналоговых
|
||||
фильтров в соответствующие передаточные характеристики цифровых фильтров.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя функции \f$H(s)\f$. \n
|
||||
Размер вектора `[n+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя функции \f$H(s)\f$. \n
|
||||
Размер вектора `[n+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Порядок полиномов рациональной функции \f$H(s)\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] c
|
||||
Указатель на вектор коэффициентов числителя функции \f$F(s)\f$. \n
|
||||
Размер вектора `[p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] d
|
||||
Указатель на вектор коэффициентов знаменателя функции \f$F(s)\f$. \n
|
||||
Размер вектора `[p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Порядок полиномов рациональной
|
||||
функции \f$F(s)\f$. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Указатель на вектор коэффициентов
|
||||
числителя функции \f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Размер вектора `[n*p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
функции \f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Размер вектора `[n*p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- Рациональная композиция рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
|
@ -1,194 +0,0 @@
|
|||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int bilinear(double* bs, double* as, int ord, double* bz, double* az)
|
||||
|
||||
\brief
|
||||
Билинейное преобразование передаточной характеристики аналогового
|
||||
фильтра \f$H(s)\f$, в передаточную характеристику цифрового фильтра \f$H(z)\f$.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра путем дробно-рациональной подстановки вида
|
||||
|
||||
\f[
|
||||
s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}.
|
||||
\f]
|
||||
|
||||
Порядок цифрового фильтра при этом остается равным порядку аналогового фильтра,
|
||||
а ось частот \f$\Omega\f$ аналогового фильтра связана c осью частот
|
||||
\f$\omega\f$ цифрового фильтра соотношением:
|
||||
|
||||
\f[
|
||||
\Omega = \tan(\omega / 2).
|
||||
\f]
|
||||
|
||||
|
||||
|
||||
\param[in] bs
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] as
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя передаточных функций
|
||||
\f$H(s)\f$ и \f$H(z)\f$ аналогового и цифрового фильтров равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] bz
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(z)\f$
|
||||
полученного цифрового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] az
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(z)\f$
|
||||
полученного цифрового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
|
||||
Пример использования функции `bilinear`:
|
||||
|
||||
\include bilinear_test.c
|
||||
|
||||
Данная программа производит расчет передаточной характеристики аналогового
|
||||
фильтра Чебышева первого рода, с частотой среза равной 1 рад/с, и производит
|
||||
билинейное преобразование в цифровой, с частотой среза равной 0.5.
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
bz[0] = 0.246 az[0] = 4.425
|
||||
bz[1] = 0.983 az[1] = -3.318
|
||||
bz[2] = 1.474 az[2] = 4.746
|
||||
bz[3] = 0.983 az[3] = -2.477
|
||||
bz[4] = 0.246 az[4] = 1.034
|
||||
err = 0
|
||||
\endverbatim
|
||||
|
||||
Кроме этого производится расчет АЧХ полученного цифрового фильтра и строится
|
||||
график АЧХ пакетом GNUPLOT
|
||||
|
||||
\image html bilinear.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
\brief
|
||||
Функция расчета коэффициентов передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра БИХ.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра, которые могут быть использованы в функции \ref filter_iir
|
||||
|
||||
\param[in] rp
|
||||
Уровень неравномерности квадрата АЧХ в полосе пропускания фильтра (дБ). \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rs
|
||||
Уровень подавления в полосе заграждения фильтра (дБ).\n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя передаточной
|
||||
функции \f$H(z)\f$ цифрового фильтров равно `ord+1`. \n
|
||||
Для полосовых и режекторных фильтров параметр `ord` должен быть чётным. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Нормированная частота среза ФНЧ или ФВЧ, или левая частота среза для
|
||||
полосового и режекторного фильтра.\n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] w1
|
||||
Правая частота среза полосового и режекторного фильтра. \n
|
||||
Данный параметр игнорируется для ФНЧ и ФВЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] type
|
||||
Тип фильтра. \n
|
||||
Данный параметр определяет тип фильтра и образуется
|
||||
набором флагов типа фильтра: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - фильтр нижних частот;
|
||||
DSPL_FILTER_HPF - фильтр верхних частот;
|
||||
DSPL_FILTER_BPASS - полосовой фильтр;
|
||||
DSPL_FILTER_BSTOP - режекторный фильтр,
|
||||
\endverbatim
|
||||
а также флагов типа аппроксимации АЧХ фильтра:
|
||||
\verbatim
|
||||
DSPL_FILTER_BUTTER - фильтр Баттерворта;
|
||||
DSPL_FILTER_CHEBY1 - фильтр Чебышева первого рода;
|
||||
DSPL_FILTER_CHEBY2 - фильтр Чебышева второго рода;
|
||||
DSPL_FILTER_ELLIP - эллиптический фильтр.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$H(z)\f$. \n
|
||||
Размер вектора `ord+1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной
|
||||
функции \f$H(z)\f$. \n
|
||||
Размер вектора `ord+1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- Фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include iir_test.c
|
||||
|
||||
Данная программа производит расчет коэффициентов фильтров
|
||||
при различном сочетании флагов параметра `type`.
|
||||
|
||||
Кроме этого производится расчет АЧХ полученных цифровых фильтров и выводится на
|
||||
график АЧХ пакетом GNUPLOT
|
||||
|
||||
\image html iir_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,133 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_dec(double* t, double* s, int nt, double period,
|
||||
int nw, double* w, complex_t* y)
|
||||
|
||||
\brief
|
||||
Расчет коэффициентов разложения в ряд Фурье
|
||||
|
||||
Функция рассчитывает спектр периодического сигнала при усечении ряда Фурье \n
|
||||
|
||||
|
||||
\param[in] t
|
||||
Указатель на массив моментов времени дискретизации исходного сигнала `s`. \n
|
||||
Размер вектора вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Указатель на массив значений исходного сигнала`s`. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nt
|
||||
Размер выборки исходного сигнала. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] period
|
||||
Период повторения сигнала. \n
|
||||
\n
|
||||
|
||||
\param[in] nw
|
||||
Размер усеченного ряда Фурье. \n
|
||||
\n
|
||||
|
||||
\param[out] w
|
||||
Указатель на массив частот спектра периодического сигнала. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель массив комплексных значений спектра периодического сигнала. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- коэффициенты ряда Фурье рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Для расчета спектра сигнала используется численное интегрирование
|
||||
исходного сигнала методом трапеций. Данная функция не является
|
||||
эффективной. Для увеличения скорости расчета спектра сигнала
|
||||
целесообразнее использовать алгоритмы дискретного
|
||||
и быстрого преобразования Фурье.
|
||||
\n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_rec(double* w, complex_t* s, int nw,
|
||||
double* t, int nt, complex_t* y)
|
||||
\brief Восстановление сигнала при усечении ряда Фурье
|
||||
|
||||
Функция рассчитывает восстановленный сигнал при усечении ряда Фурье:
|
||||
|
||||
\f[
|
||||
s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t)
|
||||
\f]
|
||||
|
||||
\param[in] w
|
||||
Указатель на массив частот \f$\omega_n\f$ усеченного ряда Фурье. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Указатель на массив значений спектра \f$S(\omega_n)\f$. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nw
|
||||
Количество членов усеченного ряда Фурье. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] t Указатель на массив временных отсчетов
|
||||
восстановленного сигнала. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Размер вектора времени и восстановленного сигнала. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на массив восстановленного сигнала. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- восстановление сигнала прошло успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Выходной восстановленный сигнал в общем случае является комплексным.
|
||||
Однако при соблюдении свойств симметрии векторов `w` и `s` относительно
|
||||
нулевой частоты получим мнимую часть элементов вектора `y` на уровне ошибок
|
||||
округления числа с двойной точностью. Ничтожно малую мнимую часть в этом случае
|
||||
можно игнорировать.
|
||||
\n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,170 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn int gnuplot_create(int argc, char* argv[], int w, int h, char* fn_png,
|
||||
void** hplot)
|
||||
|
||||
\brief
|
||||
Создать график GNUPLOT.
|
||||
|
||||
Данная функция открывает пакет GNUPLOT в зависимости от передаваемых в программу
|
||||
параметров `argv`. После вызова данной функции по адресу `hplot` будет записан
|
||||
handle графика и появляется возможность посылать GNUPLOT команды для отображения
|
||||
графиков.
|
||||
|
||||
\note С точки зрения системы, `hplot` является указателем на открытый файл,
|
||||
в который можно записывать команды для исполнения пакетом GNUPLOT.
|
||||
|
||||
|
||||
|
||||
\param[in] argc
|
||||
Количество аргументов вызова программы. \n
|
||||
(количество переменных `argv`). \n
|
||||
Данное значение не должно быть меньше единицы, потому что `argv[0]`
|
||||
хранит имя исполняемого файла программы. \n
|
||||
\n
|
||||
|
||||
\param[in] argv
|
||||
Указатель на массив строк параметров исполняемого файла. \n
|
||||
Размер массива `argc` строк. \n
|
||||
`argv[0]` хранит имя исполняемого файла программы. \n
|
||||
`argv[1]` задает формат отображения графика: \n
|
||||
\verbatim
|
||||
|
||||
--plotwin отображать график в отдельном окне
|
||||
(данный параметр используется по умолчанию);
|
||||
|
||||
--plotpng сохранить график в png-файл, заданный именем fn_png;
|
||||
|
||||
--noplot график не создавать, игнорировать все команды GNUPLOT.
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
\param[in] w
|
||||
Ширина окна графика или png-файла в пикселях. \n
|
||||
\n
|
||||
|
||||
\param[in] h
|
||||
Высота окна графика или png-файла в пикселях. \n
|
||||
\n
|
||||
|
||||
\param[in] fn_png
|
||||
Имя png-файла, в который будет сохранен график. \n
|
||||
Путь сохранения графика совпадает с путем исполняемого файла программы. \n
|
||||
|
||||
\param[in, out] hplot
|
||||
Указатель на адрес хэндла пакета GNUPLOT. \n
|
||||
По данному адресу будет записан указатель на текщий график. Данный указатель
|
||||
необходим для посылки команд GNUPLOT для построения графика. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
При возникновении ошибки по адресу `hplot` будет записан `NULL`. \n
|
||||
\note
|
||||
Если в `argv[1]` задан параметр `--noplot`, то функция вернет `RES_OK`,
|
||||
но по адресу `hplot` также будет записан `NULL`. \n
|
||||
|
||||
После построения графиков необходимо закрыть хэндл GNUPLOT функцией
|
||||
\ref gnuplot_close. \n
|
||||
|
||||
Пример построения графиков синуса и косинуса привден в следующем листинге:
|
||||
|
||||
\include gnuplot_script_test.c
|
||||
|
||||
Данная программа рассчитвает значения функций синуса и косинуса,
|
||||
а также сохрянет текстовые файлы `dat/cosine.txt` и `dat/sine.txt`. \n
|
||||
|
||||
Сохраненные данные отображаются на трех графиках (с данными синуса, косинуса
|
||||
и обоими данными):
|
||||
|
||||
\image html gnuplot_script_sin.png
|
||||
|
||||
\image html gnuplot_script_cos.png
|
||||
|
||||
\image html gnuplot_script_sincos.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_close(void* h)
|
||||
|
||||
\brief
|
||||
Закрыть хэндл GNUPLOT.
|
||||
|
||||
Данная функция закрывает открытый ранее хэндл GNUPLOT после передачи всех
|
||||
команд построения графиков.
|
||||
|
||||
\note
|
||||
С точки зрения системы, `h` является указателем на открытый файл, в который
|
||||
можно записывать команды для исполнения пакетом GNUPLOT.
|
||||
Данная функция закрывает этот файл. \n
|
||||
Важно отметить, что закрытие хэндла не означает закрытия окна графика.
|
||||
После закрытия хэндла пакета, пользователь не может посылать команды построения
|
||||
графика, но окно графика остается открытым, так как обрабатывается пакетом
|
||||
GNUPLOT независимо.
|
||||
|
||||
|
||||
\param[in] h
|
||||
Хэндл графика GNUPLOT, который будет закрыт. \n
|
||||
\n
|
||||
|
||||
|
||||
\author Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_cmd(void* h, char* cmd)
|
||||
|
||||
\brief
|
||||
Функция посылает команду `cmd` пакету GNUPLOT, для построения
|
||||
или оформления графика, соответсвующего хэндлу `h`.
|
||||
|
||||
Данная функция закрывает открытый ранее хэндл GNUPLOT после передачи всех
|
||||
команд построения графиков.
|
||||
|
||||
\note С точки зрения системы, `h` является указателем на открытый файл,
|
||||
в который можно записывать команды для исполнения пакетом GNUPLOT. Данная
|
||||
функция записывает в данный файл строку `cmd`. \n
|
||||
\n
|
||||
С точки зрения пользователя, вызов функции `gnuplot_cmd` равносильно выполнению
|
||||
одной строки скрипта GNUPLOT. \n
|
||||
\n
|
||||
Исчерпывающее описание возможностей построения графиков пакетом GNUPLOT,
|
||||
с примерами команд можно найти на
|
||||
<a href = "http://gnuplot.sourceforge.net/demo_5.2/">сайте проекта GNUPLOT</a>.
|
||||
|
||||
\param[in] h
|
||||
Хэндл графика GNUPLOT. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] cmd
|
||||
Тектовая строка команды построения или оформления графика. \n
|
||||
\n
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,128 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel(double *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief
|
||||
<a href = "http://ru.dsplib.org/content/goertzel/goertzel.html">
|
||||
Алгоритм Гёрцеля
|
||||
</a>
|
||||
для расчета отдельных спектральных отсчетов дискретного
|
||||
преобразования Фурье вещественного сигнала `x`.
|
||||
Данный алгоритм позволяет рассчитать `k` спектральных отсчетов
|
||||
`n`-точечного ДПФ, заданных вектором индексов `ind`.
|
||||
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор вещественного входного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param[in] ind
|
||||
Указатель на вектор индексов спектральных отсчетов для расчета которых
|
||||
будет использоваться алгоритм Герцеля. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] k
|
||||
Размер вектора индексов спектральных отсчетов `ind`. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор спектральных отсчетов, соответствующих номерам `ind`. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- расчёт выполнен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Алгоритм Гёрцеля эффективен когда необходимо рассчитать несколько
|
||||
спектральных отсчетов сигнала большой длительности. \n
|
||||
Однако, размер `k` вектора индексов `ind` может быть произвольным,
|
||||
в том числе больше длины сигнала `n`.
|
||||
В этом случае некоторые спектральные отсчеты будут повторяться, но это
|
||||
не повлечет за собой ошибки выполнения. \n
|
||||
Значения индексов спектральных отсчетов `ind` также могут быть
|
||||
произвольными целыми, в том числе и отрицательными.
|
||||
В этом случае будут рассчитаны спектральные отсчеты
|
||||
с индексами по модулю `n`. \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief
|
||||
<a href = "http://ru.dsplib.org/content/goertzel/goertzel.html">
|
||||
Алгоритм Гёрцеля
|
||||
</a>
|
||||
для расчета отдельных спектральных отсчетов дискретного
|
||||
преобразования Фурье комплексного сигнала `x`.
|
||||
Данный алгоритм позволяет рассчитать `k` спектральных отсчетов
|
||||
`n`-точечного ДПФ, заданных вектором индексов `ind`.
|
||||
|
||||
Данный алгоритм позволяет рассчитать `k` спектральных отсчетов
|
||||
`n`-точечного ДПФ, заданных вектором индексов `ind`.
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор комплексного входного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param[in] ind
|
||||
Указатель на вектор индексов спектральных отсчетов для расчета которых
|
||||
будет использоваться алгоритм Герцеля. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] k
|
||||
Размер вектора индексов спектральных отсчетов `ind`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор спектральных отсчетов, соответствующих номерам `ind`. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Алгоритм Герцеля эффективен когда необходимо рассчитать несколько
|
||||
спектральных отсчетов сигнала большой длительности. \n
|
||||
Однако, размер `k` вектора индексов `ind` может быть произвольным,
|
||||
в том числе больше длины сигнала `n`.
|
||||
В этом случае некоторые спектральные отсчеты
|
||||
будут повторяться, но это не повлечет за собой ошибки выполнения. \n
|
||||
Значения индексов спектральных отсчетов `ind` также могут быть
|
||||
произвольными целыми, в том числе и отрицательными.
|
||||
В этом случае будут рассчитаны спектральные отсчеты с индексами
|
||||
по модулю `n`. \n
|
||||
\n
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,321 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writebin(void* x, int n, int dtype, char* fn)
|
||||
|
||||
\brief
|
||||
Сохранить данные в бинарный файл
|
||||
|
||||
Функция сохраняет реальный или комплексный вектор данных
|
||||
размера `[n x 1]` в бинарный файл `fn`. \n \n
|
||||
|
||||
Файл является универсальным для хранения как одномерных,
|
||||
так и двумерных массивов и имеет следующий формат: \n \n
|
||||
\verbatim
|
||||
|
||||
type 4 байта типа int.
|
||||
Может принимать значение:
|
||||
DAT_DOUBLE, если x указатель на вектор вещественных чисел;
|
||||
DAT_COMPLEX, если x указатель на вектор комплексных чисел.
|
||||
|
||||
n 4 байта типа int.
|
||||
Количество строк данных.
|
||||
|
||||
m 4 байта типа int.
|
||||
Количество столбцов данных.
|
||||
При сохранении вектора всегда равно 1.
|
||||
|
||||
data Данные в бинарном виде.
|
||||
Размер данных:
|
||||
n * sizeof(double), если dtype==DAT_DOUBLE;
|
||||
n * sizeof(complex_t), если dtype==DAT_COMPLEX.
|
||||
\endverbatim
|
||||
|
||||
Файл может быть использован для верификации алгоритмов сторонними пакетами,
|
||||
такими как GNU Octave, Matlab, Python и т.д. \n \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на массив данных. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора данных. \n
|
||||
\n
|
||||
|
||||
\param[in] dtype
|
||||
Тип данных. \n
|
||||
|
||||
Может принимать значения: \n
|
||||
`DAT_DOUBLE` -- вещественные данные; \n
|
||||
`DAT_COMPLEX` -- комплексные данные. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
Имя файла. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- файл сохранен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Данная функция производит запись в файл без потери точности,
|
||||
поэтому рекомендуется использовать ее для верификации данных DSPL. \n
|
||||
\n
|
||||
|
||||
|
||||
Функция для чтения бинарного файла в GNU Octave и Matlab:
|
||||
\code{.m}
|
||||
function [dat, n, m] = readbin(fn)
|
||||
fid = fopen(fn);
|
||||
if(~fid)
|
||||
error('cannot to open file');
|
||||
end
|
||||
type = fread(fid, 1, 'int32');
|
||||
n = fread(fid, 1, 'int32');
|
||||
m = fread(fid, 1, 'int32');
|
||||
|
||||
if(type==0)
|
||||
dat = fread(fid, [n*m, 1], 'double');
|
||||
end
|
||||
|
||||
if(type==1)
|
||||
y = fread(fid, [n*m*2, 1], 'double');
|
||||
dat = y(1:2:end) + 1i * y(2:2:end);
|
||||
end
|
||||
|
||||
dat = reshape(dat, n, m);
|
||||
|
||||
fclose(fid);
|
||||
end
|
||||
\endcode
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt(double* x, double* y, int n, char* fn)
|
||||
|
||||
\brief
|
||||
Сохранить вещественные данные в текстовый файл
|
||||
|
||||
Функция сохраняет вещественные данные в текстовый файл `fn`. \n
|
||||
|
||||
Файл имеет следующий формат: \n
|
||||
|
||||
\verbatim
|
||||
x[0] y[0]
|
||||
x[1] y[1]
|
||||
... ...
|
||||
x[n-1] y[n-1]
|
||||
\endverbatim
|
||||
|
||||
Файл может быть использован для построения графика сторонней программой,
|
||||
например пакетом GNUPLOT (см. раздел \ref PLOT_GROUP). \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на первый вектор. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] y
|
||||
Указатель на второй вектор. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Может быть `NULL`. \n
|
||||
Файл будет содержать только один столбец соответствующий
|
||||
вектору `x` если `y == NULL`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер входных векторов. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
Имя файла. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- файл сохранен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
\note
|
||||
Данная функция производит округление данных при записи в файл.
|
||||
Поэтому не рекомендуется использовать ее для верификации данных DSPL.
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt_3d(double* x, int nx, double* y, int ny, double* z, char* fn)
|
||||
|
||||
\brief
|
||||
Сохранить данные для построения 3D графика
|
||||
|
||||
Функция сохраняет вещественные данные в текстовый файл `fn`
|
||||
для построения 3D поверхности. \n
|
||||
|
||||
Функция \f$ z(x,y)\f$ описывается матрицей значений `z[x[n], y[n]]`
|
||||
как это показано на рисунке
|
||||
|
||||
\image html writetxt_3d_matrix.png
|
||||
|
||||
Матрица `z` хранится в памяти по столбцам, как это показано красной стрелкой. \n
|
||||
|
||||
Файл имеет следующий формат: \n
|
||||
|
||||
\verbatim
|
||||
x[0] y[0] z[0, 0]
|
||||
x[1] y[0] z[1, 0]
|
||||
x[2] y[0] z[2, 0]
|
||||
... ... ...
|
||||
x[nx-1] y[0] z[nx-1, 0]
|
||||
|
||||
x[0] y[1] z[0, 1]
|
||||
x[1] y[1] z[1, 1]
|
||||
x[2] y[1] z[2, 1]
|
||||
... ... ...
|
||||
x[nx-1] y[1] z[nx-1, 1]
|
||||
|
||||
... ... ...
|
||||
... ... ...
|
||||
... ... ...
|
||||
|
||||
x[0] y[ny-1] z[0, ny-1]
|
||||
x[1] y[ny-1] z[1, ny-1]
|
||||
x[2] y[ny-1] z[2, ny-1]
|
||||
... ... ...
|
||||
x[nx-1] y[ny-1] z[nx-1, ny-1]
|
||||
\endverbatim
|
||||
Таким образом, каждое значение матрицы `z` записано отдельной строкой со
|
||||
соответствующими значениями `x` и `y`. Столбцы матрицы отделены пустой строкой.
|
||||
|
||||
Файл может быть использован для построения графика сторонней программой,
|
||||
например пакетом GNUPLOT (см. раздел \ref PLOT_GROUP). Также данный формат
|
||||
поддерживается пакетами pgfplot3d издательской системы Latex. \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор значений оси `x`. \n
|
||||
Размер вектора `[nx x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nx
|
||||
Размер вектора оси `x`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] y
|
||||
Указатель на второй вектор значений оси `y`. \n
|
||||
Размер вектора `[ny x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ny
|
||||
Размер вектора оси `y`. \n
|
||||
\n
|
||||
|
||||
\param[in] z
|
||||
Указатель на матрицу значений функции `z(x, y)`. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
Имя файла. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- файл сохранен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
Пример использования функции и посторения 3D поверхности приведен
|
||||
в следующем листинге:
|
||||
|
||||
\include writetxt_3d_test.c
|
||||
|
||||
Данная программа рассчитывает и строит поверхность функции
|
||||
|
||||
\f[
|
||||
z(x,y) = x \exp(-x^2 -y^2)
|
||||
\f]
|
||||
|
||||
В каталоге `dat` будет создан файл `data3d.txt`.\n
|
||||
Кроме того программа GNUPLOT произведет построение 3D поверхности
|
||||
по сохраненным в файл данным:
|
||||
|
||||
\image html writetxt_3d.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup IN_OUT_GROUP
|
||||
\fn int writetxt_int(int* x, int* y, int n, char* fn)
|
||||
|
||||
\brief
|
||||
Сохранить целочисленные данные в текстовый файл
|
||||
|
||||
Функция сохраняет целочисленные данные в текстовый файл `fn`. \n
|
||||
|
||||
Файл имеет следующий формат: \n
|
||||
|
||||
\verbatim
|
||||
x[0] y[0]
|
||||
x[1] y[1]
|
||||
... ...
|
||||
x[n-1] y[n-1]
|
||||
\endverbatim
|
||||
|
||||
Файл может быть использован для построения графика сторонней программой,
|
||||
например пакетом GNUPLOT (см. раздел \ref PLOT_GROUP). \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на первый вектор. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] y
|
||||
Указатель на второй вектор. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Может быть `NULL`. \n
|
||||
Файл будет содержать только один столбец соответствующий
|
||||
вектору `x` если `y == NULL`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер входных векторов. \n
|
||||
\n
|
||||
|
||||
\param[in] fn
|
||||
Имя файла. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- файл сохранен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,535 +0,0 @@
|
|||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int acos_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Арккосинус комплексного аргумента `x`
|
||||
|
||||
Функция рассчитывает значения арккосинуса комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
\textrm{Arccos}(x) = \frac{\pi}{2} - \textrm{Arcsin}(x) =
|
||||
\frac{\pi}{2} -j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right)
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента комплексного арккосинуса. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного арккосинуса,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно . \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
\note
|
||||
Функция может использоваться для расчета арккосинуса аргумента
|
||||
большего единицы, когда вещественная функция `acos` не определена.
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
acos_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("acos_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
acos_cmplx(1.0+2.0j) = 1.144-1.529j
|
||||
acos_cmplx(3.0+4.0j) = 0.937-2.306j
|
||||
acos_cmplx(5.0+6.0j) = 0.880-2.749j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int asin_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Арксинус комплексного аргумента `x`
|
||||
|
||||
Функция рассчитывает значения арксинуса комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
\textrm{Arcsin}(x) = j \textrm{Ln}\left( j x + \sqrt{1 - x^2} \right)
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента комплексного арксинуса. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного арксинуса,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно . \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
\note
|
||||
Функция может использоваться для расчета арксинуса аргумента
|
||||
большего единицы, когда вещественная функция `acos` не определена.
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
asin_cmplx(x, 3, y);
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("asin_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
asin_cmplx(1.0+2.0j) = 0.427+1.529j
|
||||
asin_cmplx(3.0+4.0j) = 0.634+2.306j
|
||||
asin_cmplx(5.0+6.0j) = 0.691+2.749j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int cos_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Косинус комплексного аргумента `x`
|
||||
|
||||
Функция рассчитывает значения косинуса комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
\textrm{cos}(x) = \frac{\exp(jx) + \exp(-jx)}{2}
|
||||
\f]
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента комплексного косинуса. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного косинуса,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно . \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
cos_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("cos_cmplx(%.1f%+.1fj) = %9.3f%+9.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
cos_cmplx(1.0+2.0j) = 2.033 -3.052j
|
||||
cos_cmplx(3.0+4.0j) = -27.035 -3.851j
|
||||
cos_cmplx(5.0+6.0j) = 57.219 +193.428j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRANSCEND
|
||||
\fn int bessel_i0(double* x, int n, double* y)
|
||||
\brief
|
||||
Модифицированная функция Бесселя первого рода \f$ I_0(x)\f$
|
||||
|
||||
Функция рассчитывает значения функции для вещественного вектора `x`,
|
||||
который должен принимать неотрицательные значения. \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор переменной \f$ x \f$. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер входного вектора `x`. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений функции \f$ I_0(x)\f$. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- расчёт произведен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Используемый алгоритм описа в статье:
|
||||
Rational Approximations for the Modified Bessel Function
|
||||
of the First Kind – I0(x) for Computations with Double Precision
|
||||
by PAVEL HOLOBORODKO on NOVEMBER 11, 2015
|
||||
|
||||
Пример использования функции `bessel_i0`:
|
||||
|
||||
\include bessel_i0.c
|
||||
|
||||
Данная программа рассчитывает значения функции \f$ I_0(x)\f$ переменной `x`
|
||||
в интервале \f$[0 \ 3]\f$.
|
||||
Рассчитанные данные сохраняются в текстовый файл `dat/dat0.txt`
|
||||
и выводятся на график `img/bessel_i0.png`
|
||||
|
||||
\image html bessel_i0.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int log_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Натуральный логарифм комплексного аргумента `x`
|
||||
|
||||
Функция рассчитывает значения натурального логарифма комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
\textrm{Ln}(x) = j \varphi + \ln(|x|),
|
||||
\f]
|
||||
где \f$\varphi\f$ --- фаза комплексного числа.
|
||||
|
||||
\param[in] x
|
||||
Указатель на комплексный вектор аргумента логарифма. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного логарифма,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
log_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("log_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
log_cmplx(1.0+2.0j) = 0.805+1.107j
|
||||
log_cmplx(3.0+4.0j) = 1.609+0.927j
|
||||
log_cmplx(5.0+6.0j) = 2.055+0.876j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRIG_GROUP
|
||||
\fn int sin_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Синус комплексного аргумента `x`
|
||||
|
||||
Функция рассчитывает значения синуса комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
\textrm{sin}(x) = \frac{\exp(jx) - \exp(-jx)}{2j}
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента комплексного синуса. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного синуса,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно . \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
sin_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("sin_cmplx(%.1f%+.1fj) = %9.3f%+9.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
sin_cmplx(1.0+2.0j) = 3.166 +1.960j
|
||||
sin_cmplx(3.0+4.0j) = 3.854 -27.017j
|
||||
sin_cmplx(5.0+6.0j) = -193.430 +57.218j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int sinc(double* x, int n, double a, double* y)
|
||||
|
||||
\brief
|
||||
Функция \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$
|
||||
|
||||
Функция рассчитывает значения функции для вещественного вектора `x`.
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор переменной \f$ x \f$. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер входного вектора `x`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Параметр функции \f$ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}\f$. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений функции. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- расчёт произведен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_TRANSCEND
|
||||
\fn int sine_int(double* x, int n, double* si)
|
||||
|
||||
\brief
|
||||
Функция интегрального синуса
|
||||
|
||||
\f[ \textrm{Si}(x) = \int_{0}^{x} \frac{\sin(x)}{x} \, dx\f]
|
||||
|
||||
Функция рассчитывает значения функции для интегрального синуса
|
||||
для произвольного вещественного вектора `x`.
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор переменной \f$ x \f$. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер входного вектора `x`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[out] si
|
||||
Указатель на вектор значений функции интегрального синуса. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- расчёт произведен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции `sine_int`:
|
||||
|
||||
\include sine_int_test.c
|
||||
|
||||
Данная программа рассчитывает значения функции интегрального синуса и
|
||||
функции \ref sinc для вектора переменной `x`
|
||||
в интервале \f$[-6\pi \ 6\pi]\f$.
|
||||
Рассчитанные данные сохраняются в текстовые файлы
|
||||
`dat/dat0.txt` и `dat/dat1.txt`
|
||||
|
||||
и выводятся на график `img/sine_int.png`
|
||||
|
||||
\image html sine_int.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int sqrt_cmplx(complex_t* x, int n, complex_t *y)
|
||||
\brief Квадратный корень из комплексного вектора `x` (поэлементный).
|
||||
|
||||
Функция рассчитывает значения квадратного корня комплексного аргумента,
|
||||
заданного вектором `x` длины `n`: \n
|
||||
\f[
|
||||
y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1.
|
||||
\f]
|
||||
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента квадратного корня. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного и выходного векторов `x` и `y`. \n \n
|
||||
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор значений комплексного корня,
|
||||
соответствующего входному вектору `x`. \n
|
||||
Размер массива `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если значение функции рассчитано успешно . \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки": \n
|
||||
|
||||
Например при выполнении следующего кода
|
||||
\code{.cpp}
|
||||
complex_t x[3] = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
|
||||
complex_t y[3];
|
||||
int k;
|
||||
|
||||
sqrt_cmplx(x, 3, y);
|
||||
|
||||
for(k = 0; k < 3; k++)
|
||||
printf("sqrt_cmplx(%.1f%+.1fj) = %.3f%+.3fj\n",
|
||||
RE(x[k]), IM(x[k]), RE(y[k]), IM(y[k]));
|
||||
|
||||
\endcode
|
||||
\n
|
||||
|
||||
Результатом работы будет
|
||||
|
||||
\verbatim
|
||||
sqrt_cmplx(1.0+2.0j) = 1.272+0.786j
|
||||
sqrt_cmplx(3.0+4.0j) = 2.000+1.000j
|
||||
sqrt_cmplx(5.0+6.0j) = 2.531+1.185j
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eig_cmplx(complex_t* a, int n, complex_t* v, int* info)
|
||||
|
||||
\brief
|
||||
Расчет собственных значений квадратной комплексной матрицы.
|
||||
|
||||
Данная функция производит расчет `n` собственных значений квадратной матрицы
|
||||
размером `n x n`.
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на комплексную матрицу размерности `n x n`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размерность квадратной матрицы.\n
|
||||
|
||||
\param[out] v
|
||||
Указатель на вектор собственных значений матрицы. \n
|
||||
Размер вектора `n x 1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] info
|
||||
Указатель на код возврата функции `zgees` пакета LAPACK. \n
|
||||
В случае возникновения ошибки при расчете вектора собственных значений,
|
||||
пакет LAPACK возвращает код ошибки, который может быть прочитан по данному
|
||||
указателю.
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
При возникновении ошибки `ERROR_LAPACK` по адресу
|
||||
`info` будет записан код ошибки пакета LAPACK. \n
|
||||
|
||||
|
||||
\include matrix_eig.c
|
||||
|
||||
Данная программа рассчитывает собственные значения матрицы размерности `3 x 3`
|
||||
и выводит собственные значения на печать. \n
|
||||
|
||||
Результат работы программы:
|
||||
\verbatim
|
||||
A = [ % size [3 x 3] type: complex
|
||||
1.00 +0.00i, 2.00 +0.00i, 3.00 +0.00i;
|
||||
1.00 +0.00i, 0.00 +0.00i, 0.00 +0.00i;
|
||||
0.00 +0.00i, 1.00 +0.00i, 0.00 +0.00i;];
|
||||
|
||||
v = [ % size [3 x 1] type: complex
|
||||
2.374424 -0.000000i;
|
||||
-0.687212 +0.889497i;
|
||||
-0.687212 -0.889497i;];
|
||||
\endverbatim
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eye(double* a, int n, int m)
|
||||
|
||||
\brief
|
||||
Генерирование единичной вещественой матрицы размерности `n x m`.
|
||||
|
||||
Данная функция заполняет матрицу нулями
|
||||
и записывает единицы на главной диагонали
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на вещественную матрицу размерности `n x m`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Количество строк матрицы. \n
|
||||
\n
|
||||
|
||||
\param[in] m
|
||||
Количество столбцов матрицы. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,195 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyroots(double* a, int ord, complex_t* r, int* info)
|
||||
|
||||
\brief
|
||||
Расчет корней вещественного полинома
|
||||
|
||||
Функция рассчитывает корни полинома \f$P_N(x)\f$ \f$N-\f$ого
|
||||
порядка, заданного вектором коэффициентов `a`.
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ... a_N x^N.
|
||||
\f]
|
||||
|
||||
Корни полинома рассчитываются как собственные числа характеристической
|
||||
матрицы полинома. Для расчета собственных чисел используется подпрограмма
|
||||
пакета LAPACK.
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
Коэффициент `a[ord]` не должен быть равен нулю. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[out] r
|
||||
Указатель на вектор комплексных корней полинома. \n
|
||||
Размер вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] info
|
||||
Указатель наа код возврата пакета LAPACK. \n
|
||||
Данный код возвращается подпрограммой LAPACK и транслируется через данную
|
||||
переменную для возможности анализа. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- корни полинома рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
|
||||
Пример расчета корней полинома:
|
||||
|
||||
Пример использования функции `bilinear`:
|
||||
|
||||
\include polyroots_test.c
|
||||
|
||||
Данная программа производит расчет корней полинома
|
||||
\f[
|
||||
P(x) = 2 + 2x + x^2
|
||||
\f]
|
||||
и выводит рассчитанные корни на печать.
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
Error code: 0x00000000
|
||||
r[0] = -1.00000 1.00000 j
|
||||
r[1] = -1.00000-1.00000 j
|
||||
\endverbatim
|
||||
|
||||
Получили пару комплексно-сопряженных корней полинома.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval(double* a, int ord, double* x, int n, double* y)
|
||||
|
||||
\brief
|
||||
Расчет вещественного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N-\f$ого порядка для вещественного
|
||||
аргумента, заданного вектором `x`.
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера:
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
|
||||
|
||||
\brief
|
||||
Расчет комплексного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N\f$-го порядка
|
||||
комплексного аргумента, заданного вектором `x`. \n
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера: \n
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор комплексных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель вектор значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином расчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
|
@ -1,385 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\struct random_t
|
||||
\brief Структура параметров датчиков псевдослучайных чисел.
|
||||
|
||||
Структура хранит инициализацию и текущие регистры различных датчиков
|
||||
псевдослучайных чисел. В библиотеке используются следующие датчики:
|
||||
\li MRG32K3A -- 32 битный датчик разработан Пьером Лекуэром [1].
|
||||
\li MT19937-64 -- 64-битный датчик
|
||||
<a href = "https://en.wikipedia.org/wiki/Mersenne_Twister">
|
||||
Вихрь Мерсенна
|
||||
</a> [2, 3].
|
||||
|
||||
\note
|
||||
[1] Pierre L'Ecuyer, (1999) Good Parameters and Implementations for Combined
|
||||
Multiple Recursive Random Number Generators. Operations Research
|
||||
47(1):159-164. https://doi.org/10.1287/opre.47.1.159 \n\n
|
||||
[2] T. Nishimura, ``Tables of 64-bit Mersenne Twisters // ACM Transactions
|
||||
on Modeling and Computer Simulation 10. (2000) 348--357. \n\n
|
||||
[3] M. Matsumoto and T. Nishimura Mersenne Twister: a 623-dimensionally
|
||||
equidistributed uniform pseudorandom number generator // ACM Transactions
|
||||
on Modeling and Computer Simulation 8. (Jan. 1998) 3--30. \n\n
|
||||
|
||||
\param mrg32k3a_seed
|
||||
Начальная инициализация датчика MRG32K3A. \n \n
|
||||
|
||||
|
||||
\param mrg32k3a_x
|
||||
Первый вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mrg32k3a_y
|
||||
Второй вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mt19937_mt
|
||||
Первый вектор состояния рекурсивного датчика MT19937-64. \n \n
|
||||
|
||||
\param mt19937_mti
|
||||
Текущий индекс в векторе состояния датчика MT19937-64. \n \n
|
||||
|
||||
Параметры данной структуры заполняются автоматически функцией `random_init`
|
||||
и используются функциями генерации псевдослучайных векторов.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int random_init(random_t* prnd, int type, void* seed)
|
||||
\brief
|
||||
Инициализация датчиков псевдослучайных чисел.
|
||||
|
||||
\param[in,out] prnd
|
||||
Указатель на структуру параметров и векторов состояния
|
||||
датчиков псевдослучайных чисел, которая будет инициализирована. \n\n
|
||||
|
||||
\param[in] type
|
||||
Тип датчика псевдослучайных чисел:
|
||||
\verbatim
|
||||
RAND_TYPE_MRG32K3A - 32-битный датчик MRG32K3A
|
||||
RAND_TYPE_MT19937 - 64-битный датчик MT19937-64
|
||||
\endverbatim
|
||||
|
||||
\param[in] seed
|
||||
Указатель на начальную инициализацию датчика. \n
|
||||
Данный указатель имеет тип `void*`, поскольку параметр инициализации
|
||||
зависит от типа датчика. Например если инициализируем датчик MRG32K3A,
|
||||
т.е. параметр `type` задан как `RAND_TYPE_MRG32K3A`, то данный указатель
|
||||
приводится к типу `double`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
double seed = 1234.0;
|
||||
random_init(&rnd, RAND_TYPE_MRG32K3A, (void*)&seed);
|
||||
\endcode
|
||||
Если же используется 64-битный датчик Вихрь Мерсенна
|
||||
(`type` задан как `RAND_TYPE_MT19937`), то `seed` приводится к типу
|
||||
`unsigned long long`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
unsigned long long seed = 1234353456;
|
||||
random_init(&rnd, RAND_TYPE_MT19937, (void*)&seed);
|
||||
\endcode
|
||||
При фиксированном начальном значении датчика, псевдослучайные числа будут
|
||||
повторяться при каждом запуске программы. \n
|
||||
Указатель `seed` может быть `NULL`. В этом случае начальная инициализация
|
||||
датчиков будет задаваться случайными значениями и генерируемые псевдослучайные
|
||||
числа будут различными при каждом запуске программы.
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация бинарного униполярного [0, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует униполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение 0 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb2(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация бинарного биполярного [-1, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует биполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение -1 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randi(int* x, int n, int start, int stop, random_t* prnd)
|
||||
\brief
|
||||
Генерация целочисленного вектора равномерно
|
||||
распределенных псевдослучайных чисел.
|
||||
|
||||
Функция генерирует псевдослучайный вектор целых чисел в диапазоне от `start`
|
||||
до `stop` включительно.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] start
|
||||
Начало диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] stop
|
||||
Конец диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randi_test.c
|
||||
|
||||
Программа рассчитывает целочисленный вектор
|
||||
псевдослучайных чисел в диапазоне [-4, 3].
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randi_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randn(double* x, int n, double mu, double sigma, random_t* prnd)
|
||||
\brief
|
||||
Генерация вектора нормально распределенных псевдослучайных чисел.
|
||||
|
||||
Функция использует преобразование Бокса-Мюллера для приведения
|
||||
равномерно-распределенных псевдослучайных чисел к нормальному распределению
|
||||
с математическим ожиданием \f$\mu\f$ и средневадратическим
|
||||
отклонением \f$\sigma\f$.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] mu
|
||||
Математическое ожидание \f$\mu\f$. \n\n
|
||||
|
||||
|
||||
\param[in] sigma
|
||||
Cредневадратическое отклонение \f$\sigma\f$. \n
|
||||
Дисперсия сгенерированных чисел равна \f$\sigma^2\f$. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор нормально распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randn_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы нормально распределенных
|
||||
псевдослучайных чисел, \f$\mu = 0\f$ и \f$\sigma=1\f$.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randn_test.png
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randu(double* x, int n, random_t* prnd)
|
||||
\brief
|
||||
Генерация вектора равномерно-распределенных в интервале
|
||||
от 0 до 1 псевдослучайных чисел.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор равномерно-распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции с различными датчиками псевдослучайных чисел
|
||||
приведен в следующем листинге:
|
||||
|
||||
\include randu_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы равномерно-распределенных
|
||||
от 0 до 1 псевдослучайных чисел и выводит их на график для трех различных
|
||||
датчиков: MRG32K3A, MT19937-64 и встроенный датчик, определенный
|
||||
стандартом языка Си.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
|
||||
\image html randu_test.png
|
||||
|
||||
Однако при детальном исследовании датчиков, можно обнаружить, что встроенный
|
||||
датчик, определенный стандартом языка Си,
|
||||
выдает значения на фиксированной сетке.
|
||||
|
||||
Чтобы проверить это можно выполнить следующую программу:
|
||||
|
||||
\include randu_accuracy_test.c
|
||||
|
||||
Данная программа аккумулирует только значения датчиков в интервале
|
||||
от 0 до 0.001 и выводит их на график:
|
||||
|
||||
\image html randu_acc_test.png
|
||||
|
||||
Из графика хорошо видно, что данные встроенного датчика выдаются на
|
||||
равноотстоящей сетке значений, в отличии от датчиков MRG32K3A и MT19937-64,
|
||||
которые сохранили псевдослучайный характер.
|
||||
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
|
@ -1,125 +0,0 @@
|
|||
/*!*****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int farrow_lagrange(double *s, int n, double p, double q,
|
||||
double frd, double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе
|
||||
полиномиальной Лагранжевой интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию входного сигнала `s` в `p/q` раз
|
||||
со смещением дробной задержки `frd`. \n
|
||||
|
||||
Для передискретизации используется
|
||||
<a href = "http://ru.dsplib.org/content/resampling_lagrange/resampling_lagrange.html">
|
||||
полиномиальная Лагранжева интерполяция
|
||||
</a>
|
||||
(структура Фарроу для полиномиальной интерполяции). \n
|
||||
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n
|
||||
\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n
|
||||
\n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*! ****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int int farrow_spline(double *s, int n, double p, double q, double frd,
|
||||
double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе сплайн интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию
|
||||
входного сигнала `s` в `p/q` раз со смещением дробной задержки `frd`. \n
|
||||
Для передискретизации используются
|
||||
<a href = "http://ru.dsplib.org/content/resampling_spline/resampling_spline.html">
|
||||
кубические сплайны Эрмита
|
||||
</a>
|
||||
(структура Фарроу для для сплайн-интерполяции). \n
|
||||
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n
|
||||
\n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n
|
||||
\n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n
|
||||
\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n
|
||||
\n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
|
@ -1,47 +0,0 @@
|
|||
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_STAT_GROUP
|
||||
\fn int find_max_abs(double* a, int n, double* m, int* ind)
|
||||
\brief Поиск максимального по модулю элемента вещественного вектора `a`
|
||||
|
||||
Функция производит поиск максимального по модулю значения вектора `a`. \n
|
||||
Максимальное по модулю значение `max|a[k]|` сохраняется по адресу `m`, а индекс
|
||||
данного значения в векторе `a` сохраняется по адресу `ind`. \n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вещественный вектор `a`. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного вектора `a`. \n \n
|
||||
|
||||
|
||||
\param[out] m
|
||||
Указатель на адрес памяти, в который сохранить
|
||||
максимальное по модулю значение вектора `a`. \n
|
||||
Указатель может быть `NULL`, в этом случае максимальное по модулю значение
|
||||
не сохраняется. \n \n
|
||||
|
||||
\param[out] ind Указатель на переменную, в которую будет сохранен
|
||||
индекс максимального по модулю значению вектора `a`. \n
|
||||
Указатель может быть `NULL`, в этом случае индекс не возвращается. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример:
|
||||
\code{.cpp}
|
||||
double a[5] = {0.0, 2.0, -5.0, 4.0, 2.0};
|
||||
double m;
|
||||
int ind;
|
||||
find_max_abs(a, 5, &m, &ind);
|
||||
printf("\n\nmax absolute value: %8.1f (index %d)", m, ind);
|
||||
\endcode
|
||||
В результате в переменную `m` будет записано значение `5`,
|
||||
а в переменную `ind` значение `2`.
|
||||
|
||||
\author
|
||||
Бахурин Сергей
|
||||
www.dsplib.org
|
||||
**************************************************************************** */
|
|
@ -1,100 +0,0 @@
|
|||
/*! ****************************************************************************
|
||||
\ingroup WIN_GROUP
|
||||
\fn int window(double* w, int n, int win_type, double param)
|
||||
\brief
|
||||
Расчет функции оконного взвешивания
|
||||
|
||||
Функция рассчитывает периодическую или симметричную оконную функцию
|
||||
в соответствии с параметром `win_type`. \n
|
||||
|
||||
Периодическая оконная функция используется для спектрального анализа,
|
||||
а симметричная оконная функция может быть использована для синтеза
|
||||
КИХ-фильтров.
|
||||
|
||||
\param [in,out] w
|
||||
Указатель на вектор оконной функции. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
Рассчитанная оконная функция будет помещена по данному адресу. \n
|
||||
\n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора `w` оконной функции. \n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Комбинация флагов для задания типа оконной функции. \n
|
||||
Для задания типа окна используется комбинация битовых масок
|
||||
`DSPL_WIN_MASK | DSPL_WIN_SYM_MASK`. \n
|
||||
Маска `DSPL_WIN_MASK` задает тип оконной функции.
|
||||
Может принимать следующие значения: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева.
|
||||
| Данное окно всегда является симметричным и
|
||||
| игнорирует параметр DSPL_WIN_SYM_MASK .
|
||||
| Параметр param задает уровень боковых
|
||||
| лепестков в дБ.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Непараметрическое косинус-окно
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально
|
||||
| плоской вершиной
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Непараметрическое окно Хемминга
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Непараметрическое окно Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Параметрическое окно Кайзера
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Непараметрическое окно Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Непараметрическое прямоугольное окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
Маска `DSPL_WIN_SYM_MASK` задает симметричное
|
||||
или периодическое окно: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_SYM_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_SYMMETRIC | Симметричное окно (по умолчанию)
|
||||
DSPL_WIN_PERIODIC | Периодическое окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n \n
|
||||
|
||||
|
||||
\param [in] param
|
||||
Параметр окна. \n
|
||||
Данный параметр применяется только для параметрических оконных функций. \n
|
||||
Для непараметрических окон игнорируется. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` если оконная функция рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author
|
||||
Бахурин Сергей.
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
|
1184
dspl/src/conv.c
1184
dspl/src/conv.c
Plik diff jest za duży
Load Diff
1546
dspl/src/filter_ap.c
1546
dspl/src/filter_ap.c
Plik diff jest za duży
Load Diff
|
@ -64,9 +64,260 @@ error_proc:
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Linear phase FIR filter
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup FIR_FILTER_DESIGN_GROUP
|
||||
\fn int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||
int win_type, double win_param, double* h)
|
||||
\brief
|
||||
Function calculates linear-phase FIR filter coefficients by window method
|
||||
|
||||
FIR filter transfer function is
|
||||
\f[
|
||||
H(z) = \sum_{n = 0}^{ord} h_n z^{-n}.
|
||||
\f]
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of FIR filter coefficients is `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Normalized cutoff frequency for lowpass and highpass filter,
|
||||
or left cutoff frequency for bandpass or bandstop filter. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Right normalized cutoff frequency for bandpass or bandstop filter. \n
|
||||
This parameter is ignored for lowpass or highpass filters. \n
|
||||
Frequecny `w1` must be higher than `w0`. \n
|
||||
\n
|
||||
|
||||
\param[in] filter_type
|
||||
Filter type. \n
|
||||
This parameter can be one of follow: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - lowpass filter;
|
||||
DSPL_FILTER_HPF - highpass filter;
|
||||
DSPL_FILTER_BPASS - bandpass filter;
|
||||
DSPL_FILTER_BSTOP - bandstop filter.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Window function type. \n
|
||||
This parameter can be one of follow: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
win_type | Description
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Nonparametric Bartlett window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Nonparametric Bartlett-Hann window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Nonparametric Blackman window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Nonparametric Blackman-Harris window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Nonparametric Blackman-Nuttall
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Parametric Dolph-Chebyshev window.
|
||||
| Parametr `win_param` sets sidelobe attenuation
|
||||
| level in dB.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Nonparametric Cosine window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Nonparametric maxflat window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Nonparametric Gauss window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Nonparametric Hamming window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Nonparametric Hann window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Parametric Kaiser window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Nonparametric Lanczos window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Nonparametric Nuttall window
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Nonparametric rectangular window
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_param
|
||||
Parameter value for parametric windows. \n
|
||||
This parameter is used for parametric windows only and is ignored for
|
||||
nonparametric windows. \n
|
||||
\n
|
||||
|
||||
\param[out] h
|
||||
Pointer to the linear-phase FIR filter coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memoru must be allocated. \n
|
||||
\n
|
||||
|
||||
\note
|
||||
Only symmetric windows can achieve linear-phase FIR filter. \n \n
|
||||
Bandstop filter type (`filter_type = DSPL_FILTER_BSTOP`) requires
|
||||
only even filter order `ord`.
|
||||
If `filter_type = DSPL_FILTER_BSTOP` and `ord` is odd then function
|
||||
returns `ERROR_FILTER_ORD` code.
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
\include fir_linphase_test.c
|
||||
|
||||
This function calculates coeffictiens of lowpass, highpass, bandpass
|
||||
and bandstop linear-phase FIR filters by using different kind of windows.
|
||||
Also program calculates filter magnitudes and plots. \n
|
||||
|
||||
\image html fir_linphase_test.png
|
||||
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup FIR_FILTER_DESIGN_GROUP
|
||||
\fn int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||
int win_type, double win_param, double* h)
|
||||
\brief
|
||||
Расчет коэффициентов линейно-фазового КИХ-фильтра
|
||||
методом оконного взвешивания.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики
|
||||
\f[
|
||||
H(z) = \sum_{n = 0}^{ord} h_n z^{-n}
|
||||
\f]
|
||||
цифрового линейно-фазового КИХ-фильтра фильтра.
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра (количество элементов задержки). \n
|
||||
Количество коэффициентов фильтра равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Нормированная частота среза ФНЧ или ФВЧ,
|
||||
или левая частота среза для полосового и режекторного фильтра. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Правая частота среза полосового и режекторного фильтра. \n
|
||||
Данный параметр игнорируется для ФНЧ и ФВЧ. \n
|
||||
Частота `w1` должна быть больше `w0`. \n
|
||||
\n
|
||||
|
||||
\param[in] filter_type
|
||||
Тип фильтра. \n
|
||||
Данный параметр определяет тип фильтра
|
||||
и может принимать одно из значений: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - фильтр нижних частот;
|
||||
DSPL_FILTER_HPF - фильтр верхних частот;
|
||||
DSPL_FILTER_BPASS - полосовой фильтр;
|
||||
DSPL_FILTER_BSTOP - режекторный фильтр.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_type
|
||||
Тип оконной функции. \n
|
||||
Может принимать одно из следующих значений: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение win_type | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева.
|
||||
| Параметр win_param задает уровень
|
||||
| боковых лепестков в дБ.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Непараметрическое косинус-окно
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально
|
||||
| плоской вершиной
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Непараметрическое окно Хемминга
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Непараметрическое окно Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Параметрическое окно Кайзера
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Непараметрическое окно Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Непараметрическое прямоугольное окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param [in] win_param
|
||||
Параметр окна. \n
|
||||
Данный параметр применяется только для параметрических оконных функций. \n
|
||||
Для непараметрических окон игнорируется. \n
|
||||
\n
|
||||
|
||||
\param[out] h
|
||||
Указатель на вектор коэффициентов линейно-фазового КИХ-фильтраю \f$H(z)\f$. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\note
|
||||
Для соблюдения условия линейной ФЧХ используются
|
||||
только симметричные окна. \n \n
|
||||
Расчет режекторного линейно-фазового КИХ-фильтра
|
||||
(если `filter_type = DSPL_FILTER_BSTOP`) производится только
|
||||
для фильтров чётного порядка `ord`.
|
||||
В случае нечетного порядка `ord` функция вернет код ошибки `ERROR_FILTER_ORD`.
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK`
|
||||
Фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include fir_linphase_test.c
|
||||
|
||||
Программа расчитывает коэффициенты и АЧХ линейно-фазовых КИХ-фильтрова нижних,
|
||||
верхних частот, полосовых и режекторных с применением различных весовых окон:
|
||||
прямоугольное, Хемминга, Илэкмана и Блэкмана-Харриса. \n
|
||||
Полученные АЧХ выводятся на график
|
||||
|
||||
\image html fir_linphase_test.png
|
||||
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API fir_linphase(int ord, double w0, double w1, int filter_type,
|
||||
int win_type, double win_param, double* h)
|
||||
{
|
||||
|
|
|
@ -24,9 +24,13 @@
|
|||
#include "dspl.h"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Recalculate ws frequency to 1 rad/s for HPF and BANDSTOP filters
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
double DSPL_API filter_ws1(int ord, double rp, double rs, int type)
|
||||
{
|
||||
double es2, ep2, gs2, x, ws;
|
||||
|
@ -90,9 +94,13 @@ double DSPL_API filter_ws1(int ord, double rp, double rs, int type)
|
|||
return ws;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* low 2 bandpass transformation
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API low2bp(double* b, double* a, int ord,
|
||||
double w0, double wpl, double wph,
|
||||
double* beta, double* alpha)
|
||||
|
@ -118,9 +126,13 @@ int DSPL_API low2bp(double* b, double* a, int ord,
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* low 2 bandstop transformation
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API low2bs(double* b, double* a, int ord,
|
||||
double w0, double wsl, double wsh,
|
||||
double* beta, double* alpha)
|
||||
|
@ -145,9 +157,126 @@ int DSPL_API low2bs(double* b, double* a, int ord,
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* low 2 high transformation
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Lowpass to highpass filter frequency transform
|
||||
|
||||
Function transforms lowpass filter transfer function \f$ H(s) \f$
|
||||
to the highpass filter transfer function \f$ F(s) \f$.
|
||||
|
||||
Filter order, magnitude ripple in passband and stopband
|
||||
supression still the same.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the lowpass filter transfer function \f$H(s)\f$ numerator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the lowpass filter transfer function \f$H(s)\f$ denominator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Lowpass filter cutoff frequency. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Highpass filter cutoff frequency after transformation. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the highwpass filter transfer function \f$F(s)\f$ numerator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the highwpass filter transfer function \f$F(s)\f$ denominator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2high (double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФВЧ
|
||||
|
||||
Функция производит перобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФВЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок исходного фильтра и фильтра после переобразования. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Частота среза исходного ФНЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Требуемая частота среза ФВЧ после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$F(s)\f$
|
||||
ФВЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$
|
||||
аналогового ФВЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- преобразование рассчитано успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API low2high(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
{
|
||||
|
@ -173,9 +302,127 @@ int DSPL_API low2high(double* b, double* a, int ord, double w0, double w1,
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
low 2 low transformation
|
||||
*******************************************************************************/
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
|
||||
Lowpass to lowpass filter frequency transform
|
||||
|
||||
Function transforms lowpass filter transfer function \f$ H(s) \f$
|
||||
to the lowpass filter transfer function \f$ F(s) \f$
|
||||
with other cutoff frequency.
|
||||
|
||||
Filter order, magnitude ripple in passband and stopband
|
||||
supression still the same.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the input lowpass filter transfer function \f$H(s)\f$ numerator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the input lowpass filter transfer function \f$H(s)\f$ denominator
|
||||
coefficients vector. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Input lowpass filter cutoff frequency. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Lowpass filter cutoff frequency after transformation. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the lowpass filter transfer function \f$F(s)\f$ numerator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the lowpass filter transfer function \f$F(s)\f$ denominator
|
||||
coefficients vector after transformation. \n
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter coefficients is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
\brief Частотное преобразование ФНЧ-ФНЧ
|
||||
|
||||
Функция производит преобразование передаточной функции \f$ H(s) \f$
|
||||
аналогового ФНЧ с частотой среза `w0` рад/c
|
||||
в передаточную функцию \f$ F(s) \f$ аналоговго ФНЧ с частотой среза `w1` рад/c.
|
||||
|
||||
Неравномерность АЧХ в полосе пропускания, уровень подавления в полосе
|
||||
заграждения и порядок фильтра остаются неизменными.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового ФНЧ. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок исходного фильтра и фильтра после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Частота среза исходного ФНЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] w1
|
||||
Требуемая частота среза ФНЧ после преобразования. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta Указатель на вектор коэффициентов числителя
|
||||
передаточной функции \f$F(s)\f$ ФНЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$F(s)\f$
|
||||
аналогового ФНЧ после преобразования. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- Преоборазование расчитано успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API low2low(double* b, double* a, int ord, double w0, double w1,
|
||||
double* beta, double* alpha)
|
||||
{
|
||||
|
@ -198,9 +445,160 @@ int DSPL_API low2low(double* b, double* a, int ord, double w0, double w1,
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Rational composition
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int ratcompos( double* b, double* a, int n,
|
||||
double* c, double* d, int p,
|
||||
double* beta, double* alpha)
|
||||
\brief Rational composition
|
||||
|
||||
Function calcultes composition \f$Y(s) = (H \circ F)(s) = H(F(s))\f$, here
|
||||
|
||||
\f[
|
||||
H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}
|
||||
{\sum\limits_{k = 0}^{n} a_k s^k}, \quad
|
||||
F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}
|
||||
{\sum\limits_{k = 0}^{p} c_k s^k}, \quad
|
||||
Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}
|
||||
{\sum\limits_{k = 0}^{n p} \alpha_k s^k}
|
||||
\f]
|
||||
|
||||
This function is using for filter frequency transform.
|
||||
|
||||
\param[in] b
|
||||
Pointer to the \f$H(s)\f$ polynomial function
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `[n+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Pointer to the \f$H(s)\f$ polynomial function
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `[n+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Order of \f$H(s)\f$ numerator and denominator polynomials. \n
|
||||
\n
|
||||
|
||||
\param[in] c
|
||||
Pointer to the \f$F(s)\f$ polynomial function
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `[p+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] d
|
||||
Pointer to the \f$F(s)\f$ polynomial function
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `[p+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Order of \f$F(s)\f$ numerator and denominator polynomials. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Pointer to the numerator coefficients vector of
|
||||
\f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Vector size is `[n*p+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Pointer to the denominator coefficients vector of
|
||||
\f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Vector size is `[n*p+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` if rational composition is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\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$, где
|
||||
|
||||
\f[
|
||||
H(s) = \frac{\sum\limits_{m = 0}^{n} b_m s^m}
|
||||
{\sum\limits_{k = 0}^{n} a_k s^k}, \quad
|
||||
F(s) = \frac{\sum\limits_{m = 0}^{p} d_m s^m}
|
||||
{\sum\limits_{k = 0}^{p} c_k s^k}, \quad
|
||||
Y(s) = \frac{\sum\limits_{m = 0}^{n p} \beta_m s^m}
|
||||
{\sum\limits_{k = 0}^{n p} \alpha_k s^k}
|
||||
\f]
|
||||
|
||||
Функция рациональной композиции необходима для произведения частотных
|
||||
преобразований передаточных характеристик аналоговых и цифровых фильтров,
|
||||
а также для билинейного преобразования передаточных характеристик аналоговых
|
||||
фильтров в соответствующие передаточные характеристики цифровых фильтров.
|
||||
|
||||
\param[in] b
|
||||
Указатель на вектор коэффициентов числителя функции \f$H(s)\f$. \n
|
||||
Размер вектора `[n+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор коэффициентов знаменателя функции \f$H(s)\f$. \n
|
||||
Размер вектора `[n+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] n
|
||||
Порядок полиномов рациональной функции \f$H(s)\f$. \n
|
||||
\n
|
||||
|
||||
\param[in] c
|
||||
Указатель на вектор коэффициентов числителя функции \f$F(s)\f$. \n
|
||||
Размер вектора `[p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] d
|
||||
Указатель на вектор коэффициентов знаменателя функции \f$F(s)\f$. \n
|
||||
Размер вектора `[p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] p
|
||||
Порядок полиномов рациональной
|
||||
функции \f$F(s)\f$. \n
|
||||
\n
|
||||
|
||||
\param[in,out] beta
|
||||
Указатель на вектор коэффициентов
|
||||
числителя функции \f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Размер вектора `[n*p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in,out] alpha
|
||||
Указатель на вектор коэффициентов знаменателя
|
||||
функции \f$Y(s) = (H \circ F)(s)\f$. \n
|
||||
Размер вектора `[n*p+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
|
||||
\return
|
||||
`RES_OK` --- Рациональная композиция рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API ratcompos(double* b, double* a, int n,
|
||||
double* c, double* d, int p,
|
||||
double* beta, double* alpha)
|
||||
|
@ -277,7 +675,6 @@ int DSPL_API ratcompos(double* b, double* a, int n,
|
|||
}
|
||||
|
||||
|
||||
|
||||
memset(alpha, 0, k2s);
|
||||
memset(beta, 0, k2s);
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -26,227 +26,470 @@
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int bilinear(double* bs, double* as, int ord, double* bz, double* az)
|
||||
\brief Analog filter transfer function H(s) bilinear transform to the
|
||||
digital filter transfer function H(z).
|
||||
|
||||
Function calculates digital filter coefficients by rational substitution
|
||||
\brief
|
||||
Transform a s-plane analog filter transfer function \f$H(s)\f$ to the
|
||||
digital filter transfer function \f$H(z)\f$.
|
||||
|
||||
Bilinear transform is rational composition:
|
||||
|
||||
\f[
|
||||
s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}.
|
||||
\f]
|
||||
|
||||
Digital filter order still the same as analog prototype order.
|
||||
Analog prototype frequency \f$\Omega\f$ related with the digital filter
|
||||
normalized frequency \f$\omega\f$ as:
|
||||
Digital filter order, passband magnitude ripple and stopband suppression
|
||||
still the same after bilinear transform as analog filter.
|
||||
|
||||
Frequency \f$\Omega\f$ of analog filter and frequency
|
||||
\f$\omega\f$ of digital filter relations:
|
||||
|
||||
\f[
|
||||
\Omega = \tan(\omega / 2).
|
||||
\f]
|
||||
|
||||
\param[in] bs Pointer to the numerator coefficients of an
|
||||
analog prototype transfer function \f$H(s)\f$. \n
|
||||
Array size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\param[in] as Pointer to the denominator coefficients of an
|
||||
analog prototype transfer function \f$H(s)\f$. \n
|
||||
Array size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
\param[in] bs
|
||||
Pointer to the vector of analog filter \f$H(s)\f$
|
||||
numerator coefficients.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] ord Filter order. \n
|
||||
Number of coefficients \f$H(s)\f$ and \f$H(z)\f$
|
||||
numerator and denominator equals `ord+1`. \n \n
|
||||
\param[in] as
|
||||
Pointer to the vector of analog filter \f$H(s)\f$
|
||||
denominator coefficients vector.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[out] bz Pointer to the numerator coefficients of a
|
||||
digital filter transfer function \f$H(z)\f$. \n
|
||||
Array size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
\param[in] ord
|
||||
Analog and digital filters order. \n
|
||||
\n
|
||||
|
||||
\param[out] az Pointer to the numerator coefficients of a
|
||||
digital filter transfer function \f$H(z)\f$. \n
|
||||
Array size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
\param[out] bz
|
||||
Pointer to the vector of digital filter \f$H(z)\f$
|
||||
numerator coefficients after bilinear transform.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] az
|
||||
Pointer to the vector of digital filter \f$H(z)\f$
|
||||
denominator coefficients after bilinear transform.
|
||||
Vector size is `[ord+1 x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter is calculated successfully. \n \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
`RES_OK` if bilinear transform is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
*******************************************************************************/
|
||||
|
||||
Example:
|
||||
|
||||
\include bilinear_test.c
|
||||
|
||||
This program calculates the transfer function \f$H(s)\f$ of analog
|
||||
Chebyshev filter of the first kind, with a cutoff frequency of 1 rad/s,
|
||||
and produces bilinear trandform to digital filter,
|
||||
with a normilized cutoff frequency equals 0.5.
|
||||
|
||||
Result:
|
||||
|
||||
\verbatim
|
||||
bz[0] = 0.246 az[0] = 4.425
|
||||
bz[1] = 0.983 az[1] = -3.318
|
||||
bz[2] = 1.474 az[2] = 4.746
|
||||
bz[3] = 0.983 az[3] = -2.477
|
||||
bz[4] = 0.246 az[4] = 1.034
|
||||
err = 0
|
||||
\endverbatim
|
||||
|
||||
In addition, the frequency response of the resulting digital filter
|
||||
is calculated and plotted by GNUPLOT package.
|
||||
|
||||
\image html bilinear.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int bilinear(double* bs, double* as, int ord, double* bz, double* az)
|
||||
|
||||
\brief
|
||||
Билинейное преобразование передаточной характеристики аналогового
|
||||
фильтра \f$H(s)\f$, в передаточную характеристику цифрового фильтра \f$H(z)\f$.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра путем дробно-рациональной подстановки вида
|
||||
|
||||
\f[
|
||||
s \leftarrow \frac{1 - z^{-1}}{1 - z^{-1}}.
|
||||
\f]
|
||||
|
||||
Порядок цифрового фильтра при этом остается равным порядку аналогового фильтра,
|
||||
а ось частот \f$\Omega\f$ аналогового фильтра связана c осью частот
|
||||
\f$\omega\f$ цифрового фильтра соотношением:
|
||||
|
||||
\f[
|
||||
\Omega = \tan(\omega / 2).
|
||||
\f]
|
||||
|
||||
|
||||
|
||||
\param[in] bs
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] as
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(s)\f$
|
||||
исходного аналогового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя передаточных функций
|
||||
\f$H(s)\f$ и \f$H(z)\f$ аналогового и цифрового фильтров равно `ord+1`. \n
|
||||
\n
|
||||
|
||||
\param[out] bz
|
||||
Указатель на вектор коэффициентов числителя передаточной функции \f$H(z)\f$
|
||||
полученного цифрового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] az
|
||||
Указатель на вектор коэффициентов знаменателя передаточной функции \f$H(z)\f$
|
||||
полученного цифрового фильтра. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
|
||||
Пример использования функции `bilinear`:
|
||||
|
||||
\include bilinear_test.c
|
||||
|
||||
Данная программа производит расчет передаточной характеристики аналогового
|
||||
фильтра Чебышева первого рода, с частотой среза равной 1 рад/с, и производит
|
||||
билинейное преобразование в цифровой, с частотой среза равной 0.5.
|
||||
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
bz[0] = 0.246 az[0] = 4.425
|
||||
bz[1] = 0.983 az[1] = -3.318
|
||||
bz[2] = 1.474 az[2] = 4.746
|
||||
bz[3] = 0.983 az[3] = -2.477
|
||||
bz[4] = 0.246 az[4] = 1.034
|
||||
err = 0
|
||||
\endverbatim
|
||||
|
||||
Кроме этого производится расчет АЧХ полученного цифрового фильтра и строится
|
||||
график АЧХ пакетом GNUPLOT
|
||||
|
||||
\image html bilinear.png
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API bilinear(double* bs, double* as, int ord, double* bz, double* az)
|
||||
{
|
||||
double c[2] = {1.0, -1.0};
|
||||
double d[2] = {1.0, 1.0};
|
||||
return ratcompos(bs, as, ord, c, d, 1, bz, az);
|
||||
double c[2] = {1.0, -1.0};
|
||||
double d[2] = {1.0, 1.0};
|
||||
return ratcompos(bs, as, ord, c, d, 1, bz, az);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int iir(double rp, double rs, int ord, double w0, double w1, int type, double* b, double* a)
|
||||
\brief IIR digital filter transfer function \f$H(z)\f$
|
||||
coefficients calculation which can be used in \ref filter_iir
|
||||
\fn int iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
\brief
|
||||
Digital IIR filter design.
|
||||
|
||||
The function calculates the coefficients of the digital IIR filter
|
||||
transfer fucntion \f$ H(z) \f$.
|
||||
Filter coeffitients can be used in \ref filter_iir function
|
||||
|
||||
\param[in] rp
|
||||
Magnitude ripple in passband (dB). \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rp Filter passband ripple level (dB). \n \n
|
||||
\param[in] rs
|
||||
Suppression level in stopband (dB). \n
|
||||
\n
|
||||
|
||||
\param[in] rs Filter stopband supression level (dB).\n \n
|
||||
\param[in] ord
|
||||
Filter order. \n
|
||||
Number of \f$H(z)\f$ numerator and denominator coefficients is `ord+1`. \n
|
||||
For bandpass and bandstop filters `ord` must be even. \n
|
||||
\n
|
||||
|
||||
\param[in] ord Filter order. \n
|
||||
Number of \f$H(z)\f$ coefficients is `ord+1`. \n
|
||||
This parameter must be evan for bandpass
|
||||
and bandstop filter type.\n \n
|
||||
|
||||
\param[in] w0 Normlized cutoff frequency for LPF and HPF. \n
|
||||
Left cutoff frequency for bandpass and bandstop filter. \n
|
||||
Valid value from 0 to 1. \n
|
||||
Here 0 corresponds to 0 Hz frequency, 1 corresponds to
|
||||
Fs/2 Hz frequency. \n \n
|
||||
\param[in] w0
|
||||
Normalized cutoff frequency (from 0 to 1) for lowpass or highpass filter. \n
|
||||
Or left normalized cutoff frequency (from 0 to 1) for
|
||||
bandpass and bandstop filter. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] w1 Right cutoff frequency for bandpass and bandstop filter.\n
|
||||
Valid value from 0 to 1. \n
|
||||
Here 0 corresponds to 0 Hz frequency, 1 corresponds to
|
||||
Fs/2 Hz frequency. \n
|
||||
This parameter is ignored for LPF and HPF. \n \n
|
||||
\param[in] w1
|
||||
Right normalized cutoff frequency (from 0 to 1) for
|
||||
bandpass and bandstop filter. \n
|
||||
This parameter is ingnored for lowpass and highpass filters.
|
||||
\n
|
||||
|
||||
\param[in] type Filter type. \n
|
||||
This paramenter is combination of filter type flags:\n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - lowpass filter;
|
||||
DSPL_FILTER_HPF - highpass filter;
|
||||
DSPL_FILTER_BPASS - bandpass filter;
|
||||
DSPL_FILTER_BSTOP - bandstop filter,
|
||||
\endverbatim
|
||||
and filter approximation flags:
|
||||
\verbatim
|
||||
DSPL_FILTER_BUTTER - Buttetworth filter;
|
||||
DSPL_FILTER_CHEBY1 - Chebyshev type 1 filter;
|
||||
DSPL_FILTER_CHEBY2 - Chebyshev type 2 filter;
|
||||
DSPL_FILTER_ELLIP - elliptic filter.
|
||||
\endverbatim
|
||||
\n \n
|
||||
\param[in] type
|
||||
Filter type. \n
|
||||
This patameter sets combination of filter type (one of follow): \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - lowpass filter;
|
||||
DSPL_FILTER_HPF - highpass filter;
|
||||
DSPL_FILTER_BPASS - bandpass filter;
|
||||
DSPL_FILTER_BSTOP - bandstop filter,
|
||||
\endverbatim
|
||||
and of filter approximation type (one of follow):
|
||||
\verbatim
|
||||
DSPL_FILTER_BUTTER - Butterworth filter;
|
||||
DSPL_FILTER_CHEBY1 - Chebyshev of the first kind filter;
|
||||
DSPL_FILTER_CHEBY2 - Chebyshev of the second kind filter;
|
||||
DSPL_FILTER_ELLIP - Elliptic filter.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param[out] b Pointer to the vector of \f$H(z)\f$ numerator. \n
|
||||
Vector size is `[ord+1 x 1]`.\n
|
||||
Memory must be allocated. \n \n
|
||||
\param[out] b
|
||||
Pointer to the transfer function \f$H(z)\f$
|
||||
numerator coefficients vector. \n
|
||||
Vector size is `ord+1`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] a Pointer to the vector of \f$H(z)\f$ denominator. \n
|
||||
Vector size is `[ord+1 x 1]`.\n
|
||||
Memory must be allocated. \n \n
|
||||
\param[out] a
|
||||
Pointer to the transfer function \f$H(z)\f$
|
||||
denominator coefficients vector. \n
|
||||
Vector size is `ord+1`. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if filter is calculated successfully. \n \n
|
||||
Else \ref ERROR_CODE_GROUP "code error". \n
|
||||
`RES_OK` if filter is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
Example:
|
||||
|
||||
\include iir_test.c
|
||||
|
||||
Program calculates filter coefficients for different
|
||||
`type` parameter combination. Also program calculates filters magnitude and
|
||||
draws plot:
|
||||
This program calcultes filter coefficients for different flags `type`.
|
||||
|
||||
In addition, the filters magnitudes
|
||||
is calculated and plotted by GNUPLOT package.
|
||||
|
||||
\image html iir_test.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
******************************************************************************/
|
||||
int DSPL_API iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup IIR_FILTER_DESIGN_GROUP
|
||||
\fn int iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
\brief
|
||||
Функция расчета коэффициентов передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра БИХ.
|
||||
|
||||
Функция рассчитывает коэффициенты передаточной характеристики \f$H(z)\f$
|
||||
цифрового фильтра, которые могут быть использованы в функции \ref filter_iir
|
||||
|
||||
\param[in] rp
|
||||
Уровень неравномерности квадрата АЧХ в полосе пропускания фильтра (дБ). \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] rs
|
||||
Уровень подавления в полосе заграждения фильтра (дБ).\n
|
||||
\n
|
||||
|
||||
\param[in] ord
|
||||
Порядок фильтра. \n
|
||||
Количество коэффициентов числителя и знаменателя передаточной
|
||||
функции \f$H(z)\f$ цифрового фильтров равно `ord+1`. \n
|
||||
Для полосовых и режекторных фильтров параметр `ord` должен быть чётным. \n
|
||||
\n
|
||||
|
||||
\param[in] w0
|
||||
Нормированная частота среза ФНЧ или ФВЧ, или левая частота среза для
|
||||
полосового и режекторного фильтра.\n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] w1
|
||||
Правая частота среза полосового и режекторного фильтра. \n
|
||||
Данный параметр игнорируется для ФНЧ и ФВЧ. \n
|
||||
\n
|
||||
|
||||
\param[in] type
|
||||
Тип фильтра. \n
|
||||
Данный параметр определяет тип фильтра и образуется
|
||||
набором флагов типа фильтра: \n
|
||||
\verbatim
|
||||
DSPL_FILTER_LPF - фильтр нижних частот;
|
||||
DSPL_FILTER_HPF - фильтр верхних частот;
|
||||
DSPL_FILTER_BPASS - полосовой фильтр;
|
||||
DSPL_FILTER_BSTOP - режекторный фильтр,
|
||||
\endverbatim
|
||||
а также флагов типа аппроксимации АЧХ фильтра:
|
||||
\verbatim
|
||||
DSPL_FILTER_BUTTER - фильтр Баттерворта;
|
||||
DSPL_FILTER_CHEBY1 - фильтр Чебышева первого рода;
|
||||
DSPL_FILTER_CHEBY2 - фильтр Чебышева второго рода;
|
||||
DSPL_FILTER_ELLIP - эллиптический фильтр.
|
||||
\endverbatim
|
||||
\n
|
||||
\n
|
||||
|
||||
\param[out] b
|
||||
Указатель на вектор коэффициентов
|
||||
числителя передаточной функции \f$H(z)\f$. \n
|
||||
Размер вектора `ord+1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] a
|
||||
Указатель на вектор коэффициентов знаменателя передаточной
|
||||
функции \f$H(z)\f$. \n
|
||||
Размер вектора `ord+1`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- Фильтр рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include iir_test.c
|
||||
|
||||
Данная программа производит расчет коэффициентов фильтров
|
||||
при различном сочетании флагов параметра `type`.
|
||||
|
||||
Кроме этого производится расчет АЧХ полученных цифровых фильтров и выводится на
|
||||
график АЧХ пакетом GNUPLOT
|
||||
|
||||
\image html iir_test.png
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API iir(double rp, double rs, int ord, double w0, double w1,
|
||||
int type, double* b, double* a)
|
||||
{
|
||||
double *bs = NULL;
|
||||
double *as = NULL;
|
||||
double *bt = NULL;
|
||||
double *at = NULL;
|
||||
double wa0, wa1, ws;
|
||||
int err, ord_ap = ord;
|
||||
double *bs = NULL;
|
||||
double *as = NULL;
|
||||
double *bt = NULL;
|
||||
double *at = NULL;
|
||||
double wa0, wa1, ws;
|
||||
int err, ord_ap = ord;
|
||||
|
||||
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_LPF) ||
|
||||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_HPF))
|
||||
{
|
||||
bs = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
as = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
bt = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
at = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
}
|
||||
|
||||
|
||||
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BPASS) ||
|
||||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BSTOP))
|
||||
{
|
||||
if(ord % 2)
|
||||
return ERROR_FILTER_ORD_BP;
|
||||
else
|
||||
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_LPF) ||
|
||||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_HPF))
|
||||
{
|
||||
ord_ap = ord / 2;
|
||||
bs = (double*)malloc((ord_ap + 1)*sizeof(double));
|
||||
as = (double*)malloc((ord_ap + 1)*sizeof(double));
|
||||
bt = (double*)malloc((ord + 1)*sizeof(double));
|
||||
at = (double*)malloc((ord + 1)*sizeof(double));
|
||||
bs = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
as = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
bt = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
at = (double*)malloc((ord_ap+1)*sizeof(double));
|
||||
}
|
||||
}
|
||||
err = iir_ap(rp, rs, ord_ap, type, bs, as);
|
||||
if(err != RES_OK)
|
||||
goto error_proc;
|
||||
|
||||
/* frequency transformation */
|
||||
wa0 = tan(w0 * M_PI * 0.5);
|
||||
wa1 = tan(w1 * M_PI * 0.5);
|
||||
|
||||
switch(type & DSPL_FILTER_TYPE_MASK)
|
||||
{
|
||||
|
||||
case DSPL_FILTER_LPF:
|
||||
err = low2low(bs, as, ord_ap, 1.0, wa0, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_HPF:
|
||||
ws = filter_ws1(ord_ap, rp, rs, type);
|
||||
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
||||
err = low2high(bs, as, ord_ap, 1.0, wa0, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_BPASS:
|
||||
err = low2bp(bs, as, ord_ap, 1.0, wa0, wa1, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_BSTOP:
|
||||
/* need frequency transform ws -> 1 rad/s */
|
||||
|
||||
ws = filter_ws1(ord_ap, rp, rs, type);
|
||||
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
||||
err = low2bs(bs, as, ord_ap, 1.0, wa0, wa1, bt, at);
|
||||
break;
|
||||
|
||||
default:
|
||||
err = ERROR_FILTER_TYPE;
|
||||
break;
|
||||
}
|
||||
if(err != RES_OK)
|
||||
goto error_proc;
|
||||
|
||||
|
||||
err = bilinear(bt, at, ord, b, a);
|
||||
if(((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BPASS) ||
|
||||
((type & DSPL_FILTER_TYPE_MASK) == DSPL_FILTER_BSTOP))
|
||||
{
|
||||
if(ord % 2)
|
||||
return ERROR_FILTER_ORD_BP;
|
||||
else
|
||||
{
|
||||
ord_ap = ord / 2;
|
||||
bs = (double*)malloc((ord_ap + 1)*sizeof(double));
|
||||
as = (double*)malloc((ord_ap + 1)*sizeof(double));
|
||||
bt = (double*)malloc((ord + 1)*sizeof(double));
|
||||
at = (double*)malloc((ord + 1)*sizeof(double));
|
||||
}
|
||||
}
|
||||
err = iir_ap(rp, rs, ord_ap, type, bs, as);
|
||||
if(err != RES_OK)
|
||||
goto error_proc;
|
||||
|
||||
/* frequency transformation */
|
||||
wa0 = tan(w0 * M_PI * 0.5);
|
||||
wa1 = tan(w1 * M_PI * 0.5);
|
||||
|
||||
switch(type & DSPL_FILTER_TYPE_MASK)
|
||||
{
|
||||
|
||||
case DSPL_FILTER_LPF:
|
||||
err = low2low(bs, as, ord_ap, 1.0, wa0, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_HPF:
|
||||
ws = filter_ws1(ord_ap, rp, rs, type);
|
||||
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
||||
err = low2high(bs, as, ord_ap, 1.0, wa0, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_BPASS:
|
||||
err = low2bp(bs, as, ord_ap, 1.0, wa0, wa1, bt, at);
|
||||
break;
|
||||
|
||||
case DSPL_FILTER_BSTOP:
|
||||
/* need frequency transform ws -> 1 rad/s */
|
||||
|
||||
ws = filter_ws1(ord_ap, rp, rs, type);
|
||||
err = low2low( bs, as, ord_ap, 1.0, 1.0 / ws, bs, as);
|
||||
err = low2bs(bs, as, ord_ap, 1.0, wa0, wa1, bt, at);
|
||||
break;
|
||||
|
||||
default:
|
||||
err = ERROR_FILTER_TYPE;
|
||||
break;
|
||||
}
|
||||
if(err != RES_OK)
|
||||
goto error_proc;
|
||||
|
||||
|
||||
err = bilinear(bt, at, ord, b, a);
|
||||
|
||||
error_proc:
|
||||
|
||||
if(bs)
|
||||
free(bs);
|
||||
if(as)
|
||||
free(as);
|
||||
if(bt)
|
||||
free(bt);
|
||||
if(at)
|
||||
free(at);
|
||||
if(bs)
|
||||
free(bs);
|
||||
if(as)
|
||||
free(as);
|
||||
if(bt)
|
||||
free(bt);
|
||||
if(at)
|
||||
free(at);
|
||||
|
||||
return err;
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
|
@ -260,27 +503,25 @@ Analog prototype for IIR
|
|||
*******************************************************************************/
|
||||
int iir_ap(double rp, double rs, int ord, int type, double* b, double* a)
|
||||
{
|
||||
int err;
|
||||
switch(type & DSPL_FILTER_APPROX_MASK)
|
||||
{
|
||||
case DSPL_FILTER_BUTTER:
|
||||
err = butter_ap(rp, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_CHEBY1:
|
||||
err = cheby1_ap(rp, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_CHEBY2:
|
||||
err = cheby2_ap_wp1(rp, rs, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_ELLIP:
|
||||
err = ellip_ap(rp, rs, ord, b, a);
|
||||
break;
|
||||
default:
|
||||
err = ERROR_FILTER_APPROX;
|
||||
}
|
||||
|
||||
|
||||
return err;
|
||||
int err;
|
||||
switch(type & DSPL_FILTER_APPROX_MASK)
|
||||
{
|
||||
case DSPL_FILTER_BUTTER:
|
||||
err = butter_ap(rp, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_CHEBY1:
|
||||
err = cheby1_ap(rp, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_CHEBY2:
|
||||
err = cheby2_ap_wp1(rp, rs, ord, b, a);
|
||||
break;
|
||||
case DSPL_FILTER_ELLIP:
|
||||
err = ellip_ap(rp, rs, ord, b, a);
|
||||
break;
|
||||
default:
|
||||
err = ERROR_FILTER_APPROX;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -25,140 +25,265 @@
|
|||
#include "dspl.h"
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Fourier Series Decomposition
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_dec(double* t, double* s, int nt, double period,
|
||||
int nw, double* w, complex_t* y)
|
||||
|
||||
\brief
|
||||
Fourier series coefficient calculation for periodic signal
|
||||
|
||||
\param[in] t
|
||||
Pointer to the time vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Pointer to the signal corresponds to time `t`. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Size of time and signal vectors. \n
|
||||
This value must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] period
|
||||
Signal time period. \n
|
||||
\n
|
||||
|
||||
\param[in] nw
|
||||
Number of Fourie series coefficients. \n
|
||||
\n
|
||||
|
||||
\param[out] w
|
||||
Pointer to the frequency vector (rad/s). \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the complex Fourier series coefficients vector. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Numerical integration is used for Fourier series coefficients calculation.
|
||||
This function is not effective.
|
||||
To increase the speed of calculation of the signal spectrum
|
||||
it is more expedient to use fast Fourier transform algorithms.
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_dec(double* t, double* s, int nt, double period,
|
||||
int nw, double* w, complex_t* y)
|
||||
|
||||
\brief
|
||||
Расчет коэффициентов разложения в ряд Фурье
|
||||
|
||||
Функция рассчитывает спектр периодического сигнала при усечении ряда Фурье \n
|
||||
|
||||
|
||||
\param[in] t
|
||||
Указатель на массив моментов времени дискретизации исходного сигнала `s`. \n
|
||||
Размер вектора вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Указатель на массив значений исходного сигнала`s`. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nt
|
||||
Размер выборки исходного сигнала. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] period
|
||||
Период повторения сигнала. \n
|
||||
\n
|
||||
|
||||
\param[in] nw
|
||||
Размер усеченного ряда Фурье. \n
|
||||
\n
|
||||
|
||||
\param[out] w
|
||||
Указатель на массив частот спектра периодического сигнала. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель массив комплексных значений спектра периодического сигнала. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- коэффициенты ряда Фурье рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Для расчета спектра сигнала используется численное интегрирование
|
||||
исходного сигнала методом трапеций. Данная функция не является
|
||||
эффективной. Для увеличения скорости расчета спектра сигнала
|
||||
целесообразнее использовать алгоритмы дискретного
|
||||
и быстрого преобразования Фурье.
|
||||
\n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API fourier_series_dec(double* t, double* s, int nt, double period,
|
||||
int nw, double* w, complex_t* y)
|
||||
int nw, double* w, complex_t* y)
|
||||
{
|
||||
int k, m;
|
||||
double dw = M_2PI / period;
|
||||
complex_t e[2];
|
||||
int k, m;
|
||||
double dw = M_2PI / period;
|
||||
complex_t e[2];
|
||||
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period <= 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period <= 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
w[k] = (k - nw/2) * dw;
|
||||
RE(e[1]) = s[0] * cos(w[k] * t[0]);
|
||||
IM(e[1]) = -s[0] * sin(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = s[m] * cos(w[k] * t[m]);
|
||||
IM(e[1]) = - s[m] * sin(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
w[k] = (k - nw/2) * dw;
|
||||
RE(e[1]) = s[0] * cos(w[k] * t[0]);
|
||||
IM(e[1]) = -s[0] * sin(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = s[m] * cos(w[k] * t[m]);
|
||||
IM(e[1]) = - s[m] * sin(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
}
|
||||
RE(y[k]) /= period;
|
||||
IM(y[k]) /= period;
|
||||
}
|
||||
RE(y[k]) /= period;
|
||||
IM(y[k]) /= period;
|
||||
}
|
||||
|
||||
if(!(nw%2))
|
||||
RE(y[0]) = RE(y[1]) = 0.0;
|
||||
if(!(nw%2))
|
||||
RE(y[0]) = RE(y[1]) = 0.0;
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Fourier Series Decomposition for complex input signal
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API fourier_series_dec_cmplx(double* t, complex_t* s, int nt,
|
||||
double period, int nw, double* w, complex_t* y)
|
||||
double period, int nw, double* w, complex_t* y)
|
||||
{
|
||||
int k, m;
|
||||
double dw = M_2PI / period;
|
||||
complex_t e[2];
|
||||
int k, m;
|
||||
double dw = M_2PI / period;
|
||||
complex_t e[2];
|
||||
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period <= 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period <= 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
w[k] = (k - nw/2) * dw;
|
||||
RE(e[1]) = RE(s[0]) * cos(w[k] * t[0]) +
|
||||
IM(s[0]) * sin(w[k] * t[0]);
|
||||
IM(e[1]) = -RE(s[0]) * sin(w[k] * t[0]) +
|
||||
IM(s[0]) * cos(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = RE(s[m]) * cos(w[k] * t[m]) +
|
||||
IM(s[m]) * sin(w[k] * t[m]);
|
||||
IM(e[1]) = -RE(s[m]) * sin(w[k] * t[m]) +
|
||||
IM(s[m]) * cos(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
w[k] = (k - nw/2) * dw;
|
||||
RE(e[1]) = RE(s[0]) * cos(w[k] * t[0]) +
|
||||
IM(s[0]) * sin(w[k] * t[0]);
|
||||
IM(e[1]) = -RE(s[0]) * sin(w[k] * t[0]) +
|
||||
IM(s[0]) * cos(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = RE(s[m]) * cos(w[k] * t[m]) +
|
||||
IM(s[m]) * sin(w[k] * t[m]);
|
||||
IM(e[1]) = -RE(s[m]) * sin(w[k] * t[m]) +
|
||||
IM(s[m]) * cos(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
}
|
||||
RE(y[k]) /= period;
|
||||
IM(y[k]) /= period;
|
||||
}
|
||||
RE(y[k]) /= period;
|
||||
IM(y[k]) /= period;
|
||||
}
|
||||
|
||||
if(!(nw%2))
|
||||
RE(y[0]) = RE(y[1]) = 0.0;
|
||||
if(!(nw%2))
|
||||
RE(y[0]) = RE(y[1]) = 0.0;
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
/*******************************************************************************
|
||||
Fourier Transform
|
||||
*******************************************************************************/
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API fourier_integral_cmplx(double* t, complex_t* s, int nt,
|
||||
int nw, double* w, complex_t* y)
|
||||
int nw, double* w, complex_t* y)
|
||||
{
|
||||
int k, m;
|
||||
complex_t e[2];
|
||||
int k, m;
|
||||
complex_t e[2];
|
||||
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
memset(y, 0 , nw*sizeof(complex_t));
|
||||
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
RE(e[1]) = RE(s[0]) * cos(w[k] * t[0]) +
|
||||
IM(s[0]) * sin(w[k] * t[0]);
|
||||
IM(e[1]) = -RE(s[0]) * sin(w[k] * t[0]) +
|
||||
IM(s[0]) * cos(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = RE(s[m]) * cos(w[k] * t[m]) +
|
||||
IM(s[m]) * sin(w[k] * t[m]);
|
||||
IM(e[1]) = -RE(s[m]) * sin(w[k] * t[m]) +
|
||||
IM(s[m]) * cos(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
RE(e[1]) = RE(s[0]) * cos(w[k] * t[0]) +
|
||||
IM(s[0]) * sin(w[k] * t[0]);
|
||||
IM(e[1]) = -RE(s[0]) * sin(w[k] * t[0]) +
|
||||
IM(s[0]) * cos(w[k] * t[0]);
|
||||
for(m = 1; m < nt; m++)
|
||||
{
|
||||
RE(e[0]) = RE(e[1]);
|
||||
IM(e[0]) = IM(e[1]);
|
||||
RE(e[1]) = RE(s[m]) * cos(w[k] * t[m]) +
|
||||
IM(s[m]) * sin(w[k] * t[m]);
|
||||
IM(e[1]) = -RE(s[m]) * sin(w[k] * t[m]) +
|
||||
IM(s[m]) * cos(w[k] * t[m]);
|
||||
RE(y[k]) += 0.5 * (RE(e[0]) + RE(e[1]))*(t[m] - t[m-1]);
|
||||
IM(y[k]) += 0.5 * (IM(e[0]) + IM(e[1]))*(t[m] - t[m-1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
@ -166,34 +291,152 @@ int DSPL_API fourier_integral_cmplx(double* t, complex_t* s, int nt,
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Fourier Series Reconstruction
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_rec(double* w, complex_t* s, int nw,
|
||||
double* t, int nt, complex_t* y)
|
||||
\brief Time signal reconstruction from Fourier series coefficients.
|
||||
|
||||
Function reconstructs the time signal:
|
||||
|
||||
\f[
|
||||
s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t)
|
||||
\f]
|
||||
|
||||
\param[in] w
|
||||
Pointer to the Fourier series spectrum frequency vector \f$\omega_n\f$. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Pointer to the Fourier series coefficients vector \f$S(\omega_n)\f$. \n
|
||||
Vector size is `[nw x 1]`. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nw
|
||||
Number of Fourier series coefficients. \n
|
||||
This value must be positive. \n
|
||||
\n
|
||||
|
||||
\param[in] t
|
||||
Pointer to the reconstructed signal time vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Size of time vector and reconstructed signal vector . \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the reconstructed signal vector. \n
|
||||
Vector size is `[nt x 1]`. \n
|
||||
Memory must be allocated. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
The output reconstructed signal is generally complex.
|
||||
However, subject to the symmetry properties of the vectors `w` and` s`
|
||||
with respect to zero frequency we get the imaginary part of the vector `y`
|
||||
at the EPS level. The negligible imaginary part in this case
|
||||
can be ignored.
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int fourier_series_rec(double* w, complex_t* s, int nw,
|
||||
double* t, int nt, complex_t* y)
|
||||
\brief Восстановление сигнала при усечении ряда Фурье
|
||||
|
||||
Функция рассчитывает восстановленный сигнал при усечении ряда Фурье:
|
||||
|
||||
\f[
|
||||
s(t) = \sum\limits_{n = 0}^{n_{\omega}-1} S(\omega_n) \exp(j\omega_n t)
|
||||
\f]
|
||||
|
||||
\param[in] w
|
||||
Указатель на массив частот \f$\omega_n\f$ усеченного ряда Фурье. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
\param[in] s
|
||||
Указатель на массив значений спектра \f$S(\omega_n)\f$. \n
|
||||
Размер вектора `[nw x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
|
||||
\param[in] nw
|
||||
Количество членов усеченного ряда Фурье. \n
|
||||
Значение должно быть положительным. \n
|
||||
\n
|
||||
|
||||
\param[in] t
|
||||
Указатель на массив временных отсчетов восстановленного сигнала. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена и заполнена. \n
|
||||
\n
|
||||
|
||||
\param[in] nt
|
||||
Размер вектора времени и восстановленного сигнала. \n
|
||||
\n
|
||||
|
||||
\param[out] y
|
||||
Указатель на массив восстановленного сигнала. \n
|
||||
Размер вектора `[nt x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- восстановление сигнала прошло успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Выходной восстановленный сигнал в общем случае является комплексным.
|
||||
Однако при соблюдении свойств симметрии векторов `w` и `s` относительно
|
||||
нулевой частоты получим мнимую часть элементов вектора `y` на уровне ошибок
|
||||
округления числа с двойной точностью. Ничтожно малую мнимую часть в этом случае
|
||||
можно игнорировать.
|
||||
\n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API fourier_series_rec(double* w, complex_t* s, int nw,
|
||||
double* t, int nt, complex_t* y)
|
||||
double* t, int nt, complex_t* y)
|
||||
{
|
||||
int k, m;
|
||||
complex_t e;
|
||||
int k, m;
|
||||
complex_t e;
|
||||
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
if(!t || !s || !w || !y)
|
||||
return ERROR_PTR;
|
||||
if(nt<1 || nw < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
memset(y, 0, nt*sizeof(complex_t));
|
||||
memset(y, 0, nt*sizeof(complex_t));
|
||||
|
||||
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
for(m = 0; m < nt; m++)
|
||||
for(k = 0; k < nw; k++)
|
||||
{
|
||||
RE(e) = cos(w[k] * t[m]);
|
||||
IM(e) = sin(w[k] * t[m]);
|
||||
for(m = 0; m < nt; m++)
|
||||
{
|
||||
RE(e) = cos(w[k] * t[m]);
|
||||
IM(e) = sin(w[k] * t[m]);
|
||||
|
||||
RE(y[m]) += CMRE(s[k], e);
|
||||
IM(y[m]) += CMIM(s[k], e);
|
||||
RE(y[m]) += CMRE(s[k], e);
|
||||
IM(y[m]) += CMIM(s[k], e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,122 +11,394 @@
|
|||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include "dspl.h"
|
||||
|
||||
#define GNUPLOT_NO 1
|
||||
#define GNUPLOT_WIN 2
|
||||
#define GNUPLOT_PNG 3
|
||||
#define GNUPLOT_NO 1
|
||||
#define GNUPLOT_WIN 2
|
||||
#define GNUPLOT_PNG 3
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Create Gnuplot header
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn int gnuplot_create(int argc, char* argv[], int w, int h, char* fn_png,
|
||||
void** hplot)
|
||||
\brief Create GNUPLOT chart.
|
||||
|
||||
This function opens the GNUPLOT package depending on the `argv` parameters
|
||||
passed to the program. After calling this function, the handle of the graph
|
||||
will be written to the address `hplot` and it becomes possible to send GNUPLOT
|
||||
commands to display the graphs.
|
||||
|
||||
\note From a system point of view, `hplot` is a pointer to an open file
|
||||
in which you can write commands for execution by the GNUPLOT package.
|
||||
|
||||
\param[in] argc
|
||||
The number of arguments to invoke the program. \n
|
||||
(number of `argv` variables). \n
|
||||
This value cannot be less than one, because `argv [0]`
|
||||
keeps the program executable file name. \n
|
||||
\n
|
||||
|
||||
\param[in] argv
|
||||
Pointer to a strings array of the executable file parameters . \n
|
||||
The size of the array is `argc`. \n
|
||||
`argv [0]` keeps the executable file name. \n
|
||||
`argv [1]` sets the graph display format: \n
|
||||
\verbatim
|
||||
|
||||
--plotwin display the graph in a individual window
|
||||
(this parameter is used by default);
|
||||
|
||||
--plotpng save the plot to a `fn_png` png file;
|
||||
|
||||
--noplot plot not to create, ignore all GNUPLOT commands.
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
\param[in] w
|
||||
The width of the graph window or png file in pixels. \n
|
||||
\n
|
||||
|
||||
\param[in] h
|
||||
The height of the graph window or png file in pixels. \n
|
||||
\n
|
||||
|
||||
\param[in] fn_png
|
||||
Plot png-file name. \n
|
||||
|
||||
\param[in, out] hplot
|
||||
Pointer to the handle address of the GNUPLOT package. \n
|
||||
A pointer to the current graph will be recorded at this address. This pointer
|
||||
is required to send GNUPLOT commands. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
The `hplot` pointer sets in `NULL` if function returns error. \n
|
||||
\note
|
||||
If `argv[1]` parameter equals `--noplot`, then function returns `RES_OK`, but
|
||||
`hplot` will be set as `NULL`. \n
|
||||
|
||||
GNUPLOT handle must be closed by \ref gnuplot_close after plotting.\n
|
||||
|
||||
An example of plotting sine and cosine is given in the following listing:
|
||||
|
||||
\include gnuplot_script_test.c
|
||||
|
||||
This program calculates the values of the sine and cosine functions,
|
||||
and also saves the text files `dat / cosine.txt` and` dat / sine.txt`. \n
|
||||
|
||||
The saved data is displayed on three graphs
|
||||
(with sine, cosine data by both data):
|
||||
|
||||
\image html gnuplot_script_sin.png
|
||||
|
||||
\image html gnuplot_script_cos.png
|
||||
|
||||
\image html gnuplot_script_sincos.png
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn int gnuplot_create(int argc, char* argv[], int w, int h, char* fn_png,
|
||||
void** hplot)
|
||||
\brief Создать график GNUPLOT.
|
||||
|
||||
Данная функция открывает пакет GNUPLOT в зависимости от передаваемых в программу
|
||||
параметров `argv`. После вызова данной функции по адресу `hplot` будет записан
|
||||
handle графика и появляется возможность посылать GNUPLOT команды для отображения
|
||||
графиков.
|
||||
|
||||
\note С точки зрения системы, `hplot` является указателем на открытый файл,
|
||||
в который можно записывать команды для исполнения пакетом GNUPLOT.
|
||||
|
||||
\param[in] argc
|
||||
Количество аргументов вызова программы. \n
|
||||
(количество переменных `argv`). \n
|
||||
Данное значение не должно быть меньше единицы, потому что `argv[0]`
|
||||
хранит имя исполняемого файла программы. \n
|
||||
\n
|
||||
|
||||
\param[in] argv
|
||||
Указатель на массив строк параметров исполняемого файла. \n
|
||||
Размер массива `argc` строк. \n
|
||||
`argv[0]` хранит имя исполняемого файла программы. \n
|
||||
`argv[1]` задает формат отображения графика: \n
|
||||
\verbatim
|
||||
|
||||
--plotwin отображать график в отдельном окне
|
||||
(данный параметр используется по умолчанию);
|
||||
|
||||
--plotpng сохранить график в png-файл, заданный именем fn_png;
|
||||
|
||||
--noplot график не создавать, игнорировать все команды GNUPLOT.
|
||||
\endverbatim
|
||||
\n
|
||||
|
||||
\param[in] w
|
||||
Ширина окна графика или png-файла в пикселях. \n
|
||||
\n
|
||||
|
||||
\param[in] h
|
||||
Высота окна графика или png-файла в пикселях. \n
|
||||
\n
|
||||
|
||||
\param[in] fn_png
|
||||
Имя png-файла, в который будет сохранен график. \n
|
||||
Путь сохранения графика совпадает с путем исполняемого файла программы. \n
|
||||
|
||||
\param[in, out] hplot
|
||||
Указатель на адрес хэндла пакета GNUPLOT. \n
|
||||
По данному адресу будет записан указатель на текщий график. Данный указатель
|
||||
необходим для посылки команд GNUPLOT для построения графика. \n
|
||||
\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
При возникновении ошибки по адресу `hplot` будет записан `NULL`. \n
|
||||
\note
|
||||
Если в `argv[1]` задан параметр `--noplot`, то функция вернет `RES_OK`,
|
||||
но по адресу `hplot` также будет записан `NULL`. \n
|
||||
|
||||
После построения графиков необходимо закрыть хэндл GNUPLOT функцией
|
||||
\ref gnuplot_close. \n
|
||||
|
||||
Пример построения графиков синуса и косинуса привден в следующем листинге:
|
||||
|
||||
\include gnuplot_script_test.c
|
||||
|
||||
Данная программа рассчитвает значения функций синуса и косинуса,
|
||||
а также сохрянет текстовые файлы `dat/cosine.txt` и `dat/sine.txt`. \n
|
||||
|
||||
Сохраненные данные отображаются на трех графиках (с данными синуса, косинуса
|
||||
и обоими данными):
|
||||
|
||||
\image html gnuplot_script_sin.png
|
||||
|
||||
\image html gnuplot_script_cos.png
|
||||
|
||||
\image html gnuplot_script_sincos.png
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API gnuplot_create(int argc, char* argv[],
|
||||
int w, int h, char* fn_png,
|
||||
void** hplot)
|
||||
{
|
||||
FILE* hp;
|
||||
char str[1024] = {0};
|
||||
int state = 0;
|
||||
int err;
|
||||
if(argc>1 && !argv)
|
||||
return ERROR_ARG_PARAM;
|
||||
|
||||
if(argc < 2)
|
||||
state = GNUPLOT_WIN;
|
||||
else
|
||||
{
|
||||
if(!strcmp(argv[1], "--noplot"))
|
||||
state = GNUPLOT_NO;
|
||||
if(!strcmp(argv[1], "--plotwin"))
|
||||
state = GNUPLOT_WIN;
|
||||
if(!strcmp(argv[1], "--plotpng"))
|
||||
state = GNUPLOT_PNG;
|
||||
}
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case GNUPLOT_NO:
|
||||
hp = NULL;
|
||||
|
||||
err = RES_OK;
|
||||
break;
|
||||
|
||||
case GNUPLOT_WIN:
|
||||
hp = popen("gnuplot -p", "w");
|
||||
if(!hp)
|
||||
return ERROR_GNUPLOT_CREATE;
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str, "set terminal wxt size %d,%d", w,h);
|
||||
gnuplot_cmd(hp, str);
|
||||
|
||||
err = RES_OK;
|
||||
break;
|
||||
FILE* hp;
|
||||
char str[1024] = {0};
|
||||
int state = 0;
|
||||
int err;
|
||||
if(argc>1 && !argv)
|
||||
return ERROR_ARG_PARAM;
|
||||
|
||||
case GNUPLOT_PNG:
|
||||
if(!fn_png)
|
||||
return ERROR_GNUPLOT_FNPNG;
|
||||
hp = popen("gnuplot -p", "w");
|
||||
if(!hp)
|
||||
return ERROR_GNUPLOT_CREATE;
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str,
|
||||
"set terminal pngcairo size %d,%d enhanced font 'Verdana,8'", w,h);
|
||||
gnuplot_cmd(hp, str);
|
||||
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str, "set output '%s'", fn_png);
|
||||
gnuplot_cmd(hp, str);
|
||||
err = RES_OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
err = ERROR_GNUPLOT_TERM;
|
||||
hp = NULL;
|
||||
}
|
||||
*hplot = hp;
|
||||
return err;
|
||||
if(argc < 2)
|
||||
state = GNUPLOT_WIN;
|
||||
else
|
||||
{
|
||||
if(!strcmp(argv[1], "--noplot"))
|
||||
state = GNUPLOT_NO;
|
||||
if(!strcmp(argv[1], "--plotwin"))
|
||||
state = GNUPLOT_WIN;
|
||||
if(!strcmp(argv[1], "--plotpng"))
|
||||
state = GNUPLOT_PNG;
|
||||
}
|
||||
|
||||
switch(state)
|
||||
{
|
||||
case GNUPLOT_NO:
|
||||
hp = NULL;
|
||||
|
||||
err = RES_OK;
|
||||
break;
|
||||
|
||||
case GNUPLOT_WIN:
|
||||
hp = popen("gnuplot -p", "w");
|
||||
if(!hp)
|
||||
return ERROR_GNUPLOT_CREATE;
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str, "set terminal wxt size %d,%d", w,h);
|
||||
gnuplot_cmd(hp, str);
|
||||
|
||||
err = RES_OK;
|
||||
break;
|
||||
|
||||
case GNUPLOT_PNG:
|
||||
if(!fn_png)
|
||||
return ERROR_GNUPLOT_FNPNG;
|
||||
hp = popen("gnuplot -p", "w");
|
||||
if(!hp)
|
||||
return ERROR_GNUPLOT_CREATE;
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str, "set terminal pngcairo size %d,%d\
|
||||
enhanced font 'Verdana,8'", w, h);
|
||||
|
||||
gnuplot_cmd(hp, str);
|
||||
|
||||
memset(str, 0, 1024*sizeof(char));
|
||||
sprintf(str, "set output '%s'", fn_png);
|
||||
gnuplot_cmd(hp, str);
|
||||
err = RES_OK;
|
||||
break;
|
||||
|
||||
default:
|
||||
err = ERROR_GNUPLOT_TERM;
|
||||
hp = NULL;
|
||||
}
|
||||
*hplot = hp;
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_close(void* h)
|
||||
\brief Close GNUPLOT handle.
|
||||
|
||||
This function closes the previously opened GNUPLOT handle after transferring all
|
||||
commands.
|
||||
|
||||
/*******************************************************************************
|
||||
Write Gnuplot Command
|
||||
*******************************************************************************/
|
||||
void DSPL_API gnuplot_cmd(void* h, char* cmd)
|
||||
{
|
||||
if(h)
|
||||
{
|
||||
FILE *pf = (FILE*)h;
|
||||
fprintf(pf, cmd);
|
||||
fflush(pf);
|
||||
fprintf(pf, "\n");
|
||||
fflush(pf);
|
||||
}
|
||||
}
|
||||
\note
|
||||
From a system point of view, `h` is a pointer to an open file in which
|
||||
You can write commands for execution by the GNUPLOT package.
|
||||
This function closes this file. \n
|
||||
It is important to note that closing the handle does not mean closing the
|
||||
plot window.
|
||||
After closing the package handle, the user cannot send build commands,
|
||||
but the plot window remains open, as it is processed by the package
|
||||
GNUPLOT regardless.
|
||||
|
||||
\param[in] h
|
||||
GNUPLOT handle which will be closed. \n
|
||||
\n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_close(void* h)
|
||||
\brief Закрыть хэндл GNUPLOT.
|
||||
|
||||
Данная функция закрывает открытый ранее хэндл GNUPLOT после передачи всех
|
||||
команд построения графиков.
|
||||
|
||||
\note
|
||||
С точки зрения системы, `h` является указателем на открытый файл, в который
|
||||
можно записывать команды для исполнения пакетом GNUPLOT.
|
||||
Данная функция закрывает этот файл. \n
|
||||
Важно отметить, что закрытие хэндла не означает закрытия окна графика.
|
||||
После закрытия хэндла пакета, пользователь не может посылать команды построения
|
||||
графика, но окно графика остается открытым, так как обрабатывается пакетом
|
||||
GNUPLOT независимо.
|
||||
|
||||
\param[in] h
|
||||
Хэндл графика GNUPLOT, который будет закрыт. \n
|
||||
\n
|
||||
|
||||
/*******************************************************************************
|
||||
Close Gnuplot
|
||||
*******************************************************************************/
|
||||
\author Бахурин Сергей
|
||||
www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
void DSPL_API gnuplot_close(void* h)
|
||||
{
|
||||
if(h)
|
||||
fclose((FILE*)h);
|
||||
if(h)
|
||||
fclose((FILE*)h);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_cmd(void* h, char* cmd)
|
||||
\brief Function sends `cmd` command to GNUPLOT corresponds to `h` handle.
|
||||
|
||||
\note From a system point of view, `h` is a pointer to an open file,
|
||||
into which you can write commands for execution by the GNUPLOT package. This
|
||||
function writes the string `cmd` to the given file. \n \n
|
||||
|
||||
From the user's point of view, calling the `gnuplot_cmd` function is
|
||||
GNUPLOT script one line executing. \n \n
|
||||
|
||||
A comprehensive description of the graphing capabilities of the GNUPLOT package,
|
||||
with examples of commands can be found on
|
||||
<a href = "http://gnuplot.sourceforge.net/demo_5.2/"> GNUPLOT project </a>.
|
||||
|
||||
\param[in] h
|
||||
GNUPLOT handle. \n \n
|
||||
|
||||
\param[in] cmd
|
||||
GNUPLOT command string. \n \n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup PLOT_GROUP
|
||||
\fn void gnuplot_cmd(void* h, char* cmd)
|
||||
\brief Функция посылает команду `cmd` пакету GNUPLOT, для построения
|
||||
или оформления графика, соответсвующего хэндлу `h`.
|
||||
|
||||
Данная функция закрывает открытый ранее хэндл GNUPLOT после передачи всех
|
||||
команд построения графиков.
|
||||
|
||||
\note С точки зрения системы, `h` является указателем на открытый файл,
|
||||
в который можно записывать команды для исполнения пакетом GNUPLOT. Данная
|
||||
функция записывает в данный файл строку `cmd`. \n \n
|
||||
|
||||
С точки зрения пользователя, вызов функции `gnuplot_cmd` равносильно выполнению
|
||||
одной строки скрипта GNUPLOT. \n \n
|
||||
|
||||
Исчерпывающее описание возможностей построения графиков пакетом GNUPLOT,
|
||||
с примерами команд можно найти на
|
||||
<a href = "http://gnuplot.sourceforge.net/demo_5.2/">сайте проекта GNUPLOT</a>.
|
||||
|
||||
\param[in] h
|
||||
Хэндл графика GNUPLOT. \n \n
|
||||
|
||||
\param[in] cmd
|
||||
Тектовая строка команды построения или оформления графика. \n \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
void DSPL_API gnuplot_cmd(void* h, char* cmd)
|
||||
{
|
||||
if(h)
|
||||
{
|
||||
FILE *pf = (FILE*)h;
|
||||
fprintf(pf, cmd);
|
||||
fflush(pf);
|
||||
fprintf(pf, "\n");
|
||||
fflush(pf);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
@ -23,87 +23,280 @@
|
|||
#include "dspl.h"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Goertzel algorithm for real vector
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel(double *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief <a href = "http://en.dsplib.org/content/goertzel/goertzel.html">
|
||||
Goertzel algorithm </a> individual DFT samples calculation for the real input vector `x`.
|
||||
|
||||
Goertzel algorithm calculates `k` samples of `n`-point DFT, according to
|
||||
`ind` indexes vector.
|
||||
|
||||
\param[in] x
|
||||
Pointer to the real input vector `x` \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Size of vector `x`. \n \n
|
||||
|
||||
\param[in] ind
|
||||
Pointer to the DFT samples indexes which need
|
||||
to calculate by Goertzel algorithm. \n
|
||||
Vector size is `[k x 1]`. \n \n
|
||||
|
||||
\param[in] k
|
||||
Size of vector `ind`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the DFT samples vector corresponds to indexes `ind`. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Goertzel's algorithm is effective when it is necessary to calculate
|
||||
several DFT samples of a signal of long duration. \n
|
||||
However, the size `k` of the vector of indices` ind` can be arbitrary,
|
||||
including more than the length of the signal `n`.
|
||||
In this case, some DFT samples will be repeated, but this will not entail
|
||||
a runtime error. \n
|
||||
The values of the indices of the DFT spectral samples `ind`
|
||||
can also be arbitrary integers, including negative ones.
|
||||
In this case, the DFT samples will be calculated.
|
||||
with indices modulo `n`. \n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel(double *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief <a href = "http://ru.dsplib.org/content/goertzel/goertzel.html">
|
||||
Алгоритм Гёрцеля</a> для расчета отдельных спектральных отсчетов дискретного
|
||||
преобразования Фурье вещественного сигнала `x`.
|
||||
|
||||
Данный алгоритм позволяет рассчитать `k` спектральных отсчетов
|
||||
`n`-точечного ДПФ, заданных вектором индексов `ind`.
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор вещественного входного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора входного сигнала. \n \n
|
||||
|
||||
\param[in] ind
|
||||
Указатель на вектор индексов спектральных отсчетов для расчета которых
|
||||
будет использоваться алгоритм Герцеля. \n
|
||||
Размер вектора `[k x 1]`. \n \n
|
||||
|
||||
\param[in] k
|
||||
Размер вектора индексов спектральных отсчетов `ind`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор спектральных отсчетов, соответствующих номерам `ind`. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- расчёт выполнен успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Алгоритм Гёрцеля эффективен когда необходимо рассчитать несколько
|
||||
спектральных отсчетов сигнала большой длительности. \n
|
||||
Однако, размер `k` вектора индексов `ind` может быть произвольным,
|
||||
в том числе больше длины сигнала `n`.
|
||||
В этом случае некоторые спектральные отсчеты будут повторяться, но это
|
||||
не повлечет за собой ошибки выполнения. \n
|
||||
Значения индексов спектральных отсчетов `ind` также могут быть
|
||||
произвольными целыми, в том числе и отрицательными.
|
||||
В этом случае будут рассчитаны спектральные отсчеты
|
||||
с индексами по модулю `n`. \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API goertzel(double *x, int n, int *ind, int k, complex_t *y)
|
||||
{
|
||||
|
||||
int m, p;
|
||||
double wR, wI;
|
||||
double alpha;
|
||||
double v[3];
|
||||
int m, p;
|
||||
double wR, wI;
|
||||
double alpha;
|
||||
double v[3];
|
||||
|
||||
if(!x || !y || !ind)
|
||||
return ERROR_PTR;
|
||||
if(!x || !y || !ind)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n < 1 || k < 1)
|
||||
return ERROR_SIZE;
|
||||
if(n < 1 || k < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
for(p = 0; p < k; p++)
|
||||
{
|
||||
wR = cos(M_2PI * (double)ind[p] / (double)n);
|
||||
wI = sin(M_2PI * (double)ind[p] / (double)n);
|
||||
|
||||
alpha = 2.0 * wR;
|
||||
v[0] = v[1] = v[2] = 0.0;
|
||||
|
||||
for(m = 0; m < n; m++)
|
||||
for(p = 0; p < k; p++)
|
||||
{
|
||||
v[2] = v[1];
|
||||
v[1] = v[0];
|
||||
v[0] = x[m]+alpha*v[1] - v[2];
|
||||
wR = cos(M_2PI * (double)ind[p] / (double)n);
|
||||
wI = sin(M_2PI * (double)ind[p] / (double)n);
|
||||
|
||||
alpha = 2.0 * wR;
|
||||
v[0] = v[1] = v[2] = 0.0;
|
||||
|
||||
for(m = 0; m < n; m++)
|
||||
{
|
||||
v[2] = v[1];
|
||||
v[1] = v[0];
|
||||
v[0] = x[m]+alpha*v[1] - v[2];
|
||||
}
|
||||
RE(y[p]) = wR * v[0] - v[1];
|
||||
IM(y[p]) = wI * v[0];
|
||||
}
|
||||
RE(y[p]) = wR * v[0] - v[1];
|
||||
IM(y[p]) = wI * v[0];
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Goertzel algorithm for complex vector
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief <a href = "http://en.dsplib.org/content/goertzel/goertzel.html">
|
||||
Goertzel algorithm </a> individual DFT samples calculation for
|
||||
the complex input vector `x`.
|
||||
|
||||
Goertzel algorithm calculates `k` samples of `n`-point DFT, according to
|
||||
`ind` indexes vector.
|
||||
|
||||
\param[in] x
|
||||
Pointer to the complex input vector `x` \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Size of vector `x`. \n \n
|
||||
|
||||
\param[in] ind
|
||||
Pointer to the DFT samples indexes which need
|
||||
to calculate by Goertzel algorithm. \n
|
||||
Vector size is `[k x 1]`. \n \n
|
||||
|
||||
\param[in] k
|
||||
Size of vector `ind`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Pointer to the DFT samples vector corresponds to indexes `ind`. \n
|
||||
Vector size is `[k x 1]`. \n
|
||||
Memory must be allocated. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` if function is calculated successfully. \n
|
||||
Else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
\note
|
||||
Goertzel's algorithm is effective when it is necessary to calculate
|
||||
several DFT samples of a signal of long duration. \n
|
||||
However, the size `k` of the vector of indices` ind` can be arbitrary,
|
||||
including more than the length of the signal `n`.
|
||||
In this case, some DFT samples will be repeated, but this will not entail
|
||||
a runtime error. \n
|
||||
The values of the indices of the DFT spectral samples `ind`
|
||||
can also be arbitrary integers, including negative ones.
|
||||
In this case, the DFT samples will be calculated.
|
||||
with indices modulo `n`. \n
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup DFT_GROUP
|
||||
\fn int goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
|
||||
\brief <a href = "http://ru.dsplib.org/content/goertzel/goertzel.html">
|
||||
Алгоритм Гёрцеля</a> для расчета отдельных спектральных отсчетов дискретного
|
||||
преобразования Фурье комплексного сигнала `x`.
|
||||
|
||||
Данный алгоритм позволяет рассчитать `k` спектральных отсчетов
|
||||
`n`-точечного ДПФ, заданных вектором индексов `ind`.
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор комплексного входного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора входного сигнала. \n \n
|
||||
|
||||
\param[in] ind
|
||||
Указатель на вектор индексов спектральных отсчетов для расчета которых
|
||||
будет использоваться алгоритм Герцеля. \n
|
||||
Размер вектора `[k x 1]`. \n \n
|
||||
|
||||
\param[in] k
|
||||
Размер вектора индексов спектральных отсчетов `ind`. \n \n
|
||||
|
||||
\param[out] y
|
||||
Указатель на вектор спектральных отсчетов, соответствующих номерам `ind`. \n
|
||||
Размер вектора `[k x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\note
|
||||
Алгоритм Герцеля эффективен когда необходимо рассчитать несколько
|
||||
спектральных отсчетов сигнала большой длительности. \n
|
||||
Однако, размер `k` вектора индексов `ind` может быть произвольным,
|
||||
в том числе больше длины сигнала `n`.
|
||||
В этом случае некоторые спектральные отсчеты
|
||||
будут повторяться, но это не повлечет за собой ошибки выполнения. \n
|
||||
Значения индексов спектральных отсчетов `ind` также могут быть
|
||||
произвольными целыми, в том числе и отрицательными.
|
||||
В этом случае будут рассчитаны спектральные отсчеты с индексами
|
||||
по модулю `n`. \n \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API goertzel_cmplx(complex_t *x, int n, int *ind, int k, complex_t *y)
|
||||
{
|
||||
|
||||
int m, p;
|
||||
complex_t w;
|
||||
double alpha;
|
||||
complex_t v[3];
|
||||
int m, p;
|
||||
complex_t w;
|
||||
double alpha;
|
||||
complex_t v[3];
|
||||
|
||||
if(!x || !y || !ind)
|
||||
return ERROR_PTR;
|
||||
if(!x || !y || !ind)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n < 1 || k < 1)
|
||||
return ERROR_SIZE;
|
||||
if(n < 1 || k < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
for(p = 0; p < k; p++)
|
||||
{
|
||||
RE(w) = cos(M_2PI * (double)ind[p] / (double)n);
|
||||
IM(w) = sin(M_2PI * (double)ind[p] / (double)n);
|
||||
|
||||
alpha = 2.0 * RE(w);
|
||||
memset(v, 0, 3*sizeof(complex_t));
|
||||
|
||||
for(m = 0; m < n; m++)
|
||||
for(p = 0; p < k; p++)
|
||||
{
|
||||
RE(v[2]) = RE(v[1]);
|
||||
RE(v[1]) = RE(v[0]);
|
||||
RE(v[0]) = RE(x[m]) + alpha * RE(v[1]) - RE(v[2]);
|
||||
RE(w) = cos(M_2PI * (double)ind[p] / (double)n);
|
||||
IM(w) = sin(M_2PI * (double)ind[p] / (double)n);
|
||||
|
||||
IM(v[2]) = IM(v[1]);
|
||||
IM(v[1]) = IM(v[0]);
|
||||
IM(v[0]) = IM(x[m]) + alpha * IM(v[1]) - IM(v[2]);
|
||||
alpha = 2.0 * RE(w);
|
||||
memset(v, 0, 3*sizeof(complex_t));
|
||||
|
||||
for(m = 0; m < n; m++)
|
||||
{
|
||||
RE(v[2]) = RE(v[1]);
|
||||
RE(v[1]) = RE(v[0]);
|
||||
RE(v[0]) = RE(x[m]) + alpha * RE(v[1]) - RE(v[2]);
|
||||
|
||||
IM(v[2]) = IM(v[1]);
|
||||
IM(v[1]) = IM(v[0]);
|
||||
IM(v[0]) = IM(x[m]) + alpha * IM(v[1]) - IM(v[2]);
|
||||
}
|
||||
|
||||
RE(y[p]) = CMRE(w, v[0]) - RE(v[1]);
|
||||
IM(y[p]) = CMIM(w, v[0]) - IM(v[1]);
|
||||
}
|
||||
|
||||
RE(y[p]) = CMRE(w, v[0]) - RE(v[1]);
|
||||
IM(y[p]) = CMIM(w, v[0]) - IM(v[1]);
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
1093
dspl/src/inout.c
1093
dspl/src/inout.c
Plik diff jest za duży
Load Diff
872
dspl/src/math.c
872
dspl/src/math.c
Plik diff jest za duży
Load Diff
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -27,415 +27,457 @@
|
|||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eig_cmplx(complex_t* a, int n, complex_t* v, int* info)
|
||||
|
||||
\brief Расчет собственных значений квадратной комплексной матрицы.
|
||||
|
||||
Данная функция производит расчет `n` собственных значений квадратной матрицы
|
||||
размером `n x n`.
|
||||
|
||||
\param[in] a
|
||||
Указатель на комплексную матрицу размерности `n x n`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размерность квадратной матрицы.\n
|
||||
|
||||
\param[out] v
|
||||
Указатель на вектор собственных значений матрицы. \n
|
||||
Размер вектора `n x 1`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[out] info
|
||||
Указатель на код возврата функции `zgees` пакета LAPACK. \n
|
||||
В случае возникновения ошибки при расчете вектора собственных значений,
|
||||
пакет LAPACK возвращает код ошибки, который может быть прочитан по данному
|
||||
указателю. \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
При возникновении ошибки `ERROR_LAPACK` по адресу
|
||||
`info` будет записан код ошибки пакета LAPACK. \n
|
||||
|
||||
|
||||
Пример расчета собственных значений матрицы:
|
||||
\include matrix_eig.c
|
||||
|
||||
Данная программа рассчитывает собственные значения матрицы размерности `3 x 3`
|
||||
и выводит собственные значения на печать. \n
|
||||
|
||||
Результат работы программы:
|
||||
\verbatim
|
||||
A = [ % size [3 x 3] type: complex
|
||||
1.00 +0.00i, 2.00 +0.00i, 3.00 +0.00i;
|
||||
1.00 +0.00i, 0.00 +0.00i, 0.00 +0.00i;
|
||||
0.00 +0.00i, 1.00 +0.00i, 0.00 +0.00i;];
|
||||
|
||||
v = [ % size [3 x 1] type: complex
|
||||
2.374424 -0.000000i;
|
||||
-0.687212 +0.889497i;
|
||||
-0.687212 -0.889497i;];
|
||||
\endverbatim
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API matrix_eig_cmplx(complex_t* a, int n, complex_t* v, int* info)
|
||||
{
|
||||
int err;
|
||||
int sdim = 0;
|
||||
int ldvs = 1;
|
||||
int lwork = 2*n;
|
||||
if(!a || !v)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
complex_t *work=(complex_t*)malloc(lwork*sizeof(complex_t));
|
||||
double *rwork = (double*)malloc(n*sizeof(double));
|
||||
int err;
|
||||
int sdim = 0;
|
||||
int ldvs = 1;
|
||||
int lwork = 2*n;
|
||||
if(!a || !v)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
complex_t *work=(complex_t*)malloc(lwork*sizeof(complex_t));
|
||||
double *rwork = (double*)malloc(n*sizeof(double));
|
||||
|
||||
zgees_("N", "N", NULL, &n, a, &n, &sdim, v, NULL, &ldvs, work, &lwork,
|
||||
rwork, NULL, &err);
|
||||
|
||||
if(err!=0)
|
||||
{
|
||||
if(info)
|
||||
*info = err;
|
||||
err = ERROR_LAPACK;
|
||||
}
|
||||
else
|
||||
err = RES_OK;
|
||||
|
||||
free(work);
|
||||
free(rwork);
|
||||
return err;
|
||||
zgees_("N", "N", NULL, &n, a, &n, &sdim, v, NULL, &ldvs, work, &lwork,
|
||||
rwork, NULL, &err);
|
||||
|
||||
if(err!=0)
|
||||
{
|
||||
if(info)
|
||||
*info = err;
|
||||
err = ERROR_LAPACK;
|
||||
}
|
||||
else
|
||||
err = RES_OK;
|
||||
|
||||
free(work);
|
||||
free(rwork);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
/*******************************************************************************
|
||||
Real matrix eye
|
||||
*******************************************************************************/
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_LINALG_GROUP
|
||||
\fn int matrix_eye(double* a, int n, int m)
|
||||
\brief Генерирование единичной вещественой матрицы размерности `n x m`.
|
||||
|
||||
Данная функция заполняет матрицу нулями
|
||||
и записывает единицы на главной диагонали
|
||||
|
||||
\param[in] a
|
||||
Указатель на вещественную матрицу размерности `n x m`. \n
|
||||
Матрица должна быть расположена в памяти по столбцам. \n \n
|
||||
|
||||
\param[in] n
|
||||
Количество строк матрицы. \n\n
|
||||
|
||||
\param[in] m
|
||||
Количество столбцов матрицы. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API matrix_eye(double* a, int n, int m)
|
||||
{
|
||||
int p, k;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if (n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
k = 0;
|
||||
memset(a, 0, n*m*sizeof(double));
|
||||
for(p = 0; p < m; p++)
|
||||
{
|
||||
a[k] = 1.0;
|
||||
k += n+1;
|
||||
}
|
||||
int p, k;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if (n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
k = 0;
|
||||
memset(a, 0, n*m*sizeof(double));
|
||||
for(p = 0; p < m; p++)
|
||||
{
|
||||
a[k] = 1.0;
|
||||
k += n+1;
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Complex matrix eye
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_eye_cmplx(complex_t* a, int n, int m)
|
||||
{
|
||||
int p, k;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if (n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
k = 0;
|
||||
memset(a, 0, n*m*sizeof(complex_t));
|
||||
for(p = 0; p < m; p++)
|
||||
{
|
||||
RE(a[k]) = 1.0;
|
||||
k += n+1;
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
matrix LU decomposition
|
||||
******************************************************************************
|
||||
int DSPL_API matrix_lu(matrix_t* a, matrix_t* L, matrix_t* U, matrix_t* P)
|
||||
{
|
||||
int err, k, n, m, N, ind;
|
||||
double *rl, *ru, mu, ukk, gmax;
|
||||
|
||||
if(!a || !L || !U || !P)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(a->n != a->m || a->n < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
N = a->n;
|
||||
err = matrix_create(L, N, N, a->type);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
|
||||
err = matrix_create(U, N, N, a->type);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
err = matrix_create_eye(P, N, a->type);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
|
||||
if((a->type & DAT_MASK) == DAT_DOUBLE)
|
||||
{
|
||||
rl = (double*)L->dat;
|
||||
ru = (double*)U->dat;
|
||||
|
||||
memcpy(ru, (double*)a->dat, N*N*sizeof(double));
|
||||
memset(rl, 0, N*N*sizeof(double));
|
||||
|
||||
find_max_abs(ru, N*N, &gmax, NULL);
|
||||
for(k = 0; k < N; k++)
|
||||
int p, k;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if (n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
k = 0;
|
||||
memset(a, 0, n*m*sizeof(complex_t));
|
||||
for(p = 0; p < m; p++)
|
||||
{
|
||||
find_max_abs(ru+k*N+k, N-k, NULL, &ind);
|
||||
ind += k;
|
||||
matrix_swap_rows(U, k, ind);
|
||||
matrix_swap_rows(L, k, ind);
|
||||
matrix_swap_rows(P, k, ind);
|
||||
ukk = ru[N*k+k];
|
||||
if(fabs(ukk / gmax) < MATRIX_SINGULAR_THRESHOLD)
|
||||
return ERROR_MATRIX_SINGULAR;
|
||||
|
||||
for(m = k+1; m < N; m++)
|
||||
{
|
||||
mu = ru[m+k*N] / ukk;
|
||||
rl[m+k*N] = mu;
|
||||
for(n = k; n < N; n++)
|
||||
{
|
||||
ru[m + n*N] -= ru[k + n*N] * mu;
|
||||
}
|
||||
}
|
||||
RE(a[k]) = 1.0;
|
||||
k += n+1;
|
||||
}
|
||||
for(n =0; n < N; n++)
|
||||
rl[n+n*N] = 1.0;
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
real matrix multiplication
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_mul(double* a, int na, int ma,
|
||||
double* b, int nb, int mb,
|
||||
double* c)
|
||||
{
|
||||
|
||||
double alpha = 1;
|
||||
double beta = 0.0;
|
||||
|
||||
if(!a || !b || !c)
|
||||
return ERROR_PTR;
|
||||
if(na < 1 || ma < 1 || nb < 1 || mb < 1 || ma != nb)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
double alpha = 1;
|
||||
double beta = 0.0;
|
||||
|
||||
if(!a || !b || !c)
|
||||
return ERROR_PTR;
|
||||
if(na < 1 || ma < 1 || nb < 1 || mb < 1 || ma != nb)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
/* BLAS DGEMM */
|
||||
dgemm_("N", "N", &na, &mb, &ma, &alpha, a, &na, b, &nb, &beta, c, &na);
|
||||
/* BLAS DGEMM */
|
||||
dgemm_("N", "N", &na, &mb, &ma, &alpha, a, &na, b, &nb, &beta, c, &na);
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
real matrix print
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_print(double* a, int n, int m,
|
||||
const char* name, const char* format)
|
||||
{
|
||||
int p,q;
|
||||
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_SIZE;
|
||||
int p,q;
|
||||
|
||||
printf("\n%s = [ %% size [%d x %d] type: real", name, n, m);
|
||||
|
||||
for(p = 0; p < n; p++)
|
||||
{
|
||||
printf("\n");
|
||||
for(q = 0; q < m; q++)
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
printf("\n%s = [ %% size [%d x %d] type: real", name, n, m);
|
||||
|
||||
for(p = 0; p < n; p++)
|
||||
{
|
||||
printf(format, a[q*n + p]);
|
||||
if(q == m-1)
|
||||
printf(";");
|
||||
else
|
||||
printf(", ");
|
||||
printf("\n");
|
||||
for(q = 0; q < m; q++)
|
||||
{
|
||||
printf(format, a[q*n + p]);
|
||||
if(q == m-1)
|
||||
printf(";");
|
||||
else
|
||||
printf(", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("];\n");
|
||||
|
||||
return RES_OK;
|
||||
printf("];\n");
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
complex matrix print
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_print_cmplx(complex_t* a, int n, int m,
|
||||
const char* name, const char* format)
|
||||
{
|
||||
int p,q;
|
||||
int p,q;
|
||||
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_SIZE;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
printf("\n%s = [ %% size [%d x %d] type: complex", name, n, m);
|
||||
|
||||
printf("\n%s = [ %% size [%d x %d] type: complex", name, n, m);
|
||||
|
||||
for(p = 0; p < n; p++)
|
||||
{
|
||||
printf("\n");
|
||||
for(q = 0; q < m; q++)
|
||||
for(p = 0; p < n; p++)
|
||||
{
|
||||
printf(format, RE(a[q*n + p]), IM(a[q*n + p]));
|
||||
if(q == m-1)
|
||||
printf(";");
|
||||
else
|
||||
printf(", ");
|
||||
printf("\n");
|
||||
for(q = 0; q < m; q++)
|
||||
{
|
||||
printf(format, RE(a[q*n + p]), IM(a[q*n + p]));
|
||||
if(q == m-1)
|
||||
printf(";");
|
||||
else
|
||||
printf(", ");
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("];\n");
|
||||
printf("];\n");
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
/*******************************************************************************
|
||||
Real matrix transpose
|
||||
*******************************************************************************/
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_transpose(double* a, int n, int m, double* b)
|
||||
{
|
||||
int p, q, i, j, aind, bind;
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
int p, q, i, j, aind, bind;
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
b[bind] = a[aind];
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
b[bind] = a[aind];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i = p; i < n; i++)
|
||||
for(j = 0; j < m; j++)
|
||||
b[i*m + j] = a[j*n+i];
|
||||
for(i = p; i < n; i++)
|
||||
for(j = 0; j < m; j++)
|
||||
b[i*m + j] = a[j*n+i];
|
||||
|
||||
for(i = 0; i < p; i++)
|
||||
for(j = q; j < m; j++)
|
||||
b[i*m + j] = a[j*n+i];
|
||||
|
||||
return RES_OK;
|
||||
for(i = 0; i < p; i++)
|
||||
for(j = q; j < m; j++)
|
||||
b[i*m + j] = a[j*n+i];
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Complex matrix transpose
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_transpose_cmplx(complex_t* a, int n, int m, complex_t* b)
|
||||
{
|
||||
int p, q, i, j, aind, bind;
|
||||
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
int p, q, i, j, aind, bind;
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
RE(b[bind]) = RE(a[aind]);
|
||||
IM(b[bind]) = IM(a[aind]);
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
RE(b[bind]) = RE(a[aind]);
|
||||
IM(b[bind]) = IM(a[aind]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i = p; i < n; i++)
|
||||
{
|
||||
for(j = 0; j < m; j++)
|
||||
for(i = p; i < n; i++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = IM(a[j*n+i]);
|
||||
for(j = 0; j < m; j++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = IM(a[j*n+i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < p; i++)
|
||||
{
|
||||
for(j = q; j < m; j++)
|
||||
for(i = 0; i < p; i++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = IM(a[j*n+i]);
|
||||
for(j = q; j < m; j++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = IM(a[j*n+i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Hermite matrix transpose
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API matrix_transpose_hermite(complex_t* a, int n, int m, complex_t* b)
|
||||
{
|
||||
int p, q, i, j, aind, bind;
|
||||
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
int p, q, i, j, aind, bind;
|
||||
|
||||
if(!a || !b)
|
||||
return ERROR_PTR;
|
||||
if(n < 1 || m < 1)
|
||||
return ERROR_MATRIX_SIZE;
|
||||
|
||||
for(p = 0; p < n - DSPL_MATRIX_BLOCK; p+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
for(q = 0; q < m - DSPL_MATRIX_BLOCK; q+=DSPL_MATRIX_BLOCK)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
RE(b[bind]) = RE(a[aind]);
|
||||
IM(b[bind]) = -IM(a[aind]);
|
||||
for(i = 0; i < DSPL_MATRIX_BLOCK; i++)
|
||||
{
|
||||
for(j = 0; j < DSPL_MATRIX_BLOCK; j++)
|
||||
{
|
||||
aind = (q+j) * n + p + i;
|
||||
bind = (p+i) * m + q + j;
|
||||
RE(b[bind]) = RE(a[aind]);
|
||||
IM(b[bind]) = -IM(a[aind]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for(i = p; i < n; i++)
|
||||
{
|
||||
for(j = 0; j < m; j++)
|
||||
for(i = p; i < n; i++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = -IM(a[j*n+i]);
|
||||
for(j = 0; j < m; j++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = -IM(a[j*n+i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(i = 0; i < p; i++)
|
||||
{
|
||||
for(j = q; j < m; j++)
|
||||
for(i = 0; i < p; i++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = -IM(a[j*n+i]);
|
||||
for(j = q; j < m; j++)
|
||||
{
|
||||
RE(b[i*m + j]) = RE(a[j*n+i]);
|
||||
IM(b[i*m + j]) = -IM(a[j*n+i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
/*******************************************************************************
|
||||
* Vector dot product
|
||||
******************************************************************************/
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
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;
|
||||
int inc = 1;
|
||||
|
||||
*p = ddot_(&n, x, &inc, y, &inc);
|
||||
|
||||
return RES_OK;
|
||||
if(!x || !y || !p)
|
||||
return ERROR_PTR;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
*p = ddot_(&n, x, &inc, y, &inc);
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -25,135 +25,296 @@
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Polynomial zeros to coefficients
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API poly_z2a_cmplx(complex_t* z, int nz, int ord, complex_t* a)
|
||||
{
|
||||
int k, ind, res;
|
||||
complex_t x[2];
|
||||
int k, ind, res;
|
||||
complex_t x[2];
|
||||
|
||||
if(!z || !a)
|
||||
return ERROR_PTR;
|
||||
if(nz < 0)
|
||||
return ERROR_SIZE;
|
||||
if(nz > ord || ord < 1)
|
||||
return ERROR_POLY_ORD;
|
||||
if(!z || !a)
|
||||
return ERROR_PTR;
|
||||
if(nz < 0)
|
||||
return ERROR_SIZE;
|
||||
if(nz > ord || ord < 1)
|
||||
return ERROR_POLY_ORD;
|
||||
|
||||
RE(x[1]) = 1.0;
|
||||
IM(x[1]) = 0.0;
|
||||
RE(x[1]) = 1.0;
|
||||
IM(x[1]) = 0.0;
|
||||
|
||||
memset(a, 0, (ord+1) * sizeof(complex_t));
|
||||
memset(a, 0, (ord+1) * sizeof(complex_t));
|
||||
|
||||
RE(a[0]) = 1.0;
|
||||
ind = 1;
|
||||
for(k = 0; k < nz; k++)
|
||||
{
|
||||
RE(x[0]) = -RE(z[k]);
|
||||
IM(x[0]) = -IM(z[k]);
|
||||
res = conv_cmplx(a, ind, x, 2, a);
|
||||
if(res!=RES_OK)
|
||||
return res;
|
||||
ind++;
|
||||
}
|
||||
RE(a[0]) = 1.0;
|
||||
ind = 1;
|
||||
for(k = 0; k < nz; k++)
|
||||
{
|
||||
RE(x[0]) = -RE(z[k]);
|
||||
IM(x[0]) = -IM(z[k]);
|
||||
res = conv_cmplx(a, ind, x, 2, a);
|
||||
if(res!=RES_OK)
|
||||
return res;
|
||||
ind++;
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Real polynomial roots calculation
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyroots(double* a, int ord, complex_t* r, int* info)
|
||||
\brief Расчет корней вещественного полинома
|
||||
|
||||
Функция рассчитывает корни полинома \f$P_N(x)\f$ \f$N-\f$ого
|
||||
порядка, заданного вектором коэффициентов `a`.
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 x + a_2 x^2 + a_3 x^3 + ... a_N x^N.
|
||||
\f]
|
||||
|
||||
Корни полинома рассчитываются как собственные числа характеристической
|
||||
матрицы полинома. Для расчета собственных чисел используется подпрограмма
|
||||
пакета LAPACK.
|
||||
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n
|
||||
Коэффициент `a[ord]` не должен быть равен нулю. \n \n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n \n
|
||||
|
||||
\param[out] r
|
||||
Указатель на вектор комплексных корней полинома. \n
|
||||
Размер вектора `[ord x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\param[out] info
|
||||
Указатель наа код возврата пакета LAPACK. \n
|
||||
Данный код возвращается подпрограммой LAPACK и транслируется через данную
|
||||
переменную для возможности анализа. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- корни полинома рассчитаны успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример расчета корней полинома:
|
||||
|
||||
\include polyroots_test.c
|
||||
|
||||
Данная программа производит расчет корней полинома
|
||||
\f[
|
||||
P(x) = 2 + 2x + x^2
|
||||
\f]
|
||||
и выводит рассчитанные корни на печать.
|
||||
Результат работы программы:
|
||||
|
||||
\verbatim
|
||||
Error code: 0x00000000
|
||||
r[0] = -1.00000 1.00000 j
|
||||
r[1] = -1.00000-1.00000 j
|
||||
\endverbatim
|
||||
|
||||
Получили пару комплексно-сопряженных корней полинома.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API polyroots(double* a, int ord, complex_t* r, int* info)
|
||||
{
|
||||
complex_t *t = NULL;
|
||||
int m;
|
||||
int err;
|
||||
|
||||
if(!a || !r)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(a[ord] == 0.0)
|
||||
return ERROR_POLY_AN;
|
||||
|
||||
t = (complex_t*)malloc(ord * ord * sizeof(complex_t));
|
||||
if(!t)
|
||||
return ERROR_MALLOC;
|
||||
|
||||
for(m = 0; m < ord-1; m++)
|
||||
{
|
||||
RE(t[m * (ord+1) + 1]) = 1.0;
|
||||
RE(t[m + ord * (ord - 1)]) = -a[m] / a[ord];
|
||||
}
|
||||
RE(t[ord * ord - 1]) = -a[ord-1] / a[ord];
|
||||
complex_t *t = NULL;
|
||||
int m;
|
||||
int err;
|
||||
|
||||
if(!a || !r)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(a[ord] == 0.0)
|
||||
return ERROR_POLY_AN;
|
||||
|
||||
t = (complex_t*)malloc(ord * ord * sizeof(complex_t));
|
||||
if(!t)
|
||||
return ERROR_MALLOC;
|
||||
|
||||
for(m = 0; m < ord-1; m++)
|
||||
{
|
||||
RE(t[m * (ord+1) + 1]) = 1.0;
|
||||
RE(t[m + ord * (ord - 1)]) = -a[m] / a[ord];
|
||||
}
|
||||
RE(t[ord * ord - 1]) = -a[ord-1] / a[ord];
|
||||
|
||||
err = matrix_eig_cmplx(t, ord, r, info);
|
||||
|
||||
return err;
|
||||
err = matrix_eig_cmplx(t, ord, r, info);
|
||||
|
||||
if(t)
|
||||
free(t);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Real polynomial evaluation
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval(double* a, int ord, double* x, int n, double* y)
|
||||
\brief Расчет вещественного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N-\f$ого порядка для вещественного
|
||||
аргумента, заданного вектором `x`.
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 +
|
||||
a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера:
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор вещественных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n \n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n \n
|
||||
|
||||
\param[out] y
|
||||
Указатель на значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API polyval(double* a, int ord, double* x, int n, double* y)
|
||||
{
|
||||
int k, m;
|
||||
int k, m;
|
||||
|
||||
if(!a || !x || !y)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(!a || !x || !y)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
y[k] = a[ord];
|
||||
for(m = ord-1; m>-1; m--)
|
||||
y[k] = y[k]*x[k] + a[m];
|
||||
}
|
||||
return RES_OK;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
y[k] = a[ord];
|
||||
for(m = ord-1; m>-1; m--)
|
||||
y[k] = y[k]*x[k] + a[m];
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Complex polynomial evaluation
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_COMMON_GROUP
|
||||
\fn int polyval_cmplx(complex_t* a, int ord, complex_t* x, int n, complex_t* y)
|
||||
\brief Расчет комплексного полинома
|
||||
|
||||
Функция рассчитывает полином \f$P_N(x)\f$ \f$N\f$-го порядка
|
||||
комплексного аргумента, заданного вектором `x`. \n
|
||||
|
||||
\f[
|
||||
P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N.
|
||||
\f]
|
||||
|
||||
Для расчета используется формула Горнера: \n
|
||||
\f[
|
||||
P_N(x) = a_0 + x \cdot (a_1 + x \cdot (a_2 + \cdot
|
||||
( \ldots x \cdot (a_{N-1} + x\cdot a_N) \ldots )))
|
||||
\f]
|
||||
|
||||
\param[in] a
|
||||
Указатель на вектор комплексных коэффициентов полинома. \n
|
||||
Размер вектора `[ord+1 x 1]`. \n
|
||||
Коэффициент `a[0]` соответствует коэффициенту полинома \f$a_0\f$. \n \n
|
||||
|
||||
\param[in] ord
|
||||
Порядок полинома \f$N\f$. \n \n
|
||||
|
||||
\param[in] x
|
||||
Указатель на вектор аргумента полинома. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Значения полинома будут расчитаны для всех значений аргумента вектора `x`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора агрумента полинома. \n\n
|
||||
|
||||
\param[out] y
|
||||
Указатель вектор значения полинома для аргумента `x`. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- полином расчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API polyval_cmplx(complex_t* a, int ord,
|
||||
complex_t* x, int n, complex_t* y)
|
||||
{
|
||||
int k, m;
|
||||
complex_t t;
|
||||
int k, m;
|
||||
complex_t t;
|
||||
|
||||
if(!a || !x || !y)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(!a || !x || !y)
|
||||
return ERROR_PTR;
|
||||
if(ord<0)
|
||||
return ERROR_POLY_ORD;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
RE(y[k]) = RE(a[ord]);
|
||||
IM(y[k]) = IM(a[ord]);
|
||||
for(m = ord-1; m>-1; m--)
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
RE(t) = CMRE(y[k], x[k]);
|
||||
IM(t) = CMIM(y[k], x[k]);
|
||||
RE(y[k]) = RE(t) + RE(a[m]);
|
||||
IM(y[k]) = IM(t) + IM(a[m]);
|
||||
RE(y[k]) = RE(a[ord]);
|
||||
IM(y[k]) = IM(a[ord]);
|
||||
for(m = ord-1; m>-1; m--)
|
||||
{
|
||||
RE(t) = CMRE(y[k], x[k]);
|
||||
IM(t) = CMIM(y[k], x[k]);
|
||||
RE(y[k]) = RE(t) + RE(a[m]);
|
||||
IM(y[k]) = IM(t) + IM(a[m]);
|
||||
}
|
||||
}
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -29,143 +29,285 @@
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
random generator initialization
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int random_init(random_t* prnd, int type, void* seed)
|
||||
\brief Инициализация датчиков псевдослучайных чисел.
|
||||
|
||||
\param[in,out] prnd
|
||||
Указатель на структуру параметров и векторов состояния
|
||||
датчиков псевдослучайных чисел, которая будет инициализирована. \n\n
|
||||
|
||||
\param[in] type
|
||||
Тип датчика псевдослучайных чисел:
|
||||
\verbatim
|
||||
RAND_TYPE_MRG32K3A - 32-битный датчик MRG32K3A
|
||||
RAND_TYPE_MT19937 - 64-битный датчик MT19937-64
|
||||
\endverbatim
|
||||
|
||||
\param[in] seed
|
||||
Указатель на начальную инициализацию датчика. \n
|
||||
Данный указатель имеет тип `void*`, поскольку параметр инициализации
|
||||
зависит от типа датчика. Например если инициализируем датчик MRG32K3A,
|
||||
т.е. параметр `type` задан как `RAND_TYPE_MRG32K3A`, то данный указатель
|
||||
приводится к типу `double`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
double seed = 1234.0;
|
||||
random_init(&rnd, RAND_TYPE_MRG32K3A, (void*)&seed);
|
||||
\endcode
|
||||
Если же используется 64-битный датчик Вихрь Мерсенна
|
||||
(`type` задан как `RAND_TYPE_MT19937`), то `seed` приводится к типу
|
||||
`unsigned long long`:
|
||||
\code
|
||||
random_t rnd = {0};
|
||||
unsigned long long seed = 1234353456;
|
||||
random_init(&rnd, RAND_TYPE_MT19937, (void*)&seed);
|
||||
\endcode
|
||||
При фиксированном начальном значении датчика, псевдослучайные числа будут
|
||||
повторяться при каждом запуске программы. \n
|
||||
Указатель `seed` может быть `NULL`. В этом случае начальная инициализация
|
||||
датчиков будет задаваться случайными значениями и генерируемые псевдослучайные
|
||||
числа будут различными при каждом запуске программы.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
**************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API random_init(random_t* prnd, int type, void* seed)
|
||||
{
|
||||
srand(time(NULL));
|
||||
srand(time(NULL));
|
||||
|
||||
if(!prnd)
|
||||
return RES_OK;
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case RAND_TYPE_MRG32K3A:
|
||||
/* MRG32k3a init */
|
||||
prnd->mrg32k3a_x[0] = prnd->mrg32k3a_x[1] = 1.0;
|
||||
prnd->mrg32k3a_y[0] = prnd->mrg32k3a_y[1] =
|
||||
prnd->mrg32k3a_y[2] = 1.0;
|
||||
if(seed)
|
||||
prnd->mrg32k3a_x[2] = *((double*)seed);
|
||||
else
|
||||
prnd->mrg32k3a_x[2] = (double) rand() * rand();
|
||||
break;
|
||||
case RAND_TYPE_MT19937:
|
||||
if(seed)
|
||||
mt19937_init_genrand64(*((unsigned long long*)seed), prnd);
|
||||
else
|
||||
mt19937_init_genrand64((unsigned long long)rand()*rand(), prnd);
|
||||
break;
|
||||
default:
|
||||
return ERROR_RAND_TYPE;
|
||||
}
|
||||
prnd->type = type;
|
||||
|
||||
if(!prnd)
|
||||
return RES_OK;
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case RAND_TYPE_MRG32K3A:
|
||||
/* MRG32k3a init */
|
||||
prnd->mrg32k3a_x[0] = prnd->mrg32k3a_x[1] = 1.0;
|
||||
prnd->mrg32k3a_y[0] = prnd->mrg32k3a_y[1] = prnd->mrg32k3a_y[2] = 1.0;
|
||||
if(seed)
|
||||
prnd->mrg32k3a_x[2] = *((double*)seed);
|
||||
else
|
||||
prnd->mrg32k3a_x[2] = (double) rand() * rand();
|
||||
break;
|
||||
case RAND_TYPE_MT19937:
|
||||
if(seed)
|
||||
mt19937_init_genrand64(*((unsigned long long*)seed), prnd);
|
||||
else
|
||||
mt19937_init_genrand64((unsigned long long)rand()*rand(), prnd);
|
||||
break;
|
||||
default:
|
||||
return ERROR_RAND_TYPE;
|
||||
}
|
||||
prnd->type = type;
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
random generator of binary [0,1] signal
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb(double* x, int n, random_t* prnd)
|
||||
\brief Генерация бинарного униполярного [0, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует униполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение 0 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API randb(double* x, int n, random_t* prnd)
|
||||
{
|
||||
double z[RAND_BUFSIZE];
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
double z[RAND_BUFSIZE];
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
}
|
||||
x[cnt] = z[i] > 0.5 ? 1.0 : 0.0;
|
||||
cnt++;
|
||||
}
|
||||
x[cnt] = z[i] > 0.5 ? 1.0 : 0.0;
|
||||
cnt++;
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
random generator of binary [-1, 1] signal
|
||||
*******************************************************************************/
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randb2(double* x, int n, random_t* prnd)
|
||||
\brief Генерация бинарного биполярного [-1, 1] псевдослучайного вектора
|
||||
|
||||
Функция генерирует биполярный псевдослучайный вектор,
|
||||
каждый элемент которого принимает равновероятное значение -1 или 1.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных бинарных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randb_test.c
|
||||
|
||||
Программа рассчитывает униполярный [0, 1] и биполярный [-1, 1] бинарные
|
||||
псевдослучайные векторы.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randb_test.png
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API randb2(double* x, int n, random_t* prnd)
|
||||
{
|
||||
double z[RAND_BUFSIZE];
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
double z[RAND_BUFSIZE];
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
}
|
||||
x[cnt] = z[i] > 0.5 ? 1.0 : -1.0;
|
||||
cnt++;
|
||||
}
|
||||
x[cnt] = z[i] > 0.5 ? 1.0 : -1.0;
|
||||
cnt++;
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
Uniform random generator mrg32k3a
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int randu_mrg32k3a (double* u, int n, random_t* prnd)
|
||||
{
|
||||
|
||||
if(!u || !prnd)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(!u || !prnd)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
long z;
|
||||
double xn, yn, *x, *y;
|
||||
int k;
|
||||
long z;
|
||||
double xn, yn, *x, *y;
|
||||
int k;
|
||||
|
||||
x = prnd->mrg32k3a_x;
|
||||
y = prnd->mrg32k3a_y;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
/* Component x[n] */
|
||||
xn = MRG32K3A_A12 * x[1] - MRG32K3A_A13 * x[2];
|
||||
x = prnd->mrg32k3a_x;
|
||||
y = prnd->mrg32k3a_y;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
/* Component x[n] */
|
||||
xn = MRG32K3A_A12 * x[1] - MRG32K3A_A13 * x[2];
|
||||
|
||||
z = (long)(xn / MRG32K3A_M1);
|
||||
xn -= (double)z * MRG32K3A_M1;
|
||||
if (xn < 0.0)
|
||||
xn += MRG32K3A_M1;
|
||||
z = (long)(xn / MRG32K3A_M1);
|
||||
xn -= (double)z * MRG32K3A_M1;
|
||||
if (xn < 0.0)
|
||||
xn += MRG32K3A_M1;
|
||||
|
||||
x[2] = x[1];
|
||||
x[1] = x[0];
|
||||
x[0] = xn;
|
||||
x[2] = x[1];
|
||||
x[1] = x[0];
|
||||
x[0] = xn;
|
||||
|
||||
/* Component y[n] */
|
||||
yn = MRG32K3A_A21 * y[0] - MRG32K3A_A23 * y[2];
|
||||
z = (long)(yn / MRG32K3A_M2);
|
||||
yn -= (double)z * MRG32K3A_M2;
|
||||
if (yn < 0.0)
|
||||
yn += MRG32K3A_M2;
|
||||
/* Component y[n] */
|
||||
yn = MRG32K3A_A21 * y[0] - MRG32K3A_A23 * y[2];
|
||||
z = (long)(yn / MRG32K3A_M2);
|
||||
yn -= (double)z * MRG32K3A_M2;
|
||||
if (yn < 0.0)
|
||||
yn += MRG32K3A_M2;
|
||||
|
||||
y[2] = y[1];
|
||||
y[1] = y[0];
|
||||
y[0] = yn;
|
||||
y[2] = y[1];
|
||||
y[1] = y[0];
|
||||
y[0] = yn;
|
||||
|
||||
/* Combination */
|
||||
u[k] = (xn <= yn) ? ((xn - yn + MRG32K3A_M1) * MRG32K3A_NORM):
|
||||
(xn - yn) * MRG32K3A_NORM;
|
||||
}
|
||||
return RES_OK;
|
||||
/* Combination */
|
||||
u[k] = (xn <= yn) ? ((xn - yn + MRG32K3A_M1) * MRG32K3A_NORM):
|
||||
(xn - yn) * MRG32K3A_NORM;
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
@ -175,34 +317,85 @@ int randu_mrg32k3a (double* u, int n, random_t* prnd)
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
random numbers generator of integers
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randi(int* x, int n, int start, int stop, random_t* prnd)
|
||||
\brief Генерация целочисленного вектора равномерно
|
||||
распределенных псевдослучайных чисел.
|
||||
|
||||
Функция генерирует псевдослучайный вектор целых чисел в диапазоне от `start`
|
||||
до `stop` включительно.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора `x`. \n\n
|
||||
|
||||
\param[in] start
|
||||
Начало диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] stop
|
||||
Конец диапазона целых чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор целых псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randi_test.c
|
||||
|
||||
Программа рассчитывает целочисленный вектор
|
||||
псевдослучайных чисел в диапазоне [-4, 3].
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randi_test.png
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API randi(int* x, int n, int start, int stop, random_t* prnd)
|
||||
{
|
||||
double z[RAND_BUFSIZE];
|
||||
double dx;
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
dx = (double)stop - (double)start;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
double z[RAND_BUFSIZE];
|
||||
double dx;
|
||||
int i, cnt, err;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
dx = (double)stop - (double)start;
|
||||
cnt = 0;
|
||||
while(cnt < n)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
i = cnt % RAND_BUFSIZE;
|
||||
if(!i)
|
||||
{
|
||||
err = randu(z, RAND_BUFSIZE, prnd);
|
||||
if(err != RES_OK)
|
||||
return err;
|
||||
}
|
||||
x[cnt] = start + (int)round(z[i] * dx);
|
||||
cnt++;
|
||||
}
|
||||
x[cnt] = start + (int)round(z[i] * dx);
|
||||
cnt++;
|
||||
}
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
@ -211,87 +404,206 @@ int DSPL_API randi(int* x, int n, int start, int stop, random_t* prnd)
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Gaussian random numbers generator
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randn(double* x, int n, double mu, double sigma, random_t* prnd)
|
||||
\brief Генерация вектора нормально распределенных псевдослучайных чисел.
|
||||
|
||||
Функция использует преобразование Бокса-Мюллера для приведения
|
||||
равномерно-распределенных псевдослучайных чисел к нормальному распределению
|
||||
с математическим ожиданием \f$\mu\f$ и среднеквадратическим
|
||||
отклонением \f$\sigma\f$.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] mu
|
||||
Математическое ожидание \f$\mu\f$. \n\n
|
||||
|
||||
|
||||
\param[in] sigma
|
||||
Среднеквадратическое отклонение \f$\sigma\f$. \n
|
||||
Дисперсия сгенерированных чисел равна \f$\sigma^2\f$. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор нормально распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции:
|
||||
|
||||
\include randn_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы нормально распределенных
|
||||
псевдослучайных чисел, \f$\mu = 0\f$ и \f$\sigma=1\f$.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
\image html randn_test.png
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API randn(double* x, int n, double mu, double sigma, random_t* prnd)
|
||||
{
|
||||
int k, m;
|
||||
double x1[RAND_BUFSIZE], x2[RAND_BUFSIZE];
|
||||
int res;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
int k, m;
|
||||
double x1[RAND_BUFSIZE], x2[RAND_BUFSIZE];
|
||||
int res;
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
if(sigma < 0.0)
|
||||
return ERROR_RAND_SIGMA;
|
||||
if(sigma < 0.0)
|
||||
return ERROR_RAND_SIGMA;
|
||||
|
||||
k=0;
|
||||
while(k < n)
|
||||
{
|
||||
if((res = randu(x1, RAND_BUFSIZE, prnd)) != RES_OK)
|
||||
goto exit_label;
|
||||
if((res = randu(x2, RAND_BUFSIZE, prnd)) != RES_OK)
|
||||
goto exit_label;
|
||||
m = 0;
|
||||
while(k < n && m < RAND_BUFSIZE)
|
||||
k=0;
|
||||
while(k < n)
|
||||
{
|
||||
if(x1[m] != 0.0)
|
||||
{
|
||||
x[k] = sqrt(-2.0*log(x1[m]))*cos(M_2PI*x2[m])*sigma + mu;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
if((res = randu(x1, RAND_BUFSIZE, prnd)) != RES_OK)
|
||||
goto exit_label;
|
||||
if((res = randu(x2, RAND_BUFSIZE, prnd)) != RES_OK)
|
||||
goto exit_label;
|
||||
m = 0;
|
||||
while(k < n && m < RAND_BUFSIZE)
|
||||
{
|
||||
if(x1[m] != 0.0)
|
||||
{
|
||||
x[k] = sqrt(-2.0*log(x1[m]))*cos(M_2PI*x2[m])*sigma + mu;
|
||||
k++;
|
||||
m++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
res = RES_OK;
|
||||
res = RES_OK;
|
||||
exit_label:
|
||||
return res;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Uniform random numbers generator
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\fn int randu(double* x, int n, random_t* prnd)
|
||||
\brief Генерация вектора равномерно-распределенных в интервале
|
||||
от 0 до 1 псевдослучайных чисел.
|
||||
|
||||
\param[in,out] x
|
||||
Указатель на вектор случайных чисел. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n\n
|
||||
|
||||
\param[in] n
|
||||
Размер вектора случайных чисел. \n\n
|
||||
|
||||
\param[in] prnd
|
||||
Указатель на структуру `random_t` параметров датчиков
|
||||
псевдослучайных чисел. \n
|
||||
Структура должна быть предварительно заполнена функцией \ref random_init. \n
|
||||
Данный указатель может быть `NULL`, тогда будет использоваться
|
||||
встроенный датчик, определенный стандартом языка Си. Однако для серьезных нужд,
|
||||
например в криптографии, данный режим использовать не рекомендуется.
|
||||
Нет гарантии в качестве произведенной случайной последовательности если
|
||||
параметр `prnd` задан как `NULL`. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` --- вектор равномерно-распределенных
|
||||
псевдослучайных чисел рассчитан успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример использования функции с различными датчиками псевдослучайных чисел
|
||||
приведен в следующем листинге:
|
||||
|
||||
\include randu_test.c
|
||||
|
||||
Программа рассчитывает независимые векторы равномерно-распределенных
|
||||
от 0 до 1 псевдослучайных чисел и выводит их на график для трех различных
|
||||
датчиков: MRG32K3A, MT19937-64 и встроенный датчик, определенный
|
||||
стандартом языка Си.
|
||||
|
||||
В результате выполнения программы можно увидеть график:
|
||||
|
||||
\image html randu_test.png
|
||||
|
||||
Однако при детальном исследовании датчиков, можно обнаружить, что встроенный
|
||||
датчик, определенный стандартом языка Си,
|
||||
выдает значения на фиксированной сетке.
|
||||
|
||||
Чтобы проверить это можно выполнить следующую программу:
|
||||
|
||||
\include randu_accuracy_test.c
|
||||
|
||||
Данная программа аккумулирует только значения датчиков в интервале
|
||||
от 0 до 0.001 и выводит их на график:
|
||||
|
||||
\image html randu_acc_test.png
|
||||
|
||||
Из графика хорошо видно, что данные встроенного датчика выдаются на
|
||||
равноотстоящей сетке значений, в отличии от датчиков MRG32K3A и MT19937-64,
|
||||
которые сохранили псевдослучайный характер.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API randu(double* x, int n, random_t* prnd)
|
||||
{
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n < 0)
|
||||
return ERROR_SIZE;
|
||||
|
||||
if(prnd)
|
||||
{
|
||||
switch(prnd->type)
|
||||
{
|
||||
case RAND_TYPE_MRG32K3A:
|
||||
return randu_mrg32k3a(x, n, prnd);
|
||||
case RAND_TYPE_MT19937:
|
||||
for(i = 0; i < n; i++)
|
||||
x[i] = mt19937_genrand64_real1(prnd);
|
||||
return RES_OK;
|
||||
default:
|
||||
return ERROR_RAND_TYPE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
for(i = 0; i < n; i++)
|
||||
x[i] = (double)rand()/RAND_MAX;
|
||||
}
|
||||
return ERROR_PTR;
|
||||
if(n < 0)
|
||||
return ERROR_SIZE;
|
||||
|
||||
return RES_OK;
|
||||
if(prnd)
|
||||
{
|
||||
switch(prnd->type)
|
||||
{
|
||||
case RAND_TYPE_MRG32K3A:
|
||||
return randu_mrg32k3a(x, n, prnd);
|
||||
case RAND_TYPE_MT19937:
|
||||
for(i = 0; i < n; i++)
|
||||
x[i] = mt19937_genrand64_real1(prnd);
|
||||
return RES_OK;
|
||||
default:
|
||||
return ERROR_RAND_TYPE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
for(i = 0; i < n; i++)
|
||||
x[i] = (double)rand()/RAND_MAX;
|
||||
}
|
||||
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,17 +5,17 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -29,77 +29,129 @@
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Farrow resampler based on the cubic Lagrange polynomials
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*!*****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int farrow_lagrange(double *s, int n, double p, double q,
|
||||
double frd, double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе
|
||||
полиномиальной Лагранжевой интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию входного сигнала `s` в `p/q` раз
|
||||
со смещением дробной задержки `frd`. \n
|
||||
|
||||
Для передискретизации используется
|
||||
<a href = "http://ru.dsplib.org/content/resampling_lagrange/resampling_lagrange.html">
|
||||
полиномиальная Лагранжева интерполяция
|
||||
</a> (структура Фарроу для полиномиальной интерполяции). \n
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n \n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n \n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n\n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n
|
||||
\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n\n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API farrow_lagrange(double *s, int n, double p, double q,
|
||||
double frd, double **y, int *ny)
|
||||
{
|
||||
double a[4];
|
||||
double t, x, dt;
|
||||
int ind, k, res;
|
||||
double g[4];
|
||||
double *z;
|
||||
double a[4];
|
||||
double t, x, dt;
|
||||
int ind, k, res;
|
||||
double g[4];
|
||||
double *z;
|
||||
|
||||
if(!s || !y)
|
||||
return ERROR_PTR;
|
||||
if(!s || !y)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
if(p <= 0.0 || q <= 0.0)
|
||||
return ERROR_RESAMPLE_RATIO;
|
||||
if(p <= 0.0 || q <= 0.0)
|
||||
return ERROR_RESAMPLE_RATIO;
|
||||
|
||||
if(frd <= -1.0 || frd >= 1.0)
|
||||
return ERROR_RESAMPLE_FRAC_DELAY;
|
||||
if(frd <= -1.0 || frd >= 1.0)
|
||||
return ERROR_RESAMPLE_FRAC_DELAY;
|
||||
|
||||
dt = q/p;
|
||||
dt = q/p;
|
||||
|
||||
if((*ny) != (int)((double)(n-1)/dt)+1 || !(*y))
|
||||
{
|
||||
|
||||
*ny = (int)((double)(n-1)/dt)+1;
|
||||
(*y) = (double*)realloc((*y), (*ny)*sizeof(double));
|
||||
}
|
||||
|
||||
t = -frd;
|
||||
k = 0;
|
||||
while(k < (*ny))
|
||||
{
|
||||
ind = (int)floor(t)+1;
|
||||
x = t - (double)ind;
|
||||
ind-=2;
|
||||
if(ind < 0)
|
||||
if((*ny) != (int)((double)(n-1)/dt)+1 || !(*y))
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if(ind > (-3))
|
||||
memcpy(g-ind, s, (4+ind)*sizeof(double));
|
||||
z = g;
|
||||
|
||||
*ny = (int)((double)(n-1)/dt)+1;
|
||||
(*y) = (double*)realloc((*y), (*ny)*sizeof(double));
|
||||
}
|
||||
else
|
||||
|
||||
t = -frd;
|
||||
k = 0;
|
||||
while(k < (*ny))
|
||||
{
|
||||
if(ind < n-3)
|
||||
z = s+ind;
|
||||
else
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if((n-ind)>0)
|
||||
memcpy(g, s+ind, (n-ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
ind = (int)floor(t)+1;
|
||||
x = t - (double)ind;
|
||||
ind-=2;
|
||||
if(ind < 0)
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if(ind > (-3))
|
||||
memcpy(g-ind, s, (4+ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(ind < n-3)
|
||||
z = s+ind;
|
||||
else
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if((n-ind)>0)
|
||||
memcpy(g, s+ind, (n-ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
}
|
||||
a[0] = z[2];
|
||||
a[3] = DSPL_FARROW_LAGRANGE_COEFF*(z[3] -z[0]) + 0.5*(z[1] - z[2]);
|
||||
a[1] = 0.5*(z[3] - z[1])-a[3];
|
||||
a[2] = z[3] - z[2] -a[3]-a[1];
|
||||
|
||||
res = polyval(a, 3, &x, 1, (*y)+k);
|
||||
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
t+=dt;
|
||||
k++;
|
||||
}
|
||||
a[0] = z[2];
|
||||
a[3] = DSPL_FARROW_LAGRANGE_COEFF*(z[3] -z[0]) + 0.5*(z[1] - z[2]);
|
||||
a[1] = 0.5*(z[3] - z[1])-a[3];
|
||||
a[2] = z[3] - z[2] -a[3]-a[1];
|
||||
|
||||
res = polyval(a, 3, &x, 1, (*y)+k);
|
||||
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
t+=dt;
|
||||
k++;
|
||||
}
|
||||
|
||||
exit_label:
|
||||
return res;
|
||||
|
@ -109,77 +161,128 @@ exit_label:
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Farrow resampler based on the cubic splines
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup RESAMPLING_GROUP
|
||||
\fn int int farrow_spline(double *s, int n, double p, double q, double frd,
|
||||
double **y, int *ny)
|
||||
\brief Передискретизация вещественного сигнала на основе сплайн интерполяции.
|
||||
|
||||
Данная функция осуществляет передискретизацию
|
||||
входного сигнала `s` в `p/q` раз со смещением дробной задержки `frd`. \n
|
||||
Для передискретизации используются
|
||||
<a href = "http://ru.dsplib.org/content/resampling_spline/resampling_spline.html">
|
||||
кубические сплайны Эрмита
|
||||
</a>
|
||||
(структура Фарроу для для сплайн-интерполяции). \n
|
||||
|
||||
|
||||
\param [in] s
|
||||
Указатель на вектор входного вещественного сигнала. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора входного сигнала. \n \n
|
||||
|
||||
\param [in] p
|
||||
Числитель коэффициента передискретизации. \n \n
|
||||
|
||||
\param [in] q
|
||||
Знаменатель коэффициента передискретизации. \n \n
|
||||
|
||||
\param [in] frd
|
||||
Значение смещения дробной задержки в пределах одного отсчета. \n
|
||||
Значение должно быть от 0 до 1. \n\n
|
||||
|
||||
\param [out] y
|
||||
Указатель на адрес результата передискретизации. \n
|
||||
По данному адресу будет произведено динамическое выделение памяти
|
||||
для результата передискретизации. \n
|
||||
Будет выделено памяти под `n*q/p` отсчетов выходного сигнала. \n
|
||||
Данный указатель не может быть `NULL`. \n \n
|
||||
|
||||
\param [in] ny
|
||||
Указатель на переменную, в которую будет записан
|
||||
размер вектора `(*y)` после выделения памяти. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` --- передискретизация рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки". \n
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API farrow_spline(double *s, int n, double p, double q,
|
||||
double frd, double **y, int *ny)
|
||||
{
|
||||
double a[4];
|
||||
double t, x, dt;
|
||||
int ind, k, res;
|
||||
double g[4];
|
||||
double *z;
|
||||
double a[4];
|
||||
double t, x, dt;
|
||||
int ind, k, res;
|
||||
double g[4];
|
||||
double *z;
|
||||
|
||||
if(!s || !y)
|
||||
return ERROR_PTR;
|
||||
if(!s || !y)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
if(p <= 0.0 || q <= 0.0)
|
||||
return ERROR_RESAMPLE_RATIO;
|
||||
if(p <= 0.0 || q <= 0.0)
|
||||
return ERROR_RESAMPLE_RATIO;
|
||||
|
||||
if(frd <= -1.0 || frd >= 1.0)
|
||||
return ERROR_RESAMPLE_FRAC_DELAY;
|
||||
if(frd <= -1.0 || frd >= 1.0)
|
||||
return ERROR_RESAMPLE_FRAC_DELAY;
|
||||
|
||||
dt = q/p;
|
||||
dt = q/p;
|
||||
|
||||
if((*ny) != (int)((double)(n-1)/dt)+1 || !(*y))
|
||||
{
|
||||
|
||||
*ny = (int)((double)(n-1)/dt)+1;
|
||||
(*y) = (double*)realloc((*y), (*ny)*sizeof(double));
|
||||
}
|
||||
|
||||
t = -frd;
|
||||
k = 0;
|
||||
while(k < (*ny))
|
||||
{
|
||||
ind = (int)floor(t)+1;
|
||||
x = t - (double)ind;
|
||||
ind-=2;
|
||||
if(ind < 0)
|
||||
if((*ny) != (int)((double)(n-1)/dt)+1 || !(*y))
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if(ind > (-3))
|
||||
memcpy(g-ind, s, (4+ind)*sizeof(double));
|
||||
z = g;
|
||||
|
||||
*ny = (int)((double)(n-1)/dt)+1;
|
||||
(*y) = (double*)realloc((*y), (*ny)*sizeof(double));
|
||||
}
|
||||
else
|
||||
|
||||
t = -frd;
|
||||
k = 0;
|
||||
while(k < (*ny))
|
||||
{
|
||||
if(ind < n-3)
|
||||
z = s+ind;
|
||||
else
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if((n-ind)>0)
|
||||
memcpy(g, s+ind, (n-ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
ind = (int)floor(t)+1;
|
||||
x = t - (double)ind;
|
||||
ind-=2;
|
||||
if(ind < 0)
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if(ind > (-3))
|
||||
memcpy(g-ind, s, (4+ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(ind < n-3)
|
||||
z = s+ind;
|
||||
else
|
||||
{
|
||||
memset(g, 0, 4*sizeof(double));
|
||||
if((n-ind)>0)
|
||||
memcpy(g, s+ind, (n-ind)*sizeof(double));
|
||||
z = g;
|
||||
}
|
||||
}
|
||||
a[0] = z[2];
|
||||
a[1] = 0.5*(z[3] - z[1]);
|
||||
a[3] = 2.0*(z[1] - z[2]) + a[1] + 0.5*(z[2] - z[0]);
|
||||
a[2] = z[1] - z[2] +a[3] + a[1];
|
||||
|
||||
res = polyval(a, 3, &x, 1, (*y)+k);
|
||||
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
t+=dt;
|
||||
k++;
|
||||
}
|
||||
a[0] = z[2];
|
||||
a[1] = 0.5*(z[3] - z[1]);
|
||||
a[3] = 2.0*(z[1] - z[2]) + a[1] + 0.5*(z[2] - z[0]);
|
||||
a[2] = z[1] - z[2] +a[3] + a[1];
|
||||
|
||||
res = polyval(a, 3, &x, 1, (*y)+k);
|
||||
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
t+=dt;
|
||||
k++;
|
||||
}
|
||||
|
||||
exit_label:
|
||||
return res;
|
||||
|
|
|
@ -5,82 +5,84 @@
|
|||
* This file is part of libdspl-2.0.
|
||||
*
|
||||
* is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include "dspl.h"
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Rectangle pulse signal
|
||||
*******************************************************************************/
|
||||
int DSPL_API signal_pimp(double* t, size_t n, double amp,
|
||||
double tau, double dt, double period, double* y)
|
||||
#endif
|
||||
int DSPL_API signal_pimp(double* t, size_t n, double amp,
|
||||
double tau, double dt, double period, double* y)
|
||||
{
|
||||
size_t k;
|
||||
double ll, lr, p2, tp;
|
||||
size_t k;
|
||||
double ll, lr, p2, tp;
|
||||
|
||||
if(!t || !y)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(tau < 0.0 || period < 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
if(!t || !y)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(tau < 0.0 || period < 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
|
||||
|
||||
ll = -0.5 * tau;
|
||||
lr = 0.5 * tau;
|
||||
p2 = period*0.5;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
tp = dmod(t[k] - dt + p2, period) - p2;
|
||||
y[k] = (tp < ll || tp > lr) ? 0.0 : amp;
|
||||
}
|
||||
return RES_OK;
|
||||
ll = -0.5 * tau;
|
||||
lr = 0.5 * tau;
|
||||
p2 = period*0.5;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
tp = dmod(t[k] - dt + p2, period) - p2;
|
||||
y[k] = (tp < ll || tp > lr) ? 0.0 : amp;
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Saw periodic signal
|
||||
*******************************************************************************/
|
||||
int DSPL_API signal_saw(double* t, size_t n, double amp,
|
||||
double dt, double period, double* y)
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API signal_saw(double* t, size_t n, double amp,
|
||||
double dt, double period, double* y)
|
||||
{
|
||||
size_t k;
|
||||
double p2, tp;
|
||||
size_t k;
|
||||
double p2, tp;
|
||||
|
||||
if(!t || !y)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period < 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
if(!t || !y)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
if(period < 0.0)
|
||||
return ERROR_NEGATIVE;
|
||||
|
||||
p2 = period*0.5;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
tp = dmod(t[k] - dt + p2, period) - p2;
|
||||
y[k] = amp * tp;
|
||||
}
|
||||
return RES_OK;
|
||||
p2 = period*0.5;
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
tp = dmod(t[k] - dt + p2, period) - p2;
|
||||
y[k] = amp * tp;
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,11 +11,11 @@
|
|||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -27,7 +27,9 @@
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_STAT_GROUP
|
||||
\fn int find_max_abs(double* a, int n, double* m, int* ind)
|
||||
\brief Find maximum absolute value from the real vector `a`
|
||||
|
@ -35,164 +37,224 @@
|
|||
Function searches maximum absolute value in the real vector `a`.
|
||||
This value writes to the address `m` and index keeps to te address `ind`.
|
||||
|
||||
\param[in] a Pointer to the real vector `a`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
\param[in] a
|
||||
Pointer to the real vector `a`. \n
|
||||
Vector size is `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n Size of the input vector `a`. \n \n
|
||||
\param[in] n
|
||||
Size of the input vector `a`. \n \n
|
||||
|
||||
|
||||
\param[out] m Pointer to the variable which keeps vector `a`
|
||||
maximum absolute value. \n
|
||||
Pointer can be `NULL`, maximum value will not return
|
||||
in this case. \n \n
|
||||
\param[out] m
|
||||
Pointer to the variable which keeps vector `a`
|
||||
maximum absolute value. \n
|
||||
Pointer can be `NULL`, maximum value will not return
|
||||
in this case. \n \n
|
||||
|
||||
\param[out] ind
|
||||
Pointer to the variable which keeps index of a
|
||||
maximum absolute value inside vector `a`. \n
|
||||
Pointer can be `NULL`, index will not return
|
||||
in this case. \n \n
|
||||
|
||||
\param[out] ind Pointer to the variable which keeps index of a
|
||||
maximum absolute value inside vector `a`. \n
|
||||
Pointer can be `NULL`, index will not return
|
||||
in this case. \n \n
|
||||
\return
|
||||
`RES_OK` if function calculates successfully,
|
||||
else \ref ERROR_CODE_GROUP "code error".
|
||||
|
||||
Example:
|
||||
\code{.cpp}
|
||||
double a[5] = {0.0, 2.0, -5.0, 4.0, 2.0};
|
||||
double m;
|
||||
int ind;
|
||||
find_max_abs(a, 5, &m, &ind);
|
||||
printf("\n\nmax absolute value: %8.1f (index %d)", m, ind);
|
||||
double a[5] = {0.0, 2.0, -5.0, 4.0, 2.0};
|
||||
double m;
|
||||
int ind;
|
||||
find_max_abs(a, 5, &m, &ind);
|
||||
printf("\n\nmax absolute value: %8.1f (index %d)", m, ind);
|
||||
\endcode
|
||||
As result the variable `m` will keep value `5`,
|
||||
and variable `ind` will keep `2`.
|
||||
|
||||
\author Sergey Bakhurin www.dsplib.org
|
||||
*******************************************************************************/
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_STAT_GROUP
|
||||
\fn int find_max_abs(double* a, int n, double* m, int* ind)
|
||||
\brief Поиск максимального по модулю элемента вещественного вектора `a`
|
||||
|
||||
Функция производит поиск максимального по модулю значения вектора `a`. \n
|
||||
Максимальное по модулю значение `max|a[k]|` сохраняется по адресу `m`, а индекс
|
||||
данного значения в векторе `a` сохраняется по адресу `ind`. \n
|
||||
|
||||
\param[in] a
|
||||
Указатель на вещественный вектор `a`. \n
|
||||
Размер вектора `[n x 1]`. \n \n
|
||||
|
||||
\param[in] n
|
||||
Размер входного вектора `a`. \n \n
|
||||
|
||||
\param[out] m
|
||||
Указатель на адрес памяти, в который сохранить
|
||||
максимальное по модулю значение вектора `a`. \n
|
||||
Указатель может быть `NULL`, в этом случае максимальное по модулю значение
|
||||
не сохраняется. \n \n
|
||||
|
||||
\param[out] ind Указатель на переменную, в которую будет сохранен
|
||||
индекс максимального по модулю значению вектора `a`. \n
|
||||
Указатель может быть `NULL`, в этом случае индекс не возвращается. \n \n
|
||||
|
||||
\return
|
||||
`RES_OK` если функция выполнена успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
Пример:
|
||||
\code{.cpp}
|
||||
double a[5] = {0.0, 2.0, -5.0, 4.0, 2.0};
|
||||
double m;
|
||||
int ind;
|
||||
find_max_abs(a, 5, &m, &ind);
|
||||
printf("\n\nmax absolute value: %8.1f (index %d)", m, ind);
|
||||
\endcode
|
||||
В результате в переменную `m` будет записано значение `5`,
|
||||
а в переменную `ind` значение `2`.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API find_max_abs(double* a, int n, double* m, int* ind)
|
||||
{
|
||||
int k, i;
|
||||
double t;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
t = fabs(a[0]);
|
||||
i = 0;
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
if(fabs(a[k]) > t)
|
||||
int k, i;
|
||||
double t;
|
||||
if(!a)
|
||||
return ERROR_PTR;
|
||||
if(n < 1)
|
||||
return ERROR_SIZE;
|
||||
t = fabs(a[0]);
|
||||
i = 0;
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
t = fabs(a[k]);
|
||||
i = k;
|
||||
if(fabs(a[k]) > t)
|
||||
{
|
||||
t = fabs(a[k]);
|
||||
i = k;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(m)
|
||||
*m = t;
|
||||
if(ind)
|
||||
*ind = i;
|
||||
return RES_OK;
|
||||
if(m)
|
||||
*m = t;
|
||||
if(ind)
|
||||
*ind = i;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Histogram calculation
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API histogram(double* x, int n, int nh, double* pedges, double* ph)
|
||||
{
|
||||
double xmin, xmax;
|
||||
int k, ind;
|
||||
int res;
|
||||
|
||||
if(!x || !pedges || !ph)
|
||||
return ERROR_PTR;
|
||||
double xmin, xmax;
|
||||
int k, ind;
|
||||
int res;
|
||||
|
||||
if(!x || !pedges || !ph)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1 || nh<1)
|
||||
return ERROR_SIZE;
|
||||
if(n<1 || nh<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
res = minmax(x, n, &xmin, &xmax);
|
||||
if(res != RES_OK)
|
||||
return res;
|
||||
|
||||
res = linspace(xmin, xmax, nh+1, DSPL_SYMMETRIC, pedges);
|
||||
if(res != RES_OK)
|
||||
return res;
|
||||
|
||||
memset(ph, 0, nh*sizeof(double));
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
ind = 0;
|
||||
while(ind<nh && x[k]>=pedges[ind])
|
||||
ind++;
|
||||
ph[ind-1]+=1.0;
|
||||
}
|
||||
return RES_OK;
|
||||
res = minmax(x, n, &xmin, &xmax);
|
||||
if(res != RES_OK)
|
||||
return res;
|
||||
|
||||
res = linspace(xmin, xmax, nh+1, DSPL_SYMMETRIC, pedges);
|
||||
if(res != RES_OK)
|
||||
return res;
|
||||
|
||||
memset(ph, 0, nh*sizeof(double));
|
||||
for(k = 0; k < n; k++)
|
||||
{
|
||||
ind = 0;
|
||||
while(ind<nh && x[k]>=pedges[ind])
|
||||
ind++;
|
||||
ph[ind-1]+=1.0;
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Histogram normalization
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API histogram_norm(double* y, int n, int nh, double* x, double* w)
|
||||
{
|
||||
double *pedges = NULL;
|
||||
int k, res;
|
||||
|
||||
if(!y || !x || !w)
|
||||
return ERROR_PTR;
|
||||
double *pedges = NULL;
|
||||
int k, res;
|
||||
|
||||
if(!y || !x || !w)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1 || nh<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
pedges = (double*)malloc((nh+1)*sizeof(double));
|
||||
|
||||
res = histogram(y, n, nh, pedges, w);
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
if(n<1 || nh<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
pedges = (double*)malloc((nh+1)*sizeof(double));
|
||||
|
||||
res = histogram(y, n, nh, pedges, w);
|
||||
if(res != RES_OK)
|
||||
goto exit_label;
|
||||
|
||||
for(k = 1; k < nh+1; k++)
|
||||
{
|
||||
x[k-1] = 0.5*(pedges[k] + pedges[k-1]);
|
||||
w[k-1] /= ((double)n * (pedges[k] - pedges[k-1]));
|
||||
}
|
||||
|
||||
res = RES_OK;
|
||||
exit_label:
|
||||
for(k = 1; k < nh+1; k++)
|
||||
{
|
||||
x[k-1] = 0.5*(pedges[k] + pedges[k-1]);
|
||||
w[k-1] /= ((double)n * (pedges[k] - pedges[k-1]));
|
||||
}
|
||||
|
||||
res = RES_OK;
|
||||
exit_label:
|
||||
|
||||
if(pedges)
|
||||
free(pedges);
|
||||
return res;
|
||||
if(pedges)
|
||||
free(pedges);
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
minimum and maximum values
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API minmax(double* x, int n, double* xmin, double* xmax)
|
||||
{
|
||||
int k;
|
||||
double min, max;
|
||||
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
int k;
|
||||
double min, max;
|
||||
|
||||
if(!x)
|
||||
return ERROR_PTR;
|
||||
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
if(n<1)
|
||||
return ERROR_SIZE;
|
||||
|
||||
min = max = x[0];
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
min = x[k] < min ? x[k] : min;
|
||||
max = x[k] > max ? x[k] : max;
|
||||
}
|
||||
|
||||
if(xmin)
|
||||
*xmin = min;
|
||||
if(xmax)
|
||||
*xmax = max;
|
||||
|
||||
return RES_OK;
|
||||
min = max = x[0];
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
min = x[k] < min ? x[k] : min;
|
||||
max = x[k] > max ? x[k] : max;
|
||||
}
|
||||
|
||||
if(xmin)
|
||||
*xmin = min;
|
||||
if(xmax)
|
||||
*xmax = max;
|
||||
|
||||
return RES_OK;
|
||||
}
|
|
@ -11,11 +11,11 @@
|
|||
*
|
||||
* DSPL is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
* along with Foobar. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
|
@ -24,48 +24,52 @@
|
|||
#include "dspl.h"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
Numerical integration of real data using the trapezoidal method.
|
||||
*******************************************************************************/
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API trapint(double* x, double* y, int n, double* sum)
|
||||
{
|
||||
int k;
|
||||
int k;
|
||||
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
if(n<2)
|
||||
return ERROR_SIZE;
|
||||
*sum = 0.0;
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
if(n<2)
|
||||
return ERROR_SIZE;
|
||||
*sum = 0.0;
|
||||
|
||||
for(k = 1; k < n; k++)
|
||||
*sum += 0.5 * (x[k] - x[k-1]) * (y[k] + y[k-1]);
|
||||
for(k = 1; k < n; k++)
|
||||
*sum += 0.5 * (x[k] - x[k-1]) * (y[k] + y[k-1]);
|
||||
|
||||
return RES_OK;
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
/*******************************************************************************
|
||||
Numerical integration of complex data using the trapezoidal method.
|
||||
*******************************************************************************/
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
int DSPL_API trapint_cmplx(double* x, complex_t* y, int n, complex_t* sum)
|
||||
{
|
||||
int k;
|
||||
double dx;
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
if(n<2)
|
||||
return ERROR_SIZE;
|
||||
RE(*sum) = IM(*sum) = 0.0;
|
||||
|
||||
int k;
|
||||
double dx;
|
||||
if(!x || !y)
|
||||
return ERROR_PTR;
|
||||
if(n<2)
|
||||
return ERROR_SIZE;
|
||||
RE(*sum) = IM(*sum) = 0.0;
|
||||
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
dx = 0.5 * (x[k] - x[k-1]);
|
||||
RE(*sum) += dx * (RE(y[k]) + RE(y[k-1]));
|
||||
IM(*sum) += dx * (IM(y[k]) + IM(y[k-1]));
|
||||
}
|
||||
return RES_OK;
|
||||
for(k = 1; k < n; k++)
|
||||
{
|
||||
dx = 0.5 * (x[k] - x[k-1]);
|
||||
RE(*sum) += dx * (RE(y[k]) + RE(y[k-1]));
|
||||
IM(*sum) += dx * (IM(y[k]) + IM(y[k-1]));
|
||||
}
|
||||
return RES_OK;
|
||||
}
|
||||
|
||||
|
|
101
dspl/src/win.c
101
dspl/src/win.c
|
@ -27,10 +27,103 @@
|
|||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
Window function
|
||||
*******************************************************************************/
|
||||
int window(double* w, int n, int win_type, double param)
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup WIN_GROUP
|
||||
\fn int window(double* w, int n, int win_type, double param)
|
||||
\brief Расчет функции оконного взвешивания
|
||||
|
||||
Функция рассчитывает периодическую или симметричную оконную функцию
|
||||
в соответствии с параметром `win_type`. \n
|
||||
|
||||
Периодическая оконная функция используется для спектрального анализа,
|
||||
а симметричная оконная функция может быть использована для синтеза
|
||||
КИХ-фильтров.
|
||||
|
||||
\param [in,out] w
|
||||
Указатель на вектор оконной функции. \n
|
||||
Размер вектора `[n x 1]`. \n
|
||||
Память должна быть выделена. \n
|
||||
Рассчитанная оконная функция будет помещена по данному адресу. \n \n
|
||||
|
||||
\param [in] n
|
||||
Размер вектора `w` оконной функции. \n \n
|
||||
|
||||
\param [in] win_type
|
||||
Комбинация флагов для задания типа оконной функции. \n
|
||||
Для задания типа окна используется комбинация битовых масок
|
||||
`DSPL_WIN_MASK | DSPL_WIN_SYM_MASK`. \n
|
||||
Маска `DSPL_WIN_MASK` задает тип оконной функции.
|
||||
Может принимать следующие значения: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT | Непараметрическое окно Бартлетта
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BARTLETT_HANN | Непараметрическое окно Бартлетта-Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN | Непараметрическое окно Блэкмана
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_HARRIS | Непараметрическое окно Блэкмана-Харриса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_BLACKMAN_NUTTALL | Непараметрическое окно Блэкмана-Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_CHEBY | Параметрическое окно Дольф-Чебышева.
|
||||
| Данное окно всегда является симметричным и
|
||||
| игнорирует параметр DSPL_WIN_SYM_MASK .
|
||||
| Параметр param задает уровень боковых
|
||||
| лепестков в дБ.
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_COS | Непараметрическое косинус-окно
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_FLAT_TOP | Непараметрическое окно с максимально
|
||||
| плоской вершиной
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_GAUSSIAN | Параметрическое окно Гаусса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HAMMING | Непараметрическое окно Хемминга
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_HANN | Непараметрическое окно Ханна
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_KAISER | Параметрическое окно Кайзера
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_LANCZOS | Непараметрическое окно Ланкзоса
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_NUTTALL | Непараметрическое окно Натталла
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_RECT | Непараметрическое прямоугольное окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n
|
||||
Маска `DSPL_WIN_SYM_MASK` задает симметричное
|
||||
или периодическое окно: \n
|
||||
\verbatim
|
||||
-------------------------------------------------------------------------
|
||||
Значение DSPL_WIN_SYM_MASK | Описание
|
||||
-----------------------------|-------------------------------------------
|
||||
DSPL_WIN_SYMMETRIC | Симметричное окно (по умолчанию)
|
||||
DSPL_WIN_PERIODIC | Периодическое окно
|
||||
-------------------------------------------------------------------------
|
||||
\endverbatim
|
||||
\n \n
|
||||
|
||||
\param [in] param
|
||||
Параметр окна. \n
|
||||
Данный параметр применяется только для параметрических оконных функций. \n
|
||||
Для непараметрических окон игнорируется. \n\n
|
||||
|
||||
\return
|
||||
`RES_OK` если оконная функция рассчитана успешно. \n
|
||||
В противном случае \ref ERROR_CODE_GROUP "код ошибки".
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
int DSPL_API window(double* w, int n, int win_type, double param)
|
||||
{
|
||||
switch(win_type & DSPL_WIN_MASK)
|
||||
{
|
||||
|
|
|
@ -8,10 +8,10 @@
|
|||
int main(int argc, char* argv[])
|
||||
{
|
||||
void* hdspl; /* DSPL handle */
|
||||
double a[N+1] = {2.0, 2.0, 1.0}; /* P(x) = 0.5 - 2x + x^2 */
|
||||
double a[N+1] = {2.0, 2.0, 1.0}; /* P(x) = 2 + 2x + x^2 */
|
||||
complex_t r[N] = {0}; /* roots */
|
||||
int err, n, info;
|
||||
hdspl = dspl_load(); /* Load DSPL functions */
|
||||
hdspl = dspl_load(); /* Load DSPL functions */
|
||||
if(!hdspl)
|
||||
{
|
||||
printf("libdspl loading error!\n");
|
||||
|
|
|
@ -2,29 +2,29 @@
|
|||
<CodeBlocks_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveTarget name="Release" />
|
||||
<File name="..\..\dspl\src\complex.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="3526" topLine="110" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\conv.c" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="57" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\inout.c" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="5443" topLine="222" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\filter_iir.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="8765" topLine="185" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\include\dspl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="8590" topLine="219" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\filter_iir.c" open="1" top="1" tabpos="4" split="0" active="1" splitpos="0" zoom_1="1" zoom_2="0">
|
||||
<File name="..\..\dspl\src\complex.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="8765" topLine="185" />
|
||||
<Cursor1 position="3526" topLine="110" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\conv.c" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1712" topLine="57" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\randgen.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
|
@ -32,4 +32,9 @@
|
|||
<Cursor1 position="4809" topLine="172" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\dspl\src\array.c" open="1" top="1" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
</CodeBlocks_layout_file>
|
||||
|
|
|
@ -2,5 +2,4 @@
|
|||
<CodeBlocks_workspace_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveProject path="examples.cbp" />
|
||||
<PreferredTarget name="Debug" />
|
||||
</CodeBlocks_workspace_layout_file>
|
||||
|
|
|
@ -2,14 +2,27 @@
|
|||
<CodeBlocks_layout_file>
|
||||
<FileVersion major="1" minor="0" />
|
||||
<ActiveTarget name="Release" />
|
||||
<File name="..\..\include\dspl.h" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="0" topLine="165" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\examples\src\dspl_info_test.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="3" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="348" topLine="0" />
|
||||
</Cursor>
|
||||
</File>
|
||||
<File name="..\..\include\dspl.h" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
|
||||
<Cursor>
|
||||
<Cursor1 position="1043" topLine="0" />
|
||||
</Cursor>
|
||||
<Folding>
|
||||
<Collapse line="0" />
|
||||
<Collapse line="41" />
|
||||
<Collapse line="65" />
|
||||
<Collapse line="94" />
|
||||
<Collapse line="163" />
|
||||
<Collapse line="261" />
|
||||
<Collapse line="288" />
|
||||
<Collapse line="319" />
|
||||
<Collapse line="347" />
|
||||
<Collapse line="380" />
|
||||
<Collapse line="405" />
|
||||
</Folding>
|
||||
</File>
|
||||
</CodeBlocks_layout_file>
|
||||
|
|
547
include/dspl.c
547
include/dspl.c
|
@ -183,10 +183,6 @@ p_writetxt_cmplx_re writetxt_cmplx_re ;
|
|||
p_writetxt_int writetxt_int ;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef WIN_OS
|
||||
#define LOAD_FUNC(fn) \
|
||||
fname = #fn;\
|
||||
|
@ -205,206 +201,305 @@ p_writetxt_int writetxt_int ;
|
|||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void* dspl_load()
|
||||
\brief Perform dynamic linking and load libdspl-2.0 functions.
|
||||
|
||||
This function attempts to link to the library `libdspl.dll` in
|
||||
Windows system and the `libdspl.so` library on the Linux system.
|
||||
The library is assumed to be in the same directory as the application.
|
||||
user, or the path to the library is registered in the operating path variables
|
||||
system.
|
||||
|
||||
Upon successful binding and loading of library functions, the handle is returned
|
||||
libraries, as well as in the address space of the application appear
|
||||
pointers to libdspl-2.0 functions.
|
||||
|
||||
\note
|
||||
The returned handle is of type `void *`, which can be cast on Windows
|
||||
to type `HINSTANCE`. In practice, this is not necessary, because this
|
||||
the type is cast to `HINSTANCE` automatically if the compiler flag is set,
|
||||
indicating that the application is being built on Windows.
|
||||
|
||||
An example of a simple program that implements dynamic binding with DSPL-2.0.
|
||||
|
||||
\code
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "dspl.h"
|
||||
|
||||
int main (int argc, char* argv[])
|
||||
{
|
||||
void * hdspl; // DSPL handle
|
||||
hdspl = dspl_load (); // Dynamic linking
|
||||
|
||||
// Check the pointer. If `NULL`, then the link failed
|
||||
if (! hdspl)
|
||||
{
|
||||
printf ("libdspl loading error! \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// The link was successful, you can call the functions of DSPL-2.0
|
||||
|
||||
//Before correctly terminating the application, you must unlink
|
||||
//library and clear memory.
|
||||
dspl_free(hdspl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
\endcode
|
||||
|
||||
\author Bakhurin Sergey. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void* dspl_load()
|
||||
\brief Произвести динамическую линковку и загрузить функции libdspl-2.0.
|
||||
|
||||
Данная функция производит попытку связывания с библиотекой `libdspl.dll` в
|
||||
системе Windows и с библиотекой `libdspl.so` в системе Linux.
|
||||
Предполагается, что библиотека находится в одной директории с приложением
|
||||
пользователя, или путь к библиотеке прописан в переменных пути операционной
|
||||
системы.
|
||||
|
||||
При удачном связывании и загрузке функций библиотеки возвращается хэндл
|
||||
библиотеки, а также в адресном пространстве приложения появляются
|
||||
указатели на функции libdspl-2.0.
|
||||
|
||||
\note
|
||||
Возвращаемый хэндл имеет тип `void*`, который в ОС Windows может быть приведен
|
||||
к типу `HINSTANCE`. На практике необходимости в этом, нет, потому что данный
|
||||
тип приводится к `HINSTANCE` автоматически, если выставлен флаг компилятора,
|
||||
указывающий, что сборка приложения производится в ОС Windows.
|
||||
|
||||
Пример простейшей программы реализующей динамическое связывание с DSPL-2.0.
|
||||
|
||||
\code
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "dspl.h"
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
void* hdspl; // DSPL хэндл
|
||||
hdspl = dspl_load(); // Динамическая линковка
|
||||
|
||||
// Проверяем указатель. Если `NULLL`, то линковка прошла неудачно
|
||||
if(!hdspl)
|
||||
{
|
||||
printf("libdspl loading error!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Линковка прошла успешно можно вызывать функции DSPL-2.0
|
||||
|
||||
// Перед корректным завершением приложения необходимо разлинковать
|
||||
// библиотеку и очистить память.
|
||||
dspl_free(hdspl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
\endcode
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
void* dspl_load()
|
||||
{
|
||||
|
||||
|
||||
char* fname;
|
||||
#ifdef WIN_OS
|
||||
HINSTANCE handle;
|
||||
handle = LoadLibrary(TEXT("libdspl.dll"));
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.dll loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif /* WIN_OS */
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
char* error;
|
||||
void *handle;
|
||||
/* open the *.so */
|
||||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.so loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif /* LINUX_OS */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LOAD_FUNC(acos_cmplx);
|
||||
LOAD_FUNC(array_scale_lin);
|
||||
LOAD_FUNC(asin_cmplx);
|
||||
|
||||
LOAD_FUNC(bessel_i0);
|
||||
LOAD_FUNC(bilinear);
|
||||
LOAD_FUNC(butter_ap);
|
||||
LOAD_FUNC(butter_ap_zp);
|
||||
|
||||
LOAD_FUNC(cheby_poly1);
|
||||
LOAD_FUNC(cheby_poly2);
|
||||
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);
|
||||
LOAD_FUNC(conv);
|
||||
LOAD_FUNC(conv_cmplx);
|
||||
LOAD_FUNC(conv_fft);
|
||||
LOAD_FUNC(conv_fft_cmplx);
|
||||
LOAD_FUNC(cos_cmplx);
|
||||
|
||||
LOAD_FUNC(decimate);
|
||||
LOAD_FUNC(decimate_cmplx);
|
||||
LOAD_FUNC(dft);
|
||||
LOAD_FUNC(dft_cmplx);
|
||||
LOAD_FUNC(dmod);
|
||||
LOAD_FUNC(dspl_info);
|
||||
|
||||
LOAD_FUNC(ellip_acd);
|
||||
LOAD_FUNC(ellip_acd_cmplx);
|
||||
LOAD_FUNC(ellip_ap);
|
||||
LOAD_FUNC(ellip_ap_zp);
|
||||
LOAD_FUNC(ellip_asn);
|
||||
LOAD_FUNC(ellip_asn_cmplx);
|
||||
LOAD_FUNC(ellip_cd);
|
||||
LOAD_FUNC(ellip_cd_cmplx);
|
||||
LOAD_FUNC(ellip_landen);
|
||||
LOAD_FUNC(ellip_modulareq);
|
||||
LOAD_FUNC(ellip_rat);
|
||||
LOAD_FUNC(ellip_sn);
|
||||
LOAD_FUNC(ellip_sn_cmplx);
|
||||
|
||||
LOAD_FUNC(farrow_lagrange);
|
||||
LOAD_FUNC(farrow_spline);
|
||||
LOAD_FUNC(fft);
|
||||
LOAD_FUNC(fft_cmplx);
|
||||
LOAD_FUNC(fft_create);
|
||||
LOAD_FUNC(fft_free);
|
||||
LOAD_FUNC(fft_mag);
|
||||
LOAD_FUNC(fft_mag_cmplx);
|
||||
LOAD_FUNC(fft_shift);
|
||||
LOAD_FUNC(fft_shift_cmplx);
|
||||
LOAD_FUNC(filter_freq_resp);
|
||||
LOAD_FUNC(filter_iir);
|
||||
LOAD_FUNC(filter_ws1);
|
||||
LOAD_FUNC(filter_zp2ab);
|
||||
LOAD_FUNC(find_max_abs);
|
||||
LOAD_FUNC(fir_linphase);
|
||||
LOAD_FUNC(flipip);
|
||||
LOAD_FUNC(flipip_cmplx);
|
||||
LOAD_FUNC(fourier_integral_cmplx);
|
||||
LOAD_FUNC(fourier_series_dec);
|
||||
LOAD_FUNC(fourier_series_dec_cmplx);
|
||||
LOAD_FUNC(fourier_series_rec);
|
||||
LOAD_FUNC(freqz);
|
||||
LOAD_FUNC(freqs);
|
||||
LOAD_FUNC(freqs_cmplx);
|
||||
LOAD_FUNC(freqs2time);
|
||||
|
||||
LOAD_FUNC(gnuplot_close);
|
||||
LOAD_FUNC(gnuplot_cmd);
|
||||
LOAD_FUNC(gnuplot_create);
|
||||
LOAD_FUNC(goertzel);
|
||||
LOAD_FUNC(goertzel_cmplx);
|
||||
|
||||
LOAD_FUNC(histogram);
|
||||
LOAD_FUNC(histogram_norm);
|
||||
|
||||
LOAD_FUNC(idft_cmplx);
|
||||
LOAD_FUNC(ifft_cmplx);
|
||||
LOAD_FUNC(iir);
|
||||
|
||||
LOAD_FUNC(linspace);
|
||||
LOAD_FUNC(log_cmplx);
|
||||
LOAD_FUNC(logspace);
|
||||
LOAD_FUNC(low2bp);
|
||||
LOAD_FUNC(low2bs);
|
||||
LOAD_FUNC(low2high);
|
||||
LOAD_FUNC(low2low);
|
||||
|
||||
LOAD_FUNC(matrix_eig_cmplx);
|
||||
LOAD_FUNC(matrix_eye);
|
||||
LOAD_FUNC(matrix_eye_cmplx);
|
||||
LOAD_FUNC(matrix_mul);
|
||||
LOAD_FUNC(matrix_print);
|
||||
LOAD_FUNC(matrix_print_cmplx);
|
||||
LOAD_FUNC(matrix_transpose);
|
||||
LOAD_FUNC(matrix_transpose_cmplx);
|
||||
LOAD_FUNC(matrix_transpose_hermite);
|
||||
LOAD_FUNC(minmax);
|
||||
|
||||
LOAD_FUNC(ones);
|
||||
|
||||
LOAD_FUNC(poly_z2a_cmplx);
|
||||
LOAD_FUNC(polyroots);
|
||||
LOAD_FUNC(polyval);
|
||||
LOAD_FUNC(polyval_cmplx);
|
||||
|
||||
LOAD_FUNC(randi);
|
||||
LOAD_FUNC(randb);
|
||||
LOAD_FUNC(randb2);
|
||||
LOAD_FUNC(randn);
|
||||
LOAD_FUNC(random_init);
|
||||
LOAD_FUNC(randu);
|
||||
LOAD_FUNC(ratcompos);
|
||||
LOAD_FUNC(re2cmplx);
|
||||
LOAD_FUNC(readbin);
|
||||
|
||||
LOAD_FUNC(signal_pimp);
|
||||
LOAD_FUNC(signal_saw);
|
||||
LOAD_FUNC(sin_cmplx);
|
||||
LOAD_FUNC(sinc);
|
||||
LOAD_FUNC(sine_int);
|
||||
LOAD_FUNC(sqrt_cmplx);
|
||||
|
||||
LOAD_FUNC(trapint);
|
||||
LOAD_FUNC(trapint_cmplx);
|
||||
|
||||
LOAD_FUNC(unwrap);
|
||||
|
||||
LOAD_FUNC(vector_dot);
|
||||
LOAD_FUNC(verif);
|
||||
LOAD_FUNC(verif_cmplx);
|
||||
|
||||
LOAD_FUNC(window);
|
||||
LOAD_FUNC(writebin);
|
||||
LOAD_FUNC(writetxt);
|
||||
LOAD_FUNC(writetxt_3d);
|
||||
LOAD_FUNC(writetxt_3dline);
|
||||
LOAD_FUNC(writetxt_cmplx);
|
||||
LOAD_FUNC(writetxt_cmplx_im);
|
||||
LOAD_FUNC(writetxt_cmplx_re);
|
||||
LOAD_FUNC(writetxt_int);
|
||||
|
||||
#ifdef WIN_OS
|
||||
return (void*)handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
FreeLibrary(handle);
|
||||
return NULL;
|
||||
#endif /* WIN_OS */
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
return handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
#endif /* LINUX_OS */
|
||||
|
||||
|
||||
char* fname;
|
||||
#ifdef WIN_OS
|
||||
HINSTANCE handle;
|
||||
handle = LoadLibrary(TEXT("libdspl.dll"));
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.dll loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif /* WIN_OS */
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
char* error;
|
||||
void *handle;
|
||||
/* open the *.so */
|
||||
handle = dlopen ("./libdspl.so", RTLD_LAZY);
|
||||
if (!handle)
|
||||
{
|
||||
printf("libdspl.so loading ERROR!\n");
|
||||
return NULL;
|
||||
}
|
||||
#endif /* LINUX_OS */
|
||||
|
||||
LOAD_FUNC(acos_cmplx);
|
||||
LOAD_FUNC(array_scale_lin);
|
||||
LOAD_FUNC(asin_cmplx);
|
||||
|
||||
LOAD_FUNC(bessel_i0);
|
||||
LOAD_FUNC(bilinear);
|
||||
LOAD_FUNC(butter_ap);
|
||||
LOAD_FUNC(butter_ap_zp);
|
||||
|
||||
LOAD_FUNC(cheby_poly1);
|
||||
LOAD_FUNC(cheby_poly2);
|
||||
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);
|
||||
LOAD_FUNC(conv);
|
||||
LOAD_FUNC(conv_cmplx);
|
||||
LOAD_FUNC(conv_fft);
|
||||
LOAD_FUNC(conv_fft_cmplx);
|
||||
LOAD_FUNC(cos_cmplx);
|
||||
|
||||
LOAD_FUNC(decimate);
|
||||
LOAD_FUNC(decimate_cmplx);
|
||||
LOAD_FUNC(dft);
|
||||
LOAD_FUNC(dft_cmplx);
|
||||
LOAD_FUNC(dmod);
|
||||
LOAD_FUNC(dspl_info);
|
||||
|
||||
LOAD_FUNC(ellip_acd);
|
||||
LOAD_FUNC(ellip_acd_cmplx);
|
||||
LOAD_FUNC(ellip_ap);
|
||||
LOAD_FUNC(ellip_ap_zp);
|
||||
LOAD_FUNC(ellip_asn);
|
||||
LOAD_FUNC(ellip_asn_cmplx);
|
||||
LOAD_FUNC(ellip_cd);
|
||||
LOAD_FUNC(ellip_cd_cmplx);
|
||||
LOAD_FUNC(ellip_landen);
|
||||
LOAD_FUNC(ellip_modulareq);
|
||||
LOAD_FUNC(ellip_rat);
|
||||
LOAD_FUNC(ellip_sn);
|
||||
LOAD_FUNC(ellip_sn_cmplx);
|
||||
|
||||
LOAD_FUNC(farrow_lagrange);
|
||||
LOAD_FUNC(farrow_spline);
|
||||
LOAD_FUNC(fft);
|
||||
LOAD_FUNC(fft_cmplx);
|
||||
LOAD_FUNC(fft_create);
|
||||
LOAD_FUNC(fft_free);
|
||||
LOAD_FUNC(fft_mag);
|
||||
LOAD_FUNC(fft_mag_cmplx);
|
||||
LOAD_FUNC(fft_shift);
|
||||
LOAD_FUNC(fft_shift_cmplx);
|
||||
LOAD_FUNC(filter_freq_resp);
|
||||
LOAD_FUNC(filter_iir);
|
||||
LOAD_FUNC(filter_ws1);
|
||||
LOAD_FUNC(filter_zp2ab);
|
||||
LOAD_FUNC(find_max_abs);
|
||||
LOAD_FUNC(fir_linphase);
|
||||
LOAD_FUNC(flipip);
|
||||
LOAD_FUNC(flipip_cmplx);
|
||||
LOAD_FUNC(fourier_integral_cmplx);
|
||||
LOAD_FUNC(fourier_series_dec);
|
||||
LOAD_FUNC(fourier_series_dec_cmplx);
|
||||
LOAD_FUNC(fourier_series_rec);
|
||||
LOAD_FUNC(freqz);
|
||||
LOAD_FUNC(freqs);
|
||||
LOAD_FUNC(freqs_cmplx);
|
||||
LOAD_FUNC(freqs2time);
|
||||
|
||||
LOAD_FUNC(gnuplot_close);
|
||||
LOAD_FUNC(gnuplot_cmd);
|
||||
LOAD_FUNC(gnuplot_create);
|
||||
LOAD_FUNC(goertzel);
|
||||
LOAD_FUNC(goertzel_cmplx);
|
||||
|
||||
LOAD_FUNC(histogram);
|
||||
LOAD_FUNC(histogram_norm);
|
||||
|
||||
LOAD_FUNC(idft_cmplx);
|
||||
LOAD_FUNC(ifft_cmplx);
|
||||
LOAD_FUNC(iir);
|
||||
|
||||
LOAD_FUNC(linspace);
|
||||
LOAD_FUNC(log_cmplx);
|
||||
LOAD_FUNC(logspace);
|
||||
LOAD_FUNC(low2bp);
|
||||
LOAD_FUNC(low2bs);
|
||||
LOAD_FUNC(low2high);
|
||||
LOAD_FUNC(low2low);
|
||||
|
||||
LOAD_FUNC(matrix_eig_cmplx);
|
||||
LOAD_FUNC(matrix_eye);
|
||||
LOAD_FUNC(matrix_eye_cmplx);
|
||||
LOAD_FUNC(matrix_mul);
|
||||
LOAD_FUNC(matrix_print);
|
||||
LOAD_FUNC(matrix_print_cmplx);
|
||||
LOAD_FUNC(matrix_transpose);
|
||||
LOAD_FUNC(matrix_transpose_cmplx);
|
||||
LOAD_FUNC(matrix_transpose_hermite);
|
||||
LOAD_FUNC(minmax);
|
||||
|
||||
LOAD_FUNC(ones);
|
||||
|
||||
LOAD_FUNC(poly_z2a_cmplx);
|
||||
LOAD_FUNC(polyroots);
|
||||
LOAD_FUNC(polyval);
|
||||
LOAD_FUNC(polyval_cmplx);
|
||||
|
||||
LOAD_FUNC(randi);
|
||||
LOAD_FUNC(randb);
|
||||
LOAD_FUNC(randb2);
|
||||
LOAD_FUNC(randn);
|
||||
LOAD_FUNC(random_init);
|
||||
LOAD_FUNC(randu);
|
||||
LOAD_FUNC(ratcompos);
|
||||
LOAD_FUNC(re2cmplx);
|
||||
LOAD_FUNC(readbin);
|
||||
|
||||
LOAD_FUNC(signal_pimp);
|
||||
LOAD_FUNC(signal_saw);
|
||||
LOAD_FUNC(sin_cmplx);
|
||||
LOAD_FUNC(sinc);
|
||||
LOAD_FUNC(sine_int);
|
||||
LOAD_FUNC(sqrt_cmplx);
|
||||
|
||||
LOAD_FUNC(trapint);
|
||||
LOAD_FUNC(trapint_cmplx);
|
||||
|
||||
LOAD_FUNC(unwrap);
|
||||
|
||||
LOAD_FUNC(vector_dot);
|
||||
LOAD_FUNC(verif);
|
||||
LOAD_FUNC(verif_cmplx);
|
||||
|
||||
LOAD_FUNC(window);
|
||||
LOAD_FUNC(writebin);
|
||||
LOAD_FUNC(writetxt);
|
||||
LOAD_FUNC(writetxt_3d);
|
||||
LOAD_FUNC(writetxt_3dline);
|
||||
LOAD_FUNC(writetxt_cmplx);
|
||||
LOAD_FUNC(writetxt_cmplx_im);
|
||||
LOAD_FUNC(writetxt_cmplx_re);
|
||||
LOAD_FUNC(writetxt_int);
|
||||
|
||||
#ifdef WIN_OS
|
||||
return (void*)handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
FreeLibrary(handle);
|
||||
return NULL;
|
||||
#endif /* WIN_OS */
|
||||
|
||||
|
||||
#ifdef LINUX_OS
|
||||
return handle;
|
||||
exit_label:
|
||||
printf("function %s loading ERROR!\n", fname);
|
||||
if(handle)
|
||||
dlclose(handle);
|
||||
return NULL;
|
||||
#endif /* LINUX_OS */
|
||||
}
|
||||
|
||||
|
||||
|
@ -412,17 +507,51 @@ void* dspl_load()
|
|||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void dspl_free(void* handle)
|
||||
\brief Cleans up the previously linked DSPL-2.0 dynamic library.
|
||||
|
||||
This cross-platform function clears the library `libdspl.dll` in
|
||||
Windows system and from the library `libdspl.so` on the Linux system.
|
||||
After cleaning the library, all functions will become unavailable.
|
||||
|
||||
\param [in] handle
|
||||
Handle of the previously linked DSPL-2.0 library. \n
|
||||
This pointer can be `NULL`, in this case no action
|
||||
are being produced.
|
||||
|
||||
\author Bakhurin Sergey. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
/*! ****************************************************************************
|
||||
\ingroup SYS_LOADING_GROUP
|
||||
\fn void dspl_free(void* handle)
|
||||
\brief Очищает связанную ранее динамическую библиотеку DSPL-2.0.
|
||||
|
||||
Данная кроссплатформенная функция производит очистку библиотеки `libdspl.dll` в
|
||||
системе Windows и с библиотеки `libdspl.so` в системе Linux.
|
||||
После очистки библиотеки все функции станут недоступны.
|
||||
|
||||
\param[in] handle
|
||||
Хэндл прилинкованной ранее библиотеки DSPL-2.0. \n
|
||||
Данный указатель может быть `NULL`, в этом случае никакие действия не
|
||||
производятся.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
**************************************************************************** */
|
||||
#endif
|
||||
void dspl_free(void* handle)
|
||||
{
|
||||
#ifdef WIN_OS
|
||||
FreeLibrary((HINSTANCE)handle);
|
||||
#endif /* WIN_OS */
|
||||
|
||||
#ifdef LINUX_OS
|
||||
dlclose(handle);
|
||||
#endif /* LINUX_OS */
|
||||
|
||||
#ifdef WIN_OS
|
||||
FreeLibrary((HINSTANCE)handle);
|
||||
#endif /* WIN_OS */
|
||||
|
||||
#ifdef LINUX_OS
|
||||
dlclose(handle);
|
||||
#endif /* LINUX_OS */
|
||||
}
|
||||
|
||||
#endif /* BUILD_LIB */
|
||||
|
|
|
@ -22,11 +22,8 @@
|
|||
#ifndef DSPL_H
|
||||
#define DSPL_H
|
||||
|
||||
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
/* math const definition */
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.1415926535897932384626433832795
|
||||
|
@ -37,7 +34,6 @@
|
|||
#endif
|
||||
|
||||
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup TYPES_GROUP
|
||||
|
@ -241,6 +237,54 @@ typedef struct
|
|||
#define RAND_TYPE_MT19937 0x00000002
|
||||
#define RAND_MT19937_NN 312
|
||||
|
||||
#ifdef DOXYGEN_ENGLISH
|
||||
/*! ****************************************************************************
|
||||
\ingroup SPEC_MATH_RAND_GEN_GROUP
|
||||
\struct random_t
|
||||
\brief Структура параметров датчиков псевдослучайных чисел.
|
||||
|
||||
Структура хранит инициализацию и текущие регистры различных датчиков
|
||||
псевдослучайных чисел. В библиотеке используются следующие датчики:
|
||||
\li MRG32K3A -- 32 битный датчик разработан Пьером Лекуэром [1].
|
||||
\li MT19937-64 -- 64-битный датчик
|
||||
<a href = "https://en.wikipedia.org/wiki/Mersenne_Twister">
|
||||
Вихрь Мерсенна
|
||||
</a> [2, 3].
|
||||
|
||||
\note
|
||||
[1] Pierre L'Ecuyer, (1999) Good Parameters and Implementations for Combined
|
||||
Multiple Recursive Random Number Generators. Operations Research
|
||||
47(1):159-164. https://doi.org/10.1287/opre.47.1.159 \n\n
|
||||
[2] T. Nishimura, ``Tables of 64-bit Mersenne Twisters // ACM Transactions
|
||||
on Modeling and Computer Simulation 10. (2000) 348--357. \n\n
|
||||
[3] M. Matsumoto and T. Nishimura Mersenne Twister: a 623-dimensionally
|
||||
equidistributed uniform pseudorandom number generator // ACM Transactions
|
||||
on Modeling and Computer Simulation 8. (Jan. 1998) 3--30. \n\n
|
||||
|
||||
\param mrg32k3a_seed
|
||||
Начальная инициализация датчика MRG32K3A. \n \n
|
||||
|
||||
\param mrg32k3a_x
|
||||
Первый вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mrg32k3a_y
|
||||
Второй вектор состояния рекурсивного датчика MRG32K3A. \n \n
|
||||
|
||||
\param mt19937_mt
|
||||
Первый вектор состояния рекурсивного датчика MT19937-64. \n \n
|
||||
|
||||
\param mt19937_mti
|
||||
Текущий индекс в векторе состояния датчика MT19937-64. \n \n
|
||||
|
||||
Параметры данной структуры заполняются автоматически функцией `random_init`
|
||||
и используются функциями генерации псевдослучайных векторов.
|
||||
|
||||
\author Бахурин Сергей. www.dsplib.org
|
||||
***************************************************************************** */
|
||||
#endif
|
||||
#ifdef DOXYGEN_RUSSIAN
|
||||
|
||||
#endif
|
||||
typedef struct
|
||||
{
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue