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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> алгоритмы извлечения квадратного корня
vovan1313
сообщение Oct 13 2007, 07:10
Сообщение #1





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



Подскажите пожалуйста ламеру какой-нибудь из алгоритмов извлечения квадратного корня (еще лучше привести соответствующий код на VHDL).

Сообщение отредактировал vovan1313 - Oct 13 2007, 07:12
Go to the top of the page
 
+Quote Post
petrov
сообщение Oct 13 2007, 08:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



http://www.google.ru/search?complete=1&...1%D0%BA&lr=
Go to the top of the page
 
+Quote Post
PSP
сообщение Oct 13 2007, 09:15
Сообщение #3


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

Группа: Свой
Сообщений: 118
Регистрация: 1-10-07
Пользователь №: 30 988



Сам я VHDL не использую, но вот есть исходник из какой-то статьи в архивах.


--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- FILE: SQROOT.VHD
-- PROJECT: Square Root Unit
-- AUTHOR: Anatoli Sergyienko
-- Email: aser@comsys.ntu-kpi.kiev.ua
--
-- FUNCTION: - calculating the square root function
-- from the positive integer data.
-- CONSTRAINTS: the input data bit number is less than
-- 2**(bit_num), where bit_num<28 is a generic value,
-- the output data bit number is less than 2**(bit_num/2),
-- respectively. Maximum error is equal to 1 l.s.b.
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all ;

entity SQRT is

generic (bit_num: integer:=16);
port (
ARGUM: in INTEGER range 0 to 2**(bit_num)-1;
SQRT: out INTEGER range 0 to 2**(bit_num/2)-1;
RESET: in STD_LOGIC;
CLK: in STD_LOGIC
);
end SQRT;


architecture SQRT of SQRT is
signal SQRT2 : INTEGER range 0 to 2**(bit_num/2)-1;
signal arg: integer range 0 to 2**(bit_num)-1;
function SQROOT(x1:integer; bn:integer) return integer is
variable m,n,i : INTEGER range 0 to 15;
variable a, b, x : INTEGER range 0 to 2**(bn+2)-1;
variable y : INTEGER range 0 to 2**(bn+1)-1;
begin
y:=x1; x:=x1;
m:=0; n:=bn/2;
ROOT: for i in 1 to n loop
a:=2**2*x;
exit ROOT when a>=2**(bn+1);
y:=2*y; x:=a;
end loop;
ROOT2:for i in 1 to n-1 loop
m:=m+1;
b:=x+x/2**m;
a:=b+b/2**m;
if a>=2**(bn+1) then
x:=x; y:=y;
else
x:=a; y:=y+y/2**m;
end if;
end loop;
y:=y+2**(n-1);
return y/2**n;
end;

begin
process(RESET,CLK,ARGUM)
begin
if RESET ='1' then
ARG<=0;
SQRT<=0;
elsif CLK='1' and CLK'event then
ARG<=ARGUM;
SQRT<= SQROOT(ARG, bit_num);
end if;
end process;
end SQRT;
Go to the top of the page
 
+Quote Post
Doka
сообщение Oct 13 2007, 13:19
Сообщение #4


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



от точности всё зависит, и от того сколько тактов вы можете себе позволить..
cordic наверное посмотреть можно (кажется он умел извлекать корень)

а если вам для оценки мощности квадратурного сигнала, то можно так:
SQRT(I^2 + Q^2) ~ 0.828427*(I+Q) - 0.3431452*I*Q


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
Go to the top of the page
 
+Quote Post
Alex255
сообщение Oct 15 2007, 05:36
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 450
Регистрация: 21-12-06
Пользователь №: 23 757



Цитата(vovan1313 @ Oct 13 2007, 11:10) *
Подскажите пожалуйста ламеру какой-нибудь из алгоритмов извлечения квадратного корня (еще лучше привести соответствующий код на VHDL).

Когда то баловался...
Xn+1=Xn+Y/Xn; Y - это то, из чего корень извлекают. X0 - скажем Y/2.
Go to the top of the page
 
+Quote Post
SergVZ
сообщение Oct 15 2007, 06:38
Сообщение #6


Участник
*

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



