Commit cf4a005e authored by Xiwen JIANG's avatar Xiwen JIANG

Beamforming channel estimation based on UE specific reference signal

parent 5adc20ca
...@@ -948,8 +948,8 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS ...@@ -948,8 +948,8 @@ void phy_init_lte_ue__PDSCH( LTE_UE_PDSCH* const pdsch, const LTE_DL_FRAME_PARMS
pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * frame_parms->N_RB_DL*12); pdsch->rxdataF_uespec_pilots[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * frame_parms->N_RB_DL*12);
pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->rxdataF_comp0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_bf_ch_estimates[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * frame_parms->ofdm_symbol_size*7*2);
pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t)*frame_parms->symbols_per_tti*(frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH) ); pdsch->dl_bf_ch_estimates_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_ch_rho_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_ch_rho2_ext[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num ); pdsch->dl_ch_mag0[idx] = (int32_t*)malloc16_clear( sizeof(int32_t) * num );
......
filter_length = 12; filt_len = 16;
F = -3/4:1/4:7/4; F = -3/4:1/4:7/4;
F_l = zeros(8,12); F_l = zeros(8,filt_len);
F_r = zeros(8,12); F_r = zeros(8,filt_len);
F_m = zeros(8,12); F_m = zeros(8,filt_len);
F2 =-3/5:1/5:8/5; F2 =-3/5:1/5:8/5;
for i=0:3 for i=0:3
F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i)]); F_l(i+1,:) = floor(16384*[F(8+i:-1:4) zeros(1,7-i) zeros(1,4)]);
F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i)]); F_r(i+1,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i)]); F_m(i+1,:) = floor(16384*[F(4-i:8) F(7:-1:1+i) zeros(1,4)]);
end end
for i=0:1 for i=0:1
F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i)]); F_l(i+5,:) = floor(16384*[F(8:-1:4-i) zeros(1,7-i) zeros(1,4)]);
F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i)]); F_r(i+5,:) = floor(16384*[zeros(1,5+i) F2(5+i) F2(7:end-i) zeros(1,4)]);
F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i)]); F_m(i+5,:) = floor(16384*[F(4-i:8) F2(8-i) F2(6:-1:1+i) zeros(1,4)]);
end end
for i=2:3 for i=2:3
F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5)]); F_l(i+5,:) = floor(16384*[F2(end:-1:7) F2(8-i) zeros(1,5) zeros(1,4)]);
F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i)]); F_r(i+5,:) = floor(16384*[zeros(1,4+i) F(4:end-i) zeros(1,4)]);
F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i)]); F_m(i+5,:) = floor(16384*[F2(4-i:6) F2(4+i) F(8:-1:1+i) zeros(1,4)]);
end end
fd = fopen("filt12_32.h","w"); fd = fopen("filt16_32.h","w");
for i=0:3 for i=0:3
fprintf(fd,"short filt12_l%d[12] = {\n",i); fprintf(fd,"short filt%d_l%d[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_l(i+1,1:end-1)); fprintf(fd,"%d,",F_l(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_l(i+1,end)); fprintf(fd,"%d};\n\n",F_l(i+1,end));
fprintf(fd,"short filt12_r%d[12] = {\n",i); fprintf(fd,"short filt%d_r%d[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_r(i+1,1:end-1)); fprintf(fd,"%d,",F_r(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_r(i+1,end)); fprintf(fd,"%d};\n\n",F_r(i+1,end));
fprintf(fd,"short filt12_m%d[12] = {\n",i); fprintf(fd,"short filt%d_m%d[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_m(i+1,1:end-1)); fprintf(fd,"%d,",F_m(i+1,1:end-1));
fprintf(fd,"%d};\n\n",F_m(i+1,end)); fprintf(fd,"%d};\n\n",F_m(i+1,end));
end end
for i=0:3 for i=0:3
fprintf(fd,"short filt12_l%d_dc[12] = {\n",i); fprintf(fd,"short filt%d_l%d_dc[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_l(i+5,1:end-1)); fprintf(fd,"%d,",F_l(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_l(i+5,end)); fprintf(fd,"%d};\n\n",F_l(i+5,end));
fprintf(fd,"short filt12_r%d_dc[12] = {\n",i); fprintf(fd,"short filt%d_r%d_dc[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_r(i+5,1:end-1)); fprintf(fd,"%d,",F_r(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_r(i+5,end)); fprintf(fd,"%d};\n\n",F_r(i+5,end));
fprintf(fd,"short filt12_m%d_dc[12] = {\n",i); fprintf(fd,"short filt%d_m%d_dc[%d] = {\n",filt_len,i,filt_len);
fprintf(fd,"%d,",F_m(i+5,1:end-1)); fprintf(fd,"%d,",F_m(i+5,1:end-1));
fprintf(fd,"%d};\n\n",F_m(i+5,end)); fprintf(fd,"%d};\n\n",F_m(i+5,end));
end end
......
...@@ -123,7 +123,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue, ...@@ -123,7 +123,6 @@ int lte_dl_channel_estimation(PHY_VARS_UE *phy_vars_ue,
uint8_t l, uint8_t l,
uint8_t symbol); uint8_t symbol);
int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue, int lte_dl_bf_channel_estimation(PHY_VARS_UE *phy_vars_ue,
module_id_t eNB_id, module_id_t eNB_id,
uint8_t eNB_offset, uint8_t eNB_offset,
......
...@@ -70,3 +70,17 @@ short filt12_r3_dc[12] = { ...@@ -70,3 +70,17 @@ short filt12_r3_dc[12] = {
short filt12_m3_dc[12] = { short filt12_m3_dc[12] = {
-9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0}; -9831,-6554,-3277,0,3276,6553,9830,16384,12288,8192,4096,0};
short filt12_1[12] = {
16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384,16384};
short filt12_2l0[12] = {
16384,12288,8192,4096,-4096,0,0,0,0,0,0,0};
short filt12_2r0[12] = {
0,4096,8192,12288,16384,20480,0,0,0,0,0,0};
short filt12_2l1[12] = {
20480,16384,12288,8192,4096,0,0,0,0,0,0,0};
short filt12_2r1[12] = {
-4096,0,4096,8192,12288,16384,0,0,0,0,0,0};
...@@ -54,6 +54,8 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14] ...@@ -54,6 +54,8 @@ void lte_gold(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_table[20][2][14]
void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS); void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_table[2][20][2][21],uint16_t Nid_cell, uint16_t *n_idDMRS);
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti);
/*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14. /*!\brief This function generates the LTE Gold sequence (36-211, Sec 7.2), specifically for DL UE-specific reference signals for antenna ports 7..14.
@param frame_parms LTE DL Frame parameters @param frame_parms LTE DL Frame parameters
@param lte_gold_uespec_table pointer to table where sequences are stored @param lte_gold_uespec_table pointer to table where sequences are stored
...@@ -96,7 +98,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ...@@ -96,7 +98,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
uint8_t Ns, uint8_t Ns,
uint8_t lprime, uint8_t lprime,
uint8_t p, uint8_t p,
int SS_flag ); int SS_flag);
/*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2) /*! \brief This function generates the MBSFN reference signal sequence (36-211, Sec 6.10.1.2)
@param phy_vars_eNB Pointer to eNB variables @param phy_vars_eNB Pointer to eNB variables
...@@ -130,7 +132,9 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue, ...@@ -130,7 +132,9 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
mod_sym_t *output, mod_sym_t *output,
unsigned char Ns, unsigned char Ns,
unsigned char p, unsigned char p,
int SS_flag); int lprime,
int SS_flag,
uint16_t nRB_PDSCH);
int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue, int lte_dl_mbsfn_rx(PHY_VARS_UE *phy_vars_ue,
int *output, int *output,
......
...@@ -59,12 +59,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ...@@ -59,12 +59,12 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
uint8_t Ns, uint8_t Ns,
uint8_t lprime, uint8_t lprime,
uint8_t p, uint8_t p,
int SS_flag ) int SS_flag)
{ {
mod_sym_t qpsk[4],nqpsk[4]; /* mod_sym_t qpsk[4],nqpsk[4];
int16_t k=0,a; int16_t k=0,a;
int mprime,mprime_dword,mprime_qpsk_symb; int mprime,ind,ind_dword,ind_qpsk_symb;
unsigned nushift,kprime; unsigned nushift,kprime;
// LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0]; // LTE_eNB_DLSCH_t *dlsch = phy_vars_eNB->dlsch_eNB[UE_id][0];
...@@ -103,12 +103,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ...@@ -103,12 +103,13 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
k = kprime+phy_vars_eNB->lte_frame_parms.first_carrier_offset; k = kprime+phy_vars_eNB->lte_frame_parms.first_carrier_offset;
printf("lte_dl_ue_spec:k=%d\n",k); printf("lte_dl_ue_spec:k=%d\n",k);
for (mprime=0;mprime<3*phy_vars_eNB->lte_frame_parms.N_RB_DL-1;mprime++) { for (mprime=0;mprime<3*nRB_PDSCH-1;mprime++) {
mprime_dword = mprime>>4; ind = 3*lprime*nRB_PDSCH+mprime;
mprime_qpsk_symb = mprime&0xf; ind_dword = ind>>4;
ind_qpsk_symb = ind&0xf;
//output[k] = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3]; output[k] = qpsk[(phy_vars_UE->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
output[k] = 0xffffffff; //output[k] = 0xffffffff;
k += 4; k += 4;
if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) { if (k >= phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) {
...@@ -125,7 +126,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB, ...@@ -125,7 +126,7 @@ int lte_dl_ue_spec(PHY_VARS_eNB *phy_vars_eNB,
LOG_E(PHY,"Illegal p %d UE specific pilots\n",p); LOG_E(PHY,"Illegal p %d UE specific pilots\n",p);
} }
return(0); return(0);*/
} }
...@@ -133,11 +134,13 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue, ...@@ -133,11 +134,13 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
mod_sym_t *output, mod_sym_t *output,
unsigned char Ns, unsigned char Ns,
unsigned char p, unsigned char p,
int SS_flag) int lprime,
int SS_flag,
uint16_t nRB_PDSCH)
{ {
mod_sym_t qpsk[4],nqpsk[4],*qpsk_p,*output_p; mod_sym_t qpsk[4],nqpsk[4],*qpsk_p,*output_p;
int16_t a; int16_t a;
int w,lprime,mprime,ind,l,ind_dword,ind_qpsk_symb,nPRB; int w,mprime,ind,l,ind_dword,ind_qpsk_symb,nPRB;
short pamp; short pamp;
// Compute the correct pilot amplitude, sqrt_rho_b = Q3.13 // Compute the correct pilot amplitude, sqrt_rho_b = Q3.13
...@@ -169,7 +172,7 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue, ...@@ -169,7 +172,7 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
output_p = output; output_p = output;
for (lprime=0; lprime<2; lprime++) { //for (lprime=0; lprime<2; lprime++) {
ind = 3*lprime*phy_vars_ue->lte_frame_parms.N_RB_DL; ind = 3*lprime*phy_vars_ue->lte_frame_parms.N_RB_DL;
l = lprime + ((Ns&1)<<1); l = lprime + ((Ns&1)<<1);
...@@ -288,25 +291,29 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue, ...@@ -288,25 +291,29 @@ int lte_dl_ue_spec_rx(PHY_VARS_UE *phy_vars_ue,
output_p++; output_p++;
ind++; ind++;
} }
} // }
} else { } else {
LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n"); LOG_E(PHY,"Special subframe not supported for UE specific pilots yet\n");
} }
} }
} else if (p==5) { } else if (p==5) {
if (SS_flag==0) { if (SS_flag==0) {
if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) { output_p = output;
for (lprime=0;lprime<2;lprime++) { if (phy_vars_ue->lte_frame_parms.Ncp == NORMAL) {
ind = 3*lprime*phy_vars_ue->lte_frame_parms.N_RB_DL; //for (lprime=0;lprime<4;lprime++) {
for (mprime=0;mprime<3*nRB_PDSCH;mprime++) {
for (mprime=0;mprime<3*phy_vars_ue->lte_frame_parms.N_RB_DL-1;mprime++) { ind = 3*lprime*nRB_PDSCH+mprime;
ind_dword = ind>>4; ind_dword = ind>>4;
ind_qpsk_symb = ind&0xf; ind_qpsk_symb = ind&0xf;
*output_p = qpsk_p[(phy_vars_ue->lte_gold_uespec_port5_table[Ns][lprime][ind_dword]>>(2*ind_qpsk_symb))&3];
*output_p = qpsk[(phy_vars_ue->lte_gold_uespec_port5_table[Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
//printf("lprime=%d,ind=%d,Ns=%d,output_p=(%d,%d)\n",lprime,ind,Ns,((short *)&output_p[0])[0],((short *)&output_p[0])[1]);
*output_p++; *output_p++;
} }
} // }
} }
} }
} else { } else {
......
...@@ -142,7 +142,7 @@ void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_t ...@@ -142,7 +142,7 @@ void lte_gold_ue_spec(LTE_DL_FRAME_PARMS *frame_parms,uint32_t lte_gold_uespec_t
} }
} }
void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint16_t Nid_cell, uint16_t n_rnti) void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][38],uint16_t Nid_cell, uint16_t n_rnti)
{ {
unsigned char ns,l; unsigned char ns,l;
...@@ -151,7 +151,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint ...@@ -151,7 +151,7 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint
for (ns=0; ns<20; ns++) { for (ns=0; ns<20; ns++) {
for (l=0; l<2; l++) { //for (l=0; l<2; l++) {
x2 = ((((ns>>1)+1)*((Nid_cell<<1)+1))<<16) + n_rnti; x2 = ((((ns>>1)+1)*((Nid_cell<<1)+1))<<16) + n_rnti;
...@@ -171,16 +171,16 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint ...@@ -171,16 +171,16 @@ void lte_gold_ue_spec_port5(uint32_t lte_gold_uespec_port5_table[20][2][21],uint
// printf("x1 : %x, x2 : %x\n",x1,x2); // printf("x1 : %x, x2 : %x\n",x1,x2);
} }
for (n=0; n<14; n++) { for (n=0; n<38; n++) {
x1 = (x1>>1) ^ (x1>>4); x1 = (x1>>1) ^ (x1>>4);
x1 = x1 ^ (x1<<31) ^ (x1<<28); x1 = x1 ^ (x1<<31) ^ (x1<<28);
x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4); x2 = (x2>>1) ^ (x2>>2) ^ (x2>>3) ^ (x2>>4);
x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28); x2 = x2 ^ (x2<<31) ^ (x2<<30) ^ (x2<<29) ^ (x2<<28);
lte_gold_uespec_port5_table[ns][l][n] = x1^x2; lte_gold_uespec_port5_table[ns][n] = x1^x2;
// printf("n=%d : c %x\n",n,x1^x2); // printf("n=%d : c %x\n",n,x1^x2);
} }
} // }
} }
} }
......
...@@ -71,13 +71,13 @@ uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2nd ...@@ -71,13 +71,13 @@ uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2nd
} }
//uint8_t is_not_UEspecRS(int first_layer,int re) //uint8_t is_not_UEspecRS(int first_layer,int re)
uint8_t is_not_UEspecRS(uint8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode) uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode)
{ {
uint8_t offset = (lprime==2)?2:0; uint8_t offset = (lprime==1||lprime==3)?2:0;
if(lprime==0) if (lprime==-1)
return(1); return(1);
switch(beamforming_mode){ switch (beamforming_mode) {
case 7: case 7:
if (Ncp == NORMAL){ if (Ncp == NORMAL){
if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12))) if ((re!=nushift+offset) && (re!=((nushift+4+offset)%12)) && (re!=((nushift+8+offset)%12)))
...@@ -225,7 +225,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB *phy_vars_eNB, ...@@ -225,7 +225,7 @@ int allocate_REs_in_RB(PHY_VARS_eNB *phy_vars_eNB,
uint8_t layer; uint8_t layer;
int s=1; int s=1;
uint8_t mprime2 = mprime,mprime_dword,mprime_qpsk_symb; int mprime2 = mprime,ind,ind_dword,ind_qpsk_symb;
mod_sym_t qpsk[4]; mod_sym_t qpsk[4];
gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15);
...@@ -1022,12 +1022,13 @@ break; ...@@ -1022,12 +1022,13 @@ break;
//printf("precoding UE spec RS\n"); //printf("precoding UE spec RS\n");
for (aa=0; aa<nb_antennas_tx_phy; aa++) { for (aa=0; aa<nb_antennas_tx_phy; aa++) {
mprime_dword = mprime2>>4;
mprime_qpsk_symb = mprime2&0xf;
tmp_sample1 = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][lprime][mprime_dword]>>(2*mprime_qpsk_symb))&3]; ind = 3*lprime*dlsch0_harq->nb_rb+mprime2;
//printf("tmp_sample1=%d+i%d\n",((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]); ind_dword = ind>>4;
//printf("beamforing_weights[%d][%d]=%d+i%d\n",re,aa,((int16_t*)&beamforming_weights[re][aa])[0],((int16_t*)&beamforming_weights[re][aa])[1]); ind_qpsk_symb = ind&0xf;
tmp_sample1 = qpsk[(phy_vars_eNB->lte_gold_uespec_port5_table[0][Ns][ind_dword]>>(2*ind_qpsk_symb))&3];
//printf("lprime=%d,nb_rb=%d,mprime2=%d,ind=%d,Ns=%d,tmp_sample1=(%d,%d)\n",lprime,dlsch0_harq->nb_rb,mprime2,ind,Ns,((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
((int16_t*)&txdataF[aa][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*((uint16_t*)&beamforming_weights[re][aa])[0])>>15); ((int16_t*)&txdataF[aa][tti_offset])[0] += (int16_t)((((int16_t*)&tmp_sample1)[0]*((uint16_t*)&beamforming_weights[re][aa])[0])>>15);
((int16_t*)&txdataF[aa][tti_offset])[0] +=-(int16_t)((((int16_t*)&tmp_sample1)[1]*((uint16_t*)&beamforming_weights[re][aa])[1])>>15); ((int16_t*)&txdataF[aa][tti_offset])[0] +=-(int16_t)((((int16_t*)&tmp_sample1)[1]*((uint16_t*)&beamforming_weights[re][aa])[1])>>15);
...@@ -1037,8 +1038,11 @@ break; ...@@ -1037,8 +1038,11 @@ break;
// ((int16_t*)&txdataF[aa][tti_offset])[0] = 0xffff; // ((int16_t*)&txdataF[aa][tti_offset])[0] = 0xffff;
// ((int16_t*)&txdataF[aa][tti_offset])[1] = 0xffff; // ((int16_t*)&txdataF[aa][tti_offset])[1] = 0xffff;
//printf("tmp_sample1=%d+i%d\n",((int16_t*)&tmp_sample1)[0],((int16_t*)&tmp_sample1)[1]);
//printf("beamforing_weights[%d][%d]=%d+i%d\n",re,aa,((int16_t*)&beamforming_weights[re][aa])[0],((int16_t*)&beamforming_weights[re][aa])[1]);
//printf("txdataF[%d][%d]= %d+i%d\n ",aa,tti_offset,((int16_t*)&txdataF[aa][tti_offset])[0],((int16_t*)&txdataF[aa][tti_offset])[1]);
mprime2 = mprime2++; mprime2 = mprime2++;
//printf("**txdataF[%d][%d]= %d+i%d\n ",aa,tti_offset,((int16_t*)&txdataF[aa][tti_offset])[0],((int16_t*)&txdataF[aa][tti_offset])[1]);
} }
} }
...@@ -1291,7 +1295,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, ...@@ -1291,7 +1295,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode; MIMO_mode_t mimo_mode = dlsch0_harq->mimo_mode;
uint8_t beamforming_mode = 0; uint8_t beamforming_mode = 0;
int32_t **beamforming_weights_RB = beamforming_weights; int32_t **beamforming_weights_RB = beamforming_weights;
uint8_t lprime, mprime=0,Ns; uint8_t mprime=0,Ns;
int8_t lprime=-1;
#ifdef DEBUG_DLSCH_MODULATION #ifdef DEBUG_DLSCH_MODULATION
uint8_t Nl0 = dlsch0_harq->Nl; uint8_t Nl0 = dlsch0_harq->Nl;
...@@ -1375,19 +1380,25 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, ...@@ -1375,19 +1380,25 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
beamforming_mode = 7; beamforming_mode = 7;
mprime = 0; mprime = 0;
if (frame_parms->Ncp==0) { // normal prefix if (frame_parms->Ncp==0) { // normal prefix
if ((l==6)||(l==12)) if (l==12)
lprime=2; // pilots in nushift+3, nushift+9 lprime=3; // pilots in nushift+3, nushift+9
else if ((l==3)||(l==9)) else if (l==9)
lprime=1; // pilots in nushift, nushift+6 lprime=2; // pilots in nushift, nushift+6
else if (l==6)
lprime=1; // pilots in nushift+3, nushift+9
else if (l==3)
lprime=0; // pilots in nushift, nushift+6
else else
lprime=0; lprime=-1;
} else { } else {
if ((l==7)) if (l==10)
lprime=2; lprime=2;
else if ((l==4)||(l==10)) else if (l==7)
lprime=1; lprime=1;
else else if (l==4)
lprime=0; lprime=0;
else
lprime=-1;
} }
}else if(mimo_mode==TM8){ }else if(mimo_mode==TM8){
beamforming_mode = 8; beamforming_mode = 8;
...@@ -1395,10 +1406,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, ...@@ -1395,10 +1406,7 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
beamforming_mode = 9; beamforming_mode = 9;
} }
if(l<=(nsymb>>2)) Ns = 2*subframe_offset+(l>=(nsymb>>1));
Ns=0;
else
Ns=1;
re_offset = frame_parms->first_carrier_offset; re_offset = frame_parms->first_carrier_offset;
symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb)); symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe_offset*nsymb));
...@@ -1588,12 +1596,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB, ...@@ -1588,12 +1596,8 @@ int dlsch_modulation(PHY_VARS_eNB* phy_vars_eNB,
Ns, Ns,
beamforming_weights_RB); beamforming_weights_RB);
if(mimo_mode==TM7){ if(mimo_mode==TM7 && lprime>=0)
if(frame_parms->Ncp==0&&(l==3||l==6||l==9||l==12)) mprime +=3+frame_parms->Ncp;
mprime +=3;
else if(frame_parms->Ncp==1&&(l==4||l==7||l==10))
mprime +=4;
}
} }
......
...@@ -48,7 +48,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB, ...@@ -48,7 +48,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
uint8_t beamforming_mode) uint8_t beamforming_mode)
{ {
LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms; /*LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol; uint32_t tti,tti_offset,slot_offset,Nsymb,samples_per_symbol;
uint8_t second_pilot,aa; uint8_t second_pilot,aa;
...@@ -123,7 +123,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB, ...@@ -123,7 +123,7 @@ void generate_ue_spec_pilots(PHY_VARS_eNB *phy_vars_eNB,
default: default:
msg("[generate_ue_spec_pilots(in uespec_pilots.c)]ERROR:beamforming mode %d is not supported\n",beamforming_mode); msg("[generate_ue_spec_pilots(in uespec_pilots.c)]ERROR:beamforming mode %d is not supported\n",beamforming_mode);
} }*/
} }
/*int generate_ue_spec_pilots_slot(PHY_VARS_eNB *phy_vars_eNB, /*int generate_ue_spec_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
......
...@@ -1756,6 +1756,8 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm ...@@ -1756,6 +1756,8 @@ int is_pmch_subframe(frame_t frame, int subframe, LTE_DL_FRAME_PARMS *frame_parm
uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots); uint8_t is_not_pilot(uint8_t pilots, uint8_t re, uint8_t nushift, uint8_t use2ndpilots);
uint8_t is_not_UEspecRS(int8_t lprime, uint8_t re, uint8_t nushift, uint8_t Ncp, uint8_t beamforming_mode);
uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB, uint32_t dlsch_decoding_abstraction(double *dlsch_MIPB,
LTE_DL_FRAME_PARMS *lte_frame_parms, LTE_DL_FRAME_PARMS *lte_frame_parms,
LTE_UE_DLSCH_t *dlsch, LTE_UE_DLSCH_t *dlsch,
......
...@@ -64,6 +64,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, ...@@ -64,6 +64,11 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
unsigned int rx_offset; unsigned int rx_offset;
/*LTE_UE_DLSCH_t **dlsch_ue = phy_vars_ue->dlsch_ue[eNB_id];
unsigned char harq_pid = dlsch_ue[0]->current_harq_pid;
LTE_DL_UE_HARQ_t *dlsch0_harq = dlsch_ue[0]->harq_processes[harq_pid];
int uespec_pilot[9][1200];*/
void (*dft)(int16_t *,int16_t *, int); void (*dft)(int16_t *,int16_t *, int);
int tmp_dft_in[256]; // This is for misalignment issues for 6 and 15 PRBs int tmp_dft_in[256]; // This is for misalignment issues for 6 and 15 PRBs
...@@ -241,15 +246,18 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue, ...@@ -241,15 +246,18 @@ int slot_fep(PHY_VARS_UE *phy_vars_ue,
} }
} }
// printf("slot_fep:transmission_mode[%d] = %d\n", eNB_id, phy_vars_ue->transmission_mode[eNB_id]);
if(phy_vars_ue->transmission_mode[eNB_id] == 7) if(phy_vars_ue->transmission_mode[eNB_id] == 7) {
if(frame_parms->Ncp==0 && (symbol==3) || (symbol==6) || (symbol==9) || (symbol==12))
if(frame_parms->Ncp==0 && ((symbol==3) || (symbol==6) || (symbol==9) || (symbol==12)))
lte_dl_bf_channel_estimation(phy_vars_ue,eNB_id,0,Ns,5,symbol); lte_dl_bf_channel_estimation(phy_vars_ue,eNB_id,0,Ns,5,symbol);
else if(frame_parms->Ncp==1 && (symbol==4) || (symbol==7) || (symbol==10))
else if(frame_parms->Ncp==1 && ((symbol==4) || (symbol==7) || (symbol==10)))
msg("slot_fep(slot_fep.c):channel estimation not supported yet for TM7 extented CP.\n"); msg("slot_fep(slot_fep.c):channel estimation not supported yet for TM7 extented CP.\n");
else if(phy_vars_ue->transmission_mode[eNB_id] > 7)
msg("slot_fep(slot_fep.c):transmission mode not supported yet.\n");
} else if(phy_vars_ue->transmission_mode[eNB_id] > 7) {
msg("slot_fep(slot_fep.c):transmission mode not supported yet.\n");
}
} }
#ifdef DEBUG_FEP #ifdef DEBUG_FEP
......
...@@ -243,7 +243,7 @@ typedef struct PHY_VARS_eNB_s { ...@@ -243,7 +243,7 @@ typedef struct PHY_VARS_eNB_s {
uint32_t lte_gold_table[20][2][14]; uint32_t lte_gold_table[20][2][14];
/// UE-specific reference symbols (p=5), TM 7 /// UE-specific reference symbols (p=5), TM 7
uint32_t lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][2][21]; uint32_t lte_gold_uespec_port5_table[NUMBER_OF_UE_MAX][20][38];
/// UE-specific reference symbols (p=7...14), TM 8/9/10 /// UE-specific reference symbols (p=7...14), TM 8/9/10
uint32_t lte_gold_uespec_table[2][20][2][21]; uint32_t lte_gold_uespec_table[2][20][2][21];
...@@ -510,7 +510,7 @@ typedef struct { ...@@ -510,7 +510,7 @@ typedef struct {
uint32_t lte_gold_table[7][20][2][14]; uint32_t lte_gold_table[7][20][2][14];
/// UE-specific reference symbols (p=5), TM 7 /// UE-specific reference symbols (p=5), TM 7
uint32_t lte_gold_uespec_port5_table[20][2][21]; uint32_t lte_gold_uespec_port5_table[20][38];
/// ue-specific reference symbols /// ue-specific reference symbols
uint32_t lte_gold_uespec_table[2][20][2][21]; uint32_t lte_gold_uespec_table[2][20][2][21];
......
...@@ -173,7 +173,6 @@ void lte_param_init(unsigned char N_tx, unsigned char N_tx_phy, unsigned char N_ ...@@ -173,7 +173,6 @@ void lte_param_init(unsigned char N_tx, unsigned char N_tx_phy, unsigned char N_
phy_init_lte_ue(PHY_vars_UE,1,0); phy_init_lte_ue(PHY_vars_UE,1,0);
phy_init_lte_eNB(PHY_vars_eNB,0,0,0); phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms); generate_pcfich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms); generate_phich_reg_mapping(&PHY_vars_UE->lte_frame_parms);
...@@ -746,6 +745,7 @@ int main(int argc, char **argv) ...@@ -746,6 +745,7 @@ int main(int argc, char **argv)
if (transmission_mode==7){ if (transmission_mode==7){
lte_gold_ue_spec_port5(PHY_vars_eNB->lte_gold_uespec_port5_table[0],Nid_cell,n_rnti); lte_gold_ue_spec_port5(PHY_vars_eNB->lte_gold_uespec_port5_table[0],Nid_cell,n_rnti);
lte_gold_ue_spec_port5(PHY_vars_UE->lte_gold_uespec_port5_table,Nid_cell,n_rnti); lte_gold_ue_spec_port5(PHY_vars_UE->lte_gold_uespec_port5_table,Nid_cell,n_rnti);
beamforming_weights = (int32_t **)malloc(12*N_RB_DL*sizeof(int32_t*)); beamforming_weights = (int32_t **)malloc(12*N_RB_DL*sizeof(int32_t*));
for(re=0;re<12*N_RB_DL;re++){ for(re=0;re<12*N_RB_DL;re++){
beamforming_weights[re]=(int32_t *)malloc(n_tx_phy*sizeof(int32_t)); beamforming_weights[re]=(int32_t *)malloc(n_tx_phy*sizeof(int32_t));
...@@ -3065,9 +3065,11 @@ PMI_FEEDBACK: ...@@ -3065,9 +3065,11 @@ PMI_FEEDBACK:
pilot3 = 9; pilot3 = 9;
} }
start_meas(&PHY_vars_UE->phy_proc_rx); start_meas(&PHY_vars_UE->phy_proc_rx);
// Inner receiver scheduling for 3 slots // Inner receiver scheduling for 3 slots
for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) { for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) {
for (l=0; l<pilot2; l++) { for (l=0; l<pilot2; l++) {
if (n_frames==1) if (n_frames==1)
...@@ -3085,7 +3087,7 @@ PMI_FEEDBACK: ...@@ -3085,7 +3087,7 @@ PMI_FEEDBACK:
no_prefix if 1 prefix is removed by HW no_prefix if 1 prefix is removed by HW
*/ */
if(Ns==(2*subframe) || Ns==(2*subframe+1)) {
start_meas(&PHY_vars_UE->ofdm_demod_stats); start_meas(&PHY_vars_UE->ofdm_demod_stats);
slot_fep(PHY_vars_UE, slot_fep(PHY_vars_UE,
l, l,
...@@ -3093,6 +3095,7 @@ PMI_FEEDBACK: ...@@ -3093,6 +3095,7 @@ PMI_FEEDBACK:
0, 0,
0); 0);
stop_meas(&PHY_vars_UE->ofdm_demod_stats); stop_meas(&PHY_vars_UE->ofdm_demod_stats);
}
//write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1); //write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
if (PHY_vars_UE->perfect_ce==1) { if (PHY_vars_UE->perfect_ce==1) {
...@@ -3120,6 +3123,11 @@ PMI_FEEDBACK: ...@@ -3120,6 +3123,11 @@ PMI_FEEDBACK:
for (i=0; i<frame_parms->N_RB_DL*12; i++) { for (i=0; i<frame_parms->N_RB_DL*12; i++) {
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP); ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2; ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
if (transmission_mode == 7){
((int16_t *) PHY_vars_UE->lte_ue_pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=(short)(AMP);
((int16_t *) PHY_vars_UE->lte_ue_pdsch_vars[0]->dl_bf_ch_estimates[(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size)*2]=0/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