Перейти к содержанию
    

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

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

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

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

image.thumb.png.d8f3affbc577a44e05eca5ba6af46875.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всё просто:

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)];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 minutes ago, _sda said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, _sda said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 minutes ago, _sda said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Больше 100 дБ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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

Больше 100 дБ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...