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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> LCD, AVR и CodeVisionAVR C, помогите изменить подключение
alex_ac
сообщение Sep 27 2008, 09:11
Сообщение #16





Группа: Новичок
Сообщений: 1
Регистрация: 27-09-08
Пользователь №: 40 517



Цитата(Serj78 @ Mar 30 2008, 13:07) *
Кстати, кто-нибудь разбирался с математическими функциями CV с точки зрения быстродействия?
Альтернативные функции работают быстрее?
Интересует тригонометрия:sin, cos, atan2 ...



Я делал так:

float sin (float alfa)
{
int i;
for (i = 0; i <90; i ++)
{
if (alfa > i + 0.5)
{
if (alfa < i + 1.5)
{
switch (i + 1)
{
case 0: return 0; break;
case 1: return 0.0175; break;
case 2: return 0.0349; break;
case 3: return 0.0523; break;
case 4: return 0.0698; break;
case 5: return 0.0872; break;
case 6: return 0.1045; break;
case 7: return 0.1219; break;
case 8: return 0.1392; break;
case 9: return 0.1564; break;
case 10: return 0.1736; break;
case 11: return 0.1908; break;
case 12: return 0.2079; break;
case 13: return 0.2250; break;
case 14: return 0.2419; break;
case 15: return 0.2588; break;
case 16: return 0.2756; break;
case 17: return 0.2924; break;
case 18: return 0.3090; break;
case 19: return 0.3256; break;
case 20: return 0.3420; break;
case 21: return 0.3584; break;
case 22: return 0.3746; break;
case 23: return 0.3907; break;
case 24: return 0.4067; break;
case 25: return 0.4226; break;
case 26: return 0.4384; break;
case 27: return 0.4540; break;
case 28: return 0.4695; break;
case 29: return 0.4848; break;
case 30: return 0.5000; break;
case 31: return 0.5150; break;
case 32: return 0.5299; break;
case 33: return 0.5446; break;
case 34: return 0.5592; break;
case 35: return 0.5736; break;
case 36: return 0.5878; break;
case 37: return 0.6018; break;
case 38: return 0.6157; break;
case 39: return 0.6293; break;
case 40: return 0.6428; break;
case 41: return 0.6561; break;
case 42: return 0.6691; break;
case 43: return 0.6820; break;
case 44: return 0.6947; break;
case 45: return 0.7071; break;
case 46: return 0.7193; break;
case 47: return 0.7314; break;
case 48: return 0.7431; break;
case 49: return 0.7547; break;
case 50: return 0.7660; break;
case 51: return 0.7771; break;
case 52: return 0.7880; break;
case 53: return 0.7986; break;
case 54: return 0.8090; break;
case 55: return 0.8192; break;
case 56: return 0.8290; break;
case 57: return 0.8387; break;
case 58: return 0.8480; break;
case 59: return 0.8572; break;
case 60: return 0.8660; break;
case 61: return 0.8746; break;
case 62: return 0.8829; break;
case 63: return 0.8910; break;
case 64: return 0.8988; break;
case 65: return 0.9063; break;
case 66: return 0.9135; break;
case 67: return 0.9205; break;
case 68: return 0.9272; break;
case 69: return 0.9336; break;
case 70: return 0.9397; break;
case 71: return 0.9455; break;
case 72: return 0.9511; break;
case 73: return 0.9563; break;
case 74: return 0.9613; break;
case 75: return 0.9659; break;
case 76: return 0.9703; break;
case 77: return 0.9744; break;
case 78: return 0.9781; break;
case 79: return 0.9816; break;
case 80: return 0.9848; break;
case 81: return 0.9877; break;
case 82: return 0.9903; break;
case 83: return 0.9925; break;
case 84: return 0.9945; break;
case 85: return 0.9962; break;
case 86: return 0.9976; break;
case 87: return 0.9986; break;
case 88: return 0.9994; break;
case 89: return 0.9998; break;
case 90: return 1.0000; break;
}
}
}
}
if (alfa > 90)
{
if (alfa <= 180){ return sin(alfa - 90);}
else if (alfa <= 270){ return -sin(alfa - 90);}
else if (alfa <= 360){ return -sin(alfa - 270);}
else return sin( alfa - 360);
}
}

float cos(float alfa)
{
if (alfa <= 90) return sin (90 - alfa);
else if (alfa <= 180) return -cos(alfa - 90);
else if (alfa <= 270) return -cos(alfa - 180);
else if (alfa <= 360) return cos(alfa - 270);
else return cos(alfa - 360);
}

Могут быть некоторые ошибки, или что-то криво написанно, критикуйте и напишите если у вас вариант лучше.
Go to the top of the page
 
+Quote Post
aesok
сообщение Sep 27 2008, 10:18
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(alex_ac @ Sep 27 2008, 13:11) *
Я делал так:

float sin (float alfa)
.....


Могут быть некоторые ошибки, или что-то криво написанно, критикуйте и напишите если у вас вариант лучше.


Это ПОЗОРИЩЕ. Этот код медленный, длинный и дает неточный результат.

Анатолий.
Go to the top of the page
 
+Quote Post
Syberian
сообщение Sep 27 2008, 18:17
Сообщение #18


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 29-12-06
Из: Омск
Пользователь №: 23 999



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

Проще будет создать таблицу в прогмем с 256 значениями синуса в интервале от 0 до 180 град.
Далее делаем так:

float sintbl (float degree)
{
long adr;
adr=degree- (long)(degree/360)*360;
if (adr<180) return(sintab[(255*adr)/180]);
else return(-sintab[(255*(adr-180))/180]);
}


При желании можно увеличить точность с помощью линейной интерполяции:
y=y1+(y2-y1)*(x-x1)/(x2-x1), где
y-искомое значение
х - текущий аргумент
y1 и y2 - ближайшие значения функции,
х1 и х2 - ближайшие значения аргумента.
В нашем случае (целочисленные индексы) формула будет такова:
y=y1+(y2-y1)*(x-x1)

... но я использую обычно табло из 1024 значений. Этого хватает для простых вычислений.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:28
Рейтинг@Mail.ru


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