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

 
 
> вычисление квадратного корня на tms320f2812
alexsl
сообщение May 7 2008, 12:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 8-02-07
Пользователь №: 25 165



Добрый день. При построении FSK демодулятора встретился с проблемой. Очень долго вычисляется квадратный корень. Пробовал аппаратную реализацию, как самую быструю:

unsigned int sqrt_user(unsigned long x){
unsigned long m = 0x40000000;
unsigned long y = 0;
unsigned long b;
while(m){
b = y | m;
y >>= 1;
if( x >= b ){
x -= b;
y |= m;
}
m >>= 2;
}
return y;
}

Получилось 400 циклов. Пробовал Cordic алгоритм. Еще больше получается.
Может быть есть у кого реализация, позволяющая уложится в 100 - 160 тактов?

Сообщение отредактировал alexsl - May 7 2008, 12:32
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DS
сообщение May 10 2008, 09:25
Сообщение #2


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Странно, у меня вычисление на ADSP-21 занимает 23 такта при аппроксимации 5 порядком вместе с нормализацией/денормализацией.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
nicks80
сообщение Jun 14 2008, 21:24
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 18-10-07
Пользователь №: 31 485



Цитата(DS @ May 10 2008, 12:25) *
Странно, у меня вычисление на ADSP-21 занимает 23 такта при аппроксимации 5 порядком вместе с нормализацией/денормализацией.

самое быстрое что пробовал.
unsigned int isqrt(unsigned int x) --- этот тест не прошёл гдето опечатка
{
unsigned int s,g0,g1;
if(x<=4224)
if(x<=24)
if(x<=3) return (x+3)>>2;
else if(x<=8) return 2;
else return (x>>4)+3;
else if(x<=288)
if(x<=80) s=3; else s=4;
else if (x<=1088) x=5; else s=6;
else if(x<=1024*1025-1)
if(x<=257*257-1)
if(x<=129*129-1) s=7; else s=8;
else if(x<=513*513-1) s=9;else s=10;
else if (x<= 4097*4097 -1)
if (x<=2049*2049 -1) s=11;else s=12;
else if(x<=16385*16385-1)
if(x<=8193*8193-1) s=13; else s= 14;
else if(x<=32769*32769-1)s=15;else s=16;
g0=1<<s;
g1 = (g0+(x>>s))>>1;
while(g1<g0) {
g0=g1;
g1=(g0+(x/g0))>>1;
};
return g0;
}



Цитата(1S49 @ May 9 2008, 18:27) *
Пожалуйста. Но главным образом благодарите Соединенные Штаты Америки, породившие фирму TI , которая собрала неплохих программистов Америки, Индии, Китая и России и написавших эту библиотеку.

Код
Да вот это на арме летает просто!!!
проверено в сравнении с sqrt на округление до 1650503060 все ок.
unsigned int isqrt2(unsigned long src) - здесь время константное. самый быстрый что я пробовал метод
{
    unsigned long wrk;
    unsigned int dst;
    int i;
    dst = 0x8000;
    wrk = 0x8000;
    for(i=0; i<16; i++)
    {
         if((long)dst*dst>src) dst &= ~wrk;
         wrk >>= 1;
         dst |= wrk;
    }
    return dst;
}


Сообщение отредактировал nicks80 - Jun 14 2008, 21:28
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 00:59
Рейтинг@Mail.ru


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