55372
[i] Особенности работы с библиотекой CMSIS-DSP на микроконтроллерах компании Миландр
Дата последнего изменения: 15.10.2024 11:52:45
CMSIS-DSP - программная библиотека от ARM для работы с алгоритмами ЦОС на микроконтроллерах с ядрами Cortex. Возможности библиотеки:
Рисунок 1 - Подключение библиотеки CMSIS-DSP на уровне IDE Keil
В общем виде библиотека функционирует без каких-либо проблем согласно описанному на официальном сайте API. Однако, при работе с функциями, выполняющими преобразование Фурье, могут возникнуть трудности.
По умолчанию библиотека пытается включить в сборку все таблицы вращения и реверсирования бит (для преобразований FFT разной длины), что на выходе занимает объем памяти в 1 Мбайт. В условиях, что на практике нужна одна или несколько реализаций FFT, а объем внутренней Flash-памяти микроконтроллера ограничен, включать все таблицы не просто необязательно, но и не получится. Для пояснения механизма включения таблиц был реализован пример для микроконтроллера К1986ВЕ1QI (актуально также для К1986ВЕ1FI и К1986ВЕ1QI), который в коде генерирует синусоиду частотой 333 Гц с частотой дискретизации 1024 Гц, отсчетов синусоиды при этом 1024 (то есть условно массив длительностью в 1 секунду). Далее стоит задача выполнить преобразование RFFT для переменных float32 (массив синусоиды в данном случае аналогично float32) с длиной буфера 1024. Подключение необходимых таблиц вращения выполняется при инициализации структуры для преобразования Фурье, в данном случае при исполнении функции arm_rfft_fast_init_f32() (файл arm_rfft_fast_init_f32.c) на уровне макроопределений. Видим, что если нет определения "ARM_DSP_CONFIG_TABLES" (система по умолчанию), то будут подключены все таблицы (такая реализация для всех типов преобразований Фурье), и чтобы включить только определенную таблицу, в данном случае "twiddleCoef_rfft_1024", то базово необходимо определить, например, на уровне препроцессора (так сделано в подготовленном примере, в настройках компилятора, опция "Preprocessor Symbols") определения "ARM_TABLE_TWIDDLECOEF_F32_512", "ARM_TABLE_BITREVIDX_FLT_512" и "ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024". При этом для работы этих определений на уровне библиотеки есть созависимые макроопределения (включая определения, которые настраивают работу с простыми функциями по типу нахождения квадратного корня), где итоговый список, чтобы корректно настроить библиотеку для работы с БПФ следующий:
Сохранить статью в PDF
- базовые математические функции, операции над векторами;
- быстрые тригонометрические и трансцендентные функции (sin, cos, sqrt и т.д.);
- линейная и билинейная интерполяции;
- комплексная арифметика;
- статистические функции;
- алгоритмы фильтрации – БИХ-, КИХ- фильтры, алгоритм минимальной; среднеквадратичной ошибки;
- алгоритмы преобразования сигналов (БПФ и др.);
- матричная арифметика;
- ПИД-регулятор;
- функции для работы с массивами.
Рисунок 1 - Подключение библиотеки CMSIS-DSP на уровне IDE Keil
В общем виде библиотека функционирует без каких-либо проблем согласно описанному на официальном сайте API. Однако, при работе с функциями, выполняющими преобразование Фурье, могут возникнуть трудности.
По умолчанию библиотека пытается включить в сборку все таблицы вращения и реверсирования бит (для преобразований FFT разной длины), что на выходе занимает объем памяти в 1 Мбайт. В условиях, что на практике нужна одна или несколько реализаций FFT, а объем внутренней Flash-памяти микроконтроллера ограничен, включать все таблицы не просто необязательно, но и не получится. Для пояснения механизма включения таблиц был реализован пример для микроконтроллера К1986ВЕ1QI (актуально также для К1986ВЕ1FI и К1986ВЕ1QI), который в коде генерирует синусоиду частотой 333 Гц с частотой дискретизации 1024 Гц, отсчетов синусоиды при этом 1024 (то есть условно массив длительностью в 1 секунду). Далее стоит задача выполнить преобразование RFFT для переменных float32 (массив синусоиды в данном случае аналогично float32) с длиной буфера 1024. Подключение необходимых таблиц вращения выполняется при инициализации структуры для преобразования Фурье, в данном случае при исполнении функции arm_rfft_fast_init_f32() (файл arm_rfft_fast_init_f32.c) на уровне макроопределений. Видим, что если нет определения "ARM_DSP_CONFIG_TABLES" (система по умолчанию), то будут подключены все таблицы (такая реализация для всех типов преобразований Фурье), и чтобы включить только определенную таблицу, в данном случае "twiddleCoef_rfft_1024", то базово необходимо определить, например, на уровне препроцессора (так сделано в подготовленном примере, в настройках компилятора, опция "Preprocessor Symbols") определения "ARM_TABLE_TWIDDLECOEF_F32_512", "ARM_TABLE_BITREVIDX_FLT_512" и "ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024". При этом для работы этих определений на уровне библиотеки есть созависимые макроопределения (включая определения, которые настраивают работу с простыми функциями по типу нахождения квадратного корня), где итоговый список, чтобы корректно настроить библиотеку для работы с БПФ следующий:
- ARM_DSP_CONFIG_TABLES
- ARM_FFT_ALLOW_TABLES
- ARM_FAST_ALLOW_TABLES
- ARM_ALL_FAST_TABLES
- ARM_TABLE_TWIDDLECOEF_F32_512
- ARM_TABLE_BITREVIDX_FLT_512
- ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024
Оценка производительности
Производительность расчета БПФ (и других операций) будет зависеть от компилятора, уровней его оптимизации и того, как именно исполняется код (из какой памяти и с какими задержками). Для исходной системы, когда таблица вращений и реверсирования бит находится во Flash-памяти, исполнение кода выполняется также оттуда, используются стандартные задержки к памяти, компилятор IDE Keil версии 5 с минимальным уровнем оптимизации -O0 - для этой системы функция arm_rfft_fast_f32() выполнилась за 31 мс.Сохранить статью в PDF
Файлы для скачивания
Теги
Особенности применения "Know-How"