Я вычисляю точку пересечения двух линий, заданных в полярной системе координат:
typedef ap_fixed<16,3,AP_RND> t_lines_angle;
typedef ap_fixed<16,14,AP_RND> t_lines_rho;
bool get_intersection(
hls::Polar_< t_lines_angle, t_lines_rho>* lineOne,
hls::Polar_< t_lines_angle, t_lines_rho>* lineTwo,
Point* point)
{
float angleL1 = lineOne->angle.to_float();
float angleL2 = lineTwo->angle.to_float();
t_lines_angle rhoL1 = lineOne->rho.to_float();
t_lines_angle rhoL2 = lineTwo->rho.to_float();
t_lines_angle ct1=cosf(angleL1);
t_lines_angle st1=sinf(angleL1);
t_lines_angle ct2=cosf(angleL2);
t_lines_angle st2=sinf(angleL2);
t_lines_angle d=ct1*st2-st1*ct2;
// we make sure that the lines intersect
// which means that parallel lines are not possible
point->X = (int)((st2*rhoL1-st1*rhoL2)/d);
point->Y = (int)((-ct2*rhoL1+ct1*rhoL2)/d);
return true;
}
После синтеза для нашей FPGA я увидел, что 4 реализации синуса с плавающей запятой (и cos) занимают 4800 LUT на каждую реализацию, что в сумме составляет 19000 LUT для этих 4 функций. Я хочу уменьшить количество LUT, используя синус с фиксированной точкой. Я уже нашел реализацию CORDIC, но я не знаю, как его использовать. Вход функции - целое число, но у меня есть тип данных ap_fixed
. Как я могу сопоставить это ap_fixed
с целым числом? и как я могу сопоставить свою фиксированную точку 3.13 с требуемой фиксированной точкой 2.14?