signal-lib
Описание
Библиотека elcore50-signal-lib предназначена для выполнения операций цифровой обработки сигналов. На данный момент возможны вычисление одномерных и двумерных прямых и обратных быстрых преобразований Фурье (БПФ), одномерной и двумерной БПФ-свертки на DSP ELcore-50.
Библиотека позволяет вычислять БПФ для сигналов размером от 256 до 256к комплексных отсчётов, являющимся степенью 2, в формате данных float32, float16 и fractional16 (тип с фиксированной точкой).
В библиотеке используется алгоритм вычисления линейной свертки через БПФ. Известно, что дискретное
преобразование Фурье (ДПФ) циклической свертки равно произведению спектров сворачиваемых сигналов.
Для приведения циклической свертки к линейной необходимо дополнить сигналы нулями до длины
N + M - 1
, где N
— количество отсчетов первого сигнала, M
— количество отсчетов
второго сигнала.
Вычисление БПФ-свертки в библиотеке elcore50-signal-lib возможно только для массивов, длина которых является степенью двойки. В противном случае каждый из массивов необходимо дополнить нулями до размера ближайшей степени двойки. Максимальный размер БПФ-свертки — 256к комплексных отсчетов.
Использование API
Вычисление БПФ происходит в три этапа. Сначала необходимо создать объект типа fft_t
,
в нем задать параметры преобразования: размер сигнала, тип преобразования, указатели на входной и
выходной массивы и т.д. Далее вызвать функцию fft_plan_1d()
или fft_plan_2d()
,
где на основе этих данных вычисляются поворачивающие коэффициенты *w_cols
, *w_rows
, *t
.
Третий этап — непосредственно вычисление БПФ, которое осуществляет функция
fft_execute()
.
Вычисление БПФ-свертки производится функциями fft_conv_1d()
и fft_conv_2d()
.
Более детальная информация представлена в главе API. Также в составе библиотеки распространяются тесты и примеры использования, см. главу Примеры использования.
API
Состоит из следующих заголовочных файлов:
elcore50-signal-lib/fft.h
— структуры данных и функции библиотеки БПФ.elcore50-signal-lib/types_converter.h
— функции для преобразования массивов в различные типы данных.elcore50-signal-lib/reference.h
— референсные функции.
Структуры данных
DataTypes
Перечисление доступных типов данных: FLOAT
соответствует float32,
FRACTIONAL
— fractional16, HFLOAT
— float16.
CALC_MEM
Перечисление типов вычислений: EXT_EXT
— над данными во внешней памяти, EXT_INT
— во
внутренней памяти DSP (XYRAM).
TransformType
Перечисление типов преобразований: IFFT
— обратное БПФ, FFT
— прямое БПФ.
fft_t
-
struct fft_t
Описание полей структуры fft_t
:
dim
— размерность пространства: 1 — одномерное, 2 — двумерное.size
— количество комплексных отсчетов для одномерного преобразования.height
— количество строк матрицы для двумерного преобразования.length
— количество столбцов матрицы для двумерного преобразования.Предупреждение
Значение
height
должно быть в диапазоне от 16 до 512,length
— в диапазоне от 16 до 512 комплексных отсчетов.Примечание
Поле
size
доступно только для чтения при двумерном преобразовании, а поляheight
иlength
— при одномерном.*w_cols
,*w_rows
,*t
— вектор поворотов столбцов, вектор поворотов строк, вектор поворотов промежуточного этапа соответственно. Данные поля всегда доступны только для чтения.*src
,*dst
— вектор входного сигнала и результата преобразования соответственно.Предупреждение
При вычислениях во внешней памяти адреса должны быть выровнены на размер массива в байтах.
dir
— флаг типа преобразования. Определяется черезTransformType
.Предупреждение
При вычислении обратного преобразования для типа float32 нормировка результата не происходит.
big_size
— флаг преобразования большого размера: устанавливается равным 1 при размерах входного сигнала > 16к комплексных отсчетов для типа float32, > 32K — для типов fractional16 и float16. Доступно для чтения.fft_type
— тип данных преобразования. Определяется черезDataTypes
.element_size
— размер типа используемых данных в байтах. Доступно только для чтения.int_mem
— тип вычислений. Определяется черезCALC_MEM
.ticks
— количество тактов DSP, затраченное на выполнение преобразования. Доступно для чтения.instrs
— количество инструкций, выполненное привычислении преобразования. Доступно для чтения.
Предупреждение
При вычислении одномерного преобразования, когда big_size = 0
или int_mem = 0
, результат
преобразования будет находиться в массиве dst
. В противном случае результат сохранится
в массиве src
, а массив dst
будет использоваться как вспомогательный.
При вычислении двумерного преобразования результат будет помещен в массив src
,
dst
— вспомогательный.
Предупреждение
При вычислении двумерного преобразования, когда big_size = 1
и int_mem = 1
, результат
преобразования будет транспонирован.
Функции
Вычисление БПФ и свертки
Описанные ниже функции определены в заголовочном файле elcore50-signal-lib/fft.h
.
fft_plan_1d()
Описание аргументов функции fft_plan_1d()
:
fft_obj
— структура с параметрами преобразования.size
— размер преобразования.fft_type
— тип данных преобразования, соответствующийDataTypes
.
Функция fft_plan_1d()
заполняет структуру fft_obj
и вычисляет соответствующие матрицы
поворотов для одномерного БПФ (ОБПФ). Функция вернет -1 в случае возникновения ошибки
при выполнении.
fft_plan_2d()
Описание аргументов функции fft_plan_2d()
:
fft_obj
— структура с параметрами преобразования.height
— количество строк матрицы.length
— количество столбцов матрицы.fft_type
— тип данных преобразования, соответствующийDataTypes
.
Функция fft_plan_2d()
заполняет структуру fft_obj
и вычисляет соответствующие матрицы
поворотов для двумерного БПФ (ОБПФ). Функция вернет -1 в случае возникновения ошибки при выполнении.
fft_execute()
Описание аргументов функции fft_execute()
:
fft_obj
— структура с параметрами преобразования.
Функция fft_execute()
выполняет вычисление БПФ (ОБПФ). Если параметр int_mem
в
структуре fft_obj
соответствует EXT_INT
, то данные будут загружены во внутреннюю память DSP.
fft_free_sources()
Описание аргументов функции fft_free_sources()
:
fft_obj
— структура с параметрами преобразования.
Функция fft_free_sources()
освобождает память, выделенную для выполнения преобразований.
fft_conv_1d()
-
int fft_conv_1d(float *src0, float *src1, float *dst, const int32_t size, const int8_t is_data_in_xyram)
Описание аргументов функции fft_conv_1d()
:
src0
— первый входной массив.src1
— второй входной массив.dst
— выходной массив.size
— размер свертки.is_data_in_xyram
— расположение входных данных.
Функция fft_conv_1d()
вычисляет одномерную БПФ-свертку двух массивов типа float. Размер
свертки size
необходимо рассчитать по формуле
size = 1 << ceil(log2(size0 + size1 - 1))
,
где size0
— размер первого массива, size1
— размер второго массива. Параметр
is_data_in_xyram
равен 1, если данные расположены в XYRAM, в противном случае — 0.
fft_conv_2d()
-
int fft_conv_2d(float *src0, float *src1, float *dst, const int32_t rows, const int32_t cols, const int8_t is_data_in_xyram)
Описание аргументов функции fft_conv_2d()
:
src0
— первый входной массив.src1
— второй входной массив.dst
— выходной массив.rows
— количество строк в результирующей матрице.cols
— количество столбцов в результирующей матрице.is_data_in_xyram
— расположение входных данных.
Функция fft_conv_2d()
вычисляет одномерную БПФ-свертку двух массивов типа float.
Количество строк rows
необходимо рассчитать по формуле
rows = 1 << ceil(log2(rows0 + rows1 - 1))
,
где rows0
— количество строк первого массива, rows1
— количество строк второго массива.
Количество столбцов рассчитывается аналогично. Параметр is_data_in_xyram
равен 1, если данные
расположены в XYRAM, в противном случае — 0.
Преобразование типов данных
Описанные ниже функции определены в заголовочном файле elcore50-signal-lib/types_converter.h
.
float16_to_float32()
-
extern void float16_to_float32(int16 *src, float *dst, int size)
Описание аргументов функции float16_to_float32()
:
src
— входной массив.dst
— выходной массив.size
— размер массива в элементах.
Функция float16_to_float32()
преобразовывает входной массив типа float16 в массив типа
float32.
float32_to_float16()
-
extern void float32_to_float16(float *src, int16 *dst, int size)
Описание аргументов функции float32_to_float16()
:
src
— входной массив.dst
— выходной массив.size
— размер массива в элементах.
Функция float32_to_float16()
преобразовывает входной массив типа float32 в массив типа
float16.
float32_to_fract16()
-
void float32_to_fract16(float *src, int16 *dst, const int size)
Описание аргументов функции float32_to_fract16()
:
src
— входной массив.dst
— выходной массив.size
— количество комплексных чисел во входном массиве.
Функция float32_to_fract16()
преобразовывает входной массив типа float32 в массив типа
fractional16.
fract16_to_float32()
-
void fract16_to_float32(int16 *src, float *dst, const int size)
Описание аргументов функции fract16_to_float32()
:
src
— входной массив.dst
— выходной массив.size
— количество комплексных чисел во входном массиве.
Функция fract16_to_float32()
преобразовывает входной массив типа fractional16 в массив
типа float32.