Тригонометрия с фиксированной точкой для вложенных аппликаций

9

Мне нужно делать вращательные (и другие) преобразования во встроенном приложении, требуя функции sin () cos () и tan (). Я знаю, что вы можете использовать справочные таблицы, и это единственное решение, которое я смог найти, проводя собственное исследование, но есть ли хорошая библиотека триггеров с фиксированной точкой?

Я думаю об использовании Cortex M3 для приложения, поэтому я хочу как можно больше держаться подальше от плавающей запятой, чтобы приложения работали быстро.

боб
источник
Две мысли: Традиционной примитивной реализацией ротации является алгоритм CORDIC. Вы также можете увидеть, предлагает ли ваш поставщик Cortex M4, конкурентоспособный с M3, который вы рассматривали.
Крис Страттон
4
Почему вы не хотите использовать справочные таблицы? Это очень хорошо работает для греха и соз. Выполнение греха и cos по алгоритму займет больше времени. Единственным преимуществом может быть меньшее использование памяти программ, но имеет ли это значение в вашем приложении?
Олин Латроп
@OlinLathrop, я хочу знать, что нашли другие: возможно, существует какой-то эффективный способ быстрого решения проблемы с небольшой ошибкой при сохранении места в памяти, которого я не нашел? Из того, что я знаю (и я могу ошибаться), самая большая проблема для алгоритмического решения со стандартными библиотеками состоит в том, что все математические вычисления выполняются с плавающей запятой, а без FPU все должно выполняться численно, что ужасно неэффективно. .. Самая большая проблема с таблицами поиска: насколько точным я должен быть? И если это требование точности изменится, хватит ли мне памяти программы?
Боб
Насколько точен вам нужен? Таблицы поиска скромного размера вполне достаточны для большинства встроенных нужд sin / cos. С 1025 записями в таблице вы получите 4096 угловых разрешений. На этом этапе линейная взаимосвязь обеспечивает хорошую точность между записями таблицы. Кажется, есть много неправильных мифов о поиске синуса. Смотрите мой ответ на electronics.stackexchange.com/a/16516/4512 для более подробной информации.
Олин Латроп
Я слышу, что вы говорите, и я понимаю идею таблицы поиска для функции синуса, но если я ограничен кодом (проекты всегда заполняют пространство кода), есть ли более компактный способ справиться с этим? Вот почему я спросил: есть много талантливых людей, вносящих свой вклад, и я хотел бы знать, нашли ли они что-нибудь лучше.
Боб

Ответы:

6

Хорошим подходом для выполнения тригонометрии во встроенных приложениях является использование полиномиальных приближений к нужным вам функциям. Код компактен, данные состоят из нескольких коэффициентов, и единственные необходимые операции - умножение и сложение / вычитание. Многие встраиваемые системы имеют аппаратные множители, обеспечивающие хорошую производительность.

Дэйв Твид
источник
1
Кто-нибудь выпустил версию этого на C, оптимизированную для встроенных приложений, не использующих инструкции с плавающей запятой? Высокая ошибка по обе стороны от полиномиального приближения позволяет использовать приемы для использования разных полиномов для разных сегментов для уменьшения ошибки или какой-то другой прием ...
Боб,
1
Generic C не поддерживает напрямую нецелочисленные типы данных и операции с фиксированной точкой, поэтому оптимизация для этого типа данных обычно зависит от платформы. Например, большинство DSP поддерживают дробный тип данных с фиксированной запятой непосредственно в своем оборудовании. Из C вы получаете доступ к этому через проприетарные библиотеки.
Дэйв Твид
coranac.com/2009/07/sines
эндолиты
Generic C получает поддержку через тип данных _Fract, но в большинстве реализаций микроконтроллеров есть библиотеки, зависящие от производителя. Я использую libmathq15 для всех моих потребностей с фиксированной точкой. Сделал работу до сих пор.
чуть-чуть
_Fractэто кусок дерьма ИМХО; Я ненавижу тот факт, что он был "стандартизирован" комитетом C. Это заставляет вас использовать Q15 или Q31 для всего, что не имеет смысла во многих ситуациях, и оставляет вас в затруднительном положении без помощи в таких ситуациях.
Джейсон С.
3

Вы против использования библиотек Cortex с фиксированной точкой для этого?

q31_t arm_sin_q31 (q31_t x)
Быстрое приближение к тригонометрической функции синуса для данных Q31.

от:

CMSIS-DSP: Коллекция библиотек DSP с более чем 60 функциями для различных типов данных: с фиксированной точкой (дробная q7, q15, q31) и с плавающей точкой одинарной точности (32-разрядная). Библиотека доступна для Cortex-M0, Cortex-M3 и Cortex-M4.

Он использует таблицу поиска с квадратичной интерполяцией, но это довольно быстро. Вы можете адаптировать его к линейной интерполяции для большей скорости, но с большей ошибкой.

Также обратите внимание, что даже Cortex M4 не обязательно имеет FPU. Я видел их под названием "M4F", если они делают.

эндолиты
источник