libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
Базовые математические функции и работа с массивами данных

Функции

int concat (void *a, size_t na, void *b, size_t nb, void *c)
 Конкатенация двух массивов данных Подробнее...
 
int decimate (double *x, int n, int d, double *y, int *cnt)
 Децимация вещественного вектора данных Подробнее...
 
int decimate_cmplx (complex_t *x, int n, int d, complex_t *y, int *cnt)
 Децимация комплексного вектора данных Подробнее...
 
int flipip (double *x, int n)
 Функция отражения вещественного вектора x Подробнее...
 
int flipip_cmplx (complex_t *x, int n)
 Функция отражения комплексного вектора x Подробнее...
 
int verif (double *x, double *y, size_t n, double eps, double *err)
 Верификация вещественных массивов Подробнее...
 
int verif_cmplx (complex_t *x, complex_t *y, size_t n, double eps, double *err)
 Верификация комплексных массивов Подробнее...
 
int log_cmplx (complex_t *x, int n, complex_t *y)
 Натуральный логарифм комплексного аргумента x Подробнее...
 
int sqrt_cmplx (complex_t *x, int n, complex_t *y)
 Квадратный корень из комплексного вектора x (поэлементный). Подробнее...
 
int linspace (double x0, double x1, int n, int type, double *x)
 Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1 Подробнее...
 
int logspace (double x0, double x1, int n, int type, double *x)
 Функция заполняет массив значениями логарифмической шкале Подробнее...
 
int sinc (double *x, int n, double a, double *y)
 Функция $ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$. Подробнее...
 
int polyval (double *a, int ord, double *x, int n, double *y)
 Расчет вещественного полинома Подробнее...
 
int polyval_cmplx (complex_t *a, int ord, complex_t *x, int n, complex_t *y)
 Расчет комплексного полинома Подробнее...
 

Подробное описание

Функции

◆ concat()

int concat ( void *  a,
size_t  na,
void *  b,
size_t  nb,
void *  c 
)

Конкатенация двух массивов данных


Функция производит конкатенацию двух массивов. Пусть массивы a и b заданы как векторы:
a = [a(0), a(1), ... a(na-1)],
b = [b(0), b(1), ... b(nb-1)],
тогда результатом конкатенации будет вектор размера na+nb вида:
c = [a(0), a(1), ... a(na-1), b(0), b(1), ... b(nb-1)].

Аргументы
[in]aУказатель на первый вектор a.
Размер вектора na байт.

[in]naРазмер первого вектора a в байт.

[in]bУказатель на второй вектор b.
Размер памяти вектора nb байт.

[in]nbРазмер второго вектора b в байт.

[out]cУказатель на вектор конкатенации c.
Размер памяти вектора na + nb байт.
Память должна быть выделена.

Возвращает
RES_OK если функция выполнена успешно.
В противном случае код ошибки.

Функция использует указатели типа void* и может быть использована для конкатенации данных различного типа.
Например конкатенация массивов типа double:

double a[3] = {1.0, 2.0, 3.0};
double b[2] = {4.0, 5.0};
double c[5];
concat((void*)a, 3*sizeof(double), (void*)b, 2*sizeof(double), (void*)c);

в результате вектор c будет хранить массив данных:

c = [1.0, 2.0, 3.0, 4.0, 5.0]
Автор
Бахурин Сергей, www.dsplib.org

См. определение в файле array.c строка 74

◆ decimate()

int decimate ( double *  x,
int  n,
int  d,
double *  y,
int *  cnt 
)

Децимация вещественного вектора данных


Функция производит децимацию вещественного вектора x в d раз.
В результате выходной вектор y содержит значения: y(k) = x(k*d), k = 0...n/d-1

Аргументы
[in]xУказатель на вектор входных данных x.
Размер вектора [n x 1].

[in]nРазмер входного вектора x.

[in]dКоэффициент децимации.
В результате децимации из вектора x будет взять каждый d-й элемент.

[out]yУказатель на децимированный вектор y.
Размер выходного вектора равен [n/d x 1] будет сохранен по адресу cnt.
Память должна быть выделена.

