Added automatic scaling to PUCCH2 receiver

Scaling based on incoming signal level to help with polar case.
Can subsequently add PUCCH2 CQI measurement based on this.
This commit is contained in:
Raymond Knopp
2024-08-01 14:03:48 +02:00
committed by Robert Schmidt
parent e8a083767a
commit 70751e04d8
2 changed files with 62 additions and 31 deletions
+57 -26
View File
@@ -1059,6 +1059,8 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
c16_t rp[Prx2][2][nb_re_pucch];
memset(rp, 0, sizeof(rp));
int64_t pucch2_lev = 0;
for (int aa=0;aa<Prx;aa++){
for (int symb=0;symb<pucch_pdu->nr_of_symbols;symb++) {
c16_t *tmp_rp = ((c16_t *)&rxdataF[aa][soffset + (l2 + symb) * frame_parms->ofdm_symbol_size]);
@@ -1072,10 +1074,23 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
memcpy(rp[aa][symb], &tmp_rp[re_offset[symb]], neg_length * sizeof(c16_t));
memcpy(&rp[aa][symb][neg_length], tmp_rp, pos_length * sizeof(c16_t));
}
pucch2_lev += signal_energy_nodc((int32_t *)rp[aa][symb], nb_re_pucch);
}
}
pucch2_lev /= Prx * Prx * pucch_pdu->nr_of_symbols;
int pucch2_levdB = dB_fixed(pucch2_lev);
int scaling = 0;
if (pucch2_levdB > 72)
scaling = 4;
else if (pucch2_levdB > 66)
scaling = 3;
else if (pucch2_levdB > 60)
scaling = 2;
else if (pucch2_levdB > 54)
scaling = 1;
LOG_D(PHY,
"%d.%d Decoding pucch2 for %d symbols, %d PRB, nb_harq %d, nb_sr %d, nb_csi %d/%d\n",
"%d.%d Decoding pucch2 for %d symbols, %d PRB, nb_harq %d, nb_sr %d, nb_csi %d/%d, pucch2_lev %d dB (scaling %d)\n",
frame,
slot,
pucch_pdu->nr_of_symbols,
@@ -1083,7 +1098,9 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
pucch_pdu->bit_len_harq,
pucch_pdu->sr_flag,
pucch_pdu->bit_len_csi_part1,
pucch_pdu->bit_len_csi_part2);
pucch_pdu->bit_len_csi_part2,
pucch2_levdB,
scaling);
int nc_group_size=1; // 2 PRB
int ngroup = prb_size_ext/nc_group_size/2;
@@ -1124,14 +1141,14 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
for (int idx = 0; idx < 4; idx++) {
c16_t *rp_base = rp[aa][symb] + prb * 12 + 3 * idx;
AssertFatal(prb * 12 + 3 * idx + 2 < nb_re_pucch, "");
r_re_ext_p[idx << 1] = rp_base->r;
r_im_ext_p[idx << 1] = rp_base->i;
r_re_ext_p[idx << 1] = rp_base->r >> scaling;
r_im_ext_p[idx << 1] = rp_base->i >> scaling;
rp_base++;
rd_re_ext_p[idx] = rp_base->r;
rd_im_ext_p[idx] = rp_base->i;
rd_re_ext_p[idx] = rp_base->r >> scaling;
rd_im_ext_p[idx] = rp_base->i >> scaling;
rp_base++;
r_re_ext_p[1 + (idx << 1)] = rp_base->r;
r_im_ext_p[1 + (idx << 1)] = rp_base->i;
r_re_ext_p[1 + (idx << 1)] = rp_base->r >> scaling;
r_im_ext_p[1 + (idx << 1)] = rp_base->i >> scaling;
}
#ifdef DEBUG_NR_PUCCH_RX
@@ -1524,24 +1541,38 @@ void nr_decode_pucch2(PHY_VARS_gNB *gNB,
corr_re = ( corr32_re[symb][half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_re[aa]))[0]);
corr_im = ( corr32_im[symb][half_prb>>2][aa]/(2*nc_group_size*4/2)+((int16_t*)(&prod_im[aa]))[0]);
corr_tmp += (corr_re*corr_re + corr_im*corr_im)>>(Prx/2);
/*
LOG_D(PHY,"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d) (%d,%d)+(%d,%d)
= (%d,%d) => %d\n", half_prb,cw,cw&15,cw>>4,aa,
((int16_t*)&pucch2_polar_4bit[cw&15])[0],((int16_t*)&pucch2_polar_4bit[cw>>4])[0],
((int16_t*)&pucch2_polar_4bit[cw&15])[1],((int16_t*)&pucch2_polar_4bit[cw>>4])[1],
((int16_t*)&pucch2_polar_4bit[cw&15])[2],((int16_t*)&pucch2_polar_4bit[cw>>4])[2],
((int16_t*)&pucch2_polar_4bit[cw&15])[3],((int16_t*)&pucch2_polar_4bit[cw>>4])[3],
((int16_t*)&rp_re[aa][half_prb])[0],((int16_t*)&rp_im[aa][half_prb])[0],
((int16_t*)&rp_re[aa][half_prb])[1],((int16_t*)&rp_im[aa][half_prb])[1],
((int16_t*)&rp_re[aa][half_prb])[2],((int16_t*)&rp_im[aa][half_prb])[2],
((int16_t*)&rp_re[aa][half_prb])[3],((int16_t*)&rp_im[aa][half_prb])[3],
corr32_re[half_prb>>2][aa]/(2*nc_group_size*4/2),corr32_im[half_prb>>2][aa]/(2*nc_group_size*4/2),
((int16_t*)(&prod_re[aa]))[0],
((int16_t*)(&prod_im[aa]))[0],
corr_re,
corr_im,
corr_tmp);
*/
LOG_D(PHY,
"pucch2 half_prb %d cw %d (%d,%d) aa %d: (%d,%d,%d,%d,%d,%d,%d,%d)x(%d,%d,%d,%d,%d,%d,%d,%d) (%d,%d)+(%d,%d) = "
"(%d,%d) => %d\n",
half_prb,
cw,
cw & 15,
cw >> 4,
aa,
((int16_t *)&pucch2_polar_4bit[cw & 15])[0],
((int16_t *)&pucch2_polar_4bit[cw >> 4])[0],
((int16_t *)&pucch2_polar_4bit[cw & 15])[1],
((int16_t *)&pucch2_polar_4bit[cw >> 4])[1],
((int16_t *)&pucch2_polar_4bit[cw & 15])[2],
((int16_t *)&pucch2_polar_4bit[cw >> 4])[2],
((int16_t *)&pucch2_polar_4bit[cw & 15])[3],
((int16_t *)&pucch2_polar_4bit[cw >> 4])[3],
((int16_t *)&rp_re[aa][half_prb])[0],
((int16_t *)&rp_im[aa][half_prb])[0],
((int16_t *)&rp_re[aa][half_prb])[1],
((int16_t *)&rp_im[aa][half_prb])[1],
((int16_t *)&rp_re[aa][half_prb])[2],
((int16_t *)&rp_im[aa][half_prb])[2],
((int16_t *)&rp_re[aa][half_prb])[3],
((int16_t *)&rp_im[aa][half_prb])[3],
corr32_re[symb][half_prb >> 2][aa] / (2 * nc_group_size * 4 / 2),
corr32_im[symb][half_prb >> 2][aa] / (2 * nc_group_size * 4 / 2),
((int16_t *)(&prod_re[aa]))[0],
((int16_t *)(&prod_im[aa]))[0],
corr_re,
corr_im,
corr_tmp);
}
corr16 = simde_mm_set1_epi16((int16_t)(corr_tmp >> 8));
+5 -5
View File
@@ -539,7 +539,7 @@ int main(int argc, char **argv)
}
pucch_GroupHopping_t PUCCH_GroupHopping = pucch_tx_pdu.group_hop_flag + (pucch_tx_pdu.sequence_hop_flag<<1);
double tx_level_fp = 100.0;
for(SNR=snr0;SNR<=snr1;SNR+=1){
ack_nack_errors=0;
sr_errors=0;
@@ -578,8 +578,8 @@ int main(int argc, char **argv)
for (int aarx=0;aarx<n_rx;aarx++) {
double nr = sqrt(sigma2/2)*gaussdouble(0.0,1.0);
double ni = sqrt(sigma2/2)*gaussdouble(0.0,1.0);
rxdataF[aarx][i].r = (int16_t)(100.0*(nr)/sqrt((double)txlev));
rxdataF[aarx][i].i = (int16_t)(100.0*(ni)/sqrt((double)txlev));
rxdataF[aarx][i].r = (int16_t)(tx_level_fp * (nr) / sqrt((double)txlev));
rxdataF[aarx][i].i = (int16_t)(tx_level_fp * (ni) / sqrt((double)txlev));
}
}
}
@@ -607,8 +607,8 @@ int main(int argc, char **argv)
rxr = rxr_tmp;
double nr = sqrt(sigma2/2)*gaussdouble(0.0,1.0);
double ni = sqrt(sigma2/2)*gaussdouble(0.0,1.0);
rxdataF[aarx][i].r = (int16_t)(100.0*(rxr + nr)/sqrt((double)txlev));
rxdataF[aarx][i].i=(int16_t)(100.0*(rxi + ni)/sqrt((double)txlev));
rxdataF[aarx][i].r = (int16_t)(tx_level_fp * (rxr + nr) / sqrt((double)txlev));
rxdataF[aarx][i].i = (int16_t)(tx_level_fp * (rxi + ni) / sqrt((double)txlev));
if (n_trials==1 && fabs(txr) > 0) printf("symb %d, re %d , aarx %d : txr %f, txi %f, chr %f, chi %f, nr %f, ni %f, rxr %f, rxi %f => %d,%d\n",
symb, re, aarx, txr,txi,