Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по вычислению atan(x) на Сortex 3
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladimir_T
Здравствуйте, уважаемые коллеги, подскажите, пожалуйста. Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU. Размещение кода в ОЗУ, видимо , не прибавит скорости, но все же попробую. Что еще можно придумать, кроме кардинальноого пересмотра алгоритма? Дайте совет из своего опыта.
Заранее благодарю.
Ixt
А сейчас какой алгоритм?

Судя по этому
Цитата(Vladimir_T @ Oct 10 2013, 14:06) *
включена оптимизация по времени, включен FPU.


вы полагаетесь на кодогенерацию, т.е. код написан на Си?
KSN
Табличный метод уместен?
scifi
Цитата(Vladimir_T @ Oct 10 2013, 14:06) *
Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU.

Если вызываете функцию из стандартной библиотеки, то уровень оптимизации никак не повлияет. Для начала попробуйте вызывать atanf().
demiurg_spb
Цитата(scifi @ Oct 10 2013, 14:30) *
Для начала попробуйте вызывать atanf().

ИМХО atan2f() будет ещё быстрее.
Vladimir_T
Спасибо за ответы. Код, конечно, написан на C, табличный вариант не годится, функцию atan(x) взял из стандартной библиотеки. Попробую по вашим советам atanf и atan2f.
ViKo
Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC.
Vladimir_T
Сейчас здорово удалось сократить (в 20 раз) время вычисления с использование atan2f() . Время вычисления с небольшими накладными составляет около 900 нсек.

Цитата(ViKo @ Oct 10 2013, 16:32) *
Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC.

Я, конечно, проштудирую эту тему. Для того, чтобы мне быстрее разобраться, не могли бы вы дать ссылку на пример реализации для какой-либо функции ?
ViKo
Вот это я читал.
Fat Robot
Из моего опыта: точность float (а тем более double) во многих случаях избыточна. Если это Ваш случай, то попробуйте перейти на fixed point. В этом случае даже fpu будет не нужен.

Реализацию
fract16 atan2_fr16 (fract16 y, fract16 x);
fract16 atan_fr16 (fract16 x);
для Q1.15 можно подсмотреть в библиотеке AD VisualDSP++. Там используется, насколько я помню, полиномиальная интерполяция.

Если процессор имеет операцию умножения, то в CORDICе нет смысла
sinc_func
Цитата(Fat Robot @ Oct 10 2013, 18:16) *
Из моего опыта: точность float (а тем более double) во многих случаях избыточна. Если это Ваш случай, то попробуйте перейти на fixed point. В этом случае даже fpu будет не нужен.

Реализацию
fract16 atan2_fr16 (fract16 y, fract16 x);
fract16 atan_fr16 (fract16 x);
для Q1.15 можно подсмотреть в библиотеке AD VisualDSP++. Там используется, насколько я помню, полиномиальная интерполяция.

Если процессор имеет операцию умножения, то в CORDICе нет смысла


Неплохо разъяснялось в их
DIGITAL SIGNAL PROCESSING APPLICATIONS USING THE ADSP-2100 FAMILY
первый том, глава 4
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.