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

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

Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU.
Если вызываете функцию из стандартной библиотеки, то уровень оптимизации никак не повлияет. Для начала попробуйте вызывать atanf().
demiurg_spb
Oct 10 2013, 10:55
Цитата(scifi @ Oct 10 2013, 14:30)

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

Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC.
Я, конечно, проштудирую эту тему. Для того, чтобы мне быстрее разобраться, не могли бы вы дать ссылку на пример реализации для какой-либо функции ?
Fat Robot
Oct 10 2013, 14:16
Из моего опыта: точность float (а тем более double) во многих случаях избыточна. Если это Ваш случай, то попробуйте перейти на fixed point. В этом случае даже fpu будет не нужен.
Реализацию
fract16 atan2_fr16 (fract16 y, fract16 x);
fract16 atan_fr16 (fract16 x);
для Q1.15 можно подсмотреть в библиотеке AD VisualDSP++. Там используется, насколько я помню, полиномиальная интерполяция.
Если процессор имеет операцию умножения, то в CORDICе нет смысла
sinc_func
Oct 10 2013, 17:06
Цитата(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
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.