54 #include <xdc/cfg/global.h>
55 #include <xdc/runtime/IHeap.h>
56 #include <xdc/runtime/System.h>
57 #include <xdc/runtime/Error.h>
58 #include <xdc/runtime/Memory.h>
59 #include <ti/sysbios/BIOS.h>
60 #include <ti/sysbios/knl/Task.h>
61 #include <ti/sysbios/knl/Event.h>
62 #include <ti/sysbios/knl/Semaphore.h>
63 #include <ti/sysbios/knl/Clock.h>
64 #include <ti/sysbios/heaps/HeapBuf.h>
65 #include <ti/sysbios/heaps/HeapMem.h>
66 #include <ti/sysbios/knl/Event.h>
67 #if defined (SUBSYS_DSS)
68 #include <ti/sysbios/family/c64p/Hwi.h>
69 #include <ti/sysbios/family/c64p/EventCombiner.h>
71 #define DebugP_ASSERT_ENABLED 1
72 #include <ti/drivers/osal/DebugP.h>
74 #include <ti/common/sys_common.h>
75 #include <ti/drivers/osal/SemaphoreP.h>
76 #include <ti/drivers/edma/edma.h>
77 #include <ti/drivers/esm/esm.h>
78 #include <ti/drivers/soc/soc.h>
79 #include <ti/utils/cycleprofiler/cycle_profiler.h>
81 #include <ti/alg/mmwavelib/mmwavelib.h>
83 #include "gen_twiddle_fft32x32.h"
84 #include "gen_twiddle_fft16x16.h"
85 #include "DSP_fft32x32.h"
86 #include "DSP_fft16x16.h"
94 #pragma diag_suppress 48
95 #include <ti/mathlib/mathlib.h>
109 #define ROUND(x) ((x) < 0 ? ((x) - 0.5) : ((x) + 0.5) )
111 #define SOC_XWR18XX_DSS_L3RAM_SIZE 0x100000
113 #define MMW_ADCBUF_SIZE 0x4000U
117 #define MMW_L2_HEAP_SIZE 0x19000U
121 #define MMW_L1_HEAP_SIZE 0x4000U
124 #pragma DATA_SECTION(gMmwL3, ".l3data");
125 #pragma DATA_ALIGN(gMmwL3, 8);
129 #pragma DATA_SECTION(gMmwL2, ".l2data");
130 #pragma DATA_ALIGN(gMmwL2, 8);
134 #pragma DATA_SECTION(gMmwL1, ".l1data");
135 #pragma DATA_ALIGN(gMmwL1, 8);
140 #define FFT_WINDOW_INT16 0
142 #define FFT_WINDOW_INT32 1
146 #define MMW_WIN_HAMMING 0
148 #define MMW_WIN_BLACKMAN 1
150 #define MMW_WIN_RECT 2
152 #define MMW_WIN_HANNING_RECT 3
154 #define ROUNDF(x)((x) < 0 ? ((x) - 0.5f) : ((x) + 0.5f) )
158 #define pingPongId(x) ((x) & 0x1U)
159 #define isPong(x) (pingPongId(x))
162 uint32_t windowDatumType,
170 uint16_t * restrict cfarDetObjSNR,
171 uint32_t numDetObjPerCfar,
172 uint16_t * restrict sumAbs,
176 uint32_t
pruneToPeaks(uint16_t* restrict cfarDetObjIndexBuf,
177 uint16_t* restrict cfarDetObjSNR,
178 uint32_t numDetObjPerCfar,
179 uint16_t* restrict sumAbs,
183 uint16_t* restrict cfarDetObjSNR,
184 uint32_t numDetObjPerCfar,
185 uint16_t* restrict sumAbs,
190 uint32_t numDetObjPerCfar,
191 uint16_t dopplerLine,
192 uint32_t numDetObj2D,
193 uint16_t * restrict sumAbsRange);
196 uint16_t dopplerLine, uint32_t numDetObj2D, uint16_t * restrict sumAbsRange);
199 uint16_t* detMatrix, uint32_t numRangeBins, uint32_t numDopplerBins,
200 uint32_t groupInDopplerDirection, uint32_t groupInRangeDirection);
203 uint16_t checkDetMatrixTx, uint16_t rangeIdx,
204 uint32_t * pingPongIdxPtr);
208 uint16_t out[restrict],
209 uint16_t outSNR[restrict],
211 uint32_t const1, uint32_t const2,
212 uint32_t guardLen, uint32_t noiseLen);
214 uint16_t out[restrict],
215 uint16_t outSNR[restrict], uint32_t len,
216 uint32_t const1, uint32_t const2,
217 uint32_t guardLen, uint32_t noiseLen,
218 uint32_t minIndxToIgnoreHPF);
222 uint16_t
computeSinAzimSNR(
float * azimuthMagSqr, uint16_t azimIdx, uint16_t numVirtualAntAzim, uint16_t numAngleBins, uint16_t xyzOutputQFormat);
224 float antilog2(int32_t inputActual, uint16_t fracBitIn);
228 uint16_t maxNumTrackers,
234 uint32_t numDetectedObjects,
236 uint32_t numRangeBins,
237 uint32_t numDopplerBins);
245 int32_t numDopplerBins,
246 uint32_t *azimuthModCoefs,
247 uint32_t *azimuthModCoefsThirdBin,
248 uint32_t *azimuthModCoefsTwoThirdBin,
274 if (subframeIndx == 0)
285 if (subframeIndx == 0)
305 if (subframeIndx == 0)
307 EDMA_startDmaTransfer(handle, channelId0);
338 uint32_t word = dopplerIndex >> 5;
339 uint32_t bit = dopplerIndex & 31;
354 uint32_t dopplerLineStat;
355 uint32_t word = index >> 5;
356 uint32_t bit = index & 31;
366 return dopplerLineStat;
380 uint32_t word = index >> 5;
381 uint32_t bit = index & 31;
436 uint32_t oneQFormat = (1 << xyzOutputQFormat);
438 uint32_t numSearchBins;
439 uint16_t azimIdx = 0;
444 numSearchBins = numAngleBins*2;
448 numSearchBins = numAngleBins;
452 for (i = 0; i < numSearchBins ; i++)
454 if (azimuthMagSqr[i] > maxVal)
457 maxVal = azimuthMagSqr[i];
463 if(azimIdx >= numAngleBins)
467 azimIdx -= numAngleBins;
470 azimuthMagSqr += numAngleBins;
489 uint32_t leftSearchIdx;
490 uint32_t rightSearchIdx;
491 uint32_t secondSearchLen;
492 uint32_t iModAzimLen;
498 leftSearchIdx = (i + 1) & (numAngleBins - 1);
500 while ((azimuthMagSqr[i] >= azimuthMagSqr[leftSearchIdx]) && (k > 0))
502 i = (i + 1) & (numAngleBins - 1);
503 leftSearchIdx = (leftSearchIdx + 1) & (numAngleBins - 1);
509 rightSearchIdx = (i - 1) & (numAngleBins - 1);
511 while ((azimuthMagSqr[i] >= azimuthMagSqr[rightSearchIdx]) && (k > 0))
513 i = (i - 1) & (numAngleBins - 1);
514 rightSearchIdx = (rightSearchIdx - 1) & (numAngleBins - 1);
518 secondSearchLen = ((rightSearchIdx - leftSearchIdx) & (numAngleBins - 1)) + 1;
520 maxVal2 = azimuthMagSqr[leftSearchIdx];
521 azimIdx = leftSearchIdx;
522 for (i = leftSearchIdx; i < (leftSearchIdx + secondSearchLen); i++)
524 iModAzimLen = i & (numAngleBins - 1);
525 if (azimuthMagSqr[iModAzimLen] > maxVal2)
527 azimIdx = iModAzimLen;
528 maxVal2 = azimuthMagSqr[iModAzimLen];
568 uint32_t oneQFormat = (1 << xyzOutputQFormat);
570 uint32_t numSearchBins;
571 uint16_t azimIdx = 0;
578 numSearchBins = numAngleBins*2;
582 numSearchBins = numAngleBins;
587 numSearchBins = numAngleBins;
590 for (i = 0; i < numSearchBins ; i++)
592 if (azimuthMagSqr[i] > maxVal)
595 maxVal = azimuthMagSqr[i];
604 if(azimIdx >= numAngleBins)
608 azimIdx -= numAngleBins;
611 azimuthMagSqr += numAngleBins;
633 uint32_t leftSearchIdx;
634 uint32_t rightSearchIdx;
635 uint32_t secondSearchLen;
636 uint32_t iModAzimLen;
642 leftSearchIdx = (i + 1) & (numAngleBins - 1);
644 while ((azimuthMagSqr[i] >= azimuthMagSqr[leftSearchIdx]) && (k > 0))
646 i = (i + 1) & (numAngleBins - 1);
647 leftSearchIdx = (leftSearchIdx + 1) & (numAngleBins - 1);
653 rightSearchIdx = (i - 1) & (numAngleBins - 1);
655 while ((azimuthMagSqr[i] >= azimuthMagSqr[rightSearchIdx]) && (k > 0))
657 i = (i - 1) & (numAngleBins - 1);
658 rightSearchIdx = (rightSearchIdx - 1) & (numAngleBins - 1);
662 secondSearchLen = ((rightSearchIdx - leftSearchIdx) & (numAngleBins - 1)) + 1;
664 maxVal2 = azimuthMagSqr[leftSearchIdx];
665 azimIdx = leftSearchIdx;
666 for (i = leftSearchIdx; i < (leftSearchIdx + secondSearchLen); i++)
668 iModAzimLen = i & (numAngleBins - 1);
669 if (azimuthMagSqr[iModAzimLen] > maxVal2)
671 azimIdx = iModAzimLen;
672 maxVal2 = azimuthMagSqr[iModAzimLen];
706 volatile bool isTransferDone;
710 if (subframeIndx == 0)
722 if (subframeIndx == 0)
735 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
739 }
while (isTransferDone ==
false);
757 volatile bool isTransferDone;
766 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
770 }
while (isTransferDone ==
false);
788 volatile bool isTransferDone;
798 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
802 }
while (isTransferDone ==
false);
821 volatile bool isTransferDone;
828 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
832 }
while (isTransferDone ==
false);
850 volatile bool isTransferDone;
852 if (subframeIndx == 0)
865 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
869 }
while (isTransferDone ==
false);
889 volatile bool isTransferDone;
891 if (subframeIndx == 0)
905 (
bool *)&isTransferDone) != EDMA_NO_ERROR)
909 }
while (isTransferDone ==
false);
939 uint16_t shadowParam = EDMA_NUM_DMA_CHANNELS;
942 uint8_t subframeIndx;
943 uint32_t numChirpTypes = 1;
944 uint32_t ADCBufferoffset = (32 * 1024)/4;
946 for (subframeIndx = 0; subframeIndx <
NUM_SUBFRAMES; subframeIndx++, obj++)
965 if (subframeIndx == 0)
978 (uint8_t *)(SOC_translateAddress((uint32_t)&obj->
adcDataIn[0], SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
994 if (subframeIndx == 0)
1008 (uint8_t *)(&obj->ADCdataBuf[(ADCBufferoffset>>2)]),
1009 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->adcDataIn[obj->numRangeBins]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1014 MAX(obj->numRxAntennas / 2, 1),
1015 ADCBufferoffset * 2,
1034 if (subframeIndx == 0)
1046 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->fftOut1D[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1047 (uint8_t *)(&obj->radarCube[0]),
1053 obj->numTxAntennas * numChirpTypes,
1055 obj->numDopplerBins,
1065 if (subframeIndx == 0)
1076 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->fftOut1D[obj->numRxAntennas * obj->numRangeBins]),
1077 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1078 (uint8_t *)(&obj->radarCube[0]),
1084 obj->numTxAntennas * numChirpTypes,
1086 obj->numDopplerBins,
1106 if (subframeIndx == 0)
1117 (uint8_t *)(&obj->radarCube[0]),
1118 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1123 (obj->numRangeBins * obj->numRxAntennas * obj->numTxAntennas * numChirpTypes) / 2,
1136 if (subframeIndx == 0)
1147 (uint8_t *)(&obj->radarCube[obj->numDopplerBins]),
1148 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[obj->numDopplerBins]),
1149 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1154 (obj->numRangeBins * obj->numRxAntennas * obj->numTxAntennas * numChirpTypes) / 2,
1169 if (subframeIndx == 0)
1180 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->sumAbs[0U]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1181 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->detMatrix[0U]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1201 if (subframeIndx == 0)
1236 if (subframeIndx == 0)
1248 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[0]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1253 MAX((obj->numRxAntennas * obj->numTxAntennas) / 2, 1),
1266 if (subframeIndx == 0)
1278 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->dstPingPong[obj->numDopplerBins]), SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1283 MAX((obj->numRxAntennas * obj->numTxAntennas) / 2, 1),
1325 uint32_t numDetectedObjects,
1326 uint32_t numDopplerBins,
1331 uint32_t numObjOut = 0;
1332 uint32_t searchSNRThresh = 0;
1333 uint32_t searchpeakValThresh = 0;
1338 for (i = 0; i < numDetectedObjects; i++)
1340 if ((objRaw[i].range <= maxRange) && ((objRaw[i].range >= minRange)))
1345 searchSNRThresh = 0;
1349 if (objRaw[i].range > SNRThresh[j].rangelim)
1351 searchSNRThresh = 1;
1355 if (objRaw[i].range < SNRThresh[j-1].rangelim)
1357 searchSNRThresh = 1;
1361 if (searchSNRThresh == 1)
1366 if (objRaw[i].range < SNRThresh[j].rangelim)
1374 searchpeakValThresh = 0;
1376 if (objRaw[i].range > peakValThresh[k].rangelim)
1378 searchpeakValThresh = 1;
1382 if (objRaw[i].range < peakValThresh[k-1].rangelim)
1384 searchpeakValThresh = 1;
1388 if (searchpeakValThresh == 1)
1392 if (objRaw[i].range < peakValThresh[k].rangelim)
1400 if ( (objRaw[i].rangeSNRdB > SNRThresh[j].threshold) &&
1401 (objRaw[i].peakVal > peakValThresh[k].threshold) )
1403 objOut[numObjOut].rangeIdx = objRaw[i].rangeIdx;
1404 objOut[numObjOut].dopplerIdx = objRaw[i].dopplerIdx;
1405 objOut[numObjOut].range = objRaw[i].range;
1406 objOut[numObjOut].speed = objRaw[i].speed;
1407 objOut[numObjOut].peakVal = objRaw[i].peakVal;
1408 objOut[numObjOut].rangeSNRdB = objRaw[i].rangeSNRdB;
1409 objOut[numObjOut].dopplerSNRdB = objRaw[i].dopplerSNRdB;
1434 for (i = 0; i < numSamples; i++)
1436 magSqrdBuff[i] = (float)inpBuff[i].real * (
float)inpBuff[i].real +
1437 (float)inpBuff[i].imag * (
float)inpBuff[i].imag;
1452 uint32_t rxAntIdx, binIdx;
1454 int32_t chirpPingPongOffs;
1455 int32_t chirpPingPongSize;
1463 chirpPingPongOffs = chirpPingPongId * chirpPingPongSize;
1470 for (rxAntIdx = 0; rxAntIdx < obj->
numRxAntennas; rxAntIdx++)
1473 int64_t *meanPtr = (int64_t *)&obj->
dcRangeSigMean[chirpPingPongOffs];
1474 uint32_t *fftPtr = (uint32_t *)&obj->
fftOut1D[chirpInOffs];
1481 meanBin = _amem8(&meanPtr[ind]);
1482 fftBin = _amem4(&fftPtr[binIdx]);
1483 Im = _loll(meanBin) + _ext(fftBin, 0, 16);
1484 Re = _hill(meanBin) + _ext(fftBin, 16, 16);
1485 _amem8(&meanPtr[ind]) = _itoll(Re, Im);
1490 fftPtr = (uint32_t *)&obj->
fftOut1D[chirpInOffs];
1493 meanBin = _amem8(&meanPtr[ind]);
1494 fftBin = _amem4(&fftPtr[binIdx]);
1495 Im = _loll(meanBin) + _ext(fftBin, 0, 16);
1496 Re = _hill(meanBin) + _ext(fftBin, 16, 16);
1497 _amem8(&meanPtr[ind]) = _itoll(Re, Im);
1510 for (ind = 0; ind < (obj->
numTxAntennas * chirpPingPongSize); ind++)
1512 meanBin = _amem8(&meanPtr[ind]);
1513 Im = _sshvr(_loll(meanBin), divShift);
1514 Re = _sshvr(_hill(meanBin), divShift);
1515 _amem8(&meanPtr[ind]) = _itoll(Re, Im);
1523 for (rxAntIdx = 0; rxAntIdx < obj->
numRxAntennas; rxAntIdx++)
1526 int64_t *meanPtr = (int64_t *)&obj->
dcRangeSigMean[chirpPingPongOffs];
1527 uint32_t *fftPtr = (uint32_t *)&obj->
fftOut1D[chirpInOffs];
1533 meanBin = _amem8(&meanPtr[ind]);
1534 fftBin = _amem4(&fftPtr[binIdx]);
1535 Im = _ext(fftBin, 0, 16) - _loll(meanBin);
1536 Re = _ext(fftBin, 16, 16) - _hill(meanBin);
1537 _amem4(&fftPtr[binIdx]) = _pack2(Im, Re);
1542 fftPtr = (uint32_t *)&obj->
fftOut1D[chirpInOffs];
1545 meanBin = _amem8(&meanPtr[ind]);
1546 fftBin = _amem4(&fftPtr[binIdx]);
1547 Im = _ext(fftBin, 0, 16) - _loll(meanBin);
1548 Re = _ext(fftBin, 16, 16) - _hill(meanBin);
1549 _amem4(&fftPtr[binIdx]) = _pack2(Im, Re);
1567 uint32_t antIndx, waitingTime;
1568 volatile uint32_t startTime;
1569 volatile uint32_t startTime1;
1572 startTime = Cycleprofiler_getTimeStamp();
1600 startTime1 = Cycleprofiler_getTimeStamp();
1602 waitingTime += Cycleprofiler_getTimeStamp() - startTime1;
1605 mmwavelib_windowing16x16(
1638 uint32_t rangeIdx, detIdx1, numDetObjPerCfar, numDetDopplerLine1D, numDetObj1D, numDetObj2D;
1639 volatile uint32_t startTime;
1640 volatile uint32_t startTimeWait;
1641 uint32_t waitingTime = 0;
1642 uint32_t pingPongIdx = 0;
1643 uint32_t dopplerLine, dopplerLineNext;
1644 startTime = Cycleprofiler_getTimeStamp();
1652 numDetDopplerLine1D = 0;
1656 for (rangeIdx = 0; rangeIdx < obj->
numRangeBins; rangeIdx++)
1693 uint32_t detObj1DRawIdx;
1695 float fastChirpVelIdxFlt, fastChirpVel;
1696 int16_t fastChirpVelIdx;
1704 for (detIdx1 = 0; detIdx1 < numDetObjPerCfar; detIdx1++)
1722 fastChirpVelIdxFlt = ((float)fastChirpVelIdx) + interpOffset;
1747 if (numDetObjPerCfar > 0)
1749 for (detIdx1 = 0; detIdx1 < numDetObjPerCfar; detIdx1++)
1754 numDetDopplerLine1D++;
1766 startTimeWait = Cycleprofiler_getTimeStamp();
1768 waitingTime += Cycleprofiler_getTimeStamp() - startTimeWait;
1774 if (numDetDopplerLine1D > 0)
1777 if (subframeIndx == 0)
1789 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->
detMatrix[dopplerLine]),
1790 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1791 (uint8_t *)(SOC_translateAddress((uint32_t)(&obj->
sumAbsRange[0]),
1792 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1798 for (detIdx1 = 0; detIdx1 < numDetDopplerLine1D; detIdx1++)
1801 startTimeWait = Cycleprofiler_getTimeStamp();
1803 waitingTime += Cycleprofiler_getTimeStamp() - startTimeWait;
1806 if (detIdx1 < (numDetDopplerLine1D - 1))
1811 if (subframeIndx == 0)
1822 (uint8_t*)(SOC_translateAddress(
1823 (uint32_t)(&obj->
detMatrix[dopplerLineNext]),
1824 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1825 (uint8_t*)(SOC_translateAddress(
1827 SOC_TranslateAddr_Dir_TO_EDMA, NULL)),
1846 if (numDetObjPerCfar > 0)
1867 numDetObjPerCfar, dopplerLine, numDetObj2D,
1892 dopplerLine = dopplerLineNext;
1929 uint32_t numTrackingInput;
1941 int32_t threshold = _spint(thresholdFlt*thresholdFlt);
1979 volatile uint32_t startTime;
1980 uint32_t radarCubeOffset;
1984 startTime = Cycleprofiler_getTimeStamp();
1999 if (subframeIndx == 0)
2014 (uint8_t *)(&obj->
radarCube[radarCubeOffset]),
2020 if (subframeIndx == 0)
2035 (uint8_t *)(&obj->
radarCube[radarCubeOffset]),
2084 volatile uint32_t startTime;
2086 startTime = Cycleprofiler_getTimeStamp();
2093 void calc_cmplx_exp(cmplx16ImRe_t *dftSinCos,
float i, uint32_t dftLen)
2098 itemp = (int32_t)
ROUND(temp);
2104 dftSinCos->imag = itemp;
2107 itemp = (int32_t)
ROUND(temp);
2113 dftSinCos->real = itemp;
2134 cmplx16ImRe_t *dftHalfBinVal,
2135 cmplx16ImRe_t *dftThirdBinVal,
2136 cmplx16ImRe_t *dftTwoThirdBinVal,
2141 for (i = 0; i < dftLen; i++)
2182 EDMA_transferControllerErrorInfo_t *errorInfo)
2203 int8_t subframeIndx = 0;
2205 for (subframeIndx = 0; subframeIndx <
NUM_SUBFRAMES; subframeIndx++, obj++)
2228 uint8_t numInstances;
2231 EDMA_errorConfig_t errorConfig;
2232 uint32_t instanceId;
2233 EDMA_instanceInfo_t instanceInfo;
2235 numInstances = EDMA_getNumInstances();
2238 for (instanceId = 0; instanceId < numInstances; instanceId++)
2240 EDMA_init(instanceId);
2242 handle = EDMA_open(instanceId, &errorCode, &instanceInfo);
2250 errorConfig.isConfigAllEventQueues =
true;
2251 errorConfig.isConfigAllTransferControllers =
true;
2252 errorConfig.isEventQueueThresholdingEnabled =
true;
2253 errorConfig.eventQueueThreshold = EDMA_EVENT_QUEUE_THRESHOLD_MAX;
2254 errorConfig.isEnableAllTransferControllerErrors =
true;
2257 if ((errorCode = EDMA_configErrorMonitoring(handle, &errorConfig)) != EDMA_NO_ERROR)
2277 uint8_t numInstances;
2278 uint32_t instanceId;
2280 numInstances = EDMA_getNumInstances();
2283 for (instanceId = 0; instanceId < numInstances; instanceId++)
2302 System_printf(
"Heap %s : size %d (0x%x), free %d (0x%x)\n", name, heapSize, heapSize, heapSize - heapUsed, heapSize - heapUsed);
2332 #define SOC_MAX_NUM_RX_ANTENNAS 4
2333 #define SOC_MAX_NUM_TX_ANTENNAS 3
2339 volatile uint32_t prev_end;
2340 volatile uint32_t l2HeapEndLocationForSubframe[
NUM_SUBFRAMES];
2344 #define ALIGN(x,a) (((x)+((a)-1))&~((a)-1))
2346 #define MMW_ALLOC_BUF(name, nameType, startAddr, alignment, size) \
2347 obj->name = (nameType *) ALIGN(startAddr, alignment); \
2348 uint32_t name##_end = (uint32_t)obj->name + (size) * sizeof(nameType);
2350 uint32_t subframeIndx;
2351 uint32_t numChirpTypes = 1;
2352 volatile uint32_t heapUsed;
2353 uint32_t heapL1start = (uint32_t)&
gMmwL1[0];
2354 uint32_t heapL2start = (uint32_t)&
gMmwL2[0];
2355 uint32_t heapL3start = (uint32_t)&
gMmwL3[0];
2357 uint32_t azimuthMagSqrLen;
2358 uint32_t azimuthInLen;
2359 volatile uint32_t size;
2363 memset((
void *)heapL3start, 0,
sizeof(
gMmwL3));
2365 for (subframeIndx = 0; subframeIndx <
NUM_SUBFRAMES; subframeIndx++, obj++)
2436 sumAbs_end = sumAbsSlowChirp_end;
2484 MMW_ALLOC_BUF(azimuthMagSqr,
float, elevationOut_end,
sizeof(
float), azimuthMagSqrLen);
2492 detObj2DRaw_end = detObj1DRaw_end;
2493 sumAbs_end = detObj1DRaw_end;
2525 dbscanOutputDataReport_end = trackerScratchPadShort_end;
2543 prev_end =
MAX(
MAX(
MAX(sumAbs_end, adcDataIn_end),azimuthMagSqr_end),detObj2DRaw_end);
2544 prev_end =
MAX(
MAX(prev_end,dbscanOutputDataReport_end), parkingAssistBins_end);
2545 heapUsed = prev_end - heapL1start;
2580 heapL2start,
sizeof(uint16_t),
2584 cfarDetObjIndexBuf_end,
sizeof(uint16_t),
2601 detDopplerLines_dopplerLineMask_end,
sizeof(uint16_t),
2605 sumAbsRange_end,
sizeof(uint16_t),
2613 l2HeapEndLocationForSubframe[subframeIndx] =
MAX(fftOut1D_end, detObj2D_end);
2619 obj->
ADCdataBuf = (cmplx16ReIm_t *)adcBufAddress;
2624 heapUsed = radarCube_end - heapL3start;
2630 volatile uint32_t prevL2End = 0;
2633 for (subframeIndx = 0; subframeIndx <
NUM_SUBFRAMES; subframeIndx ++)
2635 if (prevL2End < l2HeapEndLocationForSubframe[subframeIndx])
2637 prevL2End = l2HeapEndLocationForSubframe[subframeIndx];
2657 for (subframeIndx = 0; subframeIndx <
NUM_SUBFRAMES; subframeIndx++, obj++)
2704 prevL2End = trackerQvecList_end;
2724 prevL2End = parkingAssistBinsStateCnt_end;
2732 heapUsed = prevL2End - heapL2start;
2800 uint32_t windowDatumType,
2808 int16_t * win16 = (int16_t *)win;
2809 int32_t * win32 = (int32_t *)win;
2811 float phi = 2 *
PI_ / ((float)winLen - 1);
2819 for (winIndx = 0; winIndx < winGenLen; winIndx++)
2821 winVal = (int32_t)((oneQformat * (a0 - a1*cos(phi * winIndx) +
2822 a2*cos(2 * phi * winIndx))) + 0.5);
2823 if (winVal >= oneQformat)
2825 winVal = oneQformat - 1;
2827 switch (windowDatumType)
2830 win16[winIndx] = (int16_t)winVal;
2833 win32[winIndx] = (int32_t)winVal;
2842 for (winIndx = 0; winIndx < winGenLen; winIndx++)
2844 winVal = (int32_t)((oneQformat * (0.53836 - (0.46164*cos(phi * winIndx)))) + 0.5);
2846 if (winVal >= oneQformat)
2848 winVal = oneQformat - 1;
2851 switch (windowDatumType)
2854 win16[winIndx] = (int16_t)winVal;
2857 win32[winIndx] = (int32_t)winVal;
2865 for (winIndx = 0; winIndx < winGenLen; winIndx++)
2867 switch (windowDatumType)
2870 win16[winIndx] = (int16_t)(oneQformat - 1);
2873 win32[winIndx] = (int32_t)(oneQformat - 1);
2881 phi = 2 *
PI_ / ((float)(winLen/8) - 1);
2884 for (winIndx = 0; winIndx < winGenLen; winIndx++)
2886 if (winIndx <= winLen/16)
2888 winVal = (int32_t)((oneQformat * 0.5* (1 - cos(phi * winIndx))) + 0.5);
2892 winVal = oneQformat - 1;
2895 if (winVal >= oneQformat)
2897 winVal = oneQformat - 1;
2900 switch (windowDatumType)
2903 win16[winIndx] = (int16_t)(winVal);
2906 win32[winIndx] = (int32_t)(winVal);
2931 int32_t rxAntIdx, idx;
2932 volatile uint32_t startTime;
2933 volatile uint32_t startTimeWait;
2934 uint32_t waitingTime = 0;
2935 uint16_t subframeIndx = obj->subframeIndx;
2937 (checkDetMatrixTx == 1));
2938 uint32_t pingPongIdx = *pingPongIdxPtr;
2941 for (rxAntIdx = 0; rxAntIdx < (obj->numRxAntennas * obj->numTxAntennas); rxAntIdx++)
2944 startTimeWait = Cycleprofiler_getTimeStamp();
2946 waitingTime += Cycleprofiler_getTimeStamp() - startTimeWait;
2949 if ((rangeIdx < obj->numRangeBins - 1) ||
2950 (rxAntIdx < (obj->numRxAntennas * obj->numTxAntennas) - 1) ||
2968 mmwavelib_windowing16x32(
2969 (int16_t *)&obj->dstPingPong[
pingPongId(pingPongIdx) * obj->numDopplerBins],
2971 (int32_t *)obj->windowingBuf2D,
2972 obj->numDopplerBins);
2975 (int32_t *)obj->twiddle32x32_2D,
2976 obj->numDopplerBins,
2977 (int32_t *)obj->windowingBuf2D,
2978 (int32_t *)obj->fftOut2D);
2980 mmwavelib_log2Abs32(
2981 (int32_t *)obj->fftOut2D,
2983 obj->numDopplerBins);
2988 if ((rangeIdx > 0) && (checkDetMatrixTx == 1))
2990 startTimeWait = Cycleprofiler_getTimeStamp();
2992 waitingTime += Cycleprofiler_getTimeStamp() - startTimeWait;
2995 _nassert((uint32_t) sumAbs % 8 == 0);
2996 _nassert((uint32_t) obj->log2Abs % 8 == 0);
2997 _nassert(obj->numDopplerBins % 8 == 0);
2998 for (idx = 0; idx < obj->numDopplerBins; idx++)
3000 sumAbs[idx] = obj->log2Abs[idx];
3005 mmwavelib_accum16(obj->log2Abs, sumAbs, obj->numDopplerBins);
3010 *pingPongIdxPtr = pingPongIdx;
3036 uint32_t numDetObjPerCfar,
3037 uint16_t dopplerLine,
3038 uint32_t numDetObj2D,
3039 uint16_t * restrict sumAbsRange)
3042 uint32_t detIdx1, detIdx2;
3044 float disambiguatedSpeed;
3046 uint32_t detObj1DRawIdx;
3047 int16_t dopplerIdxActual;
3048 uint32_t oneQFormat = (1 << obj->xyzOutputQFormat);
3051 uint16_t * restrict cfarDetObjIndexBuf = obj->cfarDetObjIndexBuf;
3052 uint16_t * restrict cfarDetObjSNR = obj->cfarDetObjSNR;
3053 uint16_t maxNumObj2DRaw = obj->maxNumObj2DRaw;
3056 for (detIdx2 = 0; detIdx2 < numDetObjPerCfar; detIdx2++)
3059 if (numDetObj2D < maxNumObj2DRaw)
3064 rangeIdx = cfarDetObjIndexBuf[detIdx2];
3070 if ((detObj1DRaw[detObj1DRawIdx].velDisambFacValidity >= 0) &&
3071 (detObj1DRaw[detObj1DRawIdx].dopplerIdx == dopplerLine))
3076 if (dopplerLine >= (obj->numDopplerBins >> 1))
3078 dopplerIdxActual = dopplerLine - obj->numDopplerBins;
3082 dopplerIdxActual = dopplerLine;
3085 disambiguatedSpeed = ((float)dopplerIdxActual * obj->velResolution) +
3086 ((float)(2*(detObj1DRaw[detObj1DRawIdx].velDisambFacValidity - 1)) * obj->maxUnambiguousVel);
3097 detObj2DRaw[numDetObj2D].
dopplerIdx = dopplerLine;
3098 detObj2DRaw[numDetObj2D].rangeIdx = rangeIdx;
3100 detObj2DRaw[numDetObj2D].speed = (int16_t) (disambiguatedSpeed * oneQFormat);
3101 detObj2DRaw[numDetObj2D].range = (uint16_t)(range * oneQFormat);
3103 detObj2DRaw[numDetObj2D].peakVal = sumAbsRange[rangeIdx] >> obj->log2numVirtAnt;;
3105 detObj2DRaw[numDetObj2D].rangeSNRdB = cfarDetObjSNR[detIdx2] >> obj->log2numVirtAnt;
3106 detObj2DRaw[numDetObj2D].dopplerSNRdB = detObj1DRaw[detObj1DRawIdx].dopplerSNRdB;
3135 uint32_t numDetObjPerCfar,
3136 uint16_t dopplerLine,
3137 uint32_t numDetObj2D,
3138 uint16_t * restrict sumAbsRange)
3144 int16_t dopplerIdxActual;
3145 uint32_t oneQFormat = (1 << obj->xyzOutputQFormat);
3147 uint16_t * restrict cfarDetObjIndexBuf = obj->cfarDetObjIndexBuf;
3148 uint16_t * restrict cfarDetObjSNR = obj->cfarDetObjSNR;
3151 for (detIdx2 = 0; detIdx2 < numDetObjPerCfar; detIdx2++)
3154 if (numDetObj2D < obj->maxNumObj2DRaw)
3156 rangeIdx = cfarDetObjIndexBuf[detIdx2];
3160 if (dopplerLine >= (obj->numDopplerBins >> 1))
3162 dopplerIdxActual = (int16_t) dopplerLine - (int16_t)obj->numDopplerBins;
3166 dopplerIdxActual = (int16_t)dopplerLine;
3169 speed = ((float)dopplerIdxActual) * obj->velResolution;
3178 detObj2DRaw[numDetObj2D].rangeIdx = rangeIdx;
3179 detObj2DRaw[numDetObj2D].dopplerIdx = dopplerLine;
3181 detObj2DRaw[numDetObj2D].speed = (int16_t) (speed * oneQFormat);
3182 detObj2DRaw[numDetObj2D].range = (uint16_t)(range * oneQFormat);
3184 detObj2DRaw[numDetObj2D].peakVal = sumAbsRange[rangeIdx] >> obj->log2numVirtAnt;
3186 detObj2DRaw[numDetObj2D].rangeSNRdB = cfarDetObjSNR[detIdx2] >> obj->log2numVirtAnt;
3188 detObj2DRaw[numDetObj2D].dopplerSNRdB = 0;
3211 uint32_t
pruneToPeaks(uint16_t* restrict cfarDetObjIndexBuf,
3212 uint16_t* restrict cfarDetObjSNR,
3213 uint32_t numDetObjPerCfar,
3214 uint16_t* restrict sumAbs,
3218 uint32_t numDetObjPerCfarActual = 0;
3219 uint16_t currObjLoc, prevIdx, nextIdx;
3221 if (numDetObjPerCfar == 0)
3226 for (detIdx2 = 0; detIdx2 < numDetObjPerCfar; detIdx2++)
3228 currObjLoc = cfarDetObjIndexBuf[detIdx2];
3230 if (currObjLoc == 0)
3232 prevIdx = numBins - 1;
3236 prevIdx = currObjLoc - 1;
3239 if (currObjLoc == numBins - 1)
3245 nextIdx = currObjLoc + 1;
3248 if ((sumAbs[nextIdx] < sumAbs[currObjLoc])
3249 && (sumAbs[prevIdx] < sumAbs[currObjLoc]))
3251 cfarDetObjIndexBuf[numDetObjPerCfarActual] = currObjLoc;
3252 cfarDetObjSNR[numDetObjPerCfarActual] = cfarDetObjSNR[detIdx2];
3253 numDetObjPerCfarActual++;
3257 return numDetObjPerCfarActual;
3280 uint16_t * restrict cfarDetObjSNR,
3281 uint32_t numDetObjPerCfar,
3282 uint16_t * restrict sumAbs,
3286 uint32_t detIdx1, detIdx2;
3288 uint16_t currMaxIdx;
3292 if (numDetObjPerCfar <= 1)
3294 return numDetObjPerCfar;
3299 if (K >= numDetObjPerCfar)
3301 K = numDetObjPerCfar;
3306 _nassert((uint32_t) K > 0);
3307 for (detIdx1 = 0; detIdx1 < K; detIdx1++)
3310 for (detIdx2 = detIdx1; detIdx2 < numDetObjPerCfar; detIdx2++)
3312 if (currMax <= sumAbs[cfarDetObjIndexBuf[detIdx2]])
3314 currMax = sumAbs[cfarDetObjIndexBuf[detIdx2]];
3315 currMaxIdx = detIdx2;
3320 tempIdx = cfarDetObjIndexBuf[detIdx1];
3321 tempSNR = cfarDetObjSNR[detIdx1];
3322 cfarDetObjIndexBuf[detIdx1] = cfarDetObjIndexBuf[currMaxIdx];
3323 cfarDetObjSNR[detIdx1] = cfarDetObjSNR[currMaxIdx];
3324 cfarDetObjIndexBuf[currMaxIdx] = tempIdx;
3325 cfarDetObjSNR[currMaxIdx] = tempSNR;
3404 uint16_t out[restrict],
3405 uint16_t outSNR[restrict], uint32_t len,
3406 uint32_t const1, uint32_t const2,
3407 uint32_t guardLen, uint32_t noiseLen, uint32_t minIndxToIgnoreHPF)
3409 uint32_t idx, idxLeftNext, idxLeftPrev, idxRightNext,
3410 idxRightPrev, outIdx, idxCUT;
3411 uint32_t sum, sumLeft, sumRight;
3417 for (idx = 0; idx < noiseLen; idx++)
3419 sumRight += inp[idx + guardLen + 1U];
3424 if ((uint32_t) inp[idxCUT] > ((sumRight >> (const2 - 1U)) + const1))
3426 out[outIdx] = (uint16_t)idxCUT;
3428 outSNR[outIdx] = inp[idxCUT] - (sumRight >> (const2 - 1));
3434 idxRightPrev = idxCUT + guardLen;
3435 idxRightNext = idxRightPrev + noiseLen;
3436 for (idx = 0; idx < (noiseLen + guardLen - 1U); idx++)
3438 sumRight = (sumRight + inp[idxRightNext]) - inp[idxRightPrev];
3444 sumLeft += inp[idxLeftNext];
3448 if ((uint32_t) inp[idxCUT] > ((sumRight >> (const2 - 1U)) + const1))
3450 out[outIdx] = (uint16_t)idxCUT;
3451 outSNR[outIdx] = inp[idxCUT] - (sumRight >> (const2 - 1));
3458 sumRight = (sumRight + inp[idxRightNext]) - inp[idxRightPrev];
3464 sum = (sumLeft < sumRight) ? sumLeft : sumRight;
3465 if ((uint32_t) inp[idxCUT] > ((sum >> (const2-1U)) + const1))
3467 out[outIdx] = (uint16_t)idxCUT;
3468 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3474 for (idx = 0; idx < (len - 2U*(noiseLen + guardLen) - 1U); idx++)
3476 sumLeft = (sumLeft + inp[idxLeftNext]) - inp[idxLeftPrev];
3477 sumRight = (sumRight + inp[idxRightNext]) - inp[idxRightPrev];
3483 if (idx < minIndxToIgnoreHPF)
3489 sum = (sumLeft < sumRight) ? sumLeft : sumRight;
3492 if ((uint32_t)(inp[idxCUT]) >((sum >> (const2 - 1U)) + const1))
3494 out[outIdx] = idxCUT;
3495 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1U));
3503 for (idx = 0; idx < (noiseLen + guardLen); idx++)
3505 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3508 if ((uint32_t)inp[idxCUT] >((sumLeft >> (const2 - 1)) + const1))
3510 out[outIdx] = idxCUT;
3511 outSNR[outIdx] = inp[idxCUT] - (sumLeft >> (const2 - 1));
3550 uint16_t out[restrict],
3551 uint16_t outSNR[restrict],
3553 uint32_t const1, uint32_t const2,
3554 uint32_t guardLen, uint32_t noiseLen)
3556 uint32_t idx, idxLeftNext, idxLeftPrev, idxRightNext,
3557 idxRightPrev, outIdx, idxCUT;
3558 uint32_t sum, sumLeft, sumRight;
3564 for (idx = 1; idx <= noiseLen; idx++)
3566 sumLeft += inp[len - guardLen - idx];
3569 for (idx = 1; idx <= noiseLen; idx++)
3571 sumRight += inp[idx + guardLen];
3575 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3576 if ((uint32_t) inp[0] > ((sum >> (const2-1)) + const1))
3579 outSNR[outIdx] = inp[0] - (sum >> (const2 - 1));
3584 idxLeftPrev = len - guardLen - noiseLen;
3585 idxLeftNext = idxLeftPrev + noiseLen;
3586 idxRightPrev = 1 + guardLen;
3587 idxRightNext = idxRightPrev + noiseLen;
3588 for (idxCUT = 1; idxCUT <= guardLen; idxCUT++)
3590 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3593 sumRight += inp[idxRightNext] - inp[idxRightPrev];
3596 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3598 if ((uint32_t) (inp[idxCUT]) > ((sum >> (const2 - 1)) + const1))
3600 out[outIdx] = idxCUT;
3601 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3608 for (idxCUT = guardLen + 1; idxCUT <= guardLen + noiseLen;
3611 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3614 sumRight += inp[idxRightNext] - inp[idxRightPrev];
3617 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3618 if ((uint32_t) (inp[idxCUT]) > ((sum >> (const2 - 1)) + const1))
3620 out[outIdx] = idxCUT;
3621 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3628 for (idxCUT = guardLen + noiseLen + 1;
3629 idxCUT < len - (noiseLen + guardLen); idxCUT++)
3631 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3634 sumRight += inp[idxRightNext] - inp[idxRightPrev];
3637 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3638 if ((uint32_t) (inp[idxCUT]) > ((sum >> (const2 - 1)) + const1))
3640 out[outIdx] = idxCUT;
3641 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3648 for (idxCUT = len - (noiseLen + guardLen);
3649 idxCUT < len - guardLen; idxCUT++)
3651 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3654 sumRight += inp[idxRightNext] - inp[idxRightPrev];
3657 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3658 if ((uint32_t) (inp[idxCUT]) > ((sum >> (const2 - 1)) + const1))
3660 out[outIdx] = idxCUT;
3661 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3668 for (idxCUT = len - guardLen; idxCUT < len; idxCUT++)
3670 sumLeft += inp[idxLeftNext] - inp[idxLeftPrev];
3673 sumRight += inp[idxRightNext] - inp[idxRightPrev];
3676 sum = (sumLeft < sumRight) ? sumLeft:sumRight;
3677 if ((uint32_t) (inp[idxCUT]) > ((sum >> (const2 - 1)) + const1))
3679 out[outIdx] = idxCUT;
3680 outSNR[outIdx] = inp[idxCUT] - (sum >> (const2 - 1));
3715 uint32_t numDetectedObjects,
3716 uint16_t* detMatrix,
3717 uint32_t numRangeBins,
3718 uint32_t numDopplerBins,
3719 uint32_t groupInDopplerDirection,
3720 uint32_t groupInRangeDirection)
3723 int32_t rowStart, rowEnd;
3724 uint32_t numObjOut = 0;
3725 uint32_t rangeIdx, dopplerIdx;
3727 uint16_t kernel[9], detectedObjFlag;
3729 uint32_t startInd, stepInd, endInd;
3732 if ((groupInDopplerDirection == 1) && (groupInRangeDirection == 1))
3739 else if ((groupInDopplerDirection == 0) && (groupInRangeDirection == 1))
3746 else if ((groupInDopplerDirection == 1) && (groupInRangeDirection == 0))
3756 return numDetectedObjects;
3760 for(i = 0; i < numDetectedObjects; i++)
3765 detectedObjFlag = 1;
3768 tempPtr = detMatrix + (rangeIdx-1)*numDopplerBins;
3774 tempPtr = detMatrix + (rangeIdx)*numDopplerBins;
3776 memset((
void *) kernel, 0, 3 *
sizeof(uint16_t));
3778 else if (rangeIdx == numRangeBins-1)
3781 memset((
void *) &kernel[6], 0, 3 *
sizeof(uint16_t));
3784 for (j = rowStart; j <= rowEnd; j++)
3786 for (k = 0; k < 3; k++)
3788 l = dopplerIdx + (k - 1);
3791 l += numDopplerBins;
3793 else if(l >= numDopplerBins)
3795 l -= numDopplerBins;
3797 kernel[j*3+k] = tempPtr[l];
3799 tempPtr += numDopplerBins;
3804 for (k = startInd; k <= endInd; k += stepInd)
3806 if(kernel[k] > kernel[4])
3808 detectedObjFlag = 0;
3812 if (detectedObjFlag == 1)
3814 objOut[numObjOut] = objRaw[i];
3850 uint32_t numDetectedObjects,
3851 uint16_t * restrict detMatrix,
3852 uint32_t numRangeBins,
3853 uint32_t numDopplerBins)
3856 uint32_t numObjOut = 0;
3857 uint32_t rangeIdx, dopplerIdx;
3859 uint16_t kernel[3], detectedObjFlag;
3865 for(i = 0; i < numDetectedObjects; i++)
3867 rangeIdx = objOut[i].rangeIdx;
3868 dopplerIdx = objOut[i].dopplerIdx;
3870 detectedObjFlag = 1;
3873 tempPtr = detMatrix + (rangeIdx)*numDopplerBins;
3875 for (k = 0; k < 3; k++)
3877 l = dopplerIdx + (k - 1);
3881 l += numDopplerBins;
3883 else if(l >= numDopplerBins)
3885 l -= numDopplerBins;
3888 kernel[k] = tempPtr[l];
3892 if ( (kernel[1] < kernel[0]) ||
3893 (kernel[1] < kernel[2]))
3895 detectedObjFlag = 0;
3898 if (detectedObjFlag == 1)
3900 objOut[numObjOut] = objOut[i];
3922 uint16_t
computeSinAzimSNR(
float * azimuthMagSqr, uint16_t azimIdx, uint16_t numVirtualAntAzim, uint16_t numAngleBins, uint16_t xyzOutputQFormat)
3924 uint16_t ik, Idx, stepSize;
3926 stepSize = numAngleBins/numVirtualAntAzim;
3927 float NoiseFloorSqrSum = 0;
3930 for (ik = 1; ik < numVirtualAntAzim ; ik ++)
3932 Idx = stepSize*ik + azimIdx;
3933 if (Idx > (numAngleBins - 1))
3935 Idx -= numAngleBins;
3939 NoiseFloorSqrSum += azimuthMagSqr[Idx];
3943 SNRflt = divsp((azimuthMagSqr[azimIdx]*(numVirtualAntAzim-1)),NoiseFloorSqrSum);
3946 SNRflt = (SNRflt * (float) (1 << xyzOutputQFormat));
3947 if (SNRflt > 65535.0f)
3953 SNR = (uint16_t) _spint(SNRflt);
3974 float convertSNRdBToVar(uint16_t SNRdB,uint16_t bitW, uint16_t n_samples,
float resolution)
3977 float scaleFac = (n_samples*resolution);
3978 float resThresh = 2 * resolution * resolution;
3979 float invSNRlin =
antilog2(-SNRdB, bitW) * 2;
3982 fVar = (float)invSNRlin * (6.0f/((2.0f*
PI_)*(2.0f*
PI_))) * recipsp((n_samples*n_samples - 1));
3985 RVar = fVar*scaleFac*scaleFac;
3987 if (RVar < resThresh)
4011 float convertSNRLinToVar(uint16_t SNRLin,uint16_t bitW, uint16_t n_samples,
float resolution)
4014 float scaleFac = (n_samples*resolution);
4017 DebugP_assert(SNRLin);
4018 invSNRlin = recipsp( (
float) SNRLin) * ((float) (1 << bitW));
4021 fVar = (float)invSNRlin * (6.0f/((2.0f*
PI_)*(2.0f*
PI_))) * recipsp((n_samples*n_samples - 1));
4024 RVar = fVar*scaleFac*scaleFac;
4040 float antilog2(int32_t inputActual, uint16_t fracBitIn)
4043 float input = (float)inputActual;
4045 input = divsp(input , (
float)(1 << fracBitIn));
4046 output = exp2sp(input);
4064 volatile uint32_t detIdx2;
4065 uint32_t numChirpTypes = 1;
4067 volatile uint32_t startTime;
4068 volatile uint32_t startTimeWait;
4069 uint32_t waitingTime = 0;
4071 uint32_t cubeOffset;
4081 for (detIdx2 = 0; detIdx2 < numDetObj2D; detIdx2++)
4086 if (subframeIndx == 0)
4100 (uint8_t *)(&obj->
radarCube[cubeOffset]),
4105 if (subframeIndx == 0)
4118 (uint8_t *)(&obj->
radarCube[cubeOffset]),
4126 startTimeWait = Cycleprofiler_getTimeStamp();
4128 waitingTime += Cycleprofiler_getTimeStamp() - startTimeWait;
4148 mmwavelib_dftSingleBinWithWindow(
4152 (uint64_t *) &obj->
antInp[rxAntIdx],
4171 for (rxAntIdx = 0; rxAntIdx < (obj->
numRxAntennas); rxAntIdx++)
4180 for (rxAntIdx = 0; rxAntIdx < (obj->
numRxAntennas); rxAntIdx++)
4190 for (rxAntIdx = 0; rxAntIdx < (obj->
numRxAntennas); rxAntIdx++)
4197 for (rxAntIdx = 0; rxAntIdx < (obj->
numRxAntennas); rxAntIdx++)
4276 for(jj = obj->
numRxAntennas; jj<obj->numVirtualAntAzim; jj++)
4327 uint16_t maxNumClusters,
4331 uint32_t outputIdx, stateIdx;
4336 int32_t assocIndx = -1;
4340 for (stateIdx = 0; stateIdx < maxNumClusters; stateIdx++)
4342 int32_t isAssociated = 0;
4344 if (state[stateIdx].numPoints == 0)
4350 distSqMax = UINT32_MAX;
4351 for (outputIdx = 0; outputIdx < output->numCluster; outputIdx++)
4354 if (output->report[outputIdx].numPoints == 0)
4360 c = (state[stateIdx].avgVel - output->report[outputIdx].avgVel);
4362 vFactorTmp = vFactor;
4364 if (_abs(state[stateIdx].avgVel) < vFactorTmp)
4366 vFactorTmp = _abs(state[stateIdx].avgVel);
4369 if (_abs(c) > vFactorTmp)
4375 a = (state[stateIdx].xCenter - output->report[outputIdx].xCenter);
4376 b = (state[stateIdx].yCenter - output->report[outputIdx].yCenter);
4377 distSq = (a*a + b*b);
4380 if (distSq < epsilon2)
4382 if (distSq < distSqMax)
4385 assocIndx = outputIdx;
4390 if (distSqMax < UINT32_MAX)
4392 state[stateIdx].xCenter = output->report[assocIndx].xCenter;
4393 state[stateIdx].yCenter = output->report[assocIndx].yCenter;
4394 state[stateIdx].numPoints = output->report[assocIndx].numPoints;
4395 state[stateIdx].avgVel = output->report[assocIndx].avgVel;
4398 state[stateIdx].xSize = (int16_t)(7*((int32_t)state[stateIdx].xSize) + (int32_t)(output->report[assocIndx].xSize)) >> 3;
4399 state[stateIdx].ySize = (int16_t)(7*((int32_t)state[stateIdx].ySize) + (int32_t)(output->report[assocIndx].ySize)) >> 3;
4403 output->report[assocIndx].numPoints = 0;
4407 if (isAssociated == 0)
4409 state[stateIdx].numPoints = 0;
4413 for (outputIdx = 0; outputIdx < output->numCluster; outputIdx++)
4415 if (output->report[outputIdx].numPoints == 0)
4421 for (stateIdx = 0; stateIdx < maxNumClusters; stateIdx++)
4424 if (state[stateIdx].numPoints == 0)
4426 state[stateIdx] = output->report[outputIdx];
4427 output->report[outputIdx].numPoints = 0;
4451 #define TWENTY_TWO_DB_DOPPLER_SNR ((22 *(256))/6)
4452 #define EIGHTEEN_DB_DOPPLER_SNR ((18 *(256))/6)
4453 #define ZERO_POINT_FIVE_METERS (0.5f * 128)
4454 #define FOUR_POINT_ZERO_METERS (4 * 128)
4467 _nassert((uint32_t) detObjFinal % 8 == 0);
4468 _nassert((uint32_t) detObj2D % 8 == 0);
4472 for (ik = 0; ik < obj->
numDetObj; ik ++)
4474 detObjFinal[ik].speed = detObj2D[ik].speed;
4475 detObjFinal[ik].peakVal = detObj2D[ik].peakVal;
4476 detObjFinal[ik].x = detObj2D[ik].x;
4477 detObjFinal[ik].y = detObj2D[ik].y;
4478 detObjFinal[ik].z = detObj2D[ik].z;
4480 #ifdef SEND_SNR_INFO
4481 detObjFinal[ik].rangeSNRdB = detObj2D[ik].rangeSNRdB;
4482 detObjFinal[ik].dopplerSNRdB = detObj2D[ik].dopplerSNRdB;
4490 _nassert((uint32_t) clusterReport % 8 == 0);
4491 _nassert((uint32_t) clusterRepFinal % 8 == 0);
4496 if (clusterReport[ik].numPoints == 0)
4501 clusterRepFinal[jk].xCenter = clusterReport[ik].xCenter;
4502 clusterRepFinal[jk].yCenter = clusterReport[ik].yCenter;
4503 clusterRepFinal[jk].xSize = clusterReport[ik].xSize;
4504 clusterRepFinal[jk].ySize = clusterReport[ik].ySize;
4513 _nassert((uint32_t) trackerState % 8 == 0);
4514 _nassert((uint32_t) trackerOpFinal % 8 == 0);
4521 if (trackerState[ik].validity == 0)
4553 int16_t binIdx, binIdxTmp, nExp;
4564 for (ik = 0; ik < obj->
numDetObj; ik ++)
4566 range = (uint16_t) detObj2D[ik].range;
4571 if (range < obj->parkingAssistMinRange)
4575 sinAzim = (int32_t) detObj2D[ik].sinAzim;
4594 if (detObj2D[ik].dopplerIdx == 0)
4613 for (jk = 0; jk < 2*nExp + 1; jk++)
4615 binIdxTmp = binIdx - nExp + jk;
4714 for (ik = 0; ik < numCluster; ik ++)
4721 trackingInput[jk] = trackingInput[ik];
4747 float ym1, yp1, thetaPk;
4749 if (indx == len - 1)
4767 Den = (2.0f*( (2.0f*y0) - yp1 - ym1));
4774 thetaPk = (yp1 - ym1)* recipsp(Den);
4800 float y0 = (float)
antilog2(y[indx], fracBitIn);
4801 float ym1, yp1, thetaPk;
4805 if (indx == len - 1)
4811 yp1 =
antilog2(y[indx + 1], fracBitIn);
4816 ym1 =
antilog2(y[len - 1], fracBitIn);
4820 ym1 =
antilog2(y[indx - 1], fracBitIn);
4823 Den = (2.0f*( (2.0f*y0) - yp1 - ym1));
4833 thetaPk = (yp1 - ym1)* recipsp(Den);
4870 int32_t numDopplerBins,
4871 uint32_t *azimuthModCoefs,
4872 uint32_t *azimuthModCoefsThirdBin,
4873 uint32_t *azimuthModCoefsTwoThirdBin,
4879 uint32_t expDoppComp;
4880 int32_t dopplerCompensationIdx = dopplerIdx;
4891 if (dopplerCompensationIdx >= (numDopplerBins >> 1))
4893 dopplerCompensationIdx -= (int32_t)numDopplerBins;
4897 dopplerCompensationIdx = ((dopplerCompensationIdx * txAntIdx )/numTxAnt);
4899 if (dopplerCompensationIdx < 0)
4901 dopplerCompensationIdx += (int32_t) numDopplerBins;
4903 expDoppComp = azimuthModCoefs[dopplerCompensationIdx];
4905 if ((dopplerIdx%numTxAnt) == 1)
4907 expDoppComp = _cmpyr1(expDoppComp, *azimuthModCoefsThirdBin);
4909 else if((dopplerIdx%numTxAnt) == 2)
4911 expDoppComp = _cmpyr1(expDoppComp, *azimuthModCoefsTwoThirdBin);
4915 for (antIndx = 0; antIndx < numAnt; antIndx++)
4917 azimuthVal = _amem8(&azimuthIn[antIndx]);
4918 Re = _ssub(_mpyhir(expDoppComp, _loll(azimuthVal) ),
4919 _mpylir(expDoppComp, _hill(azimuthVal)));
4920 Im = _sadd(_mpylir(expDoppComp, _loll(azimuthVal)),
4921 _mpyhir(expDoppComp, _hill(azimuthVal)));
4922 _amem8(&azimuthIn[antIndx]) = _itoll(Im, Re);
4949 uint32_t rxChCompVal;
4953 for (antIndx = 0; antIndx < numAnt; antIndx++)
4955 azimuthVal = _amem8(&input[antIndx]);
4957 rxChCompVal = _amem4(&rxChComp[antIndx]);
4961 Re = _ssub(_mpyhir(rxChCompVal, _loll(azimuthVal) ),
4962 _mpylir(rxChCompVal, _hill(azimuthVal)));
4963 Im = _sadd(_mpylir(rxChCompVal, _loll(azimuthVal)),
4964 _mpyhir(rxChCompVal, _hill(azimuthVal)));
4965 _amem8(&input[antIndx]) = _itoll(Im, Re);
4988 float * azimuthMagSqr)
4992 float Wx, offset, sMaxIdxFlt;
4996 uint32_t oneQFormat = (1 << xyzOutputQFormat);
5003 range = ((float) obj->
detObj2D[objIndex].
range) * invOneQFormat;
5005 if (azimIdx > ((numAngleBins >> 1) - 1))
5007 sMaxIdx = azimIdx - numAngleBins;
5016 sMaxIdxFlt = ((float)sMaxIdx) + offset;
5022 temp = range*range - x*x;
5058 float * azimuthMagSqr)
5062 float Wx, offset, sMaxIdxFlt, Wz;
5066 uint32_t oneQFormat = (1 << xyzOutputQFormat);
5070 float peakAzimRe, peakAzimIm, peakElevRe, peakElevIm;
5071 float tempRe, tempIm;
5077 range = ((float) obj->
detObj2D[objIndex].
range) * invOneQFormat;
5079 if (azimIdx > ((numAngleBins >> 1) - 1))
5081 sMaxIdx = azimIdx - numAngleBins;
5090 sMaxIdxFlt = ((float)sMaxIdx) + offset;
5097 peakAzimIm = (float) obj->
azimuthOut[azimIdx].imag;
5098 peakAzimRe = (
float) obj->
azimuthOut[azimIdx].real;
5103 tempIm = (peakAzimIm * peakElevRe) - (peakAzimRe * peakElevIm);
5104 tempRe = (peakAzimRe * peakElevRe) + (peakAzimIm * peakElevIm);
5106 Wz = (float) atan2sp(tempIm, tempRe) * (1.0f/
PI_) ;
5119 temp = (range*range) - (x*x) - (z*z);
5177 uint16_t* restrict cfarDetObjSNR,
5178 uint32_t numDetObjPerCfar,
5179 uint16_t* restrict sumAbs,
5184 uint32_t numDetObjPerCfarActual = 0;
5185 uint16_t currObjLoc, prevIdx, nextIdx;
5186 uint16_t prevPrevIdx, nextNextIdx;
5187 uint16_t is_peak, is_neighbourOfPeakNext, is_neighbourOfPeakPrev;
5189 if (numDetObjPerCfar == 0)
5194 for (detIdx2 = 0; detIdx2 < numDetObjPerCfar; detIdx2++)
5196 currObjLoc = cfarDetObjIndexBuf[detIdx2];
5198 if (currObjLoc == 0)
5200 prevIdx = numBins - 1;
5204 prevIdx = currObjLoc - 1;
5209 prevPrevIdx = numBins - 1;
5213 prevPrevIdx = prevIdx ;
5216 if (currObjLoc == numBins - 1)
5222 nextIdx = currObjLoc + 1;
5225 if (nextIdx == numBins - 1)
5231 nextNextIdx = currObjLoc + 1;
5234 is_peak = ((sumAbs[nextIdx] < sumAbs[currObjLoc]) && (sumAbs[prevIdx] < sumAbs[currObjLoc]));
5235 is_neighbourOfPeakNext = ((sumAbs[nextNextIdx] < sumAbs[currObjLoc]) && (sumAbs[prevIdx] < sumAbs[currObjLoc]));
5236 is_neighbourOfPeakPrev = ((sumAbs[nextIdx] < sumAbs[currObjLoc]) && (sumAbs[prevPrevIdx] < sumAbs[currObjLoc]));
5237 if (is_peak || is_neighbourOfPeakNext || is_neighbourOfPeakPrev)
5239 cfarDetObjIndexBuf[numDetObjPerCfarActual] = currObjLoc;
5240 cfarDetObjSNR[numDetObjPerCfarActual] = cfarDetObjSNR[detIdx2];
5241 numDetObjPerCfarActual++;
5245 return numDetObjPerCfarActual;