Тригонометрія з фіксованою точкою для вбудованих застосувань


9

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

Я маю намір використовувати для додатків cortex M3, тому хочу максимально триматися подалі від плаваючої точки, щоб додатки були блискавками.


Дві думки: Традиційною примітивною реалізацією обертання є алгоритм CORDIC. Ви також можете побачити, чи зараз ваш постачальник пропонує Cortex M4 конкурентоспроможний M3, який ви розглядали.
Кріс Страттон

4
Чому ви не хочете використовувати таблиці пошуку? Це дуже добре справляється з гріхом і соромом. Алгоритмічно робити гріх і cos буде потрібно більше часу. Єдиною перевагою може бути менше використовуваної пам’яті програми, але чи дійсно це має значення у вашій програмі?
Олін Латроп

@OlinLathrop, я хочу знати, що знайшли інші: можливо, існує якийсь ефективний спосіб швидко вирішити проблему з невеликою помилкою при збереженні місця в пам'яті, якого я не знайшов? З того, що я знаю (і я можу помилятися), найбільша проблема алгоритмічного вирішення стандартних бібліотек полягає в тому, що вся математика проводиться в плаваючій точці, і без ФПУ це все має бути зроблено чисельно, що жахливо неефективно. .. Найбільша проблема з таблицями пошуку: наскільки мені потрібно бути точним? І якщо цей запит на точність зміниться, у мене все ще буде достатньо пам'яті програми?
Боб

Наскільки точні вам потрібні? Таблиці пошуку скромного розміру цілком достатньо для більшості вбудованих потреб greh / cos. З 1025 записів таблиці ви отримуєте кут дозволу 4096. У цей момент лінійна інтероплазія дає хорошу точність між записами таблиці. Здається, існує багато невірних міфів про пошук синусів. Дивіться мою відповідь на електроніці.stackexchange.com/ a/16516/ 4512 для отримання більш детальної інформації.
Олін Латроп

Я чую, що ви говорите, і я розумію ідею таблиці пошуку для функції синуса, але якщо я обмежений кодом (проекти завжди заповнюють простір коду), чи є більш компактний спосіб вирішення цього питання? Ось чому я запитав: чимало талановитих людей там вносять свій внесок, і я хотів би знати, чи знайшли вони щось краще.
Боб

Відповіді:


6

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


1
Хтось випустив версію цього в С, оптимізовану для вбудованих додатків, не використовуючи інструкцій з плаваючою комою? Висока помилка з обох боків від наближення полінома піддається тому, що використовуються трюки, щоб використовувати різні поліноми для різних сегментів, щоб зменшити помилку, або якийсь інший трюк ...
Боб

1
Generic C безпосередньо не підтримує не цілі типи даних і операції з фіксованою точкою, тому оптимізація для цього типу даних, як правило, досить специфічна для платформи. Наприклад, більшість DSP підтримують дробовий тип даних з фіксованою точкою безпосередньо в апараті. З C ви отримуєте доступ до цього через власні бібліотеки.
Дейв Твід


Generic C отримує підтримку завдяки типу даних _Fract, але більшість реалізацій мікроконтролерів мають спеціальні для постачальника бібліотеки. Я використовую libmathq15 для всіх своїх потреб з фіксованою точкою. Зробив цю роботу досі.
злегка

_Fract- шматок лайна ІМХО; Я ненавиджу те, що це було «стандартизовано» комітетом C. Це змушує вас використовувати Q15 або Q31 для всього, що не має сенсу в багатьох ситуаціях, і залишає вас забитими без допомоги для цих ситуацій.
Jason S

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", якщо вони є.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.