Перейти к содержанию
    

Вопрос по вычислению atan(x) на Сortex 3

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

Заранее благодарю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Судя по этому

включена оптимизация по времени, включен FPU.

 

вы полагаетесь на кодогенерацию, т.е. код написан на Си?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Если вызываете функцию из стандартной библиотеки, то уровень оптимизации никак не повлияет. Для начала попробуйте вызывать atanf().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для начала попробуйте вызывать atanf().

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы. Код, конечно, написан на C, табличный вариант не годится, функцию atan(x) взял из стандартной библиотеки. Попробую по вашим советам atanf и atan2f.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Реализацию

fract16 atan2_fr16 (fract16 y, fract16 x);

fract16 atan_fr16 (fract16 x);

для Q1.15 можно подсмотреть в библиотеке AD VisualDSP++. Там используется, насколько я помню, полиномиальная интерполяция.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Из моего опыта: точность 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...