[out]cntУказатель переменную, в которую будет сохранен размер выходного вектора после децимации.
Указатель может быть NULL, в этом случае размер вектора y не возвращается.

Возвращает
RES_OK если функция выполнена успешно.
В противном случае код ошибки.

Пример децимации вещественного массива данных в 2 раза:

double x[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0};
double y[5];
int d = 2;
int cnt;
decimate(x, 10, d, y, &cnt);

в результате в переменную cnt будет записан размер 5, а вектор y будет хранить массив данных:

c = [0.0, 2.0, 4.0, 6.0, 8.0]
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 139

◆ decimate_cmplx()

int decimate_cmplx ( complex_t x,
int  n,
int  d,
complex_t y,
int *  cnt 
)

Децимация комплексного вектора данных


Функция производит децимацию комплексного вектора x в d раз.
В результате выходной вектор y содержит значения: y(k) = x(k*d), k = 0...n/d-1

Аргументы
[in]xУказатель на вектор входных данных x.
Размер вектора [n x 1].

[in]nРазмер входного вектора x.

[in]dКоэффициент децимации.
В результате децимации из вектора x будет взять каждый d-й элемент.

[out]yУказатель на децимированный вектор y.
Размер выходного вектора равен [n/d x 1] будет сохранен по адресу cnt.
Память должна быть выделена.

[out]cntУказатель переменную, в которую будет сохранен размер выходного вектора после децимации.
Указатель может быть NULL, в этом случае размер вектора y не возвращается.

Возвращает
RES_OK если функция выполнена успешно.
В противном случае код ошибки.

Пример децимации комплексного массива данных в 2 раза:

compex_t x[10] = {{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0},
{5.0, 5.0}, {6.0, 6.0}, {7.0, 7.0}, {8.0, 8.0}, {9.0, 9.0}};
compex_t y[5];
int d = 2;
int cnt;
decimate_cmplx(x, 10, d, y, &cnt);

в результате в переменную cnt будет записан размер 5, а вектор y будет хранить массив данных:

c = [0.0+0.0j, 2.0+2.0j, 4.0+4.0j, 6.0+6.0j, 8.0+8.0j]
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 214

◆ flipip()

int flipip ( double *  x,
int  n 
)

Функция отражения вещественного вектора x


Функция производит отражение вещественного вектора длины n в памяти данных.
Например исходный вектор x длины 6:

x = [0, 1, 2, 3, 4, 5]

После отражения вектор x будет иметь вид:

x = [5, 4, 3, 2, 1, 0]
Аргументы
[in,out]xУказатель на вещественный вектор x.
Размер вектора [n x 1].
Результат отражения будет помещен по этому же адресу.
[in]nРазмер вектора x.

Возвращает
RES_OK если функция выполнена успешно.
В противном случае код ошибки.

Пример:

double x[5] = {0.0, 1.0, 2.0, 3.0, 4.0};
int i;
for(i = 0; i < 5; i++)
printf("%6.1f ", x[i]);
flipip(x, 5);
printf("\n");
for(i = 0; i < 5; i++)
printf("%6.1f ", x[i]);


Результат выполнения:

   0.0     1.0     2.0     3.0     4.0
   4.0     3.0     2.0     1.0     0.0
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 353

◆ flipip_cmplx()

int flipip_cmplx ( complex_t x,
int  n 
)

Функция отражения комплексного вектора x


Функция производит отражение комплексного вектора длины n в памяти данных.
Например исходный вектор x длины 6:

x = [0+0j, 1+1j, 2+2j, 3+3j, 4+4j, 5+5j]

После отражения вектор x будет иметь вид:

x = [5+5j, 4+4j, 3+3j, 2+2j, 1+1j, 0+0j]
Аргументы
[in,out]xУказатель на комплексный вектор x.
Размер вектора [n x 1].
Результат отражения будет помещен по этому же адресу.
[in]nРазмер вектора x.

Возвращает
RES_OK если функция выполнена успешно.
В противном случае код ошибки.

Пример:

