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;//指向下一个虚拟天线的值 }