NR IQ 比较工具

需求说明

将生成的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值