complex_t y[5] = {{0.0, 0.0}, {1.0, 1.0}, {2.0, 2.0}, {3.0, 3.0}, {4.0, 4.0}};
for(i = 0; i < 5; i++)
printf("%6.1f%+.1fj ", RE(y[i]), IM(y[i]));
printf("\n");
for(i = 0; i < 5; i++)
printf("%6.1f%+.1fj ", RE(y[i]), IM(y[i]));


Результат выполнения:

   0.0+0.0j     1.0+1.0j     2.0+2.0j     3.0+3.0j     4.0+4.0j
   4.0+4.0j     3.0+3.0j     2.0+2.0j     1.0+1.0j     0.0+0.0j
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 418

◆ linspace()

int linspace ( double  x0,
double  x1,
int  n,
int  type,
double *  x 
)

Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1


Заполняет массив x длиной n значениями в диапазоне от $x_0$ до $x_1$. Функция поддерживает два типа заполнения в соответствии с параметром type:

Симметричное заполнение согласно выражению (параметр type=DSPL_SYMMETRIC):

$x(k) = x_0 + k \cdot dx$, $dx = \frac{x_1 - x_0}{n-1}$, $k = 0 \ldots n-1.$

Периодическое заполнение (параметр type=DSPL_PERIODIC) согласно выражению:

$x(k) = x_0 + k \cdot dx$, $dx = \frac{x_1 - x_0}{n}$, $k = 0 \ldots n-1.$

Аргументы
[in]x0Начальное показателя $x_0$.

[in]x1Конечное значение $x_1$.

[in]nКоличество точек массива x.

[in]typeТип заполнения:
DSPL_SYMMETRIC - симметричное заполнение,
DSPL_PERIODIC - периодическое заполнение.

[in,out]xУказатель на вектор равноотстоящих значений .
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK - функция выполнена успешно.
В противном случае код ошибки.
Заметки
Отличие периодического и симметричного заполнения можно понять из следующих примеров.
Пример 1. Периодическое заполнение.
double x[5];
linspace(0, 5, 5, DSPL_PERIODIC, x);
В массиве x будут лежать значения:
0, 1, 2, 3, 4


Пример 2. Симметричное заполнение.
double x[5];
linspace(0, 5, 5, DSPL_SYMMETRIC, x);
В массиве x будут лежать значения:
0, 1.25, 2.5, 3.75, 5
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле fillarray.c строка 31

◆ log_cmplx()

int log_cmplx ( complex_t x,
int  n,
complex_t y 
)

Натуральный логарифм комплексного аргумента x


Функция рассчитывает значения натурального логарифма комплексного аргумента, заданного вектором x длины n:

\[ \textrm{Ln}(x) = j \varphi + \ln(|x|), \]

где $\varphi$ - фаза комплексного числа.

Аргументы
[in]xУказатель на комплексный вектор аргумента логарифма.
Размер вектора [n x 1].

[in]nРазмер входного и выходного векторов x и y.

[out]yУказатель на вектор значений комплексного логарифма, соответствующего входному вектору x.
Размер массива [n x 1].
Память должна быть выделена.

Возвращает
RES_OK если значение функции рассчитано успешно.
В противном случае код ошибки:

Например при выполнении следующего кода

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]));


Результатом работы будет

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
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле complex.c строка 374

Используется в asin_cmplx().

◆ logspace()

int logspace ( double  x0,
double  x1,
int  n,
int  type,
double *  x 
)

Функция заполняет массив значениями логарифмической шкале


Заполняет массив x длиной n значениями в диапазоне от $10^{x_0}$ до $10^{x_1}$.
Функция поддерживает два типа заполнения в соответствии с параметром type:

Симметричное заполнение согласно выражению:

$x(k) = 10^{x_0} \cdot dx^k$, где $dx = \sqrt[n-1]{10^{x_1 - x_0}}$, $k = 0 \ldots n-1.$

Периодическое заполнение согласно выражению:

$x(k) = 10^{x_0} \cdot dx^k$, где $dx = \sqrt[n]{10^{x_1 - x_0}}$, $k = 0 \ldots n-1.$

