реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по вычислению atan(x) на Сortex 3
Vladimir_T
сообщение Oct 10 2013, 10:06
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Здравствуйте, уважаемые коллеги, подскажите, пожалуйста. Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU. Размещение кода в ОЗУ, видимо , не прибавит скорости, но все же попробую. Что еще можно придумать, кроме кардинальноого пересмотра алгоритма? Дайте совет из своего опыта.
Заранее благодарю.
Go to the top of the page
 
+Quote Post
Ixt
сообщение Oct 10 2013, 10:13
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 76
Регистрация: 27-10-06
Из: Брянск
Пользователь №: 21 724



А сейчас какой алгоритм?

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


вы полагаетесь на кодогенерацию, т.е. код написан на Си?
Go to the top of the page
 
+Quote Post
KSN
сообщение Oct 10 2013, 10:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 404
Регистрация: 3-12-04
Из: Новосибирск
Пользователь №: 1 304



Табличный метод уместен?
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 10 2013, 10:30
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Если вызываете функцию из стандартной библиотеки, то уровень оптимизации никак не повлияет. Для начала попробуйте вызывать atanf().
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 10 2013, 10:55
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(scifi @ Oct 10 2013, 14:30) *
Для начала попробуйте вызывать atanf().

ИМХО atan2f() будет ещё быстрее.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение Oct 10 2013, 11:19
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Спасибо за ответы. Код, конечно, написан на C, табличный вариант не годится, функцию atan(x) взял из стандартной библиотеки. Попробую по вашим советам atanf и atan2f.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 10 2013, 12:32
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC.
Go to the top of the page
 
+Quote Post
Vladimir_T
сообщение Oct 10 2013, 13:52
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 517
Регистрация: 7-02-06
Пользователь №: 14 073



Сейчас здорово удалось сократить (в 20 раз) время вычисления с использование atan2f() . Время вычисления с небольшими накладными составляет около 900 нсек.

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

Я, конечно, проштудирую эту тему. Для того, чтобы мне быстрее разобраться, не могли бы вы дать ссылку на пример реализации для какой-либо функции ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 10 2013, 13:56
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Вот это я читал.
Прикрепленные файлы
Прикрепленный файл  CORDIC.zip ( 122.33 килобайт ) Кол-во скачиваний: 30
 
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение Oct 10 2013, 14:16
Сообщение #10


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



Из моего опыта: точность float (а тем более double) во многих случаях избыточна. Если это Ваш случай, то попробуйте перейти на fixed point. В этом случае даже fpu будет не нужен.

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

Если процессор имеет операцию умножения, то в CORDICе нет смысла
Go to the top of the page
 
+Quote Post
sinc_func
сообщение Oct 10 2013, 17:06
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 107
Регистрация: 29-05-10
Из: Пенза
Пользователь №: 57 619



Цитата(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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016