Hello,
I tried to sketch the azimuth radiation pattern of our chip in DDMA mode, so I conducted some tests.
However, the results I obtained were significantly different from example of AMR2944 Evaluation Module User's Guide(Rev.A).
The radiation pattern below is our result (left) and example of document (right).
We developed based on SDK version 04.04.01.02.
In the experiment, the corner reflection was placed to 2.4 meters ahead ith 77.1GHz center frequency and 113Mhz bandwidth.We use rotation stage to ensure the relative positions of corner reflection and our chip.
At the RxChPhaseMeasure function in objectdetection.c, we extract azimuth samples of all channels (4Tx, 4Rx) associated with the strongest target selected in the function, and multiply them by the antenna calibration parameters before saving them to the rxChPhaseComp structure.
The execution of below code, we setting the calibration_flag = 2
for (antennaIdx = 0; antennaIdx < staticCfg->numVirtualAntennas; antennaIdx++)
{
scal = 32768./ antMagSq[antennaIdx] * sqrt(antMagSqMin);
if(antennaIdx < staticCfg->numVirtualAntAzim){ //Azimuth
if(calibration_flag == 1)// rx channel calibration, //TODO: Wood, Need change this magic number (1) to "FRAME_RUN_CALIB_MODE"
{
temp = (int32_t) MATHUTILS_ROUND_FLOAT(scal * detObjList[objIdxMax].azimSamples[antennaIdx].real);
MATHUTILS_SATURATE16(temp);
compRxChanCfg->rxChPhaseComp[antennaIdx].real = (int16_t) (temp);
temp = (int32_t) MATHUTILS_ROUND_FLOAT(-scal * detObjList[objIdxMax].azimSamples[antennaIdx].imag);
MATHUTILS_SATURATE16(temp);
compRxChanCfg->rxChPhaseComp[antennaIdx].imag = (int16_t) (temp);
}
else //FRAME_RUN_DOPPLER_MODE
{
/* 3. Azimuth Antenna Calibration:
* Multiply azimuth samples (azimSamples) of Doppler FFT with antenna calib params (antennaCalibParams)
*/
azimSamples = (int64_t*) &detObjList[objIdxMax].azimSamples[0];
samplesFlt2 = _dintsp(azimSamples[antennaIdx]);
SamplesCalib[antennaIdx].ddat = _complex_mpysp(samplesFlt2,antennaCalibParams[antennaIdx]);
compRxChanCfg->rxChPhaseComp[antennaIdx].real = (int16_t)SamplesCalib[antennaIdx].cmplx.real;
compRxChanCfg->rxChPhaseComp[antennaIdx].imag = (int16_t)SamplesCalib[antennaIdx].cmplx.imag;
}
}
else{ //Elevation
elevIdx = antennaIdx - staticCfg->numVirtualAntAzim;
if(calibration_flag == 1)// rx channel calibration, //TODO: Wood, Need change this magic number (1) to "FRAME_RUN_CALIB_MODE"
{
temp = (int32_t) MATHUTILS_ROUND_FLOAT(scal * detObjList[objIdxMax].elevSamples[elevIdx].real);
MATHUTILS_SATURATE16(temp);
compRxChanCfg->rxChPhaseComp[antennaIdx].real = (int16_t) (temp);
temp = (int32_t) MATHUTILS_ROUND_FLOAT(-scal * detObjList[objIdxMax].elevSamples[elevIdx].imag);
MATHUTILS_SATURATE16(temp);
compRxChanCfg->rxChPhaseComp[antennaIdx].imag = (int16_t) (temp);
}
else //calibration_flag == 2 , FRAME_RUN_DOPPLER_MODE
{
/* 4. Elevation Antenna calibration
* Multiply elev samples with antenna calib params */
elevSamples = (int64_t*) &detObjList[objIdxMax].elevSamples[0];
samplesFlt2 = _dintsp(elevSamples[elevIdx]);
SamplesCalib[antennaIdx].ddat = _complex_mpysp(samplesFlt2,antennaCalibParams[antennaIdx]);
compRxChanCfg->rxChPhaseComp[antennaIdx].real = (int16_t)SamplesCalib[antennaIdx].cmplx.real;
compRxChanCfg->rxChPhaseComp[antennaIdx].imag = (int16_t)SamplesCalib[antennaIdx].cmplx.imag;
}
}
}
The magnitude of all channels before we display is calculated using the following algorithm
Best regards
John