Аргументы
[in]x0Начальное значение показателя $x_0$.

[in]x1Конечное значение показателя $x_1$.

[in]nКоличество точек массива x.

[in]typeТип заполнения:
DSPL_SYMMETRIC - симметричное заполнение,
DSPL_PERIODIC - периодическое заполнение.

[in,out]xУказатель на вектор значений в логарифмической шкале.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK - функция выполнена успешно.
В противном случае код ошибки.
Заметки
Отличие периодического и симметричного заполнения можно понять из следующих примеров.
Пример 1. Периодическое заполнение.
double x[5];
logspace(-2, 3, 5, DSPL_PERIODIC, x);
В массиве x будут лежать значения:
0.01, 0.1, 1, 10, 100


Пример 2. Симметричное заполнение.
double x[5];
logspace(-2, 3, 5, DSPL_SYMMETRIC, x);
В массиве x будут лежать значения:
0.01 0.178 3.162 56.234 1000
Автор
Бахурин Сергей. www.dsplib.org

См. определение в файле fillarray.c строка 68

◆ polyval()

int polyval ( double *  a,
int  ord,
double *  x,
int  n,
double *  y 
)

Расчет вещественного полинома


Функция рассчитывает полином $P_N(x)$ $N-$ого порядка для вещественного аргумента, заданного вектором x.

\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]

Для расчета используется формула Горнера:

\[ 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 ))) \]

Аргументы
[in]aУказатель на вектор вещественных коэффициентов полинома.
Размер вектора [ord+1 x 1].
Коэффициент a[0] соответствует коэффициенту полинома $a_0$.

[in]ordПорядок полинома $N$.

[in]xУказатель на вектор аргумента полинома.
Размер вектора [n x 1].
Значения полинома будут расчитаны для всех значений аргумента вектора x.

[in]nРазмер вектора агрумента полинома.

[out]yУказатель на значения полинома для аргумента x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Полином расчитан успешно.

В противном случае код ошибки.

Автор
Бахурин Сергей. www.dsplib.org
 

См. определение в файле polyval.c строка 69

Используется в bessel_i0(), farrow_lagrange() и farrow_spline().

◆ polyval_cmplx()

int polyval_cmplx ( complex_t a,
int  ord,
complex_t x,
int  n,
complex_t y 
)

Расчет комплексного полинома


Функция рассчитывает полином $P_N(x)$ $N-$ого порядка комплексного аргумента аргумента, заданного вектором x.

\[ P_N(x) = a_0 + a_1 \cdot x + a_2 \cdot x^2 + a_3 \cdot x^3 + ... a_N \cdot x^N. \]

Для расчета используется формула Горнера:

\[ 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 ))) \]

Аргументы
[in]aУказатель на вектор комплексных коэффициентов полинома.
Размер вектора [ord+1 x 1].
Коэффициент a[0] соответствует коэффициенту полинома $a_0$.

[in]ordПорядок полинома $N$.

[in]xУказатель на вектор аргумента полинома.
Размер вектора [n x 1].
Значения полинома будут расчитаны для всех значений аргумента вектора x.

[in]nРазмер вектора агрумента полинома.

[out]yУказатель вектор значения полинома для аргумента x.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Полином расчитан успешно.

В противном случае код ошибки.

Автор
Бахурин Сергей. www.dsplib.org
 

См. определение в файле polyval.c строка 96

Используется в freqs() и freqz().

◆ sinc()

int sinc ( double *  x,
int  n,
double  a,
double *  y 
)

Функция $ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$.


Функция рассчитывает значения функции для вещественного вектора x.

Аргументы
[in]xУказатель на вектор переменной $ x $.
Размер вектора [n x 1].
Память должна быть выделена.

[in]nРазмер входного вектора x.

[in]aПараметр функции $ \textrm{sinc}(x,a) = \frac{\sin(ax)}{ax}$
[out]yУказатель на вектор значений функции.
Размер вектора [n x 1].
Память должна быть выделена.

Возвращает
RES_OK Расчет произведен успешно.
В противном случае код ошибки.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле math.c строка 127

