Аппаратная реализация тригонометрических функций?

performance

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

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

, 👍0

Обсуждение

Это действительно относится к вопросу, не так ли ... хе-хе. И нет, я говорю о том, могут ли программные реализации реально быть быстрее, чем стандартные реализации, предоставляемые стандартными библиотеками. Будь то специализированные версии серии Тейлора или другие нестандартные подходы к реализации чего-то подобного sine., @spitconsumer

Я на самом деле хожу вокруг да около, чтобы не ставить себя в неловкое положение, у меня есть класс для генерации непрерывной синусоидальной волны с постоянной частотой/частотой дискретизации, и ему нет места в современном высокопроизводительном коде из-за вышеупомянутых встроенных тригонометрических функций, присутствующих на современных процессорах. Однако я хотел бы знать, используется ли он в устройствах с меньшей вычислительной мощностью, таких как микроконтроллеры и микропроцессоры. Должен ли я удалить этот вопрос и на самом деле предоставить код для критики?, @spitconsumer

"вы не знаете о назначении этого сайта?" - все, что я спрашивал, было ли у микроконтроллеров что-то вроде единой машинной инструкции для вычисления тригонометрических функций. Похоже, что общего сайта обмена стеками "микроконтроллер" не существует, поэтому я подумал, что это место будет лучшим. Очевидно, нет., @spitconsumer

[Обмен электронными стеками](https://electronics.stackexchange.com/) больше ориентирован на микроконтроллеры в целом. Чтобы ваш вопрос был по теме здесь, вам нужно было бы спросить о реализации Arduino. Поскольку Arduino, вообще говоря, ориентирован на новичков, такого, вероятно, не было бы., @Nick Gammon

Для небольших / медленных микроконтроллеров чаще используется LUT, чем для вычисления таких чисел на лету., @Majenko


1 ответ


2

Я не знаю ответа на ваш главный вопрос, но я постараюсь ответить на основной вопрос:

Я хочу знать, возможно ли реализовать более эффективные тригонометрические функции для конкретных случаев использования.

Существуют микроконтроллеры, которые не имеют аппаратных реализаций тригонометрических функций, и это главное. AVR, питающие многие К их числу относятся ардуино: у них даже нет аппаратной плавающей точки. Libc предоставляет реализации тригонометрических функций, которые являются как довольно точными (около 24 бит точности), так и очень медленными (около 100 мкс для cos() на Uno).

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

Для справки, я однажды написал cos() с фиксированной точкой с точностью до 9,53 × 10-5, который в среднем работал за 6,77 мкс на Uno. Я могу предоставить ссылку, если кому-то интересно. Если вы можете сделать это лучше (быстрее с той же точностью или точнее с той же скоростью), я определенно хотел бы это увидеть.

,

Я написал класс, который генерировал непрерывную синусоидальную волну, используя уравнение пружины (F = -kx, где x-желаемая длина покоя пружины), что в основном означает, что для каждой выборки синусоидальной волны (при условии постоянной частоты дискретизации и частоты) потребуется только два умножения и два сложения. Компромисс для этого решения заключается в том, что оно *непрерывное*, вы не можете вызвать sin(1), затем sin(5), затем sin(3), вы просто выбираете синусоидальную волну заданной частоты. Есть два других компромисса: память для хранения состояния пружины и интеграция ошибок с плавающей запятой., @spitconsumer

Интеграция ошибок с плавающей запятой не оказывает большого влияния на форму волны, это просто означает, что она имеет тенденцию входить и выходить из синхронизации с функцией sin после нескольких выборок. Вы можете выполнить повторную калибровку функции, вызвав стандартную функцию синуса и косинуса один раз за повторную калибровку. Я не понимаю, почему я говорю об этом. Я просто хотел поговорить об этом. Потому что я очень эгоистичен., @spitconsumer

Я хотел проверить, действительно ли это решение быстрее, чем многократно вызывать что-то вроде sin(x), чтобы заполнить буфер или что-то в этом роде, но, похоже, я потерял кабель, который мне нужен для программирования моего Arduino., @spitconsumer