int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, LTE_UE_DLSCH_t *dlsch_ue, unsigned int coded_bits, unsigned char NB_RB, double sigma, unsigned char qbits, unsigned int block_length, unsigned int ntrials, unsigned int *errors, unsigned int *trials, unsigned int *uerrors, unsigned int *crc_misses, unsigned int *iterations, unsigned int num_pdcch_symbols, unsigned int subframe) { unsigned char test_input[block_length+1]; //_declspec(align(16)) char channel_output[512]; //_declspec(align(16)) unsigned char output[512],decoded_output[16], *inPtr, *outPtr; short *channel_output; unsigned char decoded_output[block_length]; unsigned int i,trial=0; unsigned int crc=0; unsigned char ret; unsigned char uerr; unsigned char crc_type; channel_output = (short *)malloc(coded_bits*sizeof(short)); *iterations=0; *errors=0; *crc_misses=0; *uerrors=0; // printf("dlsch_eNB->TBS= %d\n",dlsch_eNB->harq_processes[0]->TBS); while (trial++ < ntrials) { // printf("encoding\n"); for (i=0;i<block_length;i++) { test_input[i] = (unsigned char)(taus()&0xff); } dlsch_encoding(test_input, &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, PHY_vars_eNB->dlsch_eNB[0][0], subframe); uerr=0; for (i = 0; i < coded_bits; i++){ channel_output[i] = (short)quantize(sigma/4.0,(2.0*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1.0 + sigma*gaussdouble(0.0,1.0),qbits); } // memset(decoded_output,0,16); // printf("decoding\n"); ret = dlsch_decoding(channel_output, &PHY_vars_UE->lte_frame_parms, PHY_vars_UE->dlsch_ue[0][0], subframe, num_pdcch_symbols); /* int diffs = 0,puncts=0; for (i=0;i<dlsch_ue->harq_processes[0]->Kplus*3;i++) { if (dlsch_ue->harq_processes[0]->d[0][96+i] == 0) { printf("%d punct (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); puncts++; } else if (sgn(dlsch_ue->harq_processes[0]->d[0][96+i]) != dlsch_eNb->harq_processes[0]->d[0][96+i]) { printf("%d differs (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); diffs++; } else printf("%d same (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); } printf("diffs %d puncts %d(%d,%d,%d,%d,%d)\n",diffs,puncts,dlsch_ue->harq_processes[0]->F,coded_bits,3*(block_length<<3),3*dlsch_ue->harq_processes[0]->Kplus,3*dlsch_ue->harq_processes[0]->F+3*(block_length<<3)-coded_bits); */ // printf("ret %d\n",ret); // printf("trial %d : i %d/%d : Input %x, Output %x (%x, F %d)\n",trial,0,block_length,test_input[0], // dlsch_ue->harq_processes[0]->b[0], // dlsch_ue->harq_processes[0]->c[0][0], // (dlsch_ue->harq_processes[0]->F>>3)); if (ret < MAX_TURBO_ITERATIONS+1) *iterations = (*iterations) + ret; else *iterations = (*iterations) + (ret-1); if (uerr==1) *uerrors = (*uerrors) + 1; for (i=0;i<block_length;i++) { if (dlsch_ue->harq_processes[0]->b[i] != test_input[i]) { // printf("i %d/%d : Input %x, Output %x (%x, F %d)\n",i,block_length,test_input[i], // dlsch_ue->harq_processes[0]->b[i], // dlsch_ue->harq_processes[0]->c[0][i], // (dlsch_ue->harq_processes[0]->F>>3)); *errors = (*errors) + 1; // printf("*%d\n",*errors); if (ret < MAX_TURBO_ITERATIONS+1) *crc_misses = (*crc_misses)+1; break; } } if (*errors == 100) { //printf("\n"); break; } } *trials = trial; // printf("lte: trials %d, errors %d\n",trial,*errors); return(0); }
int test_logmap8(LTE_eNB_DLSCH_t *dlsch_eNB, LTE_UE_DLSCH_t *dlsch_ue, unsigned int coded_bits, unsigned char NB_RB, double sigma, unsigned char qbits, unsigned int block_length, unsigned int ntrials, unsigned int *errors, unsigned int *trials, unsigned int *uerrors, unsigned int *crc_misses, unsigned int *iterations, unsigned int num_pdcch_symbols, unsigned int subframe) { unsigned char test_input[block_length+1]; short *channel_output; unsigned char decoded_output[block_length]; unsigned int i,trial=0; unsigned int crc=0; unsigned char ret; unsigned char uerr; unsigned char crc_type; channel_output = (short *)malloc(coded_bits*sizeof(short)); *iterations=0; *errors=0; *crc_misses=0; *uerrors=0; // printf("dlsch_eNB->TBS= %d, block_length %d\n",dlsch_eNB->harq_processes[0]->TBS,block_length); while (trial++ < ntrials) { // printf("encoding\n"); // test_input[0] = 0x80; for (i=0; i<block_length; i++) { test_input[i] = i&0xff;//(unsigned char)(taus()&0xff); } dlsch_encoding(test_input, &PHY_vars_eNB->lte_frame_parms, num_pdcch_symbols, PHY_vars_eNB->dlsch_eNB[0][0], 0, subframe, &PHY_vars_eNB->dlsch_rate_matching_stats, &PHY_vars_eNB->dlsch_turbo_encoding_stats, &PHY_vars_eNB->dlsch_interleaving_stats); uerr=0; for (i = 0; i < coded_bits; i++) { #ifdef DEBUG_CODER if ((i&0xf)==0) printf("\ne %d..%d: ",i,i+15); printf("%d.",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e[i]); #endif channel_output[i] = (short)quantize(sigma/4.0,(2.0*PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e[i]) - 1.0 + sigma*gaussdouble(0.0,1.0),qbits); // printf("input %d, output %f\n",(2*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1, // (2.0*PHY_vars_eNB->dlsch_eNB[0][0]->e[i]) - 1.0 + sigma*gaussdouble(0.0,1.0)); } #ifdef DEBUG_CODER printf("\n"); exit(-1); #endif PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->G = coded_bits; ret = dlsch_decoding(PHY_vars_UE, channel_output, &PHY_vars_UE->lte_frame_parms, PHY_vars_UE->dlsch_ue[0][0], PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid], subframe, PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid, num_pdcch_symbols,1); /* int diffs = 0,puncts=0; for (i=0;i<dlsch_ue->harq_processes[0]->Kplus*3;i++) { if (dlsch_ue->harq_processes[0]->d[0][96+i] == 0) { printf("%d punct (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); puncts++; } else if (sgn(dlsch_ue->harq_processes[0]->d[0][96+i]) != dlsch_eNb->harq_processes[0]->d[0][96+i]) { printf("%d differs (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); diffs++; } else printf("%d same (%d,%d)\n",i,dlsch_ue->harq_processes[0]->d[0][96+i],dlsch_eNb->harq_processes[0]->d[0][96+i]); } printf("diffs %d puncts %d(%d,%d,%d,%d,%d)\n",diffs,puncts,dlsch_ue->harq_processes[0]->F,coded_bits,3*(block_length<<3),3*dlsch_ue->harq_processes[0]->Kplus,3*dlsch_ue->harq_processes[0]->F+3*(block_length<<3)-coded_bits); printf("ret %d (max %d)\n",ret,dlsch_ue->max_turbo_iterations); printf("trial %d : i %d/%d : Input %x, Output %x (%x, F %d)\n",trial,0,block_length,test_input[0], dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->b[0], dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][0], (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->F>>3)); */ if (ret < dlsch_ue->max_turbo_iterations+1) { *iterations = (*iterations) + ret; // if (ret>1) // printf("ret %d\n",ret); } else *iterations = (*iterations) + (ret-1); if (uerr==1) *uerrors = (*uerrors) + 1; for (i=0; i<block_length; i++) { if (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][i] != test_input[i]) { /* printf("i %d/%d : Input %x, Output %x (%x, F %d)\n",i,block_length,test_input[i], dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->b[i], dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->c[0][i], (dlsch_ue->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->F>>3)); */ *errors = (*errors) + 1; // printf("*%d, ret %d\n",*errors,ret); if (ret < dlsch_ue->max_turbo_iterations+1) *crc_misses = (*crc_misses)+1; break; } } if (ret == dlsch_ue->max_turbo_iterations+1) { // exit(-1); } /* else { for (i=0;i<block_length;i++) { if (dlsch_ue->harq_processes[0]->b[i] != test_input[i]) { printf("i %d/%d : Input %x, Output %x (%x, F %d)\n",i,block_length,test_input[i], dlsch_ue->harq_processes[0]->b[i], dlsch_ue->harq_processes[0]->c[0][i], (dlsch_ue->harq_processes[0]->F>>3)); } } }*/ if (*errors == 100) { printf("trials %d\n",trial); break; } } *trials = trial; // printf("lte: trials %d, errors %d\n",trial,*errors); return(0); }
void mexFunction( int mlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { /* Declare */ short *dlsch_llr; unsigned char mcs; unsigned int *ret; unsigned char mod_order; unsigned char num_pdcch_symbols; unsigned char harq_pid; unsigned char subframe; unsigned char Kmimo; unsigned char Mdlharq; unsigned char abstraction_flag; LTE_UE_DLSCH_t* dlsch; LTE_DL_FRAME_PARMS *frame_parms; PHY_VARS_UE *phy_vars_ue; extern int *pi2tab16[188],*pi5tab16[188],*pi4tab16[188],*pi6tab16[188]; unsigned long *ptr_td; //Specific Modification for 64bit int *tmp[1]; /* Allocate input */ dlsch_llr = (short*) mxGetData(prhs[0]); /* Create new dlsch */ Kmimo = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"Kmimo")); Mdlharq = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"Mdlharq")); abstraction_flag = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"abstraction_flag")); mcs = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"mcs")); #ifdef DEBUG_DLSCH_DECODING mexPrintf("Kmimo %d\n",Kmimo); mexPrintf("Mdlharq %d\n",Mdlharq); mexPrintf("abstraction_flag %d\n",abstraction_flag); mexPrintf("mcs %d\n",mcs); #endif /* Create new dlsch */ dlsch = new_ue_dlsch(Kmimo,Mdlharq,8,25,abstraction_flag); // Init CRC tables crcTableInit(); // init_td(); // copy the pointers to memory allocated in dlsch_decoding_init ptr_td = (unsigned int*) mxGetData(mxGetField(prhs[1],0,"ptr_td")); #ifdef DEBUG_DLSCH_DECODING mexPrintf("ptr_td0 %p\n",ptr_td[0]); mexPrintf("ptr_td1 %p\n",ptr_td[1]); mexPrintf("ptr_td2 %p\n",ptr_td[2]); mexPrintf("ptr_td3 %p\n",ptr_td[3]); #endif memcpy(&tmp[0], &ptr_td[0], sizeof(ptr_td[0])); memcpy(&pi2tab16[0], tmp[0], 188*sizeof(pi2tab16[0])); memcpy(&tmp[0], &ptr_td[1], sizeof(ptr_td[1])); memcpy(&pi4tab16[0], tmp[0], 188*sizeof(pi4tab16[0])); memcpy(&tmp[0], &ptr_td[2], sizeof(ptr_td[2])); memcpy(&pi5tab16[0], tmp[0], 188*sizeof(pi5tab16[0])); memcpy(&tmp[0], &ptr_td[3], sizeof(ptr_td[3])); memcpy(&pi6tab16[0], tmp[0], 188*sizeof(pi6tab16[0])); harq_pid = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"harq_pid")); dlsch->current_harq_pid = harq_pid; dlsch->harq_processes[harq_pid]->rvidx = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"rvidx")); dlsch->harq_processes[harq_pid]->Nl = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"Nl")); //dlsch->harq_processes[harq_pid]->Ndi = (unsigned char) mxGetScalar(mxGetField(prhs[2],0,"Ndi")); dlsch->harq_processes[harq_pid]->mcs = mcs; dlsch->harq_processes[harq_pid]->rb_alloc[0] = (unsigned int) mxGetScalar(mxGetField(prhs[1],0,"rb_alloc")); dlsch->harq_processes[harq_pid]->nb_rb = (unsigned short) mxGetScalar(mxGetField(prhs[1],0,"nb_rb")); dlsch->harq_processes[harq_pid]->TBS = dlsch_tbs25[get_I_TBS(mcs)][dlsch->harq_processes[harq_pid]->nb_rb-1]; num_pdcch_symbols = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"num_pdcch_symbols")); subframe = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"subframe")); phy_vars_ue = calloc(1,sizeof(PHY_VARS_UE)); // Create a LTE_DL_FRAME_PARMS structure and assign required params frame_parms = calloc(1,sizeof(LTE_DL_FRAME_PARMS)); frame_parms->N_RB_DL = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"nb_rb")); frame_parms->frame_type = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"frame_type")); frame_parms->mode1_flag = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"mode1_flag")); frame_parms->Ncp = (unsigned char) mxGetScalar(mxGetField(prhs[1],0,"Ncp")); mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs); dlsch->harq_processes[harq_pid]->G = get_G(frame_parms,dlsch->harq_processes[harq_pid]->nb_rb,dlsch->harq_processes[harq_pid]->rb_alloc,mod_order,dlsch->harq_processes[harq_pid]->Nl,num_pdcch_symbols,0,subframe); #ifdef DEBUG_DLSCH_DECODING mexPrintf("TBS %d\n",dlsch->harq_processes[harq_pid]->TBS); mexPrintf("nb_rb %d\n",dlsch->harq_processes[harq_pid]->nb_rb); mexPrintf("ncs %d\n",dlsch->harq_processes[harq_pid]->mcs); mexPrintf("num_pdcch_symbols %d\n",num_pdcch_symbols); mexPrintf("subframe %d\n",subframe); mexPrintf("G %d\n",dlsch->harq_processes[harq_pid]->G); #endif if (dlsch->harq_processes[harq_pid]->G != mxGetM(prhs[0])) { free_ue_dlsch(dlsch); free(frame_parms); free(phy_vars_ue); mexErrMsgTxt("Length of the LLR vector is incorrect."); } /* Allocate Output */ plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT32_CLASS, mxREAL); ret = (unsigned int*) mxGetPr(plhs[0]); /* Algo */ *ret = dlsch_decoding(phy_vars_ue, dlsch_llr, frame_parms, dlsch, dlsch->harq_processes[harq_pid], subframe, dlsch->current_harq_pid, 1,0); /* free dlsch */ free_ue_dlsch(dlsch); free(frame_parms); free(phy_vars_ue); // free_td(); }