◆ sqrt_cmplx()

int sqrt_cmplx ( complex_t x,
int  n,
complex_t y 
)

Квадратный корень из комплексного вектора x (поэлементный).


Функция рассчитывает значения квадратного корня комплексного аргумента, заданного вектором x длины n:

\[ y(k) = \sqrt{x(k)}, \qquad k = 0 \ldots n-1. \]

Аргументы
[in]xУказатель на вектор аргумента квадратного корня.
Размер вектора [n x 1].

[in]nРазмер входного и выходного векторов x и y.

[out]yУказатель на вектор значений комплексного корня, соответствующего входному вектору x.
Размер массива [n x 1].
Память должна быть выделена.

Возвращает
RES_OK если значение функции рассчитано успешно .
В противном случае код ошибки:

Например при выполнении следующего кода

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]));


Результатом работы будет

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
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле complex.c строка 588

Используется в asin_cmplx(), ellip_acd_cmplx() и ellip_asn_cmplx().

◆ verif()

int verif ( double *  x,
double *  y,
size_t  n,
double  eps,
double *  err 
)

Верификация вещественных массивов


Функция производит расчет максимальной относительной ошибки между вещественными векторами x и y равной длины n:

\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \]

или

\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \]

и возвращает DSPL_VERIF_SUCCESS если разница $ e$ меньше eps. В противном случае возвращает DSPL_VERIF_FAILED.
Данная функция используется для верификации работы алгоритмов если вектор x результат работы алгоритма пользователя, а y – результат работы этого же алгоритма сторонней функцией.

Аргументы
[in]xУказатель на первый вектор x.
Размер вектора [n x 1].

[in]yУказатель на второй вектор y.
Размер вектора [n x 1].

[in]nРазмер векторов x и y.

[in]epsДопустимая относительная ошибка.
Если максимальная относительная ошибка меньше eps, то функция возвращает DSPL_VERIF_SUCCESS, в противном случае DSPL_VERIF_FAILED.

[in,out]errУказатель на переменную максимальной относительной ошибки.
По данному адресу будет записано значение максимальной относительной ошибки.
Указатель может быть NULL, значение ошибки в этом случае не возвращается.

Возвращает
DSPL_VERIF_SUCCESS если относительная ошибка меньше eps.
В противном случае DSPL_VERIF_FAILED.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 487

◆ verif_cmplx()

int verif_cmplx ( complex_t x,
complex_t y,
size_t  n,
double  eps,
double *  err 
)

Верификация комплексных массивов


Функция производит расчет максимальной относительной ошибки между комплексными векторами x и y равной длины n:

\[ e = \max \left( \frac{|x(k) - y(k)| }{ |x(k)|} \right), \quad \quad |x(k)| > 0, \]

или

\[ e = \max(|x(k) - y(k)| ), ~\qquad \quad~|x(k)| = 0, \]

и возвращает DSPL_VERIF_SUCCESS если разница $ e$ меньше eps. В противном случае возвращает DSPL_VERIF_FAILED.
Данная функция используется для верификации работы алгоритмов если вектор x результат работы алгоритма пользователя, а y – результат работы этого же алгоритма сторонней функцией.

Аргументы
[in]xУказатель на первый вектор x.
Размер вектора [n x 1].

[in]yУказатель на второй вектор y.
Размер вектора [n x 1].

[in]nРазмер векторов x и y.

[in]epsДопустимая относительная ошибка.
Если максимальная относительная ошибка меньше eps, то функция возвращает DSPL_VERIF_SUCCESS, в противном случае DSPL_VERIF_FAILED.

[in,out]errУказатель на переменную максимальной относительной ошибки.
По данному адресу будет записано значение максимальной относительной ошибки.
Указатель может быть NULL, значение ошибки в этом случае не возвращается.

Возвращает
DSPL_VERIF_SUCCESS если функция выполнена успешно.
В противном случае DSPL_VERIF_FAILED.
Автор
Бахурин Сергей www.dsplib.org

См. определение в файле array.c строка 569