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

Функции

int array_scale_lin (double *x, int n, double xmin, double xmax, double dx, double h, double *y)
 Линейное растяжение вектора данных x Функция производит преобразование значений \(x(i)\), \(i = 0,1,\ldots n\) в значения \(y(i)\), в соответствии с формулой: Подробнее...
 
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 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 ones (double *x, int n)
 Функция заполнения вещественного массива единицами Подробнее...
 
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)
 Верификация комплексных массивов Подробнее...
 

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

Функции

◆ array_scale_lin()

int array_scale_lin ( double *  x,
int  n,
double  xmin,
double  xmax,
double  dx,
double  h,
double *  y 
)

Линейное растяжение вектора данных x Функция производит преобразование значений \(x(i)\), \(i = 0,1,\ldots n\) в значения \(y(i)\), в соответствии с формулой:


\[ y(i) = k_x x(i) + d_x, \qquad k_x = \frac{h}{x_{\textrm{max}} - x_{\textrm{min}}}. \]

Таким образом, все значения входного вектора x в диапазоне от \(x_{\textrm{min}}\) до \(x_{\textrm{max}}\), линейно растягиваются в значения вектора y в диапазоне от \(d_x\) до \(h + d_x\). Заметим, что \(d_x\) задает линейное смещение значений вектора y.

Данная функция удобна для перевода величин разных размерностей, в частности, для переноса значений вектора x на график высоты h, где высота может быть задана в количестве пикселей, в сантиметрах и т.д.

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

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

[in]xminНижняя граница диапазона трансформации.

[in]xmaxВерхняя граница диапазона трансформации.
Значение xmax должно быть строго больше значения xmin.

[in]dxСмещение после трансформации.
Данный параметр должен иметь размерность выходного вектора y.

[in]hДиапазон значений вектора y после трансформации от dx до h+dx.

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

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

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

◆ 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 строка 315

◆ 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] = {0.0, 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 строка 445

◆ 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 строка 587

◆ 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 строка 719

◆ 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 строка 842

◆ 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

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

◆ 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

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

◆ ones()

int ones ( double *  x,
int  n 
)

Функция заполнения вещественного массива единицами


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

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

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

Пример:

double y[5] = {0};
int i;
ones(y, 5);
for(i = 0; i < 5; i++)
printf("%6.1f% ", y[i]);


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

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

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

◆ 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 строка 1417

◆ 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 строка 1564

int flipip_cmplx(complex_t *x, int n)
Функция отражения комплексного вектора x
Definition: array.c:842
int flipip(double *x, int n)
Функция отражения вещественного вектора x
Definition: array.c:719
#define RE(x)
Макрос определяющий реальную часть комплексного числа.
Definition: dspl.h:359
int logspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив значениями логарифмической шкале
Definition: array.c:1192
int ones(double *x, int n)
Функция заполнения вещественного массива единицами
Definition: array.c:1302
double complex_t[2]
Описание комплексного типа данных.
Definition: dspl.h:86
int decimate(double *x, int n, int d, double *y, int *cnt)
Децимация вещественного вектора данных
Definition: array.c:445
int concat(void *a, size_t na, void *b, size_t nb, void *c)
Конкатенация двух массивов данных
Definition: array.c:315
int linspace(double x0, double x1, int n, int type, double *x)
Функция заполняет массив линейно-нарастающими, равноотстоящими значениями от x0 до x1
Definition: array.c:1009
#define IM(x)
Макрос определяющий мнимую часть комплексного числа.
Definition: dspl.h:417
int decimate_cmplx(complex_t *x, int n, int d, complex_t *y, int *cnt)
Децимация комплексного вектора данных
Definition: array.c:587