Other Parts Discussed in Thread: AWR2944
你好,工程师
使用AWR2944EVM的SDK,让板子工作在DDMA模式下。
1、参考文档“基于AWR2944的汽车雷达DDMA波形的原理和实现”page14,应该在作AzimuthFFT之前进行幅相补偿。SDK里的代码幅相补偿是在函数
azimPeakSamplem1 = *(uint16_t *)(&azimFFTMat[(m1Idx + DopIdxCurr * obj->cfarAzimFFTCfg.numAzimFFTBins)
* obj->cfarAzimFFTCfg.azimFFTIOCfg.output.bytesPerSample]);
azimPeakSample = *(uint16_t *)(&azimFFTMat[(AzimIdxCurr + DopIdxCurr * obj->cfarAzimFFTCfg.numAzimFFTBins)
* obj->cfarAzimFFTCfg.azimFFTIOCfg.output.bytesPerSample]);
azimPeakSamplep1 = *(uint16_t *)(&azimFFTMat[(p1Idx + DopIdxCurr * obj->cfarAzimFFTCfg.numAzimFFTBins)
* obj->cfarAzimFFTCfg.azimFFTIOCfg.output.bytesPerSample]);
currObjParams->azimPeakSamples[0] = azimPeakSamplem1;
currObjParams->azimPeakSamples[1] = azimPeakSample;
currObjParams->azimPeakSamples[2] = azimPeakSamplep1; if(isValidObj){
/* Interpolate around peak */
peakIdxOffset = DPC_ObjDet_quadInterpAroundPeak(detObjList[objIdx].azimPeakSamples);
/* Get the correct peak index */
peakIdx = detObjList[objIdx].azimIdx + peakIdxOffset;
peakIdxRound = MATHUTILS_ROUND_FLOAT(peakIdx * scaleFac);
if(peakIdxRound > lutSize/2){
peakIdxRound -= lutSize;
}
azimSinPhase = 2 * PI_ * ((float)peakIdxRound) / (lutSize * DX_DIVIDER); /* First copy */
src = ((uint8_t *)dopplerFFTMat);
src = src + (dopSubIdx * obj->dopplerDemodCfg.numBandsTotal + startIdxTxToCopy1) * cfg->staticCfg.numRxAntennas * bytesPerSample;
dst = ((uint8_t *)destDetSubMat);
dst = dst + (dopSubIdx * obj->dopplerDemodCfg.numBandsActive) * cfg->staticCfg.numRxAntennas * bytesPerSample;
uint8_t * calib_dst = dst; //用于存储原来的初地址,用于校准
//uint8_t * calib_dst1 = dst;
memcpy((void*)dst, (void *)src, cfg->staticCfg.numRxAntennas * bytesPerSample * numTxToCopy1);
// memcpy(my2dFFTBuf+4096*demod_count+dopSubIdx*16*8,(void *)src,cfg->staticCfg.numRxAntennas * bytesPerSample * numTxToCopy1);
/* Second copy */
if(numTxToCopy2 > 0){
src = ((uint8_t *)dopplerFFTMat);
src = src + (dopSubIdx * obj->dopplerDemodCfg.numBandsTotal + startIdxTxToCopy2) * cfg->staticCfg.numRxAntennas * bytesPerSample;
dst = ((uint8_t *)destDetSubMat);
dst = dst + (dopSubIdx * obj->dopplerDemodCfg.numBandsActive) * cfg->staticCfg.numRxAntennas * bytesPerSample + cfg->staticCfg.numRxAntennas * bytesPerSample * numTxToCopy1;
memcpy((void*)dst, (void *)src, cfg->staticCfg.numRxAntennas * bytesPerSample * numTxToCopy2);
}
// memcpy(my2dFFTBuf+4096*demod_count+dopSubIdx*128,(void *)calib_dst,128);
int calib_ant_count;
for(calib_ant_count=0;calib_ant_count<16;calib_ant_count++)
{
int32_t dst_curr_Im = *((int32_t*)calib_dst); //取虚部
int32_t dst_curr_Re = *((int32_t*)(calib_dst+4)); //取实部
int32_t dst_curr_Im_temp = dst_curr_Im;
int32_t dst_curr_Re_temp = dst_curr_Re;
dst_curr_Re = dst_curr_Re_temp*objDetObj->commonCfg.antennaCalibParams[2*calib_ant_count+1]-dst_curr_Im_temp*objDetObj->commonCfg.antennaCalibParams[2*calib_ant_count];
dst_curr_Im = dst_curr_Re_temp*objDetObj->commonCfg.antennaCalibParams[2*calib_ant_count]+dst_curr_Im_temp*objDetObj->commonCfg.antennaCalibParams[2*calib_ant_count+1];
memcpy(calib_dst+4,&dst_curr_Re,4);
memcpy(calib_dst,&dst_curr_Im,4);
calib_dst+=8;//指向下一个虚拟天线的值
}