Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: перевод в целочисленное вычисление
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Maverick
--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 не предлагать...
litv
" быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными..." disco.gif
ну если работать в xilinx system generator и выбирать правильную разрядность с фиксированной точкой то можно.
Быстро - смотря какой клок подать на ПЛИС. tongue.gif
Maverick
Цитата(litv @ Jul 12 2013, 10:44) *
" быстро в целочисленной логике посчитать координаты центра окружности и при этом иметь малую погрешность вычислений по сравнению c вычислениями с float переменными..." disco.gif
ну если работать в xilinx system generator и выбирать правильную разрядность с фиксированной точкой то можно.
Быстро - смотря какой клок подать на ПЛИС. tongue.gif

сколько такая реализация, какую Вы нарисовали в xilinx system generator занимает в ПЛИС?
Для операции деления:
Входные данные 32 бит. Выходные 32 бит.
И если не сложно тоже самое для квадратного корня...
Входные данные 32 бит. Выходные 16 бит.
ПЛИС например спартан 6.
litv
в 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 и самому настроить на Ваши требования и изучить результаты ?

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

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

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

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

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

Далее, пусть v - Ваш вектор перемещения [x;y] длиной d. Тогда ваше решение (пооложения центров) имеет вид
С = (r/d)*R*v; R - матрица вращения. В ней угол phi =arcsin( +/- d/2r). Отсюда собственно и два решения. Итого, имеем одно деление r/d , масштабирование и вращение. Для вращения я бы на кордик посмотрел. Ну и конечно, сначала бы крутил, а потом масштабировал.
Maverick
для прояснения ситуации откуда задача
G-code

Цитата
G02 Круговая интерполяция по часовой стрелки G02 X15 Y15 R5 F200;
G03 Круговая интерполяция против часовой стрелки G03 X15 Y15 R5 F200;
andyp
Видимо, по и против часовой стрелки как раз и соответствует двум решениям.

PS Десяток итераций кордик дает точность вращения примерно 0.1 градуса.
Maverick
всем спасибо...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.