40 #include <ti/mathlib/mathlib.h>
81 uint16_t numDetetectedObj,
86 uint16_t *neighCurrent;
89 uint16_t point, member;
94 float epsilon,epsilon2, weight;
95 int32_t epsilon2fixed;
101 numPoints = numDetetectedObj;
104 epsilon2 = epsilon*epsilon;
114 for(point = 0; point < numPoints; point++)
120 neighCurrent = neighLast = inst->
neighbors;
122 memcpy(inst->
scope, inst->
visited, numPoints*
sizeof(
char));
125 detObj2D, point, neighLast, numPoints, epsilon2fixed, epsilonfixed, weight,
129 if(neighCount < inst->minPointsInCluster - 1)
141 for (ind = 0; ind < newCount; ind ++)
143 member = neighLast[ind];
146 neighLast += newCount;
148 while (neighCurrent != neighLast)
151 member = *neighCurrent++;
156 detObj2D, member, neighLast, numPoints,
157 epsilon2fixed, epsilonfixed, weight,
158 vFactorfixed, inst->
scope, &newCount,
163 int32_t speed = (int32_t) detObj2D[point].speed;
167 if (_abs(detObj2D[member].speed - speed) < vFactorfixed)
169 for (ind = 0; ind < newCount; ind ++)
171 member = neighLast[ind];
174 neighLast += newCount;
188 &trackingInput[clusterId - 1], obj);
250 uint16_t *restrict neigh,
256 char * restrict visited,
257 uint16_t * restrict newCount,
258 uint16_t dBScanNeighbourLim)
262 int32_t sum, epsilon2WithSpeed, itemp;
263 uint32_t newCounttmp = 0;
265 _nassert((uint32_t)detObj2D % 8 == 0);
266 int16_t x = detObj2D[point].x;
267 int16_t y = detObj2D[point].y;
268 int16_t speed = detObj2D[point].speed;
269 uint16_t range = detObj2D[point].range;
272 if (_abs(speed) < vFactor)
277 epsilon2WithSpeed = (int32_t)(itemp*itemp*weight + epsilon2);
279 for(i = 0; i < numPoints; i++)
286 if (_abs(detObj2D[i].speed - speed) > itemp)
291 if (_abs(detObj2D[i].range - range) > epsilon)
296 a = detObj2D[i].x - x;
297 b = detObj2D[i].y - y;
298 c = detObj2D[i].speed - speed;
300 sum = (a*a) + (b*b) + (int32_t)(weight*(
float)(c*c));
302 if (sum < epsilon2WithSpeed)
315 *newCount = (uint16_t) newCounttmp;
356 uint16_t clusterOriginator,
358 uint16_t * restrict neighStart,
359 uint16_t * restrict neighLast,
364 int16_t ind, length, member, strongestMember;
365 float sumx, sumy, sumVel, xCenter, yCenter, xSize, ySize, avgVel, temp;
367 uint16_t strongestPeakVal;
368 length = (neighLast - neighStart);
370 sumx = detObj2D[clusterOriginator].x;
371 sumy = detObj2D[clusterOriginator].y;
372 sumVel = detObj2D[clusterOriginator].speed;
374 for (ind = 0; ind < length; ind++)
376 member = neighStart[ind];
377 sumx += (float)(detObj2D[member].x);
378 sumy += (float)(detObj2D[member].y);
379 sumVel += (float)(detObj2D[member].speed);
382 lengthInv = recipsp((
float)(length + 1));
383 xCenter = sumx * lengthInv;
384 yCenter = sumy * lengthInv;
385 avgVel = sumVel * lengthInv;
389 strongestPeakVal = detObj2D[clusterOriginator].peakVal;
390 strongestMember = clusterOriginator;
392 temp = ( ((float)detObj2D[strongestMember].x) - xCenter);
393 temp = ((temp > 0)? (temp): (-temp));
394 xSize =(xSize > temp)? (xSize):(temp);
395 temp = ( ((float)detObj2D[strongestMember].y) - yCenter);
396 temp = ((temp > 0)? (temp): (-temp));
397 ySize = ((ySize > temp)? (ySize):(temp));
399 for (ind = 0; ind < length; ind++)
401 member = neighStart[ind];
402 temp = ( ((float)detObj2D[member].x) - xCenter);
403 temp = ((temp > 0)? (temp): (-temp));
404 xSize =(xSize > temp)? (xSize):(temp);
405 temp = ( ((float)detObj2D[member].y) - yCenter);
406 temp = ((temp > 0)? (temp): (-temp));
407 ySize = ((ySize > temp)? (ySize):(temp));
409 if(detObj2D[member].peakVal > strongestPeakVal)
411 strongestPeakVal = detObj2D[member].peakVal;
412 strongestMember = member;
418 if ((xSize == 0) || (ySize == 0))
426 report->numPoints = length + 1;
427 report->xCenter = (int16_t)(xCenter);
428 report->yCenter = (int16_t)(yCenter);
429 report->xSize = (int16_t)(xSize);
430 report->ySize = (int16_t)(ySize);
431 report->avgVel = (int16_t)(avgVel);