Other Parts Discussed in Thread: IWR1443
Hello
in the related topic, with the help of mr Curewitz we were able to develop a Platform for acquiring data from 3 TX Antennas based on TDM transmission on our IWR1443Boost connected through a TSW1400 EVM board to our computer.
We are working on objects at ZERO velocity, at the moment. Mostly a Corner Reflector in a non-noisy environment.
We are trying to get AoA. by separating the azimutal and elevation calculations, as suggested earlier on.
For azimutal calculations, we are zero-padding the echoes from the following antennas: TX0RX1 - TX0RX2- TX0RX3 - TX0RX4 - TX2RX1 - TX2RX2 - TX2RX3 - TX2RX4, and we are already obtaining pretty good results by FFTing the rows.
For elevation calculations, we have created a 2x4 Matrix with following echoes:
tx1rx1 tx1rx2 tx1rx3 tx1rx4
tx0rx3 rx0rx4 tx2rx1 tx2rx2
then zero padding the columns, calculating the FFT, and working on either the average or the sum of the obtained peaks.
Where we are not convinced we are operating correctly,is on the topic of Doppler Compensation
We are currently using the same function contained in the Doxygen demo:
1271 static float aoaHwa_calcCompIdx 1272 ( 1273 uint16_t dopplerIdx, 1274 uint32_t numDopplerBins, 1275 uint32_t numTxAnt 1276 ) 1277 { 1278 float dopplerCompensationIdx; 1279 1280 /* Doppler compensation index calculation */ 1281 if (dopplerIdx >= numDopplerBins/2) 1282 { 1283 dopplerCompensationIdx = ((int32_t) dopplerIdx - (int32_t) numDopplerBins); 1284 } 1285 else 1286 { 1287 dopplerCompensationIdx = dopplerIdx; 1288 } 1289 1290 /* Doppler phase correction is 1/2 or (1/3 in elevation case) of the phase between two chirps of the same antenna */ 1291 dopplerCompensationIdx = dopplerCompensationIdx / (float) numTxAnt; 1292 if (dopplerCompensationIdx < 0) 1293 { 1294 dopplerCompensationIdx += (float) numDopplerBins; 1295 } 1296 1297 return dopplerCompensationIdx; 1298 } 1299 1318 static void aoaHwa_dopplerComp 1319 ( 1320 cmplx16ImRe_t *in, 1321 cmplx16ImRe_t *out, 1322 float Cos, 1323 float Sin 1324 ) 1325 { 1326 float yRe, yIm; 1327 1328 /* Rotate symbol (correct the phase) */ 1329 yRe = in->real * Cos + in->imag * Sin; 1330 yIm = in->imag * Cos - in->real * Sin; 1331 out->real = (int16_t) yRe; 1332 out->imag = (int16_t) yIm; 1333 } 1334 1368 static void aoaHwa_dopplerCompensation 1369 ( 1370 uint32_t numDetectedObjects, 1371 uint32_t *srcPtrAzim, 1372 uint32_t *srcPtrElev, 1373 DPIF_CFARDetList *cfarOutList, 1374 uint32_t *dstPtrAzim, 1375 uint32_t *dstPtrElev, 1376 uint32_t numTxAnt, 1377 uint32_t numRxAnt, 1378 uint32_t numVirtualAntAzim, 1379 uint32_t numVirtualAntElev, 1380 uint32_t numDopplerBins 1381 ) 1382 { 1383 uint32_t index; 1384 uint32_t j; 1385 uint16_t dopplerIdx; 1386 float dopplerCompensationIdx; 1387 1388 for(index = 0; index < numDetectedObjects; index ++) 1389 { 1390 dopplerIdx = cfarOutList->dopplerIdx; 1391 1392 /* transfer data corresponding to azimuth virtual antennas (corresponding to chirp of antenna Tx0) */ 1393 for(j = 0; j < numRxAnt; j++) 1394 { 1395 *dstPtrAzim++ = *srcPtrAzim++; 1396 } 1397 1398 /* transfer data corresponding to azimuth virtual antennas (corresponding to chirp of antenna Tx1) */ 1399 if (numVirtualAntAzim > numRxAnt) 1400 { 1401 float Cos,Sin; 1402 1403 dopplerCompensationIdx = aoaHwa_calcCompIdx(dopplerIdx, numDopplerBins, numTxAnt); 1404 1405 Cos = cos(2*PI_*dopplerCompensationIdx/numDopplerBins); 1406 Sin = sin(2*PI_*dopplerCompensationIdx/numDopplerBins); 1407 1408 for(j = numRxAnt; j < numVirtualAntAzim; j++) 1409 { 1410 aoaHwa_dopplerComp((cmplx16ImRe_t *)srcPtrAzim++, (cmplx16ImRe_t *)dstPtrAzim++, Cos, Sin); 1411 } 1412 1413 if (numVirtualAntElev > 0) 1414 { 1415 /* transfer data corresponding to elevation virtual antennas, (corresponding to chirp of antenna Tx2) */ 1416 float Cos2, Sin2; 1417 /* Doppler phase shift is 2/3 */ 1418 Cos2 = Cos * Cos - Sin * Sin; 1419 Sin2 = 2 * Cos * Sin; 1420 for(j = 0; j < numVirtualAntElev; j++) 1421 { 1422 aoaHwa_dopplerComp((cmplx16ImRe_t *)srcPtrElev++, (cmplx16ImRe_t *)dstPtrElev++, Cos2, Sin2); 1423 } 1424 } 1425 } 1426 cfarOutList++; 1427 } 1428 }
But if feels almost as if the compensation is "compensating too much". Plus, we are never getting NEGATIVE values of phi.
We have created our list of points on phi by separing the -15:15 interval in the amount of points fixed by the dimension of our elev_zeropadding, which seems correct.
Thanks again for your kindness