Improved channel estimates around DC for uplink
This commit is contained in:
@@ -119,12 +119,12 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
memset(ul_ch,0,4*(gNB->frame_parms.ofdm_symbol_size));
|
||||||
|
|
||||||
#ifdef DEBUG_PUSCH
|
#ifdef DEBUG_PUSCH
|
||||||
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_DL);
|
printf("ch est pilot addr %p RB_DL %d\n",&pilot[0], gNB->frame_parms.N_RB_UL);
|
||||||
printf("k %d, first_carrier %d\n",k,gNB->frame_parms.first_carrier_offset);
|
printf("k %d, first_carrier %d\n",k,gNB->frame_parms.first_carrier_offset);
|
||||||
printf("rxF addr %p p %d\n", rxF,p);
|
printf("rxF addr %p p %d\n", rxF,p);
|
||||||
printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
|
printf("ul_ch addr %p nushift %d\n",ul_ch,nushift);
|
||||||
#endif
|
#endif
|
||||||
//if ((gNB->frame_parms.N_RB_DL&1)==0) {
|
//if ((gNB->frame_parms.N_RB_UL&1)==0) {
|
||||||
|
|
||||||
// Treat first 2 pilots specially (left edge)
|
// Treat first 2 pilots specially (left edge)
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
@@ -256,6 +256,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
ul_ch,
|
ul_ch,
|
||||||
8);
|
8);
|
||||||
|
|
||||||
|
|
||||||
// check if PRB crosses DC and improve estimates around DC
|
// check if PRB crosses DC and improve estimates around DC
|
||||||
if ((bwp_start_subcarrier >= gNB->frame_parms.ofdm_symbol_size/2) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) {
|
if ((bwp_start_subcarrier >= gNB->frame_parms.ofdm_symbol_size/2) && (bwp_start_subcarrier+nb_rb_pusch*12 >= gNB->frame_parms.ofdm_symbol_size)) {
|
||||||
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
||||||
@@ -263,55 +264,70 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
|
|||||||
uint16_t idxPil = idxDC/2;
|
uint16_t idxPil = idxDC/2;
|
||||||
re_offset = k;
|
re_offset = k;
|
||||||
pil = (int16_t *)&pilot[0];
|
pil = (int16_t *)&pilot[0];
|
||||||
pil += (idxPil-4);
|
|
||||||
ul_ch += (idxDC-8);
|
|
||||||
ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14);
|
|
||||||
|
|
||||||
re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1);
|
// for proper allignment of SIMD vectors
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
if((gNB->frame_parms.N_RB_UL&1)==0) {
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
pil += (idxPil-4);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ul_ch += (idxDC-8);
|
||||||
|
ul_ch = memset(ul_ch, 0, sizeof(int16_t)*14);
|
||||||
multadd_real_vector_complex_scalar(fl,
|
re_offset = (re_offset+idxDC/2-4)&(gNB->frame_parms.ofdm_symbol_size-1);
|
||||||
ch,
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
ul_ch,
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
8);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(fl,
|
||||||
|
ch,
|
||||||
|
ul_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
pil += 2;
|
pil += 2;
|
||||||
re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);
|
re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(filt8_dcl,
|
multadd_real_vector_complex_scalar(filt8_dcl,
|
||||||
ch,
|
ch,
|
||||||
ul_ch,
|
ul_ch,
|
||||||
8);
|
8);
|
||||||
|
|
||||||
pil += 4;
|
pil += 4;
|
||||||
re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1);
|
re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1);
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(filt8_dcr,
|
multadd_real_vector_complex_scalar(filt8_dcr,
|
||||||
ch,
|
ch,
|
||||||
ul_ch,
|
ul_ch,
|
||||||
8);
|
8);
|
||||||
/*
|
} else {
|
||||||
pil += 2;
|
pil += (idxPil-2);
|
||||||
re_offset = (re_offset+2)&(gNB->frame_parms.ofdm_symbol_size-1);
|
ul_ch += (idxDC-4);
|
||||||
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
ul_ch = memset(ul_ch, 0, sizeof(int16_t)*10);
|
||||||
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
re_offset = (re_offset+idxDC/2-2)&(gNB->frame_parms.ofdm_symbol_size-1);
|
||||||
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcl_h,
|
||||||
|
ch,
|
||||||
|
ul_ch,
|
||||||
|
8);
|
||||||
|
|
||||||
|
pil += 4;
|
||||||
|
re_offset = (re_offset+4)&(gNB->frame_parms.ofdm_symbol_size-1);
|
||||||
|
rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
|
||||||
|
ch[0] = (int16_t)(((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15);
|
||||||
|
ch[1] = (int16_t)(((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15);
|
||||||
|
|
||||||
|
multadd_real_vector_complex_scalar(filt8_dcr_h,
|
||||||
|
ch,
|
||||||
|
ul_ch,
|
||||||
|
8);
|
||||||
|
}
|
||||||
|
|
||||||
multadd_real_vector_complex_scalar(filt8_dcmd,
|
|
||||||
ch,
|
|
||||||
ul_ch,
|
|
||||||
8);
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_PDSCH
|
#ifdef DEBUG_PDSCH
|
||||||
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
ul_ch = (int16_t *)&ul_ch_estimates[aarx][ch_offset];
|
||||||
for(uint16_t idxP=0; idxP<(nb_rb_pusch*12/8); idxP++) {
|
for(uint16_t idxP=0; idxP<(nb_rb_pusch*12/8); idxP++) {
|
||||||
|
|||||||
Reference in New Issue
Block a user