Xn+1=(Xn+Y/Xn)/2; Y - это то, из чего корень извлекают. X0 - скажем Y/2.
Формулу отAlex255 чуток поправил.
Go to the top of the page
 
+Quote Post
vovan1313
сообщение Oct 17 2007, 14:38
Сообщение #7





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



Цитата(SergVZ @ Oct 15 2007, 10:38) *
Xn+1=(Xn+Y/Xn)/2; Y - это то, из чего корень извлекают. X0 - скажем Y/2.
Формулу отAlex255 чуток поправил.

SergVZ, а сколько итераций надо сделать, чтобы точность была ну, хотя бы 5-10%?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 17 2007, 16:13
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



у меня с двух итераций получилась точность 0.175%
с трёх итераций точность 0.00015% !!!


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
SergVZ
сообщение Oct 18 2007, 14:40
Сообщение #9


Участник
*

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



GetSmart, Вам похоже повезло с цифрами, возьмите для примера числа :100000 или 10е-6 smile.gif
vovan1313, Вы не указали диапозон аргумента и его тип. Попробуйте по-экспериментировать на калькуляторе число шагов с минимальным (если аргумент вещественный-наиболее его близким к нулю), несколько средних (по порядку) значениями и максимальным.
Я с ПЛИСами не работал (Вы же просили верилоговский сырец дать)-тут совет не дам.
Не забудьте проверить, что извлекаете корень из неотрицательного числа и сделать проверку на ноль, иначе Вам на "0" придеться делить.
На процах (МК) , при юзаньи этого алгоритма ("Ньютона") я всегда число итераций ограничиваю сверху из значения, полученного на кулькуляторе +1, и сравниваю разность между значениями соседних иттераций, она (разность) по модулю больше абсолютной ошибки.
Можете попробовать пару методов, на основе рядов Тейлора:
F(X)=.. или F(X0+dX)= , число членов оценивайте по калькулятору, но тут не придется делить на добные числа.
Go to the top of the page
 
+Quote Post
SergVZ
сообщение Oct 18 2007, 18:12
Сообщение #10


Участник
*

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



К сожалению, уже потерял право на релактирование своего поста.
Ловите добавку к нему:
Можно составить табличку: первые цифры(одна- две) аргумента-ответ, плюс поправка, наподобие таблиц Брадиса (ими раньше в школах пользовались).
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Oct 18 2007, 21:01
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Понятно. Чем дальше логарифмически аргумент находится от 1 тем больше итераций нужно делать. Вчера мои оптимистичные результаты были для корня из 8.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
vovan1313
сообщение Oct 19 2007, 12:38
Сообщение #12





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



спасибо за помощь всем, кто ответил, попробую вспомнить численные методы решения уравнений для оценки погрешности smile.gif

Сообщение отредактировал vovan1313 - Oct 19 2007, 12:38
Go to the top of the page
 
+Quote Post
JBM
сообщение Oct 5 2009, 12:45
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 69
Регистрация: 28-10-05
Из: Харьков, ул. Героев труда.
Пользователь №: 10 213



Код
///////////////////////////////////////////////////////////////////////////
// Carmack from ID Software's unusual square root routine for
// the quake engine
inline float q_sqrt(float number)
{
    long i;
    float x, y;
    const float f = 1.5F;
    
    x = number * 0.5F;
    y  = number;
    i  = * (long*) &y;
    i  = 0x5f3759df - (i >> 1);
    y  = * (float * ) &i;
    y  = y * (f - (x * y * y));
    y  = y * (f - (x * y * y));
    
    return number *y;
}
Go to the top of the page
 
+Quote Post
LordVader
сообщение Oct 5 2009, 13:34
Сообщение #14


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

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



JBM, эта процедурка для 1/sqrt(x), вообще-то. О чём гугл говорит, а также много другого (искать по шестнадцатеричной константе).
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Oct 6 2009, 07:41
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Есть несколько устройств и алгоритмы прямого извлечения корня в
http://electronix.ru/forum/index.php?showtopic=46469&hl=

Конечный выбор определяется исходными требованиями. Основные из них: время выполнения на операция и аппаратурные затраты, а также на чем это выполнять.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 12th August 2025 - 08:03
Рейтинг@Mail.ru


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