55372

[i] Особенности работы с библиотекой CMSIS-DSP на микроконтроллерах компании Миландр

Автор статьи: Лампадов Илья Александрович (Инженер)
Дата последнего изменения: 15.10.2024 11:52:45
CMSIS-DSP - программная библиотека от ARM для работы с алгоритмами ЦОС на микроконтроллерах с ядрами Cortex. Возможности библиотеки:
  • базовые математические функции, операции над векторами;
  • быстрые тригонометрические и трансцендентные функции (sin, cos, sqrt и т.д.);
  • линейная и билинейная интерполяции;
  • комплексная арифметика;
  • статистические функции;
  • алгоритмы фильтрации – БИХ-, КИХ- фильтры, алгоритм минимальной; среднеквадратичной ошибки;
  • алгоритмы преобразования сигналов (БПФ и др.);
  • матричная арифметика;
  • ПИД-регулятор;
  • функции для работы с массивами.
Подключение библиотеки в рамках работы с IDE Keil выполняется стандартными средствами через окно "Manage Run-Time Environment", как это показано на рисунке 1.

Рисунок 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

Файлы для скачивания

Теги

Была ли статья полезной?