libdspl-2.0
Библиотека алгоритмов цифровой обработки сигналов
|
Функции для расчета циклической и линейной сверток, а также цифровой КИХ и БИХ фильтрации. Подробнее...
Функции | |
int | conv (double *a, int na, double *b, int nb, double *c) |
Линейная свертка двух вещественных векторов Подробнее... | |
int | conv_cmplx (complex_t *a, int na, complex_t *b, int nb, complex_t *c) |
Линейная свертка двух комплексных векторов Подробнее... | |
int | conv_fft (double *a, int na, double *b, int nb, fft_t *pfft, int nfft, double *c) |
Линейная свертка двух вещественных векторов с использованием алгоритмов быстрого преобразования Фурье Подробнее... | |
int | conv_fft_cmplx (complex_t *a, int na, complex_t *b, int nb, fft_t *pfft, int nfft, complex_t *c) |
Линейная свертка двух комплексных векторов с использованием алгоритмов быстрого преобразования Фурье Подробнее... | |
int | filter_iir (double *b, double *a, int ord, double *x, int n, double *y) |
Фильтрация вещественного сигнала вещественным БИХ-фильтром Подробнее... | |
Подробное описание
Функции для расчета циклической и линейной сверток, а также цифровой КИХ и БИХ фильтрации.
Функции
◆ conv()
int conv | ( | double * | a, |
int | na, | ||
double * | b, | ||
int | nb, | ||
double * | c | ||
) |
Линейная свертка двух вещественных векторов
Функция рассчитывает линейную свертку двух векторов \( c = a * b\).
- Аргументы
-
[in] a Указатель на первый вектор \(a\).
Размер вектора[na x 1]
.
[in] na Размер первого вектора.
[in] b Указатель на второй вектор \(b\).
Размер вектора[nb x 1]
.
[in] nb Размер второго вектора.
[out] c Указатель на вектор свертки \( c = a * b\).
Размер вектора[na + nb - 1 x 1]
.
Память должна быть выделена.
- Возвращает
RES_OK
если свертка расчитана успешно.
В противном случае код ошибки.
- Заметки
- Если вектора
a
иb
представляют собой коэффициенты двух полиномов, то результат линейной свертки представляет собой коэффициенты произведения исходных полиномов.
Пример использования функции:
Результат работы:
cr[0] = 3.0 cr[1] = 5.0 cr[2] = 9.0 cr[3] = 5.0 cr[4] = 14.0 cr[5] = 12.0
См. определение в файле conv.c строка 157
Используется в ratcompos().
◆ conv_cmplx()
Линейная свертка двух комплексных векторов
Функция рассчитывает линейную свертку двух векторов \( c = a * b\).
- Аргументы
-
[in] a Указатель на первый вектор \(a\).
Размер вектора[na x 1]
.
[in] na Размер первого вектора.
[in] b Указатель на второй вектор \(b\).
Размер вектора[nb x 1]
.
[in] nb Размер второго вектора.
[out] c Указатель на вектор свертки \( c = a * b\).
Размер вектора[na + nb - 1 x 1]
.
Память должна быть выделена.
- Возвращает
RES_OK
если свертка рассчитана успешно.
В противном случае код ошибки.
- Заметки
- Если векторы
a
иb
представляют собой коэффициенты двух полиномов, то результат линейной свертки представляет собой коэффициенты произведения исходных полиномов.
Пример использования функции:
Результат работы:
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
См. определение в файле conv_cmplx.c строка 158
◆ conv_fft()
int conv_fft | ( | double * | a, |
int | na, | ||
double * | b, | ||
int | nb, | ||
fft_t * | pfft, | ||
int | nfft, | ||
double * | c | ||
) |
Линейная свертка двух вещественных векторов с использованием алгоритмов быстрого преобразования Фурье
Функция рассчитывает линейную свертку двух векторов \( c = a * b\) используя секционную обработку с перекрытием в частотной области. Это позволяет сократить вычислительные операции при расчете длинных сверток.
- Аргументы
-
[in] a Указатель на первый вектор \(a\).
Размер вектора[na x 1]
.
[in] na Размер первого вектора.
[in] b Указатель на второй вектор \(b\).
Размер вектора[nb x 1]
.
[in] nb Размер второго вектора.
[in] pfft Указатель на структуру fft_t
алгоритма быстрого преобразования Фурье.
Функция изменит состояние полей структурыfft_t
, поэтому структура должна быть очищена перед выходом из программы для исключения утечек памяти.
[in] nfft Размер алгоритма БПФ который будет использован для расчета секционной свертки с перекрытием.
Данный параметр должен быть больше чем минимальное значение размеров сворачиваемых векторов.
Например еслиna=10
, аnb=4
, то параметрnfft
должен быть больше 4.
Библиотека поддерживает алгоритмы БПФ составной длины \(n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\), где \(n_i = 2,3,5,7\), а \(m \) — произвольный простой множитель не превосходящий 46340 (см. описание функции fft_create). Однако, максимальное быстродействие достигается при использовании длин равных степени двойки.[out] c Указатель на вектор свертки \( c = a * b\).
Размер вектора[na + nb - 1 x 1]
.
Память должна быть выделена.
- Возвращает
RES_OK
если свертка рассчитана успешно.
В противном случае код ошибки.
- Заметки
- Данная функция наиболее эффективна при вычислении длинных сверток.
Пример использования функции:
Результат работы:
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
См. определение в файле conv_fft.c строка 198
◆ conv_fft_cmplx()
int conv_fft_cmplx | ( | complex_t * | a, |
int | na, | ||
complex_t * | b, | ||
int | nb, | ||
fft_t * | pfft, | ||
int | nfft, | ||
complex_t * | c | ||
) |
Линейная свертка двух комплексных векторов с использованием алгоритмов быстрого преобразования Фурье
Функция рассчитывает линейную свертку двух векторов \( c = a * b\) используя секционную обработку с перекрытием в частотной области. Это позволяет сократить вычислительные операции при расчете длинных сверток.
- Аргументы
-
[in] a Указатель на первый вектор \(a\).
Размер вектора[na x 1]
.
[in] na Размер первого вектора.
[in] b Указатель на второй вектор \(b\).
Размер вектора[nb x 1]
.
[in] nb Размер второго вектора.
[in] pfft Указатель на структуру fft_t
алгоритма быстрого преобразования Фурье.
Функция изменит состояние полей структурыfft_t
, поэтому структура должна быть очищена перед выходом из программы для исключения утечек памяти.
[in] nfft Размер алгоритма БПФ который будет использован для расчета секционной свертки с перекрытием.
Данный параметр должен быть больше чем минимальное значение размеров сворачиваемых векторов.
Например еслиna=10
, аnb=4
, то параметрnfft
должен быть больше 4.
Библиотека поддерживает алгоритмы БПФ составной длины \(n = n_0 \times n_1 \times n_2 \times \ldots \times n_p \times m\), где \(n_i = 2,3,5,7\), а \(m \) — произвольный простой множитель не превосходящий 46340 (см. описание функции fft_create). Однако, максимальное быстродействие достигается при использовании длин равных степени двойки.[out] c Указатель на вектор свертки \( c = a * b\).
Размер вектора[na + nb - 1 x 1]
.
Память должна быть выделена.
- Возвращает
RES_OK
если свертка рассчитана успешно.
В противном случае код ошибки.
- Заметки
- Данная функция наиболее эффективна при вычислении длинных сверток.
Пример использования функции:
Результат работы:
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
См. определение в файле conv_fft_cmplx.c строка 188
Используется в conv_fft().
◆ filter_iir()
int filter_iir | ( | double * | b, |
double * | a, | ||
int | ord, | ||
double * | x, | ||
int | n, | ||
double * | y | ||
) |
Фильтрация вещественного сигнала вещественным БИХ-фильтром
Функция рассчитывает выход фильтра заданного выражением
\[ H(z) = \frac{\sum_{n = 0}^{N} b_n z^{-n}} {1+{\frac{1}{a_0}}\sum_{m = 1}^{M} a_m z^{-m}}, \]
где \(a_0\) не может быть 0, \(N=M=\)ord
.
- Аргументы
-
[in] b Указатель на вектор коэффициентов числителя передаточной функции \(H(z)\) БИХ-фильтра.
Размер вектора[ord + 1 x 1]
.
[in] a Указатель на вектор коэффициентов знаменателя передаточной функции \(H(z)\) БИХ-фильтра.
Размер вектора[ord + 1 x 1]
.
Этот указатель может бытьNULL
, тогда фильтрация производится без использования рекурсивной части (вектор коэффициентовb
задает КИХ-фильтр).
[in] ord Порядок фильтра. Количество коэффициентов числителя и знаменателя передаточной функции \(H(z)\) БИХ-фильтра равно ord + 1
.
[in] x Указатель на вектор отсчетов входного сигнала.
Размер вектора[n x 1]
.
[in] n Длина входного сигнала.
[out] y Указатель на вектор выходных отсчетов фильтра.
Размер вектора[n x 1]
.
Память должна быть выделена заранее.
- Возвращает
RES_OK
Если фильтрация произведена успешно.
В противном случае код ошибки.
Пример использования функции filter_iir
:
На входе цифрового фильтра задан сигнал \(s(t) = \sin(2\pi \cdot 0.05 t) + n(t)\), где \(n(t)\) белый гауссовский шум, с нулевым средним и единичной дисперсией.
Фильтр представляет собой эллиптический ФНЧ 6 порядка. Входной сигнал фильтруется данным фильтром, и результат сохраняется в файлы:
dat/s.txt - исходный зашумленный сигнал dat/sf.txt - сигнал на выходе фильтра.
По полученным данным производится построение графиков:
См. определение в файле filter_iir.c строка 165
Создано системой 1.8.17