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

enum DataTypes
enumerator FLOAT = 1
enumerator FRACTIONAL = 2
enumerator HFLOAT = 3

Перечисление доступных типов данных: FLOAT соответствует float32, FRACTIONAL — fractional16, HFLOAT — float16.

CALC_MEM

enum CALC_MEM
enumerator EXT_EXT = 0
enumerator EXT_INT = 1

Перечисление типов вычислений: EXT_EXT — над данными во внешней памяти, EXT_INT — во внутренней памяти DSP (XYRAM).

TransformType

enum TransformType
enumerator IFFT = 0
enumerator FFT = 1

Перечисление типов преобразований: IFFT — обратное БПФ, FFT — прямое БПФ.

fft_t

struct fft_t
int dim
int size
int height
int length
void *w_cols
void *w_rows
void *t
void *src
void *dst
int dir
int big_size
DataTypes fft_type
int element_size
int int_mem
int ticks
int instrs

Описание полей структуры 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()
int fft_plan_1d(fft_t *fft_obj, int size, DataTypes fft_type)

Описание аргументов функции fft_plan_1d():

  • fft_obj — структура с параметрами преобразования.

  • size — размер преобразования.

  • fft_type — тип данных преобразования, соответствующий DataTypes.

Функция fft_plan_1d() заполняет структуру fft_obj и вычисляет соответствующие матрицы поворотов для одномерного БПФ (ОБПФ). Функция вернет -1 в случае возникновения ошибки при выполнении.

fft_plan_2d()
int fft_plan_2d(fft_t *fft_obj, const int height, const int length, DataTypes fft_type)

Описание аргументов функции fft_plan_2d():

  • fft_obj — структура с параметрами преобразования.

  • height — количество строк матрицы.

  • length — количество столбцов матрицы.

  • fft_type — тип данных преобразования, соответствующий DataTypes.

Функция fft_plan_2d() заполняет структуру fft_obj и вычисляет соответствующие матрицы поворотов для двумерного БПФ (ОБПФ). Функция вернет -1 в случае возникновения ошибки при выполнении.

fft_execute()
void fft_execute(fft_t *fft_obj)

Описание аргументов функции fft_execute():

  • fft_obj — структура с параметрами преобразования.

Функция fft_execute() выполняет вычисление БПФ (ОБПФ). Если параметр int_mem в структуре fft_obj соответствует EXT_INT, то данные будут загружены во внутреннюю память DSP.

fft_free_sources()
void fft_free_sources(fft_t *fft_obj)

Описание аргументов функции 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.