需求说明
将生成的iq bin文件跟ref bin文件一一对比,允许精度误差为3bit。
需要满足多cc的比较,并且将输出的IQ 错误点,按slot,symb,ant,I_value,Q_value输出到文件中。
C语言实现示例代码
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
//macro
//C:/Users/xueping.guo/Desktop/testVec_tdd_case1case94_passLog/dspVec/case94
//C:/Users/xueping.guo/Desktop/testVec/caseD20
#define TEST_CASE_BASE_PATH "C:/Users/xueping.guo/Desktop/testVec/case159"
#define DBG_INFO printf
#define NR_DL_MAX_RB_NUM (273)
#define NR_SC_NUM_PER_RB (12)
#define NR_MAX_SYMB_NUM_PER_SUBFRAM (14)
#define NR_MAX_ANT_NUM (4) //maybe larger
#define NR_MAX_SLOT_PER_RADIO (20)
#define IQ_DATA_SIZE_PER_ANT (NR_DL_MAX_RB_NUM * NR_SC_NUM_PER_RB * sizeof(uint32_t))
//declaration function
int32_t loadFileData(uint8_t *dstBufP, char* srcFileName);
//global variable
uint8_t phyIqDataArry[IQ_DATA_SIZE_PER_ANT * NR_MAX_ANT_NUM * NR_MAX_SYMB_NUM_PER_SUBFRAM * NR_MAX_SLOT_PER_RADIO];
uint8_t refIqDataArry[IQ_DATA_SIZE_PER_ANT * NR_MAX_ANT_NUM * NR_MAX_SYMB_NUM_PER_SUBFRAM * NR_MAX_SLOT_PER_RADIO];
int main(int argc, char* argv[])
{
uint8_t* phyIqDataBufP = phyIqDataArry;
uint8_t* refIqDataBufP = refIqDataArry;
uint32_t phyIqDataSize;
uint32_t refIqDataSize;
char srcFileNameArry[100];
char logFileNameArry[100];
uint16_t realAntNum = 0;
uint8_t totalCcNum = 0;
//test case base address
char* testCaseBaseAddrP = argv[1];
if (NULL == testCaseBaseAddrP)
{
DBG_INFO("[ERROR:] Test case base addr is null, please input correct path!!!\n");
return 0;
}
else
{
DBG_INFO("[INFO:] TestCase base address is: %s\n", testCaseBaseAddrP);
}
//calc total cc num
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out");
//cc0
if(access(srcFileNameArry, F_OK) == 0)
{
totalCcNum++;
}
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out1");
//cc1
if(access(srcFileNameArry, F_OK) == 0)
{
totalCcNum++;
}
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out2");
//cc2
if(access(srcFileNameArry, F_OK) == 0)
{
totalCcNum++;
}
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out3");
//cc3
if(access(srcFileNameArry, F_OK) == 0)
{
totalCcNum++;
}
for (uint8_t ccIdx = 0; ccIdx < totalCcNum; ++ccIdx)
{
//initialize flag per ccIdx
uint8_t iqPassFlag = 1;
if (0 == ccIdx)
{
//read phy iq data from file dlSymbPortData4g.bin
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out/dlSymbPortData.bin");
phyIqDataSize = (uint32_t)loadFileData(phyIqDataBufP, srcFileNameArry);
//read ref iq data
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/ref/dlSymbPortData.bin");
refIqDataSize = (uint32_t)loadFileData(refIqDataBufP, srcFileNameArry);
}
else if (1 == ccIdx)
{
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out1/dlSymbPortData.bin");
phyIqDataSize = (uint32_t)loadFileData(phyIqDataBufP, srcFileNameArry);
//read ref iq data
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/ref1/dlSymbPortData.bin");
refIqDataSize = (uint32_t)loadFileData(refIqDataBufP, srcFileNameArry);
}
else if (2 == ccIdx)
{
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out2/dlSymbPortData.bin");
phyIqDataSize = (uint32_t)loadFileData(phyIqDataBufP, srcFileNameArry);
//read ref iq data
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/ref2/dlSymbPortData.bin");
refIqDataSize = (uint32_t)loadFileData(refIqDataBufP, srcFileNameArry);
}
else if (3 == ccIdx)
{
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/out3/dlSymbPortData.bin");
phyIqDataSize = (uint32_t)loadFileData(phyIqDataBufP, srcFileNameArry);
//read ref iq data
memset(srcFileNameArry, 0, sizeof(srcFileNameArry));
sprintf(srcFileNameArry, "%s%s", testCaseBaseAddrP, "/ref3/dlSymbPortData.bin");
refIqDataSize = (uint32_t)loadFileData(refIqDataBufP, srcFileNameArry);
}
else
{
DBG_INFO("[ERROR:] ccIdx is invalid, ccIdx: %u\n", ccIdx);
}
//open compare log file
memset(logFileNameArry, 0, sizeof(logFileNameArry));
sprintf(logFileNameArry, "%s%s%u%s", testCaseBaseAddrP, "/iqCmpLogResult_cc", ccIdx, ".log");
//open log file and clear dirty data
FILE* logFileOpenP = fopen(logFileNameArry, "w+");
if (phyIqDataSize != refIqDataSize)
{
fprintf(logFileOpenP, "[ERROR:] compare failed because of the different length of data file!!!\n");
fprintf(logFileOpenP, "phyIqDataSize = %u, refIqDataSize = %u\n", phyIqDataSize, refIqDataSize);
fclose(logFileOpenP);
printf("[ERROR:] finished the compare because of the different length!!!\n");
return 0;
}
//get reality ant num
//273RB*12RE*4BYTE*1ANT*14SYM*20TTI = 3669120
//273RB*12RE*4BYTE*2ANT*14SYM*20TTI = 7338240
if (phyIqDataSize == 3669120)
{
realAntNum = 1;
DBG_INFO("numTxPhyAnt = %u\n", realAntNum);
}
else if (7338240 == phyIqDataSize)
{
realAntNum = 2;
DBG_INFO("numTxPhyAnt = %u\n", realAntNum);
}
else if (14676480 == phyIqDataSize)
{
realAntNum = 4;
DBG_INFO("numTxPhyAnt = %u\n", realAntNum);
}
else
{
iqPassFlag = 0;
DBG_INFO("cc%u IQ data file size is wrong, not support now!!!\n", ccIdx);
return 0;
}
//subframe loop
uint32_t iqDataSizeBytePerAnt = NR_DL_MAX_RB_NUM * NR_SC_NUM_PER_RB * sizeof(uint32_t);
uint32_t totalNumSc = NR_DL_MAX_RB_NUM * NR_SC_NUM_PER_RB;
for (uint32_t slotIdx = 0; slotIdx < NR_MAX_SLOT_PER_RADIO; ++slotIdx)
{
for (uint32_t symIdx = 0; symIdx < NR_MAX_SYMB_NUM_PER_SUBFRAM; ++symIdx)
{
for (uint32_t antIdx = 0; antIdx < realAntNum; ++antIdx)
{
uint16_t* phyIq_16bit_p = (uint16_t*)(phyIqDataBufP + slotIdx * iqDataSizeBytePerAnt * realAntNum * 14 + symIdx * iqDataSizeBytePerAnt * realAntNum + iqDataSizeBytePerAnt * antIdx);
uint16_t* refIq_16bit_p = (uint16_t*)(refIqDataBufP + slotIdx * iqDataSizeBytePerAnt * realAntNum * 14 + symIdx * iqDataSizeBytePerAnt * realAntNum + iqDataSizeBytePerAnt * antIdx);
for (uint32_t scIdx = 0; scIdx < totalNumSc; ++scIdx)
{
uint32_t startLocation = slotIdx * iqDataSizeBytePerAnt * realAntNum * 14 + symIdx * iqDataSizeBytePerAnt * realAntNum + antIdx * iqDataSizeBytePerAnt + scIdx * 4;
uint16_t absVal_1 = ((phyIq_16bit_p[2 * scIdx] - refIq_16bit_p[2 * scIdx]) > 0 )? (phyIq_16bit_p[2 * scIdx] - refIq_16bit_p[2 * scIdx]) : (refIq_16bit_p[2 * scIdx] - phyIq_16bit_p[2 * scIdx]);
uint16_t absVal_2 = ((phyIq_16bit_p[2 * scIdx + 1] - refIq_16bit_p[2 * scIdx + 1]) > 0 )? (phyIq_16bit_p[2 * scIdx + 1] - refIq_16bit_p[2 * scIdx + 1]) : (refIq_16bit_p[2 * scIdx + 1] - phyIq_16bit_p[2 * scIdx + 1]);
if ((absVal_1 <= 3) && (absVal_2 <= 3))
{
continue;
}
else
{
iqPassFlag = 0;
//printf("[ERROR:] compare fail, slotIdx = %u, symIdx = %u, antIdx = %u, scIdx = %u\n", slotIdx, symIdx, antIdx, scIdx);
fprintf(logFileOpenP, "[ERROR:] cc%u compare fail, slotIdx = %u, symIdx = %u, antIdx = %u, scIdx = %u, phy_I = %04X, ref_I = %04X, phy_Q = %04X, ref_Q = %04X, location = %08X\n", ccIdx, slotIdx, symIdx, antIdx, scIdx,
phyIq_16bit_p[2 * scIdx], refIq_16bit_p[2 * scIdx],
phyIq_16bit_p[2 * scIdx + 1], refIq_16bit_p[2 * scIdx + 1],
startLocation);
}
}
}
}
}
if (iqPassFlag)
{
DBG_INFO("cc%u IQ compare pass!!!\n", ccIdx);
fprintf(logFileOpenP, "cc%u IQ compare pass!!!", ccIdx);
}
else
{
DBG_INFO("cc%u IQ compare fail!!!\n", ccIdx);
fprintf(logFileOpenP, "cc%u IQ compare fail!!!", ccIdx);
}
}
//close log file
fclose(logFileOpenP);
return 0;
}
int32_t loadFileData(uint8_t *dstBufP, char* srcFileName)
{
int32_t size = -1;
FILE* srcFileP;
size_t readSize = 0;
srcFileP = fopen(srcFileName, "rb");
if (NULL == srcFileP)
{
DBG_INFO("[ERROR]: The file: %s can not be opened.\n", srcFileName);
fclose(srcFileP);
return 0;
}
//get file size and then read data
fseek(srcFileP, 0, SEEK_END);
size = ftell(srcFileP);
fseek(srcFileP, 0, SEEK_SET);
readSize = fread((void*)dstBufP, (size_t)1, (size_t)size, srcFileP);
if (0 == readSize)
{
DBG_INFO("[ERROR]: Can not read the file %s.\n", srcFileName);
}
fclose(srcFileP);
return size;
}