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

 
 
 
Reply to this topicStart new topic
> перевод в целочисленное вычисление
Maverick
сообщение Jul 11 2013, 19:09
Сообщение #1


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



--Algorithm
--Arc Radius Mode
--
--We need to calculate the center of the circle that has the designated radius and passes
--through both the current position and the target position. This method calculates the following
--set of equations where [x,y] is the vector from current to target position, d == magnitude of
--that vector, h == hypotenuse of the triangle formed by the radius of the circle, the distance to
--the center of the travel vector. A vector perpendicular to the travel vector [-y,x] is scaled to the
--length of h [-y/d*h, x/d*h] and added to the center of the travel vector [x/2,y/2] to form the new point
--[i,j] at [x/2-y/d*h, y/2+x/d*h] which will be the center of our arc.
--d^2 == x^2 + y^2
--h^2 == r^2 - (d/2)^2
--i == x/2 - y/d*h
--j == y/2 + x/d*h
--Expanding the equations:
--d -> sqrt(x^2 + y^2)
--h -> sqrt(4 * r^2 - x^2 - y^2)/2
--i -> (x - (y * sqrt(4 * r^2 - x^2 - y^2)) / sqrt(x^2 + y^2)) / 2
--j -> (y + (x * sqrt(4 * r^2 - x^2 - y^2)) / sqrt(x^2 + y^2)) / 2
--Which can be written:
--i -> (x - (y * sqrt(4 * r^2 - x^2 - y^2))/sqrt(x^2 + y^2))/2
--j -> (y + (x * sqrt(4 * r^2 - x^2 - y^2))/sqrt(x^2 + y^2))/2
--Which we for size and speed reasons optimize to:
--h_x2_div_d = sqrt(4 * r^2 - x^2 - y^2)/sqrt(x^2 + y^2)
--i = (x - (y * h_x2_div_d))/2
--j = (y + (x * h_x2_div_d))/2
------------------------------------------------------------------------------------------------------
Сразу прошу прощения за возможный некоректный английский текст...
вот этот расчет хочу перевести в целочисленное вычисление (последние 3 формулы).
Сейчас задача решена "в лоб". Т.е. операция деление и вычисление квадратного корня реализованы в ПЛИС как целочисленные (например 7/3=2 и остаток 1).
И для достижения точности вычислений производится умножение числителя на 32768 (при вычислении h_x2_div_d). Но это приводит в итоге к увелечению разрядности и уменьшению скорости работы. Например если входные данные 16 бит то уже окончательное вычисление значение числителя (сложение или вычитание) производиться уже с 48 битами. Сейчас погрешность (разница вычислений во флоате и целочисленным) не более 1 еденицы для одной координаты и относительно не высокая скорость...
Например:
Цитата
x = 730
y = 1412
rad = 894
float:
i = -48.878333
j = 1013.822425
int:
i = -48
j = 1013

Подробности расчета во вложении - там вычисления в целочисленном виде и float ...
Интересуют идеи как посчитать быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными...
PS. Реализовать в ПЛИС FPU не предлагать...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
litv
сообщение Jul 12 2013, 07:44
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 6-10-04
Из: Воронеж
Пользователь №: 806



" быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными..." disco.gif
ну если работать в xilinx system generator и выбирать правильную разрядность с фиксированной точкой то можно.
Быстро - смотря какой клок подать на ПЛИС. tongue.gif

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 12 2013, 08:26
Сообщение #3


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(litv @ Jul 12 2013, 10:44) *
" быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными..." disco.gif
ну если работать в xilinx system generator и выбирать правильную разрядность с фиксированной точкой то можно.
Быстро - смотря какой клок подать на ПЛИС. tongue.gif

сколько такая реализация, какую Вы нарисовали в xilinx system generator занимает в ПЛИС?
Для операции деления:
Входные данные 32 бит. Выходные 32 бит.
И если не сложно тоже самое для квадратного корня...
Входные данные 32 бит. Выходные 16 бит.
ПЛИС например спартан 6.


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
litv
сообщение Jul 12 2013, 10:28
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 6-10-04
Из: Воронеж
Пользователь №: 806



в Xilinx system Generator 3 делителя с разными параметрами........... Мне исследовательскую работу что ли сделать.

для Divider 3.0 core и один результат за 8 тактов:

Selected Device : 6slx45fgg484-3
Slice Logic Utilization:
Number of Slice Registers: 569 out of 54576 1%
Number of Slice LUTs: 406 out of 27288 1%
Number used as Logic: 404 out of 27288 1%
Number used as Memory: 2 out of 6408 0%
Number used as SRL: 2


Кстати чтобы расти так сказать технически wink.gif -
Xilinx Design Toools- ISE design suite 14.6 - Ise Design Tools- 64 bit tools- Core Generator

и в нем выбрать корку Divider Generator 3.0 и самому настроить на Ваши требования и изучить результаты ?

Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 12 2013, 10:41
Сообщение #5


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(litv @ Jul 12 2013, 13:28) *
Мне исследовательскую работу что ли сделать.

не надо, а если это для Вас так сложно могли бы не утруждать себя и просто проигнорировать сообщение...
А за выполненную "трудную" работу спасибо...

PS Для работы xilinx system generator нужен матлаб, который не установлен и сейчас его нет...
PS PS Почему xilinx system generator, а почему не вивадо или не MENTOR GRAPHICS CATAPULT C SYNTHESIS... ?

Это отклонение от темы

Еще раз мне нужна помощь по математике - возможная оптимизация формул, возможно есть другой вариант решения задачи, возможно изменения порядка вычислений, возможно изменения разрядности и т.д. ... Нужны хотя бы идеи...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
andyp
сообщение Jul 12 2013, 12:11
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



У меня несколько не по теме коммент - таких точек (центров окружности радиуса r, проходящей через концы вектора) может быть 2 или ни одного (r < d/2 в Ваших обозначениях).

Далее, пусть v - Ваш вектор перемещения [x;y] длиной d. Тогда ваше решение (пооложения центров) имеет вид
С = (r/d)*R*v; R - матрица вращения. В ней угол phi =arcsin( +/- d/2r). Отсюда собственно и два решения. Итого, имеем одно деление r/d , масштабирование и вращение. Для вращения я бы на кордик посмотрел. Ну и конечно, сначала бы крутил, а потом масштабировал.
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 12 2013, 12:29
Сообщение #7


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



для прояснения ситуации откуда задача
G-code

Цитата
G02 Круговая интерполяция по часовой стрелки G02 X15 Y15 R5 F200;
G03 Круговая интерполяция против часовой стрелки G03 X15 Y15 R5 F200;


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
andyp
сообщение Jul 12 2013, 12:33
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 23-07-08
Пользователь №: 39 163



Видимо, по и против часовой стрелки как раз и соответствует двум решениям.

PS Десяток итераций кордик дает точность вращения примерно 0.1 градуса.

Сообщение отредактировал andyp - Jul 12 2013, 12:45
Go to the top of the page
 
+Quote Post
Maverick
сообщение Jul 12 2013, 13:31
Сообщение #9


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



всем спасибо...


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 19:10
Рейтинг@Mail.ru


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