Vladimir_T 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Здравствуйте, уважаемые коллеги, подскажите, пожалуйста. Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU. Размещение кода в ОЗУ, видимо , не прибавит скорости, но все же попробую. Что еще можно придумать, кроме кардинальноого пересмотра алгоритма? Дайте совет из своего опыта. Заранее благодарю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ixt 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба А сейчас какой алгоритм? Судя по этому включена оптимизация по времени, включен FPU. вы полагаетесь на кодогенерацию, т.е. код написан на Си? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KSN 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Табличный метод уместен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Нужно в реальном времени на процессоре STM32F405 вычислять atan(x), сейчас на вычисление уходит 18 us, при частоте ядра 168 МГц, Keil 5.4, включена оптимизация по времени, включен FPU. Если вызываете функцию из стандартной библиотеки, то уровень оптимизации никак не повлияет. Для начала попробуйте вызывать atanf(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Для начала попробуйте вызывать atanf(). ИМХО atan2f() будет ещё быстрее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Спасибо за ответы. Код, конечно, написан на C, табличный вариант не годится, функцию atan(x) взял из стандартной библиотеки. Попробую по вашим советам atanf и atan2f. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vladimir_T 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Сейчас здорово удалось сократить (в 20 раз) время вычисления с использование atan2f() . Время вычисления с небольшими накладными составляет около 900 нсек. Вместо таблицы и стандартных функций, можно попытаться использовать алгоритм CORDIC. Я, конечно, проштудирую эту тему. Для того, чтобы мне быстрее разобраться, не могли бы вы дать ссылку на пример реализации для какой-либо функции ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Вот это я читал. CORDIC.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Из моего опыта: точность float (а тем более double) во многих случаях избыточна. Если это Ваш случай, то попробуйте перейти на fixed point. В этом случае даже fpu будет не нужен. Реализацию fract16 atan2_fr16 (fract16 y, fract16 x); fract16 atan_fr16 (fract16 x); для Q1.15 можно подсмотреть в библиотеке AD VisualDSP++. Там используется, насколько я помню, полиномиальная интерполяция. Если процессор имеет операцию умножения, то в CORDICе нет смысла Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sinc_func 0 10 октября, 2013 Опубликовано 10 октября, 2013 · Жалоба Из моего опыта: точность 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться