Commit e993a59d authored by sfn's avatar sfn Committed by Thomas Schlichter

Make use of gNB precoding matrix for PDSCH layer precoding

parent 0517b973
...@@ -76,8 +76,9 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -76,8 +76,9 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
gNB_MAC_INST *mac) { gNB_MAC_INST *mac) {
//get RRC Codebook configuration //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]; 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(gNB->frame_parms.nb_antennas_tx>1){
LOG_I(MAC,"NR mac_init_codebook_gNB: codebookType present %d\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present);
if(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present==NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) { if(csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present==NR_CodebookConfig__codebookType__type1__subType_PR_typeI_SinglePanel) {
int N1=1; int N1=1;
int N2=1; int N2=1;
...@@ -91,7 +92,7 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -91,7 +92,7 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
// N2 . . . . ... . // N2 . . . . ... .
// X X X X ... X // X X X X ... X
// |<-----N1---->| // |<-----N1---->|
printf("NR Codebook Config: codebookType, type1, subType_PR_typeI_SinglePanel\n"); LOG_I(MAC,"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; 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) { if (type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_two) {
N1=1; N1=1;
...@@ -99,120 +100,121 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -99,120 +100,121 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
O1=1; O1=1;
O2=1; O2=1;
CSI_RS_antenna_ports=2; CSI_RS_antenna_ports=2;
LOG_I(MAC,"NR Codebook Config: antenna ports: %d\n",CSI_RS_antenna_ports);
} else if(type1single->nrOfAntennaPorts.present == NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo) { } 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) //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) { 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: 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; N1=2;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=4; CSI_RS_antenna_ports=4;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_two_one\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_two_two_TypeI_SinglePanel_Restriction: 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; N1=2;
N2=2; N2=2;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=8; CSI_RS_antenna_ports=8;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_two_two_TypeI\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_one_TypeI_SinglePanel_Restriction: 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; N1=4;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=8; CSI_RS_antenna_ports=8;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_four_one\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_three_two_TypeI_SinglePanel_Restriction: 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; N1=3;
N2=2; N2=2;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=12; CSI_RS_antenna_ports=12;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_three_two\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction: 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; N1=6;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=12; CSI_RS_antenna_ports=12;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_six_one\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_two_TypeI_SinglePanel_Restriction: 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; N1=4;
N2=2; N2=2;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=16; CSI_RS_antenna_ports=16;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_four_two\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_one_TypeI_SinglePanel_Restriction: 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; N1=8;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=16; CSI_RS_antenna_ports=16;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_eight_one\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_three_TypeI_SinglePanel_Restriction: 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; N1=4;
N2=3; N2=3;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=24; CSI_RS_antenna_ports=24;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_four_three\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_two_TypeI_SinglePanel_Restriction: 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; N1=6;
N2=2; N2=2;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=24; CSI_RS_antenna_ports=24;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_six_two\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_twelve_one_TypeI_SinglePanel_Restriction: 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; N1=12;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=24; CSI_RS_antenna_ports=24;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_twelve_one\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_four_four_TypeI_SinglePanel_Restriction: 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; N1=4;
N2=4; N2=4;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=32; CSI_RS_antenna_ports=32;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_four_four\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_eight_two_TypeI_SinglePanel_Restriction: 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; N1=8;
N2=2; N2=2;
O1=4; O1=4;
O2=4; O2=4;
CSI_RS_antenna_ports=32; CSI_RS_antenna_ports=32;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_eight_two\n",CSI_RS_antenna_ports);
break; break;
case NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_sixteen_one_TypeI_SinglePanel_Restriction: 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; N1=16;
N2=1; N2=1;
O1=4; O1=4;
O2=1; O2=1;
CSI_RS_antenna_ports=32; CSI_RS_antenna_ports=32;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2_PR_sixteen_one\n",CSI_RS_antenna_ports);
break; break;
default: default:
printf("n1 n2 is %d\n",type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present);
N1=1; N1=1;
N2=1; N2=1;
O1=1; O1=1;
O2=1; O2=1;
CSI_RS_antenna_ports=2; CSI_RS_antenna_ports=2;
LOG_I(MAC,"NR Codebook Config: codebookType: type1, antenna ports: %d n1_n2 %d\n",CSI_RS_antenna_ports,type1single->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present);
break; break;
} }
} }
...@@ -250,68 +252,85 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -250,68 +252,85 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
for (int mm=0; mm<N2*O2; mm++)//i_1_2 for (int mm=0; mm<N2*O2; mm++)//i_1_2
for (int nn1=0; nn1<N1; nn1++) for (int nn1=0; nn1<N1; nn1++)
for (int nn2=0; nn2<N2; nn2++){ for (int nn2=0; nn2<N2; nn2++){
printf("indx %d \n",nn1*N2+nn2); //printf("indx %d \n",nn1*N2+nn2);
v_lm[ll][mm][nn1*N2+nn2] = v[ll][nn1]*u[mm][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])); //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;
gNB->nr_mimo_precoding_matrix = (int32_t ***)malloc16(4* sizeof(int32_t **));
int32_t ***mat = gNB->nr_mimo_precoding_matrix;
double complex res_code; double complex res_code;
//Table 5.2.2.2.1-5: //Table 5.2.2.2.1-5:
//Codebook for 1-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS //Codebook for 1-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
int pmiq_size = N1*O1*N2*O2*4+1;
mat[0] = (int32_t **)malloc16(pmiq_size*sizeof(int32_t *));
//pmi=0 corresponds to unit matrix
mat[0][0] = (int32_t *)calloc(2*N1*N2,sizeof(int32_t));
for(int j_col=0; j_col<1; j_col++)//1 layer
for (int i_rows=0; i_rows<2*N1*N2; i_rows++)//2-x polarized antenna
if(j_col==i_rows)
((short*) &mat[0][0][i_rows+j_col])[0] = 32768;
for(int ll=0; ll<N1*O1; ll++)//i_1_1 for(int ll=0; ll<N1*O1; ll++)//i_1_1
for (int mm=0; mm<N2*O2; mm++)//i_1_2 for (int mm=0; mm<N2*O2; mm++)//i_1_2
for (int nn=0; nn<4; nn++){ for (int nn=0; nn<4; nn++){
int pmiq = ll*N2*O2*4+mm*4+nn; int pmiq = 1+ll*N2*O2*4+mm*4+nn;
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*1*sizeof(int32_t)); mat[0][pmiq] = (int32_t *)malloc16((2*N1*N2)*1*sizeof(int32_t));
printf("layer 1 pmiq = %d\n",pmiq); LOG_I(MAC,"layer 1 Codebook pmiq = %d\n",pmiq);
for (int len=0; len<N1*N2; len++) { for (int len=0; len<N1*N2; len++) {
res_code=sqrt(1/(double)CSI_RS_antenna_ports)*v_lm[ll][mm][len]; res_code=sqrt(1/(double)CSI_RS_antenna_ports)*v_lm[ll][mm][len];
if (creal(res_code)>0) if (creal(res_code)>0)
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[0][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]); LOG_I(MAC, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[0][pmiq][len])[0],((short*) &mat[0][pmiq][len])[1]);
} }
for(int len=N1*N2; len<2*N1*N2; len++) { 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]; res_code=sqrt(1/(double)CSI_RS_antenna_ports)*theta_n[nn]*v_lm[ll][mm][len-N1*N2];
if (creal(res_code)>0) if (creal(res_code)>0)
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[0][pmiq][len])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][len])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[0][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]);
LOG_I(MAC, "1 Layer Precoding Matrix[0][pmi %d][antPort %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq, len, creal(res_code), cimag(res_code),((short*) &mat[0][pmiq][len])[0],((short*) &mat[0][pmiq][len])[1]);
} }
} }
int llc; int llc;
int mmc; int mmc;
double complex phase_sign; double complex phase_sign;
//Table 5.2.2.2.1-6: //Table 5.2.2.2.1-6:
//Codebook for 2-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS //Codebook for 2-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
pmiq_size = N1*O1*N2*O2*N1*O1*N2*O2*2+1;
mat[1] = (int32_t **)malloc16(pmiq_size*sizeof(int32_t *));
//pmi=0 corresponds to unit matrix
mat[1][0] = (int32_t *)calloc((2*N1*N2)*(2),sizeof(int32_t));
for(int j_col=0; j_col<2; j_col++)//2 layers
for (int i_rows=0; i_rows<2*N1*N2; i_rows++)//2-x polarized antenna
if(j_col==i_rows)
((short*) &mat[1][0][i_rows*2+j_col])[0] = 32768;
//pmi=1,...,pmi_size are computed as follows
for(int llb=0; llb<N1*O1; llb++)//i_1_1 for(int llb=0; llb<N1*O1; llb++)//i_1_1
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2 for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
for(int ll=0; ll<N1*O1; ll++)//i_1_1 for(int ll=0; ll<N1*O1; ll++)//i_1_1
for (int mm=0; mm<N2*O2; mm++)//i_1_2 for (int mm=0; mm<N2*O2; mm++)//i_1_2
for (int nn=0; nn<2; nn++){ 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; int pmiq = 1+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)); mat[1][pmiq] = (int32_t *)malloc16((2*N1*N2)*(2)*sizeof(int32_t));
printf("layer 2 pmiq = %d\n",pmiq); LOG_I(MAC,"layer 2 Codebook pmiq = %d\n",pmiq);
for(int j_col=0; j_col<2; j_col++) { for(int j_col=0; j_col<2; j_col++) {
if (j_col==0) { if (j_col==0) {
llc = llb; llc = llb;
...@@ -326,41 +345,55 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -326,41 +345,55 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
for (int i_rows=0; i_rows<N1*N2; i_rows++) { 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]; res_code=sqrt(1/(double)(2*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
if (creal(res_code)>0) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[1][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]);
LOG_I(MAC, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[1][pmiq][i_rows*2+j_col])[0],((short*) &mat[1][pmiq][i_rows*2+j_col])[1]);
} }
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) { 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]; 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) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[1][pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*2+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[1][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]);
LOG_I(MAC, "2 Layer Precoding Matrix[1][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[1][pmiq][i_rows*2+j_col])[0],((short*) &mat[1][pmiq][i_rows*2+j_col])[1]);
} }
} }
} }
//Table 5.2.2.2.1-7: //Table 5.2.2.2.1-7:
//Codebook for 3-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS //Codebook for 3-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
if(CSI_RS_antenna_ports>=3) if(CSI_RS_antenna_ports>=3){
pmiq_size = N1*O1*N2*O2*N1*O1*N2*O2*2+1;
mat[2] = (int32_t **)malloc16(pmiq_size*sizeof(int32_t *));
//pmi=0 corresponds to unit matrix
mat[2][0] = (int32_t *)calloc((2*N1*N2)*(3),sizeof(int32_t));
for(int j_col=0; j_col<3; j_col++)//3 layers
for (int i_rows=0; i_rows<2*N1*N2; i_rows++)//2-x polarized antenna
if(j_col==i_rows)
((short*) &mat[2][0][i_rows*3+j_col])[0] = 32768;
//pmi=1,...,pmi_size are computed as follows
for(int llb=0; llb<N1*O1; llb++)//i_1_1 for(int llb=0; llb<N1*O1; llb++)//i_1_1
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2 for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
for(int ll=0; ll<N1*O1; ll++)//i_1_1 for(int ll=0; ll<N1*O1; ll++)//i_1_1
for (int mm=0; mm<N2*O2; mm++)//i_1_2 for (int mm=0; mm<N2*O2; mm++)//i_1_2
for (int nn=0; nn<2; nn++){ 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; int pmiq = llb*N2*O2*N1*O1*N2*O2*2+mmb*N1*O1*N2*O2*2+ll*N2*O2*2+mm*2+nn+1;
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t)); mat[2][pmiq] = (int32_t *)malloc16((2*N1*N2)*(3)*sizeof(int32_t));
printf("layer 3 pmiq = %d\n",pmiq); LOG_D(MAC,"layer 3 Codebook pmiq = %d\n",pmiq);
for(int j_col=0; j_col<3; j_col++) { for(int j_col=0; j_col<3; j_col++) {
if (j_col==0) { if (j_col==0) {
llc = llb; llc = llb;
...@@ -380,41 +413,56 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -380,41 +413,56 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
for (int i_rows=0; i_rows<N1*N2; i_rows++) { 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]; res_code=sqrt(1/(double)(3*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
if (creal(res_code)>0) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[2][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]);
LOG_D(MAC, "3 Layer Precoding Matrix[2][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[2][pmiq][i_rows*3+j_col])[0],((short*) &mat[2][pmiq][i_rows*3+j_col])[1]);
} }
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) { 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]; 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) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[2][pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*3+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[2][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]);
LOG_D(MAC, "3 Layer Precoding Matrix[2][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[2][pmiq][i_rows*3+j_col])[0],((short*) &mat[2][pmiq][i_rows*3+j_col])[1]);
}
} }
} }
} }
//Table 5.2.2.2.1-8: //Table 5.2.2.2.1-8:
//Codebook for 4-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS //Codebook for 4-layer CSI reporting using antenna ports 3000 to 2999+PCSI-RS
if(CSI_RS_antenna_ports>=4)
if(CSI_RS_antenna_ports>=4){
pmiq_size = N1*O1*N2*O2*N1*O1*N2*O2*2+1;
mat[3] = (int32_t **)malloc16(pmiq_size*sizeof(int32_t *));
//pmi=0 corresponds to unit matrix
mat[3][0] = (int32_t *)calloc((2*N1*N2)*(4),sizeof(int32_t));
for(int j_col=0; j_col<4; j_col++)//4 layers
for (int i_rows=0; i_rows<2*N1*N2; i_rows++)//2-x polarized antenna
if(j_col==i_rows)
((short*) &mat[3][0][i_rows*4+j_col])[0] = 32768;
//pmi=1,...,pmi_size are computed as follows
for(int llb=0; llb<N1*O1; llb++)//i_1_1 for(int llb=0; llb<N1*O1; llb++)//i_1_1
for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2 for (int mmb=0; mmb<N2*O2; mmb++)//i_1_2
for(int ll=0; ll<N1*O1; ll++)//i_1_1 for(int ll=0; ll<N1*O1; ll++)//i_1_1
for (int mm=0; mm<N2*O2; mm++)//i_1_2 for (int mm=0; mm<N2*O2; mm++)//i_1_2
for (int nn=0; nn<2; nn++){ 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; int pmiq = llb*N2*O2*N1*O1*N2*O2*2+mmb*N1*O1*N2*O2*2+ll*N2*O2*2+mm*2+nn+1;
mat[pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t)); mat[3][pmiq] = (int32_t *)malloc16((2*N1*N2)*4*sizeof(int32_t));
printf("layer 4 pmiq = %d\n",pmiq); LOG_D(MAC,"layer 4 pmiq = %d\n",pmiq);
for(int j_col=0; j_col<4; j_col++) { for(int j_col=0; j_col<4; j_col++) {
if (j_col==0) { if (j_col==0) {
llc = llb; llc = llb;
...@@ -439,36 +487,40 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB, ...@@ -439,36 +487,40 @@ int mac_init_codebook_gNB(PHY_VARS_gNB *gNB,
for (int i_rows=0; i_rows<N1*N2; i_rows++) { 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]; res_code=sqrt(1/(double)(4*CSI_RS_antenna_ports))*v_lm[llc][mmc][i_rows];
if (creal(res_code)>0) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) 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[3][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 ((short*) &mat[3][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]);
LOG_D(MAC, "4 Layer Precoding Matrix[3][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[3][pmiq][i_rows*4+j_col])[0],((short*) &mat[3][pmiq][i_rows*4+j_col])[1]);
} }
for (int i_rows=N1*N2; i_rows<2*N1*N2; i_rows++) { 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]; 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) if (creal(res_code)>0)
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[3][pmiq][i_rows*4+j_col])[0] = (short) ((creal(res_code)*32768)-0.5);//convert to Q15
if (cimag(res_code)>0) if (cimag(res_code)>0)
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15 ((short*) &mat[3][pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)+0.5);//convert to Q15
else else
((short*) &mat[pmiq][i_rows*4+j_col])[1] = (short) ((cimag(res_code)*32768)-0.5);//convert to Q15 ((short*) &mat[3][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]);
LOG_D(MAC, "4 Layer Precoding Matrix[3][pmi %d][antPort %d][layerIdx %d]= %f+j %f -> Fixed Point %d+j %d \n",pmiq,i_rows,j_col, creal(res_code), cimag(res_code),((short*) &mat[3][pmiq][i_rows*4+j_col])[0],((short*) &mat[3][pmiq][i_rows*4+j_col])[1]);
}
} }
} }
} }
} }
} else {//codebookMode 2 } else {//codebookMode 2
printf("CodeBook Type 1, CodebookMode %ld is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->codebookMode); LOG_I(MAC,"CodeBook Type 1, CodebookMode %ld is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->codebookMode);
} }
} else { } else {
printf("subType_PR_typeI %d is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present); LOG_I(MAC,"subType_PR_typeI %d is not supported\n",csi_reportconfig->codebookConfig->codebookType.choice.type1->subType.present);
}
} }
return (0); return (0);
} }
......
...@@ -801,3 +801,18 @@ int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n ...@@ -801,3 +801,18 @@ int nr_layer_precoder(int16_t **datatx_F_precoding, char *prec_matrix, uint8_t n
/* ((int16_t *)precodatatx_F)[0] = (int16_t)((((int16_t *)precodatatx_F)[0]*ONE_OVER_SQRT2_Q15)>>15); /* ((int16_t *)precodatatx_F)[0] = (int16_t)((((int16_t *)precodatatx_F)[0]*ONE_OVER_SQRT2_Q15)>>15);
((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/ ((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/
} }
int nr_layer_precoder_cm(int16_t **datatx_F_precoding, int *prec_matrix, uint8_t n_layers, int32_t re_offset)
{
int32_t precodatatx_F = 0;
for (int al = 0; al<n_layers; al++) {
int16_t antenna_re = datatx_F_precoding[al][re_offset<<1];
int16_t antenna_im = datatx_F_precoding[al][(re_offset<<1) +1];
//printf("antenna precoding: %d %d\n",((int16_t *)&prec_matrix[al])[0],((int16_t *)&prec_matrix[al])[1]);
((int16_t *) &precodatatx_F)[0] += (int16_t)(((int32_t)(antenna_re*(((int16_t *)&prec_matrix[al])[0])) - (int32_t)(antenna_im* (((int16_t *)&prec_matrix[al])[1])))>>15);
((int16_t *) &precodatatx_F)[1] += (int16_t)(((int32_t)(antenna_re*(((int16_t *)&prec_matrix[al])[1])) + (int32_t)(antenna_im* (((int16_t *)&prec_matrix[al])[0])))>>15);
}
return precodatatx_F;
}
...@@ -135,4 +135,9 @@ int nr_layer_precoder(int16_t **datatx_F_precoding, ...@@ -135,4 +135,9 @@ int nr_layer_precoder(int16_t **datatx_F_precoding,
char *prec_matrix, char *prec_matrix,
uint8_t n_layers, uint8_t n_layers,
int32_t re_offset); int32_t re_offset);
int nr_layer_precoder_cm(int16_t **datatx_F_precoding,
int *prec_matrix,
uint8_t n_layers,
int32_t re_offset);
#endif #endif
...@@ -459,48 +459,39 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, ...@@ -459,48 +459,39 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx,
} }
} }
else { else {
//get the precoding matrix weights: if(frame_parms->nb_antennas_tx==1){//no precoding matrix defined
char *W_prec; memcpy((void*)&txdataF[ap][l*frame_parms->ofdm_symbol_size + txdataF_offset + k],
switch (frame_parms->nb_antennas_tx) { (void*)&txdataF_precoding[ap][2*(l*frame_parms->ofdm_symbol_size + txdataF_offset+ k)],
case 1://1 antenna port NR_NB_SC_PER_RB*sizeof(int32_t));
W_prec = nr_W_1l_2p[pmi][ap]; k += NR_NB_SC_PER_RB;
break; if (k >= frame_parms->ofdm_symbol_size) {
case 2://2 antenna ports k -= frame_parms->ofdm_symbol_size;
if (rel15->nrOfLayers == 1)//1 layer
W_prec = nr_W_1l_2p[pmi][ap];
else//2 layers
W_prec = nr_W_2l_2p[pmi][ap];
break;
case 4://4 antenna ports
if (rel15->nrOfLayers == 1)//1 layer
W_prec = nr_W_1l_4p[pmi][ap];
else if (rel15->nrOfLayers == 2)//2 layers
W_prec = nr_W_2l_4p[pmi][ap];
else if (rel15->nrOfLayers == 3)//3 layers
W_prec = nr_W_3l_4p[pmi][ap];
else//4 layers
W_prec = nr_W_4l_4p[pmi][ap];
break;
default:
LOG_D(PHY,"Precoding 1,2, or 4 antenna ports are currently supported\n");
W_prec = nr_W_1l_2p[pmi][ap];
break;
} }
}
else {
//get the precoding matrix weights:
int32_t **mat = gNB->nr_mimo_precoding_matrix[rel15->nrOfLayers-1];
//i_row =0,...,dl_antenna_port
//j_col =0,...,nrOfLayers
//mat[pmi][i_rows*2+j_col]
int *W_prec;
W_prec = (int32_t *)&mat[pmi][ap*rel15->nrOfLayers];
for (int i=0; i<NR_NB_SC_PER_RB; i++) { for (int i=0; i<NR_NB_SC_PER_RB; i++) {
int32_t re_offset = l*frame_parms->ofdm_symbol_size + k; int32_t re_offset = l*frame_parms->ofdm_symbol_size + k;
int32_t precodatatx_F = nr_layer_precoder(txdataF_precoding, W_prec, rel15->nrOfLayers, re_offset+txdataF_offset); int32_t precodatatx_F = nr_layer_precoder_cm(txdataF_precoding, W_prec, rel15->nrOfLayers, re_offset+txdataF_offset);
((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[0]; ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[0];
((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[1]; ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)] = ((int16_t *) &precodatatx_F)[1];
#ifdef DEBUG_DLSCH_MAPPING #ifdef DEBUG_DLSCH_MAPPING
printf("antenna %d\t l %d \t k %d \t txdataF: %d %d\n", printf("antenna %d\t l %d \t k %d \t txdataF: %d %d\n",
ap, l, k, ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)], ap, l, k, ((int16_t*)txdataF[ap])[(re_offset<<1) + (2*txdataF_offset)],
((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)]); ((int16_t*)txdataF[ap])[(re_offset<<1) + 1 + (2*txdataF_offset)]);
#endif #endif
if (++k >= frame_parms->ofdm_symbol_size) { if (++k >= frame_parms->ofdm_symbol_size) {
k -= frame_parms->ofdm_symbol_size; k -= frame_parms->ofdm_symbol_size;
} }
} }
} }
}
} //RB loop } //RB loop
} // symbol loop } // symbol loop
}// port loop }// port loop
......
...@@ -805,7 +805,7 @@ typedef struct PHY_VARS_gNB_s { ...@@ -805,7 +805,7 @@ typedef struct PHY_VARS_gNB_s {
uint32_t ****nr_gold_pdsch_dmrs; uint32_t ****nr_gold_pdsch_dmrs;
/// PDSCH codebook I precoding LUTs /// PDSCH codebook I precoding LUTs
int32_t **nr_mimo_precoding_matrix; int32_t ***nr_mimo_precoding_matrix;
/// PUSCH DMRS /// PUSCH DMRS
uint32_t ****nr_gold_pusch_dmrs; uint32_t ****nr_gold_pusch_dmrs;
......
...@@ -794,6 +794,7 @@ int main(int argc, char **argv) ...@@ -794,6 +794,7 @@ int main(int argc, char **argv)
// rrc_mac_config_req_gNB // rrc_mac_config_req_gNB
gNB_mac->pre_processor_dl = nr_dlsim_preprocessor; gNB_mac->pre_processor_dl = nr_dlsim_preprocessor;
phy_init_nr_gNB(gNB,0,1); phy_init_nr_gNB(gNB,0,1);
mac_init_codebook_gNB(gNB,gNB_mac);
N_RB_DL = gNB->frame_parms.N_RB_DL; N_RB_DL = gNB->frame_parms.N_RB_DL;
NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info; NR_UE_info_t *UE_info = &RC.nrmac[0]->UE_info;
UE_info->num_UEs=1; UE_info->num_UEs=1;
......
...@@ -1156,7 +1156,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ...@@ -1156,7 +1156,7 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList)); csi_MeasConfig->csi_ReportConfigToAddModList = calloc(1,sizeof(*csi_MeasConfig->csi_ReportConfigToAddModList));
csi_MeasConfig->csi_ReportConfigToReleaseList = NULL; csi_MeasConfig->csi_ReportConfigToReleaseList = NULL;
if (do_csirs && dl_antenna_ports > 1) { if (dl_antenna_ports > 1) {/*do_csirs&&*/
NR_CSI_ReportConfig_t *csirep1 = calloc(1,sizeof(*csirep1)); NR_CSI_ReportConfig_t *csirep1 = calloc(1,sizeof(*csirep1));
csirep1->reportConfigId=0; csirep1->reportConfigId=0;
csirep1->carrier=NULL; csirep1->carrier=NULL;
...@@ -1208,8 +1208,19 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco ...@@ -1208,8 +1208,19 @@ void fill_default_secondaryCellGroup(NR_ServingCellConfigCommon_t *servingcellco
NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo; NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts_PR_moreThanTwo;
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.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)); calloc(1,sizeof(*csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo));
if(dl_antenna_ports == 4)
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_two_one_TypeI_SinglePanel_Restriction;
else if(dl_antenna_ports == 8)
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_four_one_TypeI_SinglePanel_Restriction;
else if(dl_antenna_ports == 12)
csirep1->codebookConfig->codebookType.choice.type1->subType.choice.typeI_SinglePanel->nrOfAntennaPorts.choice.moreThanTwo->n1_n2.present= 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; NR_CodebookConfig__codebookType__type1__subType__typeI_SinglePanel__nrOfAntennaPorts__moreThanTwo__n1_n2_PR_six_one_TypeI_SinglePanel_Restriction;
else//default
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_two_one_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.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.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=malloc(1);
......
...@@ -239,6 +239,8 @@ RUs = ( ...@@ -239,6 +239,8 @@ RUs = (
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000]; #bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix: ## beamforming 2x2 matrix:
#bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff]; #bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 2x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000];
## beamforming 4x4 matrix: ## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff]; #bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2"; sdr_addrs = "addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment