Add codebook type I precoding matrices generation function
This commit is contained in:
@@ -74,7 +74,7 @@
|
|||||||
#include "UTIL/OPT/opt.h"
|
#include "UTIL/OPT/opt.h"
|
||||||
#include "enb_config.h"
|
#include "enb_config.h"
|
||||||
#include "gnb_paramdef.h"
|
#include "gnb_paramdef.h"
|
||||||
|
#include "LAYER2/NR_MAC_gNB/mac_proto.h"
|
||||||
|
|
||||||
#include "s1ap_eNB.h"
|
#include "s1ap_eNB.h"
|
||||||
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
#include "SIMULATION/ETH_TRANSPORT/proto.h"
|
||||||
@@ -497,14 +497,18 @@ void print_opp_meas(void) {
|
|||||||
void init_eNB_afterRU(void) {
|
void init_eNB_afterRU(void) {
|
||||||
int inst,ru_id,i,aa;
|
int inst,ru_id,i,aa;
|
||||||
PHY_VARS_gNB *gNB;
|
PHY_VARS_gNB *gNB;
|
||||||
|
gNB_MAC_INST *mac;
|
||||||
LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst);
|
LOG_I(PHY,"%s() RC.nb_nr_inst:%d\n", __FUNCTION__, RC.nb_nr_inst);
|
||||||
|
|
||||||
if(NFAPI_MODE == NFAPI_MODE_PNF)
|
if(NFAPI_MODE == NFAPI_MODE_PNF)
|
||||||
RC.nb_nr_inst = 1;
|
RC.nb_nr_inst = 1;
|
||||||
for (inst=0; inst<RC.nb_nr_inst; inst++) {
|
for (inst=0; inst<RC.nb_nr_inst; inst++) {
|
||||||
LOG_I(PHY,"RC.nb_nr_CC[inst:%d]:%p\n", inst, RC.gNB[inst]);
|
LOG_I(PHY,"RC.nb_nr_CC[inst:%d]:%p\n", inst, RC.gNB[inst]);
|
||||||
gNB = RC.gNB[inst];
|
gNB = RC.gNB[inst];
|
||||||
|
mac = RC.nrmac[gNB->UL_INFO.module_id];
|
||||||
|
|
||||||
phy_init_nr_gNB(gNB,0,0);
|
phy_init_nr_gNB(gNB,0,0);
|
||||||
|
mac_init_codebook_gNB(gNB,mac);
|
||||||
|
|
||||||
// map antennas and PRACH signals to gNB RX
|
// map antennas and PRACH signals to gNB RX
|
||||||
if (0) AssertFatal(gNB->num_RU>0,"Number of RU attached to gNB %d is zero\n",gNB->Mod_id);
|
if (0) AssertFatal(gNB->num_RU>0,"Number of RU attached to gNB %d is zero\n",gNB->Mod_id);
|
||||||
|
|||||||
+401
-1
@@ -36,9 +36,10 @@
|
|||||||
#include "MBSFN-SubframeConfigList.h"*/
|
#include "MBSFN-SubframeConfigList.h"*/
|
||||||
#include "openair1/PHY/defs_RU.h"
|
#include "openair1/PHY/defs_RU.h"
|
||||||
#include "openair1/PHY/CODING/nrLDPC_extern.h"
|
#include "openair1/PHY/CODING/nrLDPC_extern.h"
|
||||||
|
#include "LAYER2/NR_MAC_gNB/nr_mac_gNB.h"
|
||||||
#include "assertions.h"
|
#include "assertions.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include <complex.h>
|
||||||
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
#include "PHY/NR_TRANSPORT/nr_ulsch.h"
|
||||||
#include "PHY/NR_REFSIG/nr_refsig.h"
|
#include "PHY/NR_REFSIG/nr_refsig.h"
|
||||||
#include "SCHED_NR/fapi_nr_l1.h"
|
#include "SCHED_NR/fapi_nr_l1.h"
|
||||||
@@ -71,6 +72,405 @@ int l1_north_init_gNB() {
|
|||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
|
||||||
|
gNB_MAC_INST *mac) {
|
||||||
|
//get RRC Codebook configuration
|
||||||
|
struct NR_CSI_ReportConfig *csi_reportconfig = mac->UE_info.CellGroup[0]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup->csi_ReportConfigToAddModList->list.array[0];
|
||||||
|
//int rrc_count = mac->UE_info.CellGroup[0]->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup->csi_ReportConfigToAddModList->list.count;
|
||||||
|
|
||||||
|
if(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present==NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
|
||||||
|
int N1=1;
|
||||||
|
int N2=1;
|
||||||
|
int O1=0;
|
||||||
|
int O2=0;
|
||||||
|
int CSI_RS_antenna_ports=1;
|
||||||
|
|
||||||
|
//Uniform Planner Array: UPA
|
||||||
|
// X X X X ... X
|
||||||
|
// X X X X ... X
|
||||||
|
// N2 . . . . ... .
|
||||||
|
// X X X X ... X
|
||||||
|
// |<-----N1---->|
|
||||||
|
printf("NR Codebook Config: codebookType, type1, subType_PR_typeI_SinglePanel\n");
|
||||||
|
struct NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel *type1single = csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel;
|
||||||
|
if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
|
||||||
|
N1=1;
|
||||||
|
N2=1;
|
||||||
|
O1=1;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=2;
|
||||||
|
} else if(type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) {
|
||||||
|
//Type 1 Single Panel : Based on 38.214 v15.3-Table 5.2.2.2.1-2: Supported configurations of (N1,N2) and (O1,O2)
|
||||||
|
switch(type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present) {
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_two_one\n");
|
||||||
|
N1=2;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=4;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_two_two_TypeI\n");
|
||||||
|
N1=2;
|
||||||
|
N2=2;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=8;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_four_one\n");
|
||||||
|
N1=4;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=8;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_three_two\n");
|
||||||
|
N1=3;
|
||||||
|
N2=2;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=12;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_six_one\n");
|
||||||
|
N1=6;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=12;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_four_two\n");
|
||||||
|
N1=4;
|
||||||
|
N2=2;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=16;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_eight_one\n");
|
||||||
|
N1=8;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=16;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_four_three\n");
|
||||||
|
N1=4;
|
||||||
|
N2=3;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=24;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_six_two_\n");
|
||||||
|
N1=6;
|
||||||
|
N2=2;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=24;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_twelve_one\n");
|
||||||
|
N1=12;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=24;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_four_four\n");
|
||||||
|
N1=4;
|
||||||
|
N2=4;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=32;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_eight_two\n");
|
||||||
|
N1=8;
|
||||||
|
N2=2;
|
||||||
|
O1=4;
|
||||||
|
O2=4;
|
||||||
|
CSI_RS_antenna_ports=32;
|
||||||
|
break;
|
||||||
|
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction:
|
||||||
|
printf("NR Codebook Config: codebookType, type1, n1_n2_PR_sixteen_one\n");
|
||||||
|
N1=16;
|
||||||
|
N2=1;
|
||||||
|
O1=4;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=32;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("n1 n2 is %d\n",type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present);
|
||||||
|
N1=1;
|
||||||
|
N2=1;
|
||||||
|
O1=1;
|
||||||
|
O2=1;
|
||||||
|
CSI_RS_antenna_ports=2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(csi_reportconfig->codebookConfig->codebookType.choice.type1->codebookMode==1){
|
||||||
|
if (CSI_RS_antenna_ports < 16) {
|
||||||
|
//Generate DFT vertical beams
|
||||||
|
//ll: index of a vertical beams vector (represented by i1_1 in TS 38.214)
|
||||||
|
double complex v[N1*O1][N1];
|
||||||
|
for (int ll=0; ll<N1*O1; ll++)//i1_1
|
||||||
|
for (int nn=0; nn<N1; nn++){
|
||||||
|
v[ll][nn] = cexp(I*(2*M_PI*nn*ll)/(N1*O1));
|
||||||
|
//printf("v[%d][%d] = %f +j %f\n", ll,nn, creal(v[ll][nn]),cimag(v[ll][nn]));
|
||||||
|
}
|
||||||
|
//Generate DFT Horizontal beams
|
||||||
|
//mm: index of a Horizontal beams vector (represented by i1_2 in TS 38.214)
|
||||||
|
double complex u[N2*O2][N2];
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i1_2
|
||||||
|
for (int nn=0; nn<N2; nn++){
|
||||||
|
u[mm][nn] = cexp(I*(2*M_PI*nn*mm)/(N2*O2));
|
||||||
|
//printf("u[%d][%d] = %f +j %f\n", mm,nn, creal(u[mm][nn]),cimag(u[mm][nn]));
|
||||||
|
}
|
||||||
|
//Generate co-phasing angles
|
||||||
|
//i_2: index of a co-phasing vector
|
||||||
|
//i1_1, i1_2, and i_2 are reported from UEs
|
||||||
|
double complex theta_n[4];
|
||||||
|
for (int nn=0; nn<4; nn++){
|
||||||
|
theta_n[nn] = cexp(I*M_PI*nn/2);
|
||||||
|
//printf("theta_n[%d] = %f +j %f\n", nn, creal(theta_n[nn]),cimag(theta_n[nn]));
|
||||||
|
}
|
||||||
|
//Kronecker product v_lm
|
||||||
|
double complex v_lm[N1*O1][N2*O2][N2*N1];
|
||||||
|
//v_ll_mm_codebook denotes the elements of a precoding matrix W_i1,1_i_1,2
|
||||||
|
for(int ll=0; ll<N1*O1; ll++)//i_1_1
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i_1_2
|
||||||
|
for (int nn1=0; nn1<N1; nn1++)
|
||||||
|
for (int nn2=0; nn2<N2; nn2++){
|
||||||
|
printf("indx %d \n",nn1*N2+nn2);
|
||||||
|
v_lm[ll][mm][nn1*N2+nn2] = v[ll][nn1]*u[mm][nn2];
|
||||||
|
printf("v_lm[%d][%d][%d] = %f +j %f\n",ll,mm, nn1*N2+nn2, creal(v_lm[ll][mm][nn1*N2+nn2]),cimag(v_lm[ll][mm][nn1*N2+nn2]));
|
||||||
|
}
|
||||||
|
int pmi_size=1;
|
||||||
|
if(CSI_RS_antenna_ports==2)
|
||||||
|
pmi_size = (N1*O1)*N2*O2*(4)+(N1*O1-1)*N2*O2*N1*O1*N2*O2*2+(N2*O2-1)*N1*O1*N2*O2*2+(N1*O1-1)*N2*O2*2+(N2*O2-1)*2+2;
|
||||||
|
else if(CSI_RS_antenna_ports>=4)
|
||||||
|
pmi_size = N1*O1*N2*O2*(4)+N1*O1*N2*O2*N1*O1*N2*O2*2+N1*O1*N2*O2*N1*O1*N2*O2*2+(N1*O1-1)*N2*O2*N1*O1*N2*O2*2+(N2*O2-1)*N1*O1*N2*O2*2+(N1*O1-1)*N2*O2*2+(N2*O2-1)*2+2;
|
||||||
|
gNB->nr_mimo_precoding_matrix = (int32_t **)malloc16(pmi_size* sizeof(int32_t));
|
||||||
|
int32_t **mat = gNB->nr_mimo_precoding_matrix;
|
||||||
|
|
||||||
|
double complex res_code;
|
||||||
|
|
||||||
|
//Table 5.2.2.2.1-5:
|
||||||
|
//Codebook for 1-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
|
||||||
|
for(int ll=0; ll<N1*O1; ll++)//i_1_1
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i_1_2
|
||||||
|
for (int nn=0; nn<4; nn++){
|
||||||
|
int pmiq = ll*N2*O2*4+mm*4+nn;
|
||||||
|
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*1*sizeof(int32_t));
|
||||||
|
printf("layer 1 pmiq = %d\n",pmiq);
|
||||||
|
for (int len=0; len<N1*N2; len++) {
|
||||||
|
res_code=sqrt(1/(double)CSI_RS_antenna_ports)*v_lm[ll][mm][len];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[pmiq][len])[0],((short*) &mat[pmiq][len])[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int len=N1*N2; len<2*N1*N2; len++) {
|
||||||
|
res_code=sqrt(1/(double)CSI_RS_antenna_ports)*theta_n[nn]*v_lm[ll][mm][len-N1*N2];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[pmiq][len])[0],((short*) &mat[pmiq][len])[1]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int llc;
|
||||||
|
int mmc;
|
||||||
|
double complex phase_sign;
|
||||||
|
//Table 5.2.2.2.1-6:
|
||||||
|
//Codebook for 2-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
|
||||||
|
for(int llb=0; llb<N1*O1; llb++)//i_1_1
|
||||||
|
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
|
||||||
|
for(int ll=0; ll<N1*O1; ll++)//i_1_1
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i_1_2
|
||||||
|
for (int nn=0; nn<2; nn++){
|
||||||
|
int pmiq = N1*O1*N2*O2*(4)+llb*N2*O2*N1*O1*N2*O2*2+mmb*N1*O1*N2*O2*2+ll*N2*O2*2+mm*2+nn;
|
||||||
|
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*(2)*sizeof(int32_t));
|
||||||
|
printf("layer 2 pmiq = %d\n",pmiq);
|
||||||
|
for(int j_col=0; j_col<2; j_col++) {
|
||||||
|
if (j_col==0) {
|
||||||
|
llc = llb;
|
||||||
|
mmc = mmb;
|
||||||
|
phase_sign = 1;
|
||||||
|
}
|
||||||
|
if (j_col==1) {
|
||||||
|
llc = ll;
|
||||||
|
mmc = mm;
|
||||||
|
phase_sign = -1;
|
||||||
|
}
|
||||||
|
for (int i_rows=0; i_rows<N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(2*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*2+j_col])[0],((short*) &mat[pmiq][i_rows*2+j_col])[1]);
|
||||||
|
}
|
||||||
|
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(2*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*2+j_col])[0],((short*) &mat[pmiq][i_rows*2+j_col])[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Table 5.2.2.2.1-7:
|
||||||
|
//Codebook for 3-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
|
||||||
|
if(CSI_RS_antenna_ports>=3)
|
||||||
|
for(int llb=0; llb<N1*O1; llb++)//i_1_1
|
||||||
|
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
|
||||||
|
for(int ll=0; ll<N1*O1; ll++)//i_1_1
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i_1_2
|
||||||
|
for (int nn=0; nn<2; nn++){
|
||||||
|
int pmiq = N1*O1*N2*O2*(4)+N1*O1*N2*O2*N1*O1*N2*O2*2+llb*N2*O2*N1*O1*N2*O2*2+mmb*N1*O1*N2*O2*2+ll*N2*O2*2+mm*2+nn;
|
||||||
|
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t));
|
||||||
|
printf("layer 3 pmiq = %d\n",pmiq);
|
||||||
|
for(int j_col=0; j_col<3; j_col++) {
|
||||||
|
if (j_col==0) {
|
||||||
|
llc = llb;
|
||||||
|
mmc = mmb;
|
||||||
|
phase_sign = 1;
|
||||||
|
}
|
||||||
|
if (j_col==1) {
|
||||||
|
llc = ll;
|
||||||
|
mmc = mm;
|
||||||
|
phase_sign = 1;
|
||||||
|
}
|
||||||
|
if (j_col==3) {
|
||||||
|
llc = llb;
|
||||||
|
mmc = mmb;
|
||||||
|
phase_sign = -1;
|
||||||
|
}
|
||||||
|
for (int i_rows=0; i_rows<N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(3*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*3+j_col])[0],((short*) &mat[pmiq][i_rows*3+j_col])[1]);
|
||||||
|
}
|
||||||
|
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(3*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*3+j_col])[0],((short*) &mat[pmiq][i_rows*3+j_col])[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//Table 5.2.2.2.1-8:
|
||||||
|
//Codebook for 4-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
|
||||||
|
if(CSI_RS_antenna_ports>=4)
|
||||||
|
for(int llb=0; llb<N1*O1; llb++)//i_1_1
|
||||||
|
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
|
||||||
|
for(int ll=0; ll<N1*O1; ll++)//i_1_1
|
||||||
|
for (int mm=0; mm<N2*O2; mm++)//i_1_2
|
||||||
|
for (int nn=0; nn<2; nn++){
|
||||||
|
int pmiq = N1*O1*N2*O2*(4)+N1*O1*N2*O2*N1*O1*N2*O2*2+N1*O1*N2*O2*N1*O1*N2*O2*2+llb*N2*O2*N1*O1*N2*O2*2+mmb*N1*O1*N2*O2*2+ll*N2*O2*2+mm*2+nn;
|
||||||
|
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t));
|
||||||
|
printf("layer 4 pmiq = %d\n",pmiq);
|
||||||
|
for(int j_col=0; j_col<4; j_col++) {
|
||||||
|
if (j_col==0) {
|
||||||
|
llc = llb;
|
||||||
|
mmc = mmb;
|
||||||
|
phase_sign = 1;
|
||||||
|
}
|
||||||
|
if (j_col==1) {
|
||||||
|
llc = ll;
|
||||||
|
mmc = mm;
|
||||||
|
phase_sign = 1;
|
||||||
|
}
|
||||||
|
if (j_col==3) {
|
||||||
|
llc = llb;
|
||||||
|
mmc = mmb;
|
||||||
|
phase_sign = -1;
|
||||||
|
}
|
||||||
|
if (j_col==4) {
|
||||||
|
llc = ll;
|
||||||
|
mmc = mm;
|
||||||
|
phase_sign = -1;
|
||||||
|
}
|
||||||
|
for (int i_rows=0; i_rows<N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(4*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q1else
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*4+j_col])[0],((short*) &mat[pmiq][i_rows*4+j_col])[1]);
|
||||||
|
}
|
||||||
|
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) {
|
||||||
|
res_code=sqrt(1/(double)(4*CSI_RS_antenna_ports))*(phase_sign)*theta_n[nn]*v_lm[llc][mmc][i_rows-N1*N2];
|
||||||
|
if (creal(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
if (cimag(res_code)>0)
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
|
||||||
|
else
|
||||||
|
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15
|
||||||
|
printf("%d %d result = %f+j %f FIXED POINT %d+j %d \n",pmiq, i_rows, creal(res_code), cimag(res_code),((short*) &mat[pmiq][i_rows*4+j_col])[0],((short*) &mat[pmiq][i_rows*4+j_col])[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {//codebookMode 2
|
||||||
|
printf("CodeBook Type 1, CodebookMode %ld is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->codebookMode);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
printf("subType_PR_typeI %d is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
|
||||||
unsigned char is_secondary_gNB,
|
unsigned char is_secondary_gNB,
|
||||||
|
|||||||
@@ -804,6 +804,9 @@ typedef struct PHY_VARS_gNB_s {
|
|||||||
/// PDSCH DMRS sequence
|
/// PDSCH DMRS sequence
|
||||||
uint32_t ****nr_gold_pdsch_dmrs;
|
uint32_t ****nr_gold_pdsch_dmrs;
|
||||||
|
|
||||||
|
/// PDSCH codebook I precoding LUTs
|
||||||
|
int32_t **nr_mimo_precoding_matrix;
|
||||||
|
|
||||||
/// PUSCH DMRS
|
/// PUSCH DMRS
|
||||||
uint32_t ****nr_gold_pusch_dmrs;
|
uint32_t ****nr_gold_pusch_dmrs;
|
||||||
|
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ void set_cset_offset(uint16_t);
|
|||||||
|
|
||||||
void mac_top_init_gNB(void);
|
void mac_top_init_gNB(void);
|
||||||
|
|
||||||
|
int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, gNB_MAC_INST *mac);
|
||||||
|
|
||||||
void config_common(int Mod_idP,
|
void config_common(int Mod_idP,
|
||||||
int ssb_SubcarrierOffset,
|
int ssb_SubcarrierOffset,
|
||||||
int pdsch_AntennaPorts,
|
int pdsch_AntennaPorts,
|
||||||
|
|||||||
@@ -1189,19 +1189,39 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
|
|||||||
csirep1->codebookConfig->codebookType.choice.type1 = calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1));
|
csirep1->codebookConfig->codebookType.choice.type1 = calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1));
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.present=NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.present=NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel=calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel));
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel=calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel));
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present=
|
if (dl_antenna_ports <= 2) {
|
||||||
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present=
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two=
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two;
|
||||||
calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two));
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two=
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.size=1;
|
calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two));
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.bits_unused=2;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.size=1;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf=malloc(1);
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.bits_unused=2;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf[0]=0xfc;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf=malloc(1);
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.size=1;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.two->twoTX_CodebookSubsetRestriction.buf[0]=0xfc;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.bits_unused=0;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.size=1;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf=malloc(1);
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.bits_unused=0;
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]=0x03;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf=malloc(1);
|
||||||
csirep1->codebookConfig->codebookType.choice.type1->codebookMode=1;
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->typeI_SinglePanel_ri_Restriction.buf[0]=0x03;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->codebookMode=1;
|
||||||
|
} else if (dl_antenna_ports < 16) {
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.present=
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo=
|
||||||
|
calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo));
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present=
|
||||||
|
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction;
|
||||||
|
/*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.choice.two_one_TypeI_SinglePanel_Restriction.size=1;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.choice.two_one_TypeI_SinglePanel_Restriction.bits_unused=1;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.choice.two_one_TypeI_SinglePanel_Restriction.buf=malloc(1);
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.choice.two_one_TypeI_SinglePanel_Restriction.buf[0]=0xc0; //'00000011'B
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->typeI_SinglePanel_codebookSubsetRestriction_i2->size = 1;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->typeI_SinglePanel_codebookSubsetRestriction_i2->bits_unused=1;
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->typeI_SinglePanel_codebookSubsetRestriction_i2->buf=malloc(1);
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->typeI_SinglePanel_codebookSubsetRestriction_i2->buf[0]=0xc0;*/
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->codebookMode=1;
|
||||||
|
} else {//32 antennas are Not implemented yet
|
||||||
|
csirep1->codebookConfig->codebookType.choice.type1->codebookMode=2;
|
||||||
|
}
|
||||||
csirep1->dummy = NULL;
|
csirep1->dummy = NULL;
|
||||||
csirep1->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
|
csirep1->groupBasedBeamReporting.present = NR_CSI_ReportConfig__groupBasedBeamReporting_PR_disabled;
|
||||||
csirep1->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep1->groupBasedBeamReporting.choice.disabled));
|
csirep1->groupBasedBeamReporting.choice.disabled=calloc(1,sizeof(*csirep1->groupBasedBeamReporting.choice.disabled));
|
||||||
|
|||||||
Reference in New Issue
Block a user