Форум » Программирование » Вычисление арктангенса. » Ответить

Вычисление арктангенса.

Admin: Понятно, чт проще всего для расчета арктангенса использовать готовую функцию в библиотке math.h, но она работает с данными типа флоат, следовательно занимает много места и времени для расчета. Вобщем, пришлось сделать свою. Суть идеи по формуле расчитывается приблизительное значение угла, а потом по модулю этого значения. выбирается из таблицы поправочное значение. Погрешность такого вычисления составляет один градус, что вполне достаточно. Даный метод успешно реализован и работает в моем приборе. __flash signed char AtanMod[]= { // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, //10,11,12,13,14,15,16,17,18,19, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, //20,21,22,23,24,25,26,27,28,29, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, //30,31,32,33,34,35,36,37,38,39, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, //40,41,42,43,44,45,46,47,48,49, 1, 1, 1, 1, 0, 0, 0,-1,-1,-1, //50,51,52,53,54,55,56,57,58,59, -1,-1,-2,-2,-2,-3,-3,-3,-3,-3, //60,61,62,63,64,65,66,67,68,69, -4,-4,-4,-4,-4,-4,-4,-4,-4,-4, //70,71,72,73,74,75,76,77,78,79, -4,-4,-4,-4,-4,-4,-4,-4,-3,-3, //80,81,82,83,84,85,86,87,88,89,90 -3,-3,-2,-2,-2,-2,-1,-1,-1,-1,0 }; //------------------------------------------------- signed char Atan( int Xsd, int Ysd) { signed char Temp; if((Xsd==0)&&(Ysd==0)) return 0; if(Xsd<0) { Xsd=-Xsd; Temp =(90*Xsd)/(Xsd+Ysd); Temp-=AtanMod[Temp]; Temp=-Temp; } else { Temp =(90*Xsd)/(Xsd+Ysd); Temp-= AtanMod[Temp]; } return Temp; } Вызов функции: Atan (X,Y); где X и Y по модулю не должны быть больше 255.

Ответов - 2

Art: Привет M@rs, вот ещё формула atan2(y,x) ~= 32*(x*y)/(32*x*x + 9*y*y) Работает в секторе [-pi/4 ; pi/4] ошибка порядка 0.5% M@rs, зачем брать поправочное значение, бери сразу сам угол с учетом поправки. Я просто вычисляю 256*Y/X и беру из таблицы угол и косинус арктангенса для вычисления гипотенузы (амплитуды сигнала)

Admin: Спасибо за информацию. Надо будет попробовать.



полная версия страницы