本篇文章主要是介绍main函数中的MmwDemo_dataPathConfigPopulate函数,该函数主要是对雷达的数据路径的一些参数进行配置
int16_t i;
obj->processingPath = POINT_CLOUD_PROCESSING;
obj->subframeIndx = subframeIndx;
obj->numRxAntennas = NUM_RX_CHANNELS;
obj->chirpThreshold = ADCBUFF_CHIRP_THRESHOLD;
obj->numTxAntennas = SUBFRAME_USRR_NUM_TX;
obj->numVirtualAntennas = SUBFRAME_USRR_NUM_VIRT_ANT;
obj->numVirtualAntAzim = 8;
obj->numVirtualAntElev = 4;
obj->numAdcSamples = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES;
obj->numRangeBins = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES;
obj->numDopplerBins = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS;
#if (SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS != SUBFRAME_USRR_CHIRPTYPE_1_NUM_CHIRPS)
#error "the number of chirps in each chirp type is not equal"
#endif
obj->maxUnambiguousVel = SUBFRAME_USRR_MAX_VEL_M_P_S;
/*! @brief Q format of the output x/y/z coordinates */
obj->xyzOutputQFormat = 7;
obj->invOneQFormat = 1.0f/((float)(1U << obj->xyzOutputQFormat));
obj->sinAzimQFormat = 14;
obj->invOneSinAzimFormat = 1.0f/((float)(1U << obj->sinAzimQFormat));
//obj->radarProcConfig.DopplerWinSize =
/*! @brief DC Range antenna signature calibration configuration. */
// obj->calibDcRangeSigCfg.enabled = 0;
obj->txAntennaCount = SUBFRAME_USRR_NUM_TX;
//obj->radarProcConfig.framePeriod = ;
obj->radarProcConfig.numAdcSamplePerChirp = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES;
obj->radarProcConfig.numAdcBitsPerSample = 16;
obj->radarProcConfig.numChirpPerFrame = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS;
obj->radarProcConfig.numTxAntenna = SUBFRAME_USRR_NUM_TX;
obj->radarProcConfig.numAziAntenna = 8; //SUBFRAME_USRR_NUM_AZI_ANT;
obj->radarProcConfig.numAntenna = SUBFRAME_USRR_NUM_VIRT_ANT;
obj->radarProcConfig.numPhyRxAntenna = NUM_RX_CHANNELS;
obj->radarProcConfig.mimoModeFlag = 1; /**<Flag for MIMO mode: 0 -- SIMO, 1 -- TDM MIMO, 2 -- FDM or BF*/
obj->radarProcConfig.numTotalChirpProfile = SUBFRAME_USRR_NUM_TX; /**<number of chirp profiles*/
obj->radarProcConfig.numUniqueChirpProfile = 1; /**<number of unique chirp profiles*/
//obj->radarProcConfig.chirpInterval;
//obj->radarProcConfig.frequencySlopeMHzMicoSec;
//obj->radarProcConfig.adcSamplePeriodMicoSec;
//obj->radarProcConfig.bandWidth;
//obj->radarProcConfig.centerFrequency;
obj->radarProcConfig.fftSize1D = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES;
obj->radarProcConfig.fftSize2D = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS;
obj->radarProcConfig.maxNumDetObj = MAX_DET_OBJECTS_RAW_POINT_CLOUD_PROCESSING;
//obj->radarProcConfig.rangeWinSize = 16;
//obj->radarProcConfig.rangeWindow[0] = 0.0800f;
//obj->radarProcConfig.rangeWindow[1] = 0.0894f;
//obj->radarProcConfig.rangeWindow[2] = 0.1173f;
//obj->radarProcConfig.rangeWindow[3] = 0.1624f;
//obj->radarProcConfig.rangeWindow[4] = 0.2231f;
//obj->radarProcConfig.rangeWindow[5] = 0.2967f;
//obj->radarProcConfig.rangeWindow[6] = 0.3802f;
//obj->radarProcConfig.rangeWindow[7] = 0.4703f;
//obj->radarProcConfig.rangeWindow[8] = 0.5633f;
//obj->radarProcConfig.rangeWindow[9] = 0.6553f;
//obj->radarProcConfig.rangeWindow[10] = 0.7426f;
//obj->radarProcConfig.rangeWindow[11] = 0.8216f;
//obj->radarProcConfig.rangeWindow[12] = 0.8890f;
//obj->radarProcConfig.rangeWindow[13] = 0.9422f;
//obj->radarProcConfig.rangeWindow[14] = 0.9789f;
//obj->radarProcConfig.rangeWindow[15] = 0.9976f;
/* Doppler window parameters. */
obj->radarProcConfig.DopplerWinSize = 4;
obj->radarProcConfig.dopplerWindow[0] = 0.1624f;
obj->radarProcConfig.dopplerWindow[1] = 0.4703f;
obj->radarProcConfig.dopplerWindow[2] = 0.8216f;
obj->radarProcConfig.dopplerWindow[3] = 0.9976f;
for (i = 0; i < 12; i++) //set default
{
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 0] = 1.f;
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 1] = 0.f;
}
// -0.6663 - 0.7457i
for (i = 4; i < 8; i++) //TX1 and TX2 are normal, TX3 needs a big phase adjust.
{
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 0] = -0.6663;
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 1] = -0.7457;
}
//radarModuleCfarConfig cfarConfig;
obj->radarProcConfig.cfarConfig.cfarMethod = 4;
obj->radarProcConfig.cfarConfig.cfarDiscardLeft = 4;
obj->radarProcConfig.cfarConfig.cfarDiscardRight = 5;
obj->radarProcConfig.cfarConfig.refWinSize[0] = 8;
obj->radarProcConfig.cfarConfig.refWinSize[1] = 4;
obj->radarProcConfig.cfarConfig.guardWinSize[0] = 2;
obj->radarProcConfig.cfarConfig.guardWinSize[1] = 0;
obj->radarProcConfig.cfarConfig.thre = 6.3;
obj->radarProcConfig.cfarConfig.dopplerSearchRelThr = 6.3;
obj->radarProcConfig.cfarConfig.log2MagFlag = 0;
obj->radarProcConfig.cfarConfig.clRemoval = 0;
obj->radarProcConfig.cfarConfig.rangeRes = PROFILE_USRR_RANGE_RESOLUTION_METERS;
obj->radarProcConfig.cfarConfig.velocityRes = SUBFRAME_USRR_VEL_RESOLUTION_M_P_S;
//3 1 1047 3 600 10 100
obj->radarProcConfig.doaConfig.doaMethod = 3; /**< DOA method, 3 for MPBF, 4 for DML, 0 for SPBF.*/
obj->radarProcConfig.doaConfig.vmaxUnrollFlag = 1; /**<flag for angle correction for Vmax unrolling */
obj->radarProcConfig.doaConfig.doaGamma = 1.047; /**< gama for DoA_MPBF.*/
obj->radarProcConfig.doaConfig.doaSideLobeLevel_dB = 3;
obj->radarProcConfig.doaConfig.doaSearchRange = 60; /**< DoA search range, from -doaSearchRange to +doaSearchRange.*/
obj->radarProcConfig.doaConfig.doaSearchRes = 1; /**< DoA Resolution.*/
obj->radarProcConfig.doaConfig.doaVarThr = 10; /**< Minimum variance range (in degree) for the output estimation. Estimates with bigger confidence range will not be reported.*/
//obj->radarProcConfig.doaConfig.antSpacing; /**< antenna spacing in unit of lambda/2, size of nRxAnt, only support uniform linear array*/
//obj->radarProcConfig.heatMapMemSize;
//obj->radarProcConfig.heatMapMem;
//obj->radarProcConfig.pFFT1DBuffer;
//clustering
#ifdef TMDEMOV1
obj->radarProcConfig.dbscanConfig.nAccFrames = 4;
obj->radarProcConfig.dbscanConfig.epsilon = 0.4;
obj->radarProcConfig.dbscanConfig.weight = 1.3;
obj->radarProcConfig.dbscanConfig.vFactor = 2.0;
obj->radarProcConfig.dbscanConfig.minPointsInCluster = 3; //obj->radarProcConfig.dbscanConfig.dbscan_nAccFrames - 1;
obj->radarProcConfig.dbscanConfig.fixedPointScale = 256;
obj->radarProcConfig.dbscanConfig.xyzOutputQFormat = 8;
#endif
对上面程序进行解读
obj->processingPath = POINT_CLOUD_PROCESSING; //处理路径
obj->subframeIndx = subframeIndx; //子帧Id
obj->numRxAntennas = NUM_RX_CHANNELS; //接收天线数量
obj->chirpThreshold = ADCBUFF_CHIRP_THRESHOLD; //chirp阈值 也就是每次处理的chirp数
obj->numTxAntennas = SUBFRAME_USRR_NUM_TX; //发射天线的数量
obj->numVirtualAntennas = SUBFRAME_USRR_NUM_VIRT_ANT; //虚拟成的天线的数量
obj->numVirtualAntAzim = 8; //水平方向虚拟的天线数量
obj->numVirtualAntElev = 4; //俯仰方向上虚拟的天线数量
obj->numAdcSamples = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES; //ADC采样点的数量
obj->numRangeBins = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES; //rangebin的数量
obj->numDopplerBins = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS; //dopplerbin的数量
obj->maxUnambiguousVel = SUBFRAME_USRR_MAX_VEL_M_P_S; //最大无模糊速度
/*! @brief Q format of the output x/y/z coordinates */
obj->xyzOutputQFormat = 7;
obj->invOneQFormat = 1.0f/((float)(1U << obj->xyzOutputQFormat));
obj->sinAzimQFormat = 14;
obj->invOneSinAzimFormat = 1.0f/((float)(1U << obj->sinAzimQFormat));
obj->txAntennaCount = SUBFRAME_USRR_NUM_TX; //发射天线的计数变量
obj->radarProcConfig.numAdcSamplePerChirp = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES; //每个chirp中的采样点数量
obj->radarProcConfig.numAdcBitsPerSample = 16; //每个采样点的位数
obj->radarProcConfig.numChirpPerFrame = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS; //每个frame中的chirp数量
obj->radarProcConfig.numTxAntenna = SUBFRAME_USRR_NUM_TX; //发射天线的数量
obj->radarProcConfig.numAziAntenna = 8; //SUBFRAME_USRR_NUM_AZI_ANT; //水平天线的数量
obj->radarProcConfig.numAntenna = SUBFRAME_USRR_NUM_VIRT_ANT; //虚拟天线的数量
obj->radarProcConfig.numPhyRxAntenna = NUM_RX_CHANNELS; //物理上的接收天线的数量
obj->radarProcConfig.mimoModeFlag = 1; //雷达的模式 时分复用 多发多收/**<Flag for MIMO mode: 0 -- SIMO, 1 -- TDM MIMO, 2 -- FDM or BF*/
obj->radarProcConfig.numTotalChirpProfile = SUBFRAME_USRR_NUM_TX; /**<number of chirp profiles*/
obj->radarProcConfig.numUniqueChirpProfile = 1; /**<number of unique chirp profiles*/
obj->radarProcConfig.fftSize1D = SUBFRAME_USRR_NUM_CMPLX_ADC_SAMPLES; //1Dfft的维度大小
obj->radarProcConfig.fftSize2D = SUBFRAME_USRR_CHIRPTYPE_0_NUM_CHIRPS; //2Dfft维度的大小
obj->radarProcConfig.maxNumDetObj = MAX_DET_OBJECTS_RAW_POINT_CLOUD_PROCESSING; //最大的可检测点的数量
obj->radarProcConfig.DopplerWinSize = 4; //多普勒窗的大小
//多普勒窗的系数
obj->radarProcConfig.dopplerWindow[0] = 0.1624f;
obj->radarProcConfig.dopplerWindow[1] = 0.4703f;
obj->radarProcConfig.dopplerWindow[2] = 0.8216f;
obj->radarProcConfig.dopplerWindow[3] = 0.9976f;
//天线的相位系数
for (i = 0; i < 12; i++) //set default
{
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 0] = 1.f; //实部
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 1] = 0.f; //虚部
}
// -0.6663 - 0.7457i
//给发射天线3设置相位系数,因为发射天线3需要较大的相位调整
for (i = 4; i < 8; i++) //TX1 and TX2 are normal, TX3 needs a big phase adjust.
{
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 0] = -0.6663; //实部
obj->radarProcConfig.antPhaseCompCoeff[2 * i + 1] = -0.7457; //虚部
}
obj->radarProcConfig.cfarConfig.cfarMethod = 4; //使用到的CFAR检测的算法
obj->radarProcConfig.cfarConfig.cfarDiscardLeft = 4; //cfar左边要忽略的单元数目
obj->radarProcConfig.cfarConfig.cfarDiscardRight = 5; //cfar右边要忽略的单元数目
obj->radarProcConfig.cfarConfig.refWinSize[0] = 8; //range bin维度上的参考单元的数目
obj->radarProcConfig.cfarConfig.refWinSize[1] = 4; //doppler bin维度上的参考单元的数目
obj->radarProcConfig.cfarConfig.guardWinSize[0] = 2; //range bin维度上的保护单元的数目
obj->radarProcConfig.cfarConfig.guardWinSize[1] = 0; //doppler bin维度上的保护单元的数目
obj->radarProcConfig.cfarConfig.thre = 6.3; //用于比较的阈值
obj->radarProcConfig.cfarConfig.dopplerSearchRelThr = 6.3; //多普勒搜索的阈值
obj->radarProcConfig.cfarConfig.log2MagFlag = 0; //标志位:输入值是否是log2(mag)
obj->radarProcConfig.cfarConfig.clRemoval = 0;
obj->radarProcConfig.cfarConfig.rangeRes = PROFILE_USRR_RANGE_RESOLUTION_METERS; //距离分辨率
obj->radarProcConfig.cfarConfig.velocityRes = SUBFRAME_USRR_VEL_RESOLUTION_M_P_S; //速度分辨率
//3 1 1047 3 600 10 100
obj->radarProcConfig.doaConfig.doaMethod = 3; /**< DOA method, 3 for MPBF, 4 for DML, 0 for SPBF.*/
obj->radarProcConfig.doaConfig.vmaxUnrollFlag = 1; /**<flag for angle correction for Vmax unrolling */
obj->radarProcConfig.doaConfig.doaGamma = 1.047; /**< gama for DoA_MPBF.*/
obj->radarProcConfig.doaConfig.doaSideLobeLevel_dB = 3;
obj->radarProcConfig.doaConfig.doaSearchRange = 60; /**< DoA search range, from -doaSearchRange to +doaSearchRange.*/
obj->radarProcConfig.doaConfig.doaSearchRes = 1; /**< DoA Resolution.*/
obj->radarProcConfig.doaConfig.doaVarThr = 10; /**< Minimum variance range (in degree) for the output estimation. Estimates with bigger confidence range will not be reported.*/
//clustering
#ifdef TMDEMOV1
obj->radarProcConfig.dbscanConfig.nAccFrames = 4;
obj->radarProcConfig.dbscanConfig.epsilon = 0.4;
obj->radarProcConfig.dbscanConfig.weight = 1.3;
obj->radarProcConfig.dbscanConfig.vFactor = 2.0;
obj->radarProcConfig.dbscanConfig.minPointsInCluster = 3; //obj->radarProcConfig.dbscanConfig.dbscan_nAccFrames - 1;
obj->radarProcConfig.dbscanConfig.fixedPointScale = 256;
obj->radarProcConfig.dbscanConfig.xyzOutputQFormat = 8;
#endif