Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: acos
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
_Andu_
нужно расчитать arccos. Есть оптимизированая библиотека qmath в ней можно расчитать atan.
arccos(x) = pi/2 - arctg(x/sqrt(1-x*x)) ;
Для перещета arccos слишком много операций нет ли готовой оптимизированой ф-и arccos или хотябы коэфиц. полинома.
thermit
С какой точностью?
_Andu_
для atan у них вот такой полином, для acos чтобы был такойже

;***********************************************************************;
;* Tylor Series Approximation of ATAN: *;
;* Algorithm : *;
;* atan(x): where 'x' is in 16.16 format *;
;* = 0.318253*x + 0.003314*x^2 - 0.130908*x^3 + 0.068542*x^4 *;
;* - 0.009159*x^5; if x<1 *;
;* = 0.5-atan(1/x); if x>=1 *;
;***********************************************************************;
Gyga
Табличка и ряды. Был у меня спрвочник по рядам, да сплыл
diwil
Цитата(_Andu_ @ May 26 2010, 16:37) *
нужно расчитать arccos. Есть оптимизированая библиотека qmath в ней можно расчитать atan.
arccos(x) = pi/2 - arctg(x/sqrt(1-x*x)) ;
Для перещета arccos слишком много операций нет ли готовой оптимизированой ф-и arccos или хотябы коэфиц. полинома.


если арифметика целочисленная, то CORDIC, наверное, будет оптимальным вариантом. однако придется вычислить синус.
_Andu_
Надо быстрая функция
Арифметика целочисленная. А CORDIC используют та что я видел для ПЛИС а как тут я не знаю.
thermit
Для точности ~10-5 (что соответствует Q15) подойдет такой метод:


acos(x) ~ f(x) = sqrt( 1 - x ) * P( x ) x=0 ... 1 f(x) = pi/2 ... 0

P( x ) = -0.0187293*x^3 + 0.0742610*x^2 - 0.2121144*x + 1.5707288

Делить тут уже не надо, но корень извлечь придется.
Все остальные способы существенно сложнее в вычислительном плане...
_Andu_
да max погрешность ~0.000068 для целочисленного числа где-то max = 2
_Andu_
Спасибо! А как получились эти коэффициенты
-0.0187293
0.0742610
-0.2121144
1.5707288
DMax
Цитата(thermit @ May 26 2010, 18:22) *
P( x ) = -0.0187293*x^3 + 0.0742610*x^2 - 0.2121144*x + 1.5707288

Делить тут уже не надо, но корень извлечь придется.


И не забыть, что вычислять полином лучше по схеме Горнера.
_Andu_
Да по схеме Горнера. А как получились эти коэффициенты
thermit
Цитата
DMax:
И не забыть, что вычислять полином лучше по схеме Горнера.


Ну, для настоящих индейцев это само-собой разумеется...

Цитата
_Andu_:
А как получились эти коэффициенты


Путем аппроксимации функции acos(x)/sqrt(1-x).
В отличие от acos эта функция хорошо приближается полиномом невысокого порядка.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.