Jump to content
    

Реализация извлечения корня

42 минуты назад, blackfin сказал:

Это ещё зачем? "Нормальные герои всегда идут в обход?" ;-) 

Вы с этой формулой не согласны? Вы меня заинтриговали, с нетерпением жду вашего совета.

image.thumb.png.d8f3affbc577a44e05eca5ba6af46875.png

Share this post


Link to post
Share on other sites

Есть такой бытрый способ, но его точность может быть для вас недостаточной:

sqrt (a*a + b*b) ~ max (|a|, |b|) + min (|a|, |b|)/2

 

 

 

Share this post


Link to post
Share on other sites

58 минут назад, andrew_b сказал:

Есть такой бытрый способ, но его точность может быть для вас недостаточной:

sqrt (a*a + b*b) ~ max (|a|, |b|) + min (|a|, |b|)/2

Спасибо! Но эта формула позволяет вычислить только sqrt(a^2 + b^2). С остальными двумя корнями она не справится.

Очень надеюсь что уважаемый  blackfin покажет свою формулу. 

Share this post


Link to post
Share on other sites

Всё просто:

1. CORDIC'ом преобразуем оба числа в показательную форму:

 

z1 = x1 + y1*i = r1*exp(i*φ1);

z2 = x2 + y2*i = r2*exp(i*φ2);

 

2. Вычисляем корни обоих чисел:

 

sqrt(z1) = sqrt(r1)*exp(i*φ1/2);

sqrt(z2) = sqrt(r2)*exp(i*φ2/2);

 

3. Находим корень произведения:

 

sqrt(z1*z2) = sqrt(z1)*sqrt(z2) = sqrt(r1)*sqrt(r2)*exp(i*φ1/2+i*φ2/2);

 

4. При необходимости, CORDIC'ом преобразуем полученный корень произведения в алгебраическую форму:


Re(sqrt(z1*z2)) + i*Im(sqrt(z1*z2)) = sqrt(r1)*sqrt(r2)*[cos(φ1/2+φ2/2) + i*sin(φ1/2+φ2/2)];

Share this post


Link to post
Share on other sites

Отличный ход! Я знал что вы знаете... Спасибо за совет! Я о показательной форме совсем не подумал...

Тогда у меня будет примерно следующий расход времени: 

1). Преобразование в показательную форму и обратно = 2*N тактов (пока не знаю, выясню). А так как IP-core Кордик работает в потоковом режиме то эти такты можно не учитывать, просто добавится латентность. 

2). Извлечение корня из вещественного числа = 12/2+1=7 тактов

Это заметно меньше чем в предыдущих вариантах. Но 7 тактов это тоже много, я не успею всё посчитать. Проблема в том что моя реализация корня не работает в потоковом режиме.

У меня извлечение выглядит так - установил данные на порт, дёрнул ireq, дождался oready, забрал вычисленный корень. Для этой задачи такой режим совершенно не годится.

Режим работы должен быть потоковым. Попробую штатную IP core корня, но емнип там жуткие тормоза по тактовой частоте.

Проверю, если так и есть то буду пробовать ввести конвейер в свою реализацию корня.

Share this post


Link to post
Share on other sites

43 minutes ago, _sda said:

Но 7 тактов это тоже много, я не успею всё посчитать. Проблема в том что моя реализация корня не работает в потоковом режиме.

Если нельзя сделать потоковым, то на вход/выход карусельный арбитр и несколько последовательных блоков.

Share this post


Link to post
Share on other sites

On 11/20/2021 at 2:11 PM, _sda said:

Может кому приходилось решать подобную задачу? Как действовали?

На Xilinx просто брал их CORDIC и получал корень :blum3:
Конечно там всегда возня с форматами, но при должном упорстве разгадать можно.

Share this post


Link to post
Share on other sites

14 минут назад, des00 сказал:

Если нельзя сделать потоковым, то на вход/выход карусельный арбитр и несколько последовательных блоков.

Да, согласен, это вариант. Спасибо!

1 минуту назад, AVR сказал:

На Xilinx просто брал их CORDIC и получал корень :blum3:
Конечно там всегда возня с форматами, но при должном упорстве разгадать можно.

А корень чего вы получали?

Share this post


Link to post
Share on other sites

3 minutes ago, _sda said:

А корень чего вы получали?

Кажется понял, нужно из комплексного числа? В этом и сложность задачи этой темы? Комплексные у CORDIC может и есть но я не припоминаю.

Share this post


Link to post
Share on other sites

10 minutes ago, _sda said:

А корень чего вы получали?

скорее всего имелась в виду амплитуда

Share this post


Link to post
Share on other sites

47 минут назад, des00 сказал:

скорее всего имелась в виду амплитуда

Тоже подумал что модуль, не понял к чему это... Стандартная функция кордика...

Share this post


Link to post
Share on other sites

On 11/20/2021 at 2:11 PM, _sda said:

Динамический диапазон сигнала во 

входных шинах очень широкий

Больше 100 дБ?

Share this post


Link to post
Share on other sites

6 часов назад, _sda сказал:

не понял к чему это... Стандартная функция кордика...

... Включает в себя в том числе и вычисление обычного квадратного корня

Share this post


Link to post
Share on other sites

2 часа назад, Самурай сказал:

... Включает в себя в том числе и вычисление обычного квадратного корня

И...? Чем этот вариант лучше штатной IP-core? По дефолту на пятом циклоне она показала максимум Fs=36МГц, немного поколдовал - стала показывать 290МГц, солидный запас для моей тактовой. Так что с этим вопросом я окончательно определился.

2 часа назад, faa сказал:

Помнится, пришлось применить метод Понселе

Посмотрите, может точности хватит.

Этот метод я применяю уже лет 15, поверьте, здесь ему делать нечего. Кордик рулит.

3 часа назад, Tpeck сказал:

Больше 100 дБ?

Около того. А вы с какой целью интересуетесь?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...