diff --git a/cmake_targets/autotests/test_case_list.xml b/cmake_targets/autotests/test_case_list.xml
index 50da90b5ec..3d15361430 100755
--- a/cmake_targets/autotests/test_case_list.xml
+++ b/cmake_targets/autotests/test_case_list.xml
@@ -159,9 +159,9 @@
-n100 -R106 -b106 -s5
-n100 -R217 -b217 -s5
-n100 -R273 -b273 -s5
- -n100 -s1 -t25
- -n100 -s1 -t33
- -n100 -s1 -t50
+ -n100 -s1 -S2 -t25
+ -n100 -s1 -S2 -t33
+ -n100 -s5 -S7 -t50
-n100 -m0 -e0 -R25 -b25 -i 2 1 0
test1 test2 test3 test4 test5 test6 test7
PDSCH test OK
@@ -193,15 +193,17 @@
(Test3: 106 MCS-TABLE 256 QAM MCS Index 26),
(Test4: MCS 0, low SNR performance),
(Test5: 4x4 MIMO, 1 Layer),
- (Test6: 4x4 MIMO, 2 Layers)
+ (Test6: 4x4 MIMO, 2 Layers),
+ (Test7: 4x4 MIMO, 4 Layers)
nr_dlsim
-n100 -e27 -s30
- -n100 -e16 -s10
+ -n100 -e16 -s11 -S13
-n100 -q1 -e26 -s30
-n100 -e0 -t95 -S-1.0 -i 2 1 0
-n10 -s20 -U 3 0 0 2 -gR -x1 -y4 -z4
- -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
- test1 test2 test3 test4 test5 test6
+ -n10 -s20 -U 3 0 0 2 -gR -x2 -y4 -z4
+ -n10 -s20 -U 3 0 0 2 -x4 -y4 -z4
+ test1 test2 test3 test4 test5 test6 test7
PDSCH test OK
segmentation fault|assertion|exiting|fatal
3
@@ -218,9 +220,9 @@
-n100 -s5 -T 2 2 2
-n100 -s5 -T 2 1 2
-n100 -s5 -T 2 0 4
- -n100 -s2 -U 2 0 1
- -n100 -s2 -U 2 0 2
- -n100 -s2 -U 2 1 3
+ -n100 -s5 -S7 -U 2 0 1
+ -n100 -s5 -S7 -U 2 0 2
+ -n100 -s5 -S7 -U 2 1 3
test1 test2 test3 test4 test5 test6
PDSCH test OK
segmentation fault|assertion|exiting|fatal
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
index 0ddc0986bd..94bf1b02dc 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/fapi_nr_ue_interface.h
@@ -87,6 +87,7 @@ typedef struct {
typedef struct {
uint16_t rnti;
uint8_t dci_format;
+ uint8_t coreset_type;
int ss_type;
// n_CCE index of first CCE for PDCCH reception
int n_CCE;
diff --git a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
index 53ca4bf762..ebc225d82b 100644
--- a/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+++ b/openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
@@ -249,69 +249,21 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
}
#endif
- } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { //pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
- LOG_D(PHY,"PUSCH estimation DMRS type 2, Freq-domain interpolation");
- c16_t *pil = pilot;
- int re_offset = k0;
- // Treat first DMRS specially (left edge)
- *ul_ch=c16mulShift(*pil,
- rxdataF[soffset+nushift+re_offset],
- 15);
- pil++;
- ul_ch++;
- re_offset = (re_offset + 1)%symbolSize;
- ch_offset++;
-
- // TO verify: used after the loop, likely a piece of code is missing for ch_r
- c16_t ch_r;
- for (int re_cnt = 1; re_cnt < (nb_rb_pusch*NR_NB_SC_PER_RB) - 5; re_cnt += 6) {
- c16_t ch_l=c16mulShift(*pil,
- rxdataF[soffset+nushift+re_offset],
- 15);
- *ul_ch = ch_l;
+ } else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type2 && chest_freq == 0) { // pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
+ LOG_D(PHY, "PUSCH estimation DMRS type 2, Freq-domain interpolation\n");
+ c16_t *pil = pilot;
+ c16_t *rx = &rxdataF[soffset + nushift];
+ for (int n = 0; n < nb_rb_pusch * NR_NB_SC_PER_RB; n += 6) {
+ c16_t ch0 = c16mulShift(*pil, rx[(k0 + n) % symbolSize], 15);
pil++;
- ul_ch++;
- ch_offset++;
- multadd_real_four_symbols_vector_complex_scalar(filt8_ml2,
- &ch_l,
- ul_ch);
- *max_ch = max(*max_ch, max(abs(ch_l.r), abs(ch_l.i)));
-
- re_offset = (re_offset+5)%symbolSize;
- ch_r=c16mulShift(*pil,
- rxdataF[soffset+nushift+re_offset],
- 15);
- multadd_real_four_symbols_vector_complex_scalar(filt8_mr2,
- &ch_r,
- ul_ch);
- *max_ch = max(*max_ch, max(abs(ch_r.r), abs(ch_r.i)));
-
- //for (int re_idx = 0; re_idx < 8; re_idx += 2)
- //printf("ul_ch = %d + j*%d\n", ul_ch[re_idx], ul_ch[re_idx+1]);
- ul_ch += 4;
- ch_offset += 4;
- *ul_ch = ch_r;
+ c16_t ch1 = c16mulShift(*pil, rx[(k0 + n + 1) % symbolSize], 15);
pil++;
- ul_ch++;
- ch_offset++;
- re_offset = (re_offset + 1)%symbolSize;
+ c16_t ch = c16addShift(ch0, ch1, 1);
+ *max_ch = max(*max_ch, max(abs(ch.r), abs(ch.i)));
+ multadd_real_four_symbols_vector_complex_scalar(filt8_rep4, &ch, &ul_ch[n]);
+ ul_ch[n + 4] = ch;
+ ul_ch[n + 5] = ch;
}
-
- // Treat last pilot specially (right edge)
- c16_t ch_l=c16mulShift(*pil,
- rxdataF[soffset+nushift+re_offset],
- 15);
- *ul_ch = ch_l;
- ul_ch++;
- ch_offset++;
- multadd_real_four_symbols_vector_complex_scalar(filt8_rr1,
- &ch_l,
- ul_ch);
- multadd_real_four_symbols_vector_complex_scalar(filt8_rr2,
- &ch_r,
- ul_ch);
- __m128i *ul_ch_128 = (__m128i *)&ul_ch_estimates[p*gNB->frame_parms.nb_antennas_rx+aarx][ch_offset];
- ul_ch_128[0] = _mm_slli_epi16 (ul_ch_128[0], 2);
}
else if (pusch_pdu->dmrs_config_type == pusch_dmrs_type1) { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
index d2a25b1258..52ede9018e 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
@@ -342,3 +342,26 @@ short filt16_ul_middle[16] = {2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
short filt16_ul_last[16] = {4096, 4096, 4096, 4096, 8192, 8192, 8192, 8192,
0, 0, 0, 0, 0, 0, 0, 0};
+
+short filt8_rep4[8] = {16384, 16384, 16384, 16384, 0, 0, 0, 0};
+
+// DL
+// DMRS_Type1
+short filt16_dl_first[16] = {12228, 12228, 12228, 12228, 8192, 8192, 8192, 8192,
+ 4096, 4096, 4096, 4096, 0, 0, 0, 0};
+
+short filt16_dl_middle[16] = {2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048,
+ 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048};
+
+short filt16_dl_last[16] = {4096, 4096, 4096, 4096, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0};
+
+// DMRS_Type2
+short filt16_dl_first_type2[16] = {16384, 16384, 16384, 8192, 8192, 8192, 8192, 8192,
+ 8192, 0, 0, 0, 0, 0, 0};
+
+short filt16_dl_middle_type2[16] = {8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
+ 8192, 8192, 8192, 8192, 0, 0, 0, 0};
+
+short filt16_dl_last_type2[16] = {8192, 8192, 8192, 8192, 8192, 8192, 16384, 16384,
+ 16384, 0, 0, 0, 0, 0, 0, 0};
diff --git a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
index 8a3b0a9870..b7bd6aec18 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
@@ -224,4 +224,16 @@ extern short filt16_ul_p0[16];
extern short filt16_ul_p1p2[16];
extern short filt16_ul_middle[16];
extern short filt16_ul_last[16];
+extern short filt8_rep4[8];
+
+/*DL*/
+// DL DMRS_Type1
+extern short filt16_dl_first[16];
+extern short filt16_dl_middle[16];
+extern short filt16_dl_last[16];
+
+// DL DMRS_Type2
+extern short filt16_dl_first_type2[16];
+extern short filt16_dl_middle_type2[16];
+extern short filt16_dl_last_type2[16];
#endif
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
index 6b988393d3..814de26b88 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
@@ -1230,6 +1230,360 @@ void nr_pdcch_channel_estimation(PHY_VARS_NR_UE *ue,
}
}
+void NFAPI_NR_DMRS_TYPE1_linear_interp(NR_DL_FRAME_PARMS *frame_parms,
+ c16_t *rxF,
+ c16_t *pil,
+ c16_t *dl_ch,
+ unsigned short bwp_start_subcarrier,
+ unsigned short nb_rb_pdsch,
+ int8_t delta)
+{
+ int re_offset = bwp_start_subcarrier % frame_parms->ofdm_symbol_size;
+ c16_t *pil0 = pil;
+ c16_t *dl_ch0 = dl_ch;
+ c16_t ch = {0};
+
+ int16_t *fdcl = NULL;
+ int16_t *fdcr = NULL;
+ int16_t *fdclh = NULL;
+ int16_t *fdcrh = NULL;
+ switch (delta) {
+ case 0: // port 0,1
+ fdcl = filt8_dcl0; // left DC interpolation Filter (even RB)
+ fdcr = filt8_dcr0; // right DC interpolation Filter (even RB)
+ fdclh = filt8_dcl0_h; // left DC interpolation Filter (odd RB)
+ fdcrh = filt8_dcr0_h; // right DC interpolation Filter (odd RB)
+ break;
+
+ case 1: // port2,3
+ fdcl = filt8_dcl1;
+ fdcr = filt8_dcr1;
+ fdclh = filt8_dcl1_h;
+ fdcrh = filt8_dcr1_h;
+ break;
+
+ default:
+ AssertFatal(1 == 0, "pdsch_channel_estimation: Invalid delta %i\n", delta);
+ break;
+ }
+
+ for (int pilot_cnt = 0; pilot_cnt < 6 * nb_rb_pdsch; pilot_cnt++) {
+ if (pilot_cnt % 2 == 0) {
+ ch = c16mulShift(*pil, rxF[re_offset], 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16maddShift(*pil, rxF[re_offset], ch, 15);
+ ch = c16Shift(ch, 1);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ }
+
+#ifdef DEBUG_PDSCH
+ printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil->r, pil->i, rxF[re_offset].r, rxF[re_offset].i, ch.r, ch.i);
+#endif
+
+ if (pilot_cnt == 0) { // Treat first pilot
+ c16multaddVectRealComplex(filt16_dl_first, &ch, dl_ch, 16);
+ } else if (pilot_cnt == 6 * nb_rb_pdsch - 1) { // Treat last pilot
+ c16multaddVectRealComplex(filt16_dl_last, &ch, dl_ch, 16);
+ } else { // Treat middle pilots
+ c16multaddVectRealComplex(filt16_dl_middle, &ch, dl_ch, 16);
+ if (pilot_cnt % 2 == 0) {
+ dl_ch += 4;
+ }
+ }
+ }
+
+ // check if PRB crosses DC and improve estimates around DC
+ if ((bwp_start_subcarrier < frame_parms->ofdm_symbol_size) && (bwp_start_subcarrier + nb_rb_pdsch * 12 >= frame_parms->ofdm_symbol_size)) {
+ dl_ch = dl_ch0;
+ uint16_t idxDC = 2 * (frame_parms->ofdm_symbol_size - bwp_start_subcarrier);
+ uint16_t idxPil = idxDC / 4;
+ re_offset = bwp_start_subcarrier % frame_parms->ofdm_symbol_size;
+ pil = pil0;
+ pil += (idxPil - 1);
+ dl_ch += (idxDC / 2 - 2);
+ dl_ch = memset(dl_ch, 0, sizeof(c16_t) * 5);
+ re_offset = (re_offset + idxDC / 2 - 2) % frame_parms->ofdm_symbol_size;
+ ch = c16mulShift(*pil, rxF[re_offset], 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16maddShift(*pil, rxF[re_offset], ch, 15);
+ ch = c16Shift(ch, 1);
+
+ // for proper allignment of SIMD vectors
+ if ((frame_parms->N_RB_DL & 1) == 0) {
+ c16multaddVectRealComplex(fdcl, &ch, dl_ch - 2, 8);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16mulShift(*pil, rxF[re_offset], 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16maddShift(*pil, rxF[re_offset], ch, 15);
+ ch = c16Shift(ch, 1);
+ c16multaddVectRealComplex(fdcr, &ch, dl_ch - 2, 8);
+ } else {
+ c16multaddVectRealComplex(fdclh, &ch, dl_ch, 8);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16mulShift(*pil, rxF[re_offset], 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ ch = c16maddShift(*pil, rxF[re_offset], ch, 15);
+ ch = c16Shift(ch, 1);
+ c16multaddVectRealComplex(fdcrh, &ch, dl_ch, 8);
+ }
+ }
+}
+
+void NFAPI_NR_DMRS_TYPE1_average_prb(NR_DL_FRAME_PARMS *frame_parms,
+ c16_t *rxF,
+ c16_t *pil,
+ c16_t *dl_ch,
+ unsigned short bwp_start_subcarrier,
+ unsigned short nb_rb_pdsch)
+{
+ int re_offset = bwp_start_subcarrier % frame_parms->ofdm_symbol_size;
+ c16_t ch = {0};
+ int P_average = 6;
+
+ c32_t ch32 = {0};
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 2 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 2 * P_average;
+#else
+ c16multaddVectRealComplex(filt8_avlip0, &ch, dl_ch, 8);
+ dl_ch += 16;
+ c16multaddVectRealComplex(filt8_avlip1, &ch, dl_ch, 8);
+ dl_ch += 16;
+ c16multaddVectRealComplex(filt8_avlip2, &ch, dl_ch, 8);
+ dl_ch -= 24;
+#endif
+
+ for (int pilot_cnt = P_average; pilot_cnt < 6 * (nb_rb_pdsch - 1); pilot_cnt += P_average) {
+ ch32.r = 0;
+ ch32.i = 0;
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 2 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 2 * P_average;
+#else
+ dl_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+ dl_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
+ dl_ch += 4;
+ c16multaddVectRealComplex(filt8_avlip3, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip4, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip5, &ch, dl_ch, 8);
+ dl_ch -= 8;
+#endif
+ }
+
+ ch32.r = 0;
+ ch32.i = 0;
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 2) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 2 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 2 * P_average;
+#else
+ dl_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+ dl_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
+ dl_ch += 4;
+ c16multaddVectRealComplex(filt8_avlip3, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip6, &ch, dl_ch, 8);
+#endif
+}
+
+void NFAPI_NR_DMRS_TYPE2_linear_interp(NR_DL_FRAME_PARMS *frame_parms,
+ c16_t *rxF,
+ c16_t *pil,
+ c16_t *dl_ch,
+ unsigned short bwp_start_subcarrier,
+ unsigned short nb_rb_pdsch,
+ int8_t delta,
+ unsigned short p)
+{
+ int re_offset = bwp_start_subcarrier % frame_parms->ofdm_symbol_size;
+ c16_t *dl_ch0 = dl_ch;
+ c16_t ch = {0};
+ c16_t ch_l = {0};
+ c16_t ch_r = {0};
+
+ for (int pilot_cnt = 0; pilot_cnt < 4 * nb_rb_pdsch; pilot_cnt += 2) {
+ ch_l = c16mulShift(*pil, rxF[re_offset], 15);
+#ifdef DEBUG_PDSCH
+ printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil->r, pil->i, rxF[re_offset].r, rxF[re_offset].i, ch_l.r, ch_l.i);
+#endif
+ pil++;
+ re_offset = (re_offset + 1) % frame_parms->ofdm_symbol_size;
+ ch_r = c16mulShift(*pil, rxF[re_offset], 15);
+#ifdef DEBUG_PDSCH
+ printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil->r, pil->i, rxF[re_offset].r, rxF[re_offset].i, ch_r.r, ch_r.i);
+#endif
+ ch = c16addShift(ch_l, ch_r, 1);
+ if (pilot_cnt == 1) {
+ multadd_real_vector_complex_scalar(filt16_dl_first_type2, (int16_t *)&ch, (int16_t *)dl_ch, 16);
+ dl_ch += 3;
+ } else if (pilot_cnt == (4 * nb_rb_pdsch - 1)) {
+ multadd_real_vector_complex_scalar(filt16_dl_last_type2, (int16_t *)&ch, (int16_t *)dl_ch, 16);
+ } else {
+ multadd_real_vector_complex_scalar(filt16_dl_middle_type2, (int16_t *)&ch, (int16_t *)dl_ch, 16);
+ dl_ch += 6;
+ }
+ pil++;
+ re_offset = (re_offset + 5) % frame_parms->ofdm_symbol_size;
+ }
+
+ // check if PRB crosses DC and improve estimates around DC
+ if ((bwp_start_subcarrier < frame_parms->ofdm_symbol_size) && (bwp_start_subcarrier + nb_rb_pdsch * 12 >= frame_parms->ofdm_symbol_size) && (p < 2)) {
+ dl_ch = dl_ch0;
+ uint16_t idxDC = 2 * (frame_parms->ofdm_symbol_size - bwp_start_subcarrier);
+ dl_ch += (idxDC / 2 - 4);
+ dl_ch = memset(dl_ch, 0, sizeof(c16_t) * 10);
+
+ dl_ch--;
+ ch_r = *dl_ch;
+ dl_ch += 11;
+ ch_l = *dl_ch;
+
+ // for proper allignment of SIMD vectors
+ if ((frame_parms->N_RB_DL & 1) == 0) {
+ dl_ch -= 10;
+ // Interpolate fdcrl1 with ch_r
+ c16multaddVectRealComplex(filt8_dcrl1, &ch_r, dl_ch, 8);
+ // Interpolate fdclh1 with ch_l
+ c16multaddVectRealComplex(filt8_dclh1, &ch_l, dl_ch, 8);
+ dl_ch += 8;
+ // Interpolate fdcrh1 with ch_r
+ c16multaddVectRealComplex(filt8_dcrh1, &ch_r, dl_ch, 8);
+ // Interpolate fdcll1 with ch_l
+ c16multaddVectRealComplex(filt8_dcll1, &ch_l, dl_ch, 8);
+ } else {
+ dl_ch -= 14;
+ // Interpolate fdcrl1 with ch_r
+ c16multaddVectRealComplex(filt8_dcrl2, &ch_r, dl_ch, 8);
+ // Interpolate fdclh1 with ch_l
+ c16multaddVectRealComplex(filt8_dclh2, &ch_l, dl_ch, 8);
+ dl_ch += 8;
+ // Interpolate fdcrh1 with ch_r
+ c16multaddVectRealComplex(filt8_dcrh2, &ch_r, dl_ch, 8);
+ // Interpolate fdcll1 with ch_l
+ c16multaddVectRealComplex(filt8_dcll2, &ch_l, dl_ch, 8);
+ }
+ }
+}
+
+void NFAPI_NR_DMRS_TYPE2_average_prb(NR_DL_FRAME_PARMS *frame_parms,
+ c16_t *rxF,
+ c16_t *pil,
+ c16_t *dl_ch,
+ unsigned short bwp_start_subcarrier,
+ unsigned short nb_rb_pdsch)
+{
+ int re_offset = bwp_start_subcarrier % frame_parms->ofdm_symbol_size;
+ c16_t ch = {0};
+ int P_average = 4;
+
+ c32_t ch32 = {0};
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 1) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 3 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 3 * P_average;
+#else
+ c16multaddVectRealComplex(filt8_avlip0, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip1, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip2, &ch, dl_ch, 8);
+ dl_ch -= 12;
+#endif
+
+ for (int pilot_cnt = P_average; pilot_cnt < 4 * (nb_rb_pdsch - 1); pilot_cnt += P_average) {
+ ch32.r = 0;
+ ch32.i = 0;
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 5) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 3 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 3 * P_average;
+#else
+ dl_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+ dl_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
+ dl_ch += 4;
+ c16multaddVectRealComplex(filt8_avlip3, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip4, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip5, &ch, dl_ch, 8);
+ dl_ch -= 8;
+#endif
+ }
+
+ ch32.r = 0;
+ ch32.i = 0;
+ for (int p_av = 0; p_av < P_average; p_av++) {
+ ch32 = c32x16maddShift(*pil, rxF[re_offset], ch32, 15);
+ pil++;
+ re_offset = (re_offset + 5) % frame_parms->ofdm_symbol_size;
+ }
+ ch = c16x32div(ch32, P_average);
+
+#if NO_INTERP
+ for (int i = 0; i < 3 * P_average; i++) {
+ dl_ch[i] = ch;
+ }
+ dl_ch += 3 * P_average;
+#else
+ dl_ch[3].r += (ch.r * 1365) >> 15; // 1/12*16384
+ dl_ch[3].i += (ch.i * 1365) >> 15; // 1/12*16384
+ dl_ch += 4;
+ c16multaddVectRealComplex(filt8_avlip3, &ch, dl_ch, 8);
+ dl_ch += 8;
+ c16multaddVectRealComplex(filt8_avlip6, &ch, dl_ch, 8);
+#endif
+}
int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
UE_nr_rxtx_proc_t *proc,
bool is_SI,
@@ -1243,35 +1597,23 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned short nb_rb_pdsch,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
- c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP])
+ int rxdataFsize,
+ c16_t rxdataF[][rxdataFsize])
{
int gNB_id = proc->gNB_id;
int Ns = proc->nr_slot_rx;
- int pilot[3280] __attribute__((aligned(16)));
- unsigned char aarx;
- unsigned short k;
- unsigned int pilot_cnt;
- int16_t ch_l[2],ch_r[2],ch[2],*pil,*rxF,*dl_ch;
- int16_t *fl=NULL,*fm=NULL,*fr=NULL,*fml=NULL,*fmr=NULL,*fmm=NULL,*fdcl=NULL,*fdcr=NULL,*fdclh=NULL,*fdcrh=NULL, *frl=NULL, *frr=NULL;
- int ch_offset,symbol_offset;
-
- uint8_t nushift;
- ch_offset = ue->frame_parms.ofdm_symbol_size*symbol;
-
- symbol_offset = ue->frame_parms.ofdm_symbol_size*symbol;
-
- k = bwp_start_subcarrier;
- int re_offset = k;
+ const int ch_offset = ue->frame_parms.ofdm_symbol_size * symbol;
+ const int symbol_offset = ue->frame_parms.ofdm_symbol_size * symbol;
#ifdef DEBUG_PDSCH
- printf("PDSCH Channel Estimation : gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, k=%d symbol %d\n",
+ printf("PDSCH Channel Estimation : gNB_id %d ch_offset %d, symbol_offset %d OFDM size %d, Ncp=%d, Ns=%d, bwp_start_subcarrier=%d symbol %d\n",
gNB_id,
ch_offset,
symbol_offset,
ue->frame_parms.ofdm_symbol_size,
ue->frame_parms.Ncp,
Ns,
- k,
+ bwp_start_subcarrier,
symbol);
#endif
@@ -1283,95 +1625,26 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int8_t delta = get_delta(p, config_type);
// checking if re-initialization of scrambling IDs is needed
- if (scrambling_id != ue->scramblingID_dlsch[nscid]){
+ if (scrambling_id != ue->scramblingID_dlsch[nscid]) {
ue->scramblingID_dlsch[nscid] = scrambling_id;
nr_gold_pdsch(ue, nscid, scrambling_id);
}
- nr_pdsch_dmrs_rx(ue, Ns, ue->nr_gold_pdsch[gNB_id][Ns][symbol][0], &pilot[0], 1000+p, 0, nb_rb_pdsch+rb_offset, config_type);
+ c16_t pilot[3280] __attribute__((aligned(16)));
+ nr_pdsch_dmrs_rx(ue, Ns, ue->nr_gold_pdsch[gNB_id][Ns][symbol][0], (int32_t *)pilot, 1000 + p, 0, nb_rb_pdsch + rb_offset, config_type);
- if (config_type == NFAPI_NR_DMRS_TYPE1){
- nushift = (p>>1)&1;
- if (p<4) ue->frame_parms.nushift = nushift;
- switch (delta) {
-
- case 0://port 0,1
- fl = filt8_l0;//left interpolation Filter for DMRS config. 1
- fm = filt8_m0;//left middle interpolation Filter
- fr = filt8_r0;//right interpolation Filter
- fmm = filt8_mm0;;//middle middle interpolation Filter
- fml = filt8_m0;//left middle interpolation Filter
- fmr = filt8_mr0;//middle right interpolation Filter
- fdcl = filt8_dcl0;//left DC interpolation Filter (even RB)
- fdcr = filt8_dcr0;//right DC interpolation Filter (even RB)
- fdclh = filt8_dcl0_h;//left DC interpolation Filter (odd RB)
- fdcrh = filt8_dcr0_h;//right DC interpolation Filter (odd RB)
- frl = NULL;
- frr = NULL;
- break;
-
- case 1://port2,3
- fl = filt8_l1;
- fm = filt8_m1;
- fr = filt8_r1;
- fmm = filt8_mm1;
- fml = filt8_ml1;
- fmr = filt8_m1;
- fdcl = filt8_dcl1;
- fdcr = filt8_dcr1;
- fdclh = filt8_dcl1_h;
- fdcrh = filt8_dcr1_h;
- frl = NULL;
- frr = NULL;
- break;
-
- default:
- LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
- return -1;
- break;
- }
- } else {//NFAPI_NR_DMRS_TYPE2
+ uint8_t nushift = 0;
+ if (config_type == NFAPI_NR_DMRS_TYPE1) {
+ nushift = (p >> 1) & 1;
+ if (p < 4)
+ ue->frame_parms.nushift = nushift;
+ } else { // NFAPI_NR_DMRS_TYPE2
nushift = delta;
- if (p<6) ue->frame_parms.nushift = nushift;
- switch (delta) {
- case 0://port 0,1
- fl = filt8_l2;//left interpolation Filter should be fml
- fr = filt8_r2;//right interpolation Filter should be fmr
- fm = filt8_l2;
- fmm = filt8_r2;
- fml = filt8_ml2;
- fmr = filt8_mr2;
- frl = filt8_rl2;
- frr = filt8_rm2;
- fdcl = filt8_dcl1;
- fdcr = filt8_dcr1;
- fdclh = filt8_dcl1_h;
- fdcrh = filt8_dcr1_h;
- break;
-
- case 2://port2,3
- fl = filt8_l3;
- fm = filt8_m2;
- fr = filt8_r3;
- fmm = filt8_mm2;
- fml = filt8_l2;
- fmr = filt8_r2;
- frl = filt8_rl3;
- frr = filt8_rr3;
- fdcl = NULL;
- fdcr = NULL;
- fdclh = NULL;
- fdcrh = NULL;
- break;
-
- default:
- LOG_E(PHY,"pdsch_channel_estimation: nushift=%d -> ERROR\n",nushift);
- return -1;
- break;
- }
+ if (p < 6)
+ ue->frame_parms.nushift = nushift;
}
- for (aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
+ for (int aarx = 0; aarx < ue->frame_parms.nb_antennas_rx; aarx++) {
#ifdef DEBUG_PDSCH
printf("\n============================================\n");
@@ -1379,643 +1652,57 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
printf("============================================\n");
#endif
- pil = (int16_t *)&pilot[rb_offset * ((config_type == NFAPI_NR_DMRS_TYPE1) ? 6 : 4)];
- k = k % ue->frame_parms.ofdm_symbol_size;
- re_offset = k;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset + re_offset + nushift)];
- dl_ch = (int16_t *)&dl_ch_estimates[p * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
- memset(dl_ch, 0, 4 * (ue->frame_parms.ofdm_symbol_size));
+ c16_t *rxF = &rxdataF[aarx][symbol_offset + nushift];
+ c16_t *dl_ch = (c16_t *)&dl_ch_estimates[p * ue->frame_parms.nb_antennas_rx + aarx][ch_offset];
+ memset(dl_ch, 0, sizeof(*dl_ch) * ue->frame_parms.ofdm_symbol_size);
if (config_type == NFAPI_NR_DMRS_TYPE1 && ue->chest_freq == 0) {
+ NFAPI_NR_DMRS_TYPE1_linear_interp(&ue->frame_parms,
+ rxF,
+ &pilot[6 * rb_offset],
+ dl_ch,
+ bwp_start_subcarrier,
+ nb_rb_pdsch,
+ delta);
- for (pilot_cnt = 0; pilot_cnt < 6 * nb_rb_pdsch; pilot_cnt++) {
+ } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->chest_freq == 0) {
+ NFAPI_NR_DMRS_TYPE2_linear_interp(&ue->frame_parms,
+ rxF,
+ &pilot[4 * rb_offset],
+ dl_ch,
+ bwp_start_subcarrier,
+ nb_rb_pdsch,
+ delta,
+ p);
- if (pilot_cnt % 2 == 0) {
- 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);
- pil += 2;
- re_offset = (re_offset + 2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- ch[0] >>= 1;
- ch[1] >>= 1;
- pil += 2;
- re_offset = (re_offset + 2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset + nushift + re_offset)];
- }
+ } else if (config_type == NFAPI_NR_DMRS_TYPE1) {
+ NFAPI_NR_DMRS_TYPE1_average_prb(&ue->frame_parms,
+ rxF,
+ &pilot[6 * rb_offset],
+ dl_ch,
+ bwp_start_subcarrier,
+ nb_rb_pdsch);
-#ifdef DEBUG_PDSCH
- printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch[0], ch[1]);
-#endif
-
- if (pilot_cnt == 0) {
- multadd_real_vector_complex_scalar(fl, ch, dl_ch, 8);
- } else if (pilot_cnt == 1) {
- multadd_real_vector_complex_scalar(fml, ch, dl_ch, 8);
- } else if (pilot_cnt == 6 * nb_rb_pdsch - 2) {
- multadd_real_vector_complex_scalar(fmr, ch, dl_ch, 8);
- dl_ch += 8;
- } else if (pilot_cnt == 6 * nb_rb_pdsch - 1) {
- multadd_real_vector_complex_scalar(fr, ch, dl_ch, 8);
- } else if (pilot_cnt % 2 == 0) {
- multadd_real_vector_complex_scalar(fmm, ch, dl_ch, 8);
- dl_ch += 8;
- } else {
- multadd_real_vector_complex_scalar(fm, ch, dl_ch, 8);
- }
- }
-
- // check if PRB crosses DC and improve estimates around DC
- if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size)) {
- dl_ch = (int16_t *)&dl_ch_estimates[aarx][ch_offset];
- uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
- uint16_t idxPil = idxDC/2;
- re_offset = k;
- pil = (int16_t *)&pilot[rb_offset*((config_type == NFAPI_NR_DMRS_TYPE1) ? 6:4)];
- pil += (idxPil-2);
- dl_ch += (idxDC-4);
- dl_ch = memset(dl_ch, 0, sizeof(int16_t)*10);
- re_offset = (re_offset+idxDC/2-2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- pil += 2;
- re_offset = (re_offset + 2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- ch[0] >>= 1;
- ch[1] >>= 1;
-
- // for proper allignment of SIMD vectors
- if((ue->frame_parms.N_RB_DL&1) == 0) {
-
- multadd_real_vector_complex_scalar(fdcl,
- ch,
- dl_ch-4,
- 8);
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- pil += 2;
- re_offset = (re_offset + 2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- ch[0] >>= 1;
- ch[1] >>= 1;
-
- multadd_real_vector_complex_scalar(fdcr,
- ch,
- dl_ch-4,
- 8);
- } else {
-
- multadd_real_vector_complex_scalar(fdclh,
- ch,
- dl_ch,
- 8);
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- pil += 2;
- re_offset = (re_offset + 2) % ue->frame_parms.ofdm_symbol_size;
- 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);
- ch[0] >>= 1;
- ch[1] >>= 1;
-
- multadd_real_vector_complex_scalar(fdcrh,
- ch,
- dl_ch,
- 8);
- }
- }
- } else if (config_type == NFAPI_NR_DMRS_TYPE2 && ue->chest_freq == 0){ //pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
-
- for (pilot_cnt = 0; pilot_cnt < 4 * nb_rb_pdsch; pilot_cnt++) {
- if (pilot_cnt % 2 == 0) {
- ch_l[0] = (int16_t)(((int32_t)pil[0] * rxF[0] - (int32_t)pil[1] * rxF[1]) >> 15);
- ch_l[1] = (int16_t)(((int32_t)pil[0] * rxF[1] + (int32_t)pil[1] * rxF[0]) >> 15);
-
-#ifdef DEBUG_PDSCH
- printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch_l[0], ch_l[1]);
-#endif
-
- } else {
- ch_r[0] = (int16_t)(((int32_t)pil[0] * rxF[0] - (int32_t)pil[1] * rxF[1]) >> 15);
- ch_r[1] = (int16_t)(((int32_t)pil[0] * rxF[1] + (int32_t)pil[1] * rxF[0]) >> 15);
-
-#ifdef DEBUG_PDSCH
- printf("pilot %3u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d) \n", pilot_cnt, pil[0], pil[1], rxF[0], rxF[1], ch_r[0], ch_r[1]);
-#endif
- ch[0] = (ch_l[0] + ch_r[0]) >> 1;
- ch[1] = (ch_l[1] + ch_r[1]) >> 1;
-
- if (pilot_cnt == 3) {
- multadd_real_vector_complex_scalar(fr, ch, dl_ch, 8);
- dl_ch += 12;
- } else if (pilot_cnt % 4 == 1) {
- multadd_real_vector_complex_scalar(fmr, ch, dl_ch, 8);
- dl_ch += 8;
- } else if (pilot_cnt > 3) {
- multadd_real_vector_complex_scalar(fmm, ch, dl_ch, 8);
- dl_ch += 12;
- }
-
- dl_ch[0 + (nushift << 1)] = ch[0];
- dl_ch[1 + (nushift << 1)] = ch[1];
- dl_ch[2 + (nushift << 1)] = ch[0];
- dl_ch[3 + (nushift << 1)] = ch[1];
-
- if (pilot_cnt == 1) {
- multadd_real_vector_complex_scalar(fl, ch, dl_ch, 8);
- } else if (pilot_cnt % 4 == 1) {
- multadd_real_vector_complex_scalar(fm, ch, dl_ch, 8);
-
- } else if (pilot_cnt == (4 * nb_rb_pdsch - 1)) {
- dl_ch += 4;
- // Treat last 2 pilots specially (right edge)
- multadd_real_vector_complex_scalar(frl, dl_ch - 2 + (nushift << 1), dl_ch, 8);
- multadd_real_vector_complex_scalar(frr, dl_ch - 14 + (nushift << 1), dl_ch, 8);
-
- } else {
- dl_ch += 4;
- multadd_real_vector_complex_scalar(fml, ch, dl_ch, 8);
- }
- }
-
- pil += 2;
- int re_offset_add = pilot_cnt % 2 == 0 ? 1 : 5;
- re_offset = (re_offset + re_offset_add) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset + nushift + re_offset)];
- }
-
- // check if PRB crosses DC and improve estimates around DC
- if ((bwp_start_subcarrier < ue->frame_parms.ofdm_symbol_size) && (bwp_start_subcarrier+nb_rb_pdsch*12 >= ue->frame_parms.ofdm_symbol_size) && (p<2)) {
-
- dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
- uint16_t idxDC = 2*(ue->frame_parms.ofdm_symbol_size - bwp_start_subcarrier);
- dl_ch += (idxDC-8);
- dl_ch = memset(dl_ch, 0, sizeof(int16_t)*20);
-
- dl_ch -= 2;
-
- ch_r[0] = dl_ch[0];
- ch_r[1]= dl_ch[1] ;
- dl_ch += 22;
- ch_l[0] = dl_ch[0];
- ch_l[1]= dl_ch[1] ;
-
- // for proper allignment of SIMD vectors
- if((ue->frame_parms.N_RB_DL&1) == 0) {
- dl_ch -= 20;
- //Interpolate fdcrl1 with ch_r
- multadd_real_vector_complex_scalar(filt8_dcrl1,
- ch_r,
- dl_ch,
- 8);
- //Interpolate fdclh1 with ch_l
- multadd_real_vector_complex_scalar(filt8_dclh1,
- ch_l,
- dl_ch,
- 8);
- dl_ch += 16;
- //Interpolate fdcrh1 with ch_r
- multadd_real_vector_complex_scalar(filt8_dcrh1,
- ch_r,
- dl_ch,
- 8);
- //Interpolate fdcll1 with ch_l
- multadd_real_vector_complex_scalar(filt8_dcll1,
- ch_l,
- dl_ch,
- 8);
- } else {
- dl_ch -= 28;
- //Interpolate fdcrl1 with ch_r
- multadd_real_vector_complex_scalar(filt8_dcrl2,
- ch_r,
- dl_ch,
- 8);
- //Interpolate fdclh1 with ch_l
- multadd_real_vector_complex_scalar(filt8_dclh2,
- ch_l,
- dl_ch,
- 8);
- dl_ch += 16;
- //Interpolate fdcrh1 with ch_r
- multadd_real_vector_complex_scalar(filt8_dcrh2,
- ch_r,
- dl_ch,
- 8);
- //Interpolate fdcll1 with ch_l
- multadd_real_vector_complex_scalar(filt8_dcll2,
- ch_l,
- dl_ch,
- 8);
- }
- }
+ } else {
+ NFAPI_NR_DMRS_TYPE2_average_prb(&ue->frame_parms,
+ rxF,
+ &pilot[4 * rb_offset],
+ dl_ch,
+ bwp_start_subcarrier,
+ nb_rb_pdsch);
}
- else if (config_type == NFAPI_NR_DMRS_TYPE1) { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 6 DMRS REs and use a common value for the whole PRB
- int32_t ch_0, ch_1;
-
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 6;
- ch[1] = ch_1 / 6;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- multadd_real_vector_complex_scalar(filt8_avlip0,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip1,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip2,
- ch,
- dl_ch,
- 8);
- dl_ch -= 24;
-#endif
-
- for (pilot_cnt=6; pilot_cnt<6*(nb_rb_pdsch-1); pilot_cnt += 6) {
-
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 6;
- ch[1] = ch_1 / 6;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
- dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
-
- dl_ch += 8;
- multadd_real_vector_complex_scalar(filt8_avlip3,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip4,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip5,
- ch,
- dl_ch,
- 8);
- dl_ch -= 16;
-#endif
- }
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+2) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 6;
- ch[1] = ch_1 / 6;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
- dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
-
- dl_ch += 8;
- multadd_real_vector_complex_scalar(filt8_avlip3,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip6,
- ch,
- dl_ch,
- 8);
-#endif
- }
- else { // this is case without frequency-domain linear interpolation, just take average of LS channel estimates of 4 DMRS REs and use a common value for the whole PRB
- int32_t ch_0, ch_1;
-
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 4;
- ch[1] = ch_1 / 4;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- multadd_real_vector_complex_scalar(filt8_avlip0,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip1,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip2,
- ch,
- dl_ch,
- 8);
- dl_ch -= 24;
-#endif
-
- for (pilot_cnt=4; pilot_cnt<4*(nb_rb_pdsch-1); pilot_cnt += 4) {
- int32_t ch_0, ch_1;
-
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 4;
- ch[1] = ch_1 / 4;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
- dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
-
- dl_ch += 8;
- multadd_real_vector_complex_scalar(filt8_avlip3,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip4,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip5,
- ch,
- dl_ch,
- 8);
- dl_ch -= 16;
-#endif
- }
-
- ch_0 = ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 = ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+1) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch_0 += ((int32_t)pil[0]*rxF[0] - (int32_t)pil[1]*rxF[1])>>15;
- ch_1 += ((int32_t)pil[0]*rxF[1] + (int32_t)pil[1]*rxF[0])>>15;
-
- pil += 2;
- re_offset = (re_offset+5) % ue->frame_parms.ofdm_symbol_size;
- rxF = (int16_t *)&rxdataF[aarx][(symbol_offset+nushift+re_offset)];
-
- ch[0] = ch_0 / 4;
- ch[1] = ch_1 / 4;
-
-#if NO_INTERP
- for (int i=0;i<12;i++) ((int32_t*)dl_ch)[i] = *(int32_t*)ch;
- dl_ch+=24;
-#else
- dl_ch[6] += (ch[0] * 1365)>>15; // 1/12*16384
- dl_ch[7] += (ch[1] * 1365)>>15; // 1/12*16384
-
- dl_ch += 8;
- multadd_real_vector_complex_scalar(filt8_avlip3,
- ch,
- dl_ch,
- 8);
-
- dl_ch += 16;
- multadd_real_vector_complex_scalar(filt8_avlip6,
- ch,
- dl_ch,
- 8);
-#endif
- }
#ifdef DEBUG_PDSCH
- dl_ch = (int16_t *)&dl_ch_estimates[p*ue->frame_parms.nb_antennas_rx+aarx][ch_offset];
- for(uint16_t idxP=0; idxPframe_parms.nb_antennas_rx + aarx][ch_offset];
+ for (uint16_t idxP = 0; idxP < ceil((float)nb_rb_pdsch * 12 / 8); idxP++) {
+ for (uint8_t idxI = 0; idxI < 8; idxI++) {
+ printf("%4d\t%4d\t", dl_ch[idxP * 8 + idxI].r, dl_ch[idxP * 8 + idxI].i);
}
- printf("%2d\n",idxP);
+ printf("%2d\n", idxP);
}
#endif
}
- return(0);
+ return 0;
}
/*******************************************************************
@@ -2045,10 +1732,11 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
* 3) Compensate signal with PTRS estimation for slot
*********************************************************************/
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
+ int nbRx,
c16_t ptrs_phase_per_slot[][14],
int32_t ptrs_re_per_slot[][14],
- uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
+ uint32_t rx_size_symbol,
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
NR_DL_FRAME_PARMS *frame_parms,
NR_DL_UE_HARQ_t *dlsch0_harq,
NR_DL_UE_HARQ_t *dlsch1_harq,
@@ -2139,8 +1827,9 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
nr_ptrs_cpe_estimation(*K_ptrs,*ptrsReOffset,*dmrsConfigType,*nb_rb,
rnti,
nr_slot_rx,
- symbol,frame_parms->ofdm_symbol_size,
- (int16_t*)&rxdataF_comp[aarx][(symbol * nb_re_pdsch)],
+ symbol,
+ frame_parms->ofdm_symbol_size,
+ (int16_t *)(rxdataF_comp[0][aarx] + symbol * nb_re_pdsch),
ue->nr_gold_pdsch[gNB_id][nr_slot_rx][symbol][0],
(int16_t*)&phase_per_symbol[symbol],
&ptrs_re_symbol[symbol]);
@@ -2161,9 +1850,7 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
}
#ifdef DEBUG_DL_PTRS
LOG_M("ptrsEst.m","est",ptrs_phase_per_slot[aarx],frame_parms->symbols_per_slot,1,1 );
- LOG_M("rxdataF_bf_ptrs_comp.m","bf_ptrs_cmp",
- &rxdataF_comp[aarx][(*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb) ],
- (*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb),1,1);
+ LOG_M("rxdataF_bf_ptrs_comp.m", "bf_ptrs_cmp", rxdataF_comp[0][aarx] + (*startSymbIndex) * NR_NB_SC_PER_RB * (*nb_rb), (*nb_rb) * NR_NB_SC_PER_RB * (*nbSymb), 1, 1);
#endif
/*------------------------------------------------------------------------------------------------------- */
/* 3) Compensated DMRS based estimated signal with PTRS estimation */
@@ -2175,10 +1862,11 @@ void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
#ifdef DEBUG_DL_PTRS
printf("[PHY][DL][PTRS]: Rotate Symbol %2d with %d + j* %d\n", i, phase_per_symbol[i].r,phase_per_symbol[i].i);
#endif
- rotate_cpx_vector((c16_t*)&rxdataF_comp[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+ rotate_cpx_vector((c16_t *)&rxdataF_comp[0][aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
&phase_per_symbol[i],
- (c16_t*)&rxdataF_comp[aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
- ((*nb_rb) * NR_NB_SC_PER_RB), 15);
+ (c16_t *)&rxdataF_comp[0][aarx][(i * (*nb_rb) * NR_NB_SC_PER_RB)],
+ ((*nb_rb) * NR_NB_SC_PER_RB),
+ 15);
}// if not DMRS Symbol
}// symbol loop
}// last symbol check
diff --git a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
index b779882c86..11dad31602 100644
--- a/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+++ b/openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
@@ -91,7 +91,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned short nb_rb_pdsch,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
- c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP]);
+ int rxdataFsize,
+ c16_t rxdataF[][rxdataFsize]);
void nr_adjust_synch_ue(NR_DL_FRAME_PARMS *frame_parms,
PHY_VARS_NR_UE *ue,
@@ -123,10 +124,11 @@ void phy_adjust_gain_nr(PHY_VARS_NR_UE *ue,
uint8_t gNB_id);
void nr_pdsch_ptrs_processing(PHY_VARS_NR_UE *ue,
+ int nbRx,
c16_t ptrs_phase_per_slot[][14],
int32_t ptrs_re_per_slot[][14],
- uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
+ uint32_t rx_size_symbol,
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
NR_DL_FRAME_PARMS *frame_parms,
NR_DL_UE_HARQ_t *dlsch0_harq,
NR_DL_UE_HARQ_t *dlsch1_harq,
diff --git a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
index 08aa58d5f9..4eaa36f1bc 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
@@ -518,9 +518,8 @@ int nr_csi_rs_ri_estimation(const PHY_VARS_NR_UE *ue,
// construct Hh x H elements
if(ant_rx_conjch == ant_rx_ch) {
- nr_a_sum_b((__m128i *)&csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k_offset],
- (__m128i *)&csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k_offset],
- 1);
+ nr_a_sum_b(
+ (c16_t *)&csi_rs_estimated_A_MF[port_tx_conjch][port_tx_ch][k_offset], (c16_t *)&csi_rs_estimated_conjch_ch[ant_rx_conjch][port_tx_conjch][ant_rx_ch][port_tx_ch][k_offset], 1);
}
}
}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
index 2809a21cd4..d4ffb66b65 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/dci_nr.c
@@ -935,6 +935,7 @@ uint8_t nr_dci_decoding_procedure(PHY_VARS_NR_UE *ue,
dci_ind->dci_list[dci_ind->number_of_dcis].N_CCE = L;
dci_ind->dci_list[dci_ind->number_of_dcis].dci_format = rel15->dci_format_options[k];
dci_ind->dci_list[dci_ind->number_of_dcis].ss_type = rel15->dci_type_options[k];
+ dci_ind->dci_list[dci_ind->number_of_dcis].coreset_type = rel15->coreset.CoreSetType;
int n_rb, rb_offset;
get_coreset_rballoc(rel15->coreset.frequency_domain_resource, &n_rb, &rb_offset);
dci_ind->dci_list[dci_ind->number_of_dcis].cset_start = rel15->BWPStart + rb_offset;
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
index af1980f820..d568172153 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
@@ -40,6 +40,7 @@
#include "PHY/NR_REFSIG/dmrs_nr.h"
#include "common/utils/nr/nr_common.h"
#include
+#include "openair1/PHY/TOOLS/phy_scope_interface.h"
/* dynamic shift for LLR computation for TM3/4
* set as command line argument, see lte-softmodem.c
@@ -81,15 +82,15 @@ unsigned char offset_mumimo_llr_drange[29][3]={{8,8,8},{7,7,7},{7,7,7},{7,7,7},{
#define print_shorts(s,x) printf("%s = [%d+j*%d, %d+j*%d, %d+j*%d, %d+j*%d]\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7])
/* compute H_h_H matrix inversion up to 4x4 matrices */
-uint8_t nr_zero_forcing_rx(uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- unsigned short nb_rb,
+uint8_t nr_zero_forcing_rx(uint32_t rx_size_symbol,
unsigned char n_rx,
unsigned char n_tx,//number of layer
+ int32_t rxdataF_comp[][n_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int32_t dl_ch_mag[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magb[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magr[][n_rx][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ unsigned short nb_rb,
unsigned char mod_order,
int shift,
unsigned char symbol,
@@ -105,13 +106,14 @@ static void nr_dlsch_layer_demapping(int16_t *llr_cw[2],
int16_t *llr_layers[NR_MAX_NB_LAYERS]);
/* compute LLR */
-static int nr_dlsch_llr(uint32_t rx_size,
+static int nr_dlsch_llr(uint32_t rx_size_symbol,
+ int nbRx,
int16_t *layer_llr[NR_MAX_NB_LAYERS],
NR_DL_FRAME_PARMS *frame_parms,
- int32_t rxdataF_comp[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int32_t dl_ch_mag[rx_size_symbol],
+ int32_t dl_ch_magb[rx_size_symbol],
+ int32_t dl_ch_magr[rx_size_symbol],
NR_DL_UE_HARQ_t *dlsch0_harq,
NR_DL_UE_HARQ_t *dlsch1_harq,
unsigned char harq_pid,
@@ -124,6 +126,122 @@ static int nr_dlsch_llr(uint32_t rx_size,
uint8_t nr_slot_rx,
NR_UE_DLSCH_t dlsch[2],
uint32_t llr_offset[NR_SYMBOLS_PER_SLOT]);
+/** \fn dlsch_extract_rbs(int32_t **rxdataF,
+ int32_t **dl_ch_estimates,
+ int32_t **rxdataF_ext,
+ int32_t **dl_ch_estimates_ext,
+ unsigned char symbol
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos)
+ \brief This function extracts the received resource blocks, both channel estimates and data symbols,
+ for the current allocation and for multiple layer antenna gNB transmission.
+ @param rxdataF Raw FFT output of received signal
+ @param dl_ch_estimates Channel estimates of current slot
+ @param rxdataF_ext FFT output for RBs in this allocation
+ @param dl_ch_estimates_ext Channel estimates for RBs in this allocation
+ @param Nl nb of antenna layers
+ @param symbol Symbol to extract
+ @param n_dmrs_cdm_groups
+ @param frame_parms Pointer to frame descriptor
+*/
+static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
+ c16_t rxdataF[][rxdataF_sz],
+ uint32_t rx_size_symbol,
+ uint32_t pdsch_est_size,
+ int32_t dl_ch_estimates[][pdsch_est_size],
+ c16_t rxdataF_ext[][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos,
+ int chest_time_type);
+
+static void nr_dlsch_channel_level_median(uint32_t rx_size_symbol, int32_t dl_ch_estimates_ext[][rx_size_symbol], int32_t *median, int n_tx, int n_rx, int length);
+
+/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for
+ 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
+ @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
+ @param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
+ @param dl_ch_mag First Channel magnitudes (16QAM/64QAM)
+ @param dl_ch_magb Second weighted Channel magnitudes (64QAM)
+ @param rxdataF_comp Compensated received waveform
+ @param rho Cross-correlation between two spatial channels on each RX antenna
+ @param frame_parms Pointer to frame descriptor
+ @param symbol Symbol on which to operate
+ @param first_symbol_flag set to 1 on first DLSCH symbol
+ @param mod_order Modulation order of allocation
+ @param nb_rb Number of RBs in allocation
+ @param output_shift Rescaling for compensated output (should be energy-normalizing)
+ @param phy_measurements Pointer to UE PHY measurements
+*/
+
+void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
+ int nbRx,
+ c16_t rxdataF_ext[][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ int32_t dl_ch_mag[][nbRx][rx_size_symbol],
+ int32_t dl_ch_magb[][nbRx][rx_size_symbol],
+ int32_t dl_ch_magr[][nbRx][rx_size_symbol],
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int ***rho,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t nb_aatx,
+ unsigned char symbol,
+ int length,
+ uint8_t first_symbol_flag,
+ unsigned char mod_order,
+ unsigned short nb_rb,
+ unsigned char output_shift,
+ PHY_NR_MEASUREMENTS *measurements);
+
+/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
+ @param dl_ch_estimates_ext Channel estimates in allocated RBs
+ @param frame_parms Pointer to frame descriptor
+ @param avg Pointer to average signal strength
+ @param pilots_flag Flag to indicate pilots in symbol
+ @param nb_rb Number of allocated RBs
+*/
+static void nr_dlsch_channel_level(uint32_t rx_size_symbol,
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
+ int32_t *avg,
+ uint8_t symbol,
+ uint32_t len,
+ unsigned short nb_rb);
+
+void nr_dlsch_scale_channel(uint32_t rx_size_symbol,
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint8_t n_tx,
+ uint8_t n_rx,
+ uint8_t symbol,
+ uint8_t pilots,
+ uint32_t len,
+ unsigned short nb_rb);
+void nr_dlsch_detection_mrc(uint32_t rx_size_symbol,
+ short n_tx,
+ short n_rx,
+ int32_t rxdataF_comp[][n_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int ***rho,
+ int32_t dl_ch_mag[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magb[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magr[][n_rx][rx_size_symbol],
+ unsigned char symbol,
+ unsigned short nb_rb,
+ int length);
/* Main Function */
int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
@@ -135,21 +253,28 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
int16_t *llr[2],
- c16_t ptrs_phase_per_slot[][NR_SYMBOLS_PER_SLOT],
- int32_t ptrs_re_per_slot[][NR_SYMBOLS_PER_SLOT],
uint32_t dl_valid_re[NR_SYMBOLS_PER_SLOT],
- uint32_t rx_size,
- int32_t dl_ch_estimates_ext[][rx_size],
- int32_t rxdataF_ext[][rx_size],
- int32_t rxdataF_comp[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
uint32_t llr_offset[NR_SYMBOLS_PER_SLOT],
- int32_t *log2_maxh)
+ int32_t *log2_maxh,
+ int rx_size_symbol,
+ int nbRx,
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol],
+ c16_t ptrs_phase_per_slot[][NR_SYMBOLS_PER_SLOT],
+ int32_t ptrs_re_per_slot[][NR_SYMBOLS_PER_SLOT])
{
+ const int matrixSz = ue->frame_parms.nb_antennas_rx * ue->frame_parms.nb_antennas_tx;
+ __attribute__((aligned(32))) int32_t dl_ch_estimates_ext[matrixSz][rx_size_symbol];
+ memset(dl_ch_estimates_ext, 0, sizeof(dl_ch_estimates_ext));
+ __attribute__((aligned(32))) int32_t dl_ch_mag[ue->frame_parms.nb_antennas_tx][ue->frame_parms.nb_antennas_rx][rx_size_symbol];
+ memset(dl_ch_mag, 0, sizeof(dl_ch_mag));
+
+ __attribute__((aligned(32))) int32_t dl_ch_magb[ue->frame_parms.nb_antennas_tx][nbRx][rx_size_symbol];
+ memset(dl_ch_magb, 0, sizeof(dl_ch_magb));
+
+ __attribute__((aligned(32))) int32_t dl_ch_magr[ue->frame_parms.nb_antennas_tx][nbRx][rx_size_symbol];
+ memset(dl_ch_magr, 0, sizeof(dl_ch_magr));
NR_UE_COMMON *common_vars = &ue->common_vars;
NR_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
PHY_NR_MEASUREMENTS *measurements = &ue->measurements;
@@ -279,64 +404,59 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//----------------------------------------------------------
//--------------------- RBs extraction ---------------------
//----------------------------------------------------------
- start_meas(&ue->generic_stat_bis[slot]);
- nr_dlsch_extract_rbs(ue->frame_parms.samples_per_slot_wCP,
- rxdataF,
- rx_size,
- pdsch_est_size,
- dl_ch_estimates,
- rxdataF_ext,
- dl_ch_estimates_ext,
- symbol,
- pilots,
- config_type,
- start_rb + dlsch[0].dlsch_config.BWPStart,
- nb_rb_pdsch,
- dlsch[0].dlsch_config.n_dmrs_cdm_groups,
- dlsch[0].Nl,
- frame_parms,
- dlsch[0].dlsch_config.dlDmrsSymbPos,
- ue->chest_time);
- stop_meas(&ue->generic_stat_bis[slot]);
- if (cpumeas(CPUMEAS_GETSTATE))
- LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Pilot/Data extraction %5.2f \n",
- frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[slot].p_time/(cpuf*1000.0));
+ const int n_rx = frame_parms->nb_antennas_rx;
+ const int nl = dlsch[0].Nl;
- int nl = dlsch[0].Nl;
- int n_rx = frame_parms->nb_antennas_rx;
- nb_re_pdsch = (pilots==1)? ((config_type==NFAPI_NR_DMRS_TYPE1)?nb_rb_pdsch*(12-6*dlsch[0].dlsch_config.n_dmrs_cdm_groups): nb_rb_pdsch*(12-4*dlsch[0].dlsch_config.n_dmrs_cdm_groups)) : (nb_rb_pdsch*12);
+ start_meas(&ue->generic_stat_bis[slot]);
+ {
+ __attribute__((aligned(32))) c16_t rxdataF_ext[nbRx][rx_size_symbol];
+ memset(rxdataF_ext, 0, sizeof(rxdataF_ext));
+
+ nr_dlsch_extract_rbs(ue->frame_parms.samples_per_slot_wCP,
+ rxdataF,
+ rx_size_symbol,
+ pdsch_est_size,
+ dl_ch_estimates,
+ rxdataF_ext,
+ dl_ch_estimates_ext,
+ symbol,
+ pilots,
+ config_type,
+ start_rb + dlsch[0].dlsch_config.BWPStart,
+ nb_rb_pdsch,
+ dlsch[0].dlsch_config.n_dmrs_cdm_groups,
+ dlsch[0].Nl,
+ frame_parms,
+ dlsch[0].dlsch_config.dlDmrsSymbPos,
+ ue->chest_time);
+ stop_meas(&ue->generic_stat_bis[slot]);
+ if (ue->phy_sim_pdsch_rxdataF_ext)
+ for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
+ int offset = ((void *)rxdataF_ext[aarx] - (void *)rxdataF_ext) + symbol * rx_size_symbol;
+ memcpy(ue->phy_sim_pdsch_rxdataF_ext + offset, rxdataF_ext, rx_size_symbol * sizeof(c16_t));
+ }
+ if (cpumeas(CPUMEAS_GETSTATE))
+ LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Pilot/Data extraction %5.2f \n", frame, nr_slot_rx, slot, symbol, ue->generic_stat_bis[slot].p_time / (cpuf * 1000.0));
+
+ nb_re_pdsch = (pilots == 1)
+ ? ((config_type == NFAPI_NR_DMRS_TYPE1) ? nb_rb_pdsch * (12 - 6 * dlsch[0].dlsch_config.n_dmrs_cdm_groups) : nb_rb_pdsch * (12 - 4 * dlsch[0].dlsch_config.n_dmrs_cdm_groups))
+ : (nb_rb_pdsch * 12);
//----------------------------------------------------------
//--------------------- Channel Scaling --------------------
//----------------------------------------------------------
start_meas(&ue->generic_stat_bis[slot]);
- nr_dlsch_scale_channel(rx_size,
- dl_ch_estimates_ext,
- frame_parms,
- nl,
- n_rx,
- symbol,
- pilots,
- nb_re_pdsch,
- nb_rb_pdsch);
+ nr_dlsch_scale_channel(rx_size_symbol, dl_ch_estimates_ext, frame_parms, nl, n_rx, symbol, pilots, nb_re_pdsch, nb_rb_pdsch);
stop_meas(&ue->generic_stat_bis[slot]);
if (cpumeas(CPUMEAS_GETSTATE))
- LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n",
- frame,nr_slot_rx,slot,symbol,ue->generic_stat_bis[slot].p_time/(cpuf*1000.0));
+ LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: Channel Scale %5.2f \n", frame, nr_slot_rx, slot, symbol, ue->generic_stat_bis[slot].p_time / (cpuf * 1000.0));
//----------------------------------------------------------
//--------------------- Channel Level Calc. ----------------
//----------------------------------------------------------
start_meas(&ue->generic_stat_bis[slot]);
if (first_symbol_flag==1) {
- nr_dlsch_channel_level(rx_size,
- dl_ch_estimates_ext,
- frame_parms,
- nl,
- avg,
- symbol,
- nb_re_pdsch,
- nb_rb_pdsch);
+ nr_dlsch_channel_level(rx_size_symbol, dl_ch_estimates_ext, frame_parms, nl, avg, symbol, nb_re_pdsch, nb_rb_pdsch);
avgs = 0;
for (aatx=0;aatx 1) {
- nr_dlsch_channel_level_median(rx_size,
- dl_ch_estimates_ext,
- median,
- nl,
- n_rx,
- nb_re_pdsch,
- symbol*nb_rb_pdsch*12);
+ nr_dlsch_channel_level_median(rx_size_symbol, dl_ch_estimates_ext, median, nl, n_rx, nb_re_pdsch);
for (aatx = 0; aatx < nl; aatx++) {
for (aarx = 0; aarx < n_rx; aarx++) {
avgs = cmax(avgs, median[aatx*n_rx + aarx]);
@@ -361,12 +475,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
}
*log2_maxh = (log2_approx(avgs)/2) + 1;
//LOG_I(PHY, "avgs Power per SC is %d lg2_maxh %d\n", avgs, log2_maxh);
- LOG_D(PHY,"[DLSCH] AbsSubframe %d.%d log2_maxh = %d (%d,%d)\n",
- frame%1024,
- nr_slot_rx,
- *log2_maxh,
- avg[0],
- avgs);
+ LOG_D(PHY, "[DLSCH] AbsSubframe %d.%d log2_maxh = %d (%d,%d)\n", frame % 1024, nr_slot_rx, *log2_maxh, avg[0], avgs);
}
stop_meas(&ue->generic_stat_bis[slot]);
@@ -385,7 +494,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
//----------------------------------------------------------
// Disable correlation measurement for optimizing UE
start_meas(&ue->generic_stat_bis[slot]);
- nr_dlsch_channel_compensation(rx_size,
+ nr_dlsch_channel_compensation(rx_size_symbol,
+ nbRx,
rxdataF_ext,
dl_ch_estimates_ext,
dl_ch_mag,
@@ -402,38 +512,26 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
nb_rb_pdsch,
*log2_maxh,
measurements); // log2_maxh+I0_shift
- stop_meas(&ue->generic_stat_bis[slot]);
+ stop_meas(&ue->generic_stat_bis[slot]);
+ }
if (cpumeas(CPUMEAS_GETSTATE))
- LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n", frame, nr_slot_rx, slot, symbol, *log2_maxh, proc->channel_level, ue->generic_stat_bis[slot].p_time/(cpuf*1000.0));
+ LOG_D(PHY,
+ "[AbsSFN %u.%d] Slot%d Symbol %d log2_maxh %d channel_level %d: Channel Comp %5.2f \n",
+ frame,
+ nr_slot_rx,
+ slot,
+ symbol,
+ *log2_maxh,
+ proc->channel_level,
+ ue->generic_stat_bis[slot].p_time / (cpuf * 1000.0));
start_meas(&ue->generic_stat_bis[slot]);
if (n_rx > 1) {
- nr_dlsch_detection_mrc(rx_size,
- rxdataF_comp,
- NULL,
- dl_ch_mag,
- dl_ch_magb,
- dl_ch_magr,
- nl,
- n_rx,
- symbol,
- nb_rb_pdsch,
- nb_re_pdsch);
+ nr_dlsch_detection_mrc(rx_size_symbol, nl, n_rx, rxdataF_comp, NULL, dl_ch_mag, dl_ch_magb, dl_ch_magr, symbol, nb_rb_pdsch, nb_re_pdsch);
if (nl >= 2)//Apply zero forcing for 2, 3, and 4 Tx layers
- nr_zero_forcing_rx(rx_size,
- rxdataF_comp,
- dl_ch_mag,
- dl_ch_magb,
- dl_ch_magr,
- dl_ch_estimates_ext,
- nb_rb_pdsch,
- n_rx,
- nl,
- dlsch[0].dlsch_config.qamModOrder,
- *log2_maxh,
- symbol,
- nb_re_pdsch);
+ nr_zero_forcing_rx(
+ rx_size_symbol, n_rx, nl, rxdataF_comp, dl_ch_mag, dl_ch_magb, dl_ch_magr, dl_ch_estimates_ext, nb_rb_pdsch, dlsch[0].dlsch_config.qamModOrder, *log2_maxh, symbol, nb_re_pdsch);
}
stop_meas(&ue->generic_stat_bis[slot]);
@@ -452,19 +550,8 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
/* Check for PTRS bitmap and process it respectively */
if((pduBitmap & 0x1) && (dlsch[0].rnti_type == _C_RNTI_)) {
- nr_pdsch_ptrs_processing(ue,
- ptrs_phase_per_slot,
- ptrs_re_per_slot,
- rx_size,
- rxdataF_comp,
- frame_parms,
- dlsch0_harq,
- dlsch1_harq,
- gNB_id,
- nr_slot_rx,
- symbol,
- (nb_rb_pdsch*12),
- dlsch[0].rnti,dlsch);
+ nr_pdsch_ptrs_processing(
+ ue, nbRx, ptrs_phase_per_slot, ptrs_re_per_slot, rx_size_symbol, rxdataF_comp, frame_parms, dlsch0_harq, dlsch1_harq, gNB_id, nr_slot_rx, symbol, (nb_rb_pdsch * 12), dlsch[0].rnti, dlsch);
dl_valid_re[symbol-1] -= ptrs_re_per_slot[0][symbol];
}
@@ -499,13 +586,14 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
first_symbol_flag=0;
}
/* Calculate LLR's for each symbol */
- nr_dlsch_llr(rx_size,
+ nr_dlsch_llr(rx_size_symbol,
+ nbRx,
layer_llr,
frame_parms,
rxdataF_comp,
- dl_ch_mag,
- dl_ch_magb,
- dl_ch_magr,
+ dl_ch_mag[0][0],
+ dl_ch_magb[0][0],
+ dl_ch_magr[0][0],
dlsch0_harq,
dlsch1_harq,
harq_pid,
@@ -514,7 +602,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
nb_rb_pdsch,
codeword_TB0,
codeword_TB1,
- dl_valid_re[i-1],
+ dl_valid_re[i - 1],
nr_slot_rx,
dlsch,
llr_offset);
@@ -570,13 +658,28 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
LOG_D(PHY, "[AbsSFN %u.%d] Slot%d Symbol %d: LLR Computation %5.2f \n", frame, nr_slot_rx, slot, symbol, ue->generic_stat_bis[slot].p_time / (cpuf * 1000.0));
#if T_TRACER
- T(T_UE_PHY_PDSCH_IQ, T_INT(gNB_id), T_INT(ue->Mod_id), T_INT(frame%1024),
- T_INT(nr_slot_rx), T_INT(nb_rb_pdsch),
- T_INT(frame_parms->N_RB_UL), T_INT(frame_parms->symbols_per_slot),
- T_BUFFER(&rxdataF_comp[gNB_id][0], 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL *12*frame_parms->symbols_per_slot*2));
+ T(T_UE_PHY_PDSCH_IQ,
+ T_INT(gNB_id),
+ T_INT(ue->Mod_id),
+ T_INT(frame % 1024),
+ T_INT(nr_slot_rx),
+ T_INT(nb_rb_pdsch),
+ T_INT(frame_parms->N_RB_UL),
+ T_INT(frame_parms->symbols_per_slot),
+ T_BUFFER(&rxdataF_comp[gNB_id][0], 2 * /* ulsch[UE_id]->harq_processes[harq_pid]->nb_rb */ frame_parms->N_RB_UL * 12 * 2));
#endif
- return(0);
+ UEscopeCopy(ue, pdschRxdataF_comp, rxdataF_comp, sizeof(c16_t), nbRx, rx_size_symbol);
+
+ if (ue->phy_sim_pdsch_rxdataF_comp)
+ for (int a = 0; a < nbRx; a++) {
+ int offset = (void *)rxdataF_comp[0][a] - (void *)rxdataF_comp[0] + symbol * rx_size_symbol * sizeof(c16_t);
+ memcpy(ue->phy_sim_pdsch_rxdataF_comp + offset, rxdataF_comp[0][a] + symbol * rx_size_symbol, sizeof(c16_t) * rx_size_symbol);
+ memcpy(ue->phy_sim_pdsch_dl_ch_estimates + offset, dl_ch_estimates, pdsch_est_size * sizeof(c16_t));
+ }
+ if (ue->phy_sim_pdsch_dl_ch_estimates_ext)
+ memcpy(ue->phy_sim_pdsch_dl_ch_estimates_ext + symbol * rx_size_symbol, dl_ch_estimates_ext, sizeof(dl_ch_estimates_ext));
+ return (0);
}
void nr_dlsch_deinterleaving(uint8_t symbol,
@@ -630,13 +733,14 @@ void nr_dlsch_deinterleaving(uint8_t symbol,
// Pre-processing for LLR computation
//==============================================================================================
-void nr_dlsch_channel_compensation(uint32_t rx_size,
- int32_t rxdataF_ext[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
- int32_t rxdataF_comp[][rx_size],
+void nr_dlsch_channel_compensation(uint32_t rx_size_symbol,
+ int nbRx,
+ c16_t rxdataF_ext[][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ int32_t dl_ch_mag[][nbRx][rx_size_symbol],
+ int32_t dl_ch_magb[][nbRx][rx_size_symbol],
+ int32_t dl_ch_magr[][nbRx][rx_size_symbol],
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
int ***rho,
NR_DL_FRAME_PARMS *frame_parms,
uint8_t nb_aatx,
@@ -676,12 +780,12 @@ void nr_dlsch_channel_compensation(uint32_t rx_size,
for (aarx=0; aarxnb_antennas_rx; aarx++) {
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
- dl_ch_mag128r = (__m128i *)&dl_ch_magr[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][symbol*nb_rb*12];
- rxdataF_comp128 = (__m128i *)&rxdataF_comp[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch128 = (__m128i *)dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx];
+ dl_ch_mag128 = (__m128i *)dl_ch_mag[aatx][aarx];
+ dl_ch_mag128b = (__m128i *)dl_ch_magb[aatx][aarx];
+ dl_ch_mag128r = (__m128i *)dl_ch_magr[aatx][aarx];
+ rxdataF128 = (__m128i *)rxdataF_ext[aarx];
+ rxdataF_comp128 = (__m128i *)(rxdataF_comp[aatx][aarx] + symbol * nb_rb * 12);
for (rb=0; rb2) {
@@ -839,8 +943,8 @@ void nr_dlsch_channel_compensation(uint32_t rx_size,
//avg_rho_re[aarx][aatx*nb_aatx+atx] = 0;
//avg_rho_im[aarx][aatx*nb_aatx+atx] = 0;
rho128 = (__m128i *)&rho[aarx][aatx*nb_aatx+atx][symbol*nb_rb*12];
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx][symbol*nb_rb*12];
- dl_ch128_2 = (__m128i *)&dl_ch_estimates_ext[atx*frame_parms->nb_antennas_rx+aarx][symbol*nb_rb*12];
+ dl_ch128 = (__m128i *)dl_ch_estimates_ext[aatx*frame_parms->nb_antennas_rx+aarx];
+ dl_ch128_2 = (__m128i *)dl_ch_estimates_ext[atx*frame_parms->nb_antennas_rx+aarx];
for (rb=0; rbnb_antennas_rx; aarx++) {
- dl_ch128 = (int16x4_t*)&dl_ch_estimates_ext[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128 = (int16x8_t*)&dl_ch_mag[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch_mag128b = (int16x8_t*)&dl_ch_magb[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF128 = (int16x4_t*)&rxdataF_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- rxdataF_comp128 = (int16x4x2_t*)&rxdataF_comp[(aatx<<1)+aarx][symbol*frame_parms->N_RB_DL*12];
+ dl_ch128 = (int16x4_t*)dl_ch_estimates_ext[(aatx<<1)+aarx];
+ dl_ch_mag128 = (int16x8_t *)dl_ch_mag[aatx][aarx];
+ dl_ch_mag128b = (int16x8_t *)dl_ch_magb[aatx][aarx];
+ rxdataF128 = (int16x4_t *)rxdataF_ext[aarx];
+ rxdataF_comp128 = (int16x4x2_t *)(rxdataF_comp[aatx][aarx] + symbol * nb_rb * 12);
for (rb=0; rb2) {
@@ -1076,8 +1180,8 @@ void nr_dlsch_channel_compensation(uint32_t rx_size,
if (rho) {
for (aarx=0; aarxnb_antennas_rx; aarx++) {
rho128 = (int16x4x2_t*)&rho[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128 = (int16x4_t*)&dl_ch_estimates_ext[aarx][symbol*frame_parms->N_RB_DL*12];
- dl_ch128_2 = (int16x4_t*)&dl_ch_estimates_ext[2+aarx][symbol*frame_parms->N_RB_DL*12];
+ dl_ch128 = (int16x4_t*)dl_ch_estimates_ext[aarx];
+ dl_ch128_2 = (int16x4_t*)dl_ch_estimates_ext[2+aarx];
for (rb=0; rb 1 ? n_rx : 2;
-
- dl_ch128 = (__m128i *)&dl_ch_estimates_ext[aatx*x + aarx][start_point];
- dl_ch_mag128 = (__m128i *)&dl_ch_mag[aatx*x + aarx][start_point];
- dl_ch_mag128b = (__m128i *)&dl_ch_magb[aatx*x + aarx][start_point];
- rxdataF128 = (__m128i *)&rxdataF_ext[aarx][start_point];
- rxdataF_comp128 = (__m128i *)&rxdataF_comp[aatx*x + aarx][start_point];
-
- length_mod8 = length&7;
- if (length_mod8 == 0){
- length2 = length>>3;
-
- for (ii=0; ii2) {
- // get channel amplitude if not QPSK
-
- mmtmpD0 = _mm_madd_epi16(dl_ch128[0],dl_ch128[0]);
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
-
- mmtmpD1 = _mm_madd_epi16(dl_ch128[1],dl_ch128[1]);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
-
- mmtmpD0 = _mm_packs_epi32(mmtmpD0,mmtmpD1);
-
- // store channel magnitude here in a new field of dlsch
-
- dl_ch_mag128[0] = _mm_unpacklo_epi16(mmtmpD0,mmtmpD0);
- dl_ch_mag128b[0] = dl_ch_mag128[0];
- dl_ch_mag128[0] = _mm_mulhi_epi16(dl_ch_mag128[0],QAM_amp128);
- dl_ch_mag128[0] = _mm_slli_epi16(dl_ch_mag128[0],1);
- //print_ints("Re(ch):",(int16_t*)&mmtmpD0);
- //print_shorts("QAM_amp:",(int16_t*)&QAM_amp128);
- //print_shorts("mag:",(int16_t*)&dl_ch_mag128[0]);
- dl_ch_mag128[1] = _mm_unpackhi_epi16(mmtmpD0,mmtmpD0);
- dl_ch_mag128b[1] = dl_ch_mag128[1];
- dl_ch_mag128[1] = _mm_mulhi_epi16(dl_ch_mag128[1],QAM_amp128);
- dl_ch_mag128[1] = _mm_slli_epi16(dl_ch_mag128[1],1);
-
- dl_ch_mag128b[0] = _mm_mulhi_epi16(dl_ch_mag128b[0],QAM_amp128b);
- dl_ch_mag128b[0] = _mm_slli_epi16(dl_ch_mag128b[0],1);
-
- dl_ch_mag128b[1] = _mm_mulhi_epi16(dl_ch_mag128b[1],QAM_amp128b);
- dl_ch_mag128b[1] = _mm_slli_epi16(dl_ch_mag128b[1],1);
-
- }
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch128[0],rxdataF128[0]);
-
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[0],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)&conjugate[0]);
- // print_ints("im",&mmtmpD1);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[0]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- // print_ints("re(shift)",&mmtmpD0);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- // print_ints("im(shift)",&mmtmpD1);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
- // print_ints("c0",&mmtmpD2);
- // print_ints("c1",&mmtmpD3);
- rxdataF_comp128[0] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128);
- // print_shorts("ch:",dl_ch128);
- // print_shorts("pack:",rxdataF_comp128);
-
- // multiply by conjugated channel
- mmtmpD0 = _mm_madd_epi16(dl_ch128[1],rxdataF128[1]);
- // mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
- mmtmpD1 = _mm_shufflelo_epi16(dl_ch128[1],_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_shufflehi_epi16(mmtmpD1,_MM_SHUFFLE(2,3,0,1));
- mmtmpD1 = _mm_sign_epi16(mmtmpD1,*(__m128i*)conjugate);
- mmtmpD1 = _mm_madd_epi16(mmtmpD1,rxdataF128[1]);
- // mmtmpD1 contains imag part of 4 consecutive outputs (32-bit)
- mmtmpD0 = _mm_srai_epi32(mmtmpD0,output_shift);
- mmtmpD1 = _mm_srai_epi32(mmtmpD1,output_shift);
- mmtmpD2 = _mm_unpacklo_epi32(mmtmpD0,mmtmpD1);
- mmtmpD3 = _mm_unpackhi_epi32(mmtmpD0,mmtmpD1);
-
- rxdataF_comp128[1] = _mm_packs_epi32(mmtmpD2,mmtmpD3);
- // print_shorts("rx:",rxdataF128+1);
- // print_shorts("ch:",dl_ch128+1);
- //print_shorts("pack:",rxdataF_comp128+1);
-
- dl_ch128+=2;
- dl_ch_mag128+=2;
- dl_ch_mag128b+=2;
- rxdataF128+=2;
- rxdataF_comp128+=2;
- }
- }else {
- printf ("Channel Compensation: Received number of subcarriers is not multiple of 8, \n"
- "need to adapt the code!\n");
- }
- }
- }
-
-/*This part of code makes sense only for processing in 2x2 blocks*/
- if (rho) {
-
-
- for (aarx=0; aarx>3;
-
- for (ii=0; iinb_antennas_rx)+aarx][symbol*nb_rb*12];
+ dl_ch128=(__m128i *)dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx];
for (rb=0;rbN_RB_DL*12];
+ dl_ch128=(int16x4_t *)dl_ch_estimates_ext[(aatx<<1)+aarx];
for (rb=0; rb>2;//length = number of REs, hence length2=nb_REs*(32/128) in SIMD loop
@@ -1565,7 +1459,7 @@ void nr_dlsch_channel_level_median(uint32_t rx_size,
min = 0;
norm128D = vdupq_n_s32(0);
- dl_ch128=(int16x4_t *)&dl_ch_estimates_ext[aatx*n_rx + aarx][start_point];
+ dl_ch128=(int16x4_t *)dl_ch_estimates_ext[aatx*n_rx + aarx];
length_mod8=length&3;
length2 = length>>2;
@@ -1598,23 +1492,23 @@ void nr_dlsch_channel_level_median(uint32_t rx_size,
// Extraction functions
//==============================================================================================
-void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
- c16_t rxdataF[][rxdataF_sz],
- const uint32_t rx_size,
- const uint32_t pdsch_est_size,
- int32_t dl_ch_estimates[][pdsch_est_size],
- int32_t rxdataF_ext[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- unsigned char symbol,
- uint8_t pilots,
- uint8_t config_type,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- uint8_t n_dmrs_cdm_groups,
- uint8_t Nl,
- NR_DL_FRAME_PARMS *frame_parms,
- uint16_t dlDmrsSymbPos,
- int chest_time_type)
+static void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
+ c16_t rxdataF[][rxdataF_sz],
+ uint32_t rx_size_symbol,
+ uint32_t pdsch_est_size,
+ int32_t dl_ch_estimates[][pdsch_est_size],
+ c16_t rxdataF_ext[][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ unsigned char symbol,
+ uint8_t pilots,
+ uint8_t config_type,
+ unsigned short start_rb,
+ unsigned short nb_rb_pdsch,
+ uint8_t n_dmrs_cdm_groups,
+ uint8_t Nl,
+ NR_DL_FRAME_PARMS *frame_parms,
+ uint16_t dlDmrsSymbPos,
+ int chest_time_type)
{
if (config_type == NFAPI_NR_DMRS_TYPE1) {
AssertFatal(n_dmrs_cdm_groups == 1 || n_dmrs_cdm_groups == 2,
@@ -1633,14 +1527,13 @@ void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
validDmrsEst = get_next_dmrs_symbol_in_slot(dlDmrsSymbPos,0,14); // get first dmrs symbol index
for (unsigned char aarx = 0; aarx < frame_parms->nb_antennas_rx; aarx++) {
-
- int32_t *rxF_ext = &rxdataF_ext[aarx][symbol * nb_rb_pdsch * NR_NB_SC_PER_RB];
- int32_t *rxF = (int32_t *)&rxdataF[aarx][symbol * frame_parms->ofdm_symbol_size];
+ c16_t *rxF_ext = rxdataF_ext[aarx];
+ c16_t *rxF = &rxdataF[aarx][symbol * frame_parms->ofdm_symbol_size];
for (unsigned char aatx = 0; aatx < Nl; aatx++) {
int32_t *dl_ch0 = &dl_ch_estimates[(aatx*frame_parms->nb_antennas_rx)+aarx][validDmrsEst * frame_parms->ofdm_symbol_size];
- int32_t *dl_ch0_ext = &dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx][symbol * nb_rb_pdsch * NR_NB_SC_PER_RB];
+ int32_t *dl_ch0_ext = dl_ch_estimates_ext[(aatx*frame_parms->nb_antennas_rx)+aarx];
if (pilots == 0) { //data symbol only
if (aatx == 0) {
@@ -1720,17 +1613,18 @@ void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
}
}
-void nr_dlsch_detection_mrc(uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
- int ***rho,
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
+void nr_dlsch_detection_mrc(uint32_t rx_size_symbol,
short n_tx,
short n_rx,
+ int32_t rxdataF_comp[][n_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int ***rho,
+ int32_t dl_ch_mag[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magb[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magr[][n_rx][rx_size_symbol],
unsigned char symbol,
unsigned short nb_rb,
- int length) {
+ int length)
+{
#if defined(__x86_64__)||defined(__i386__)
unsigned char aatx, aarx;
int i;
@@ -1740,15 +1634,15 @@ void nr_dlsch_detection_mrc(uint32_t rx_size,
if (n_rx>1) {
for (aatx=0; aatx 0, "");
if(size==1) {
- nr_element_sign(a44[0],//a
- ad_bc,//b
+ nr_element_sign(a44[0][0], // a
+ ad_bc, // b
nb_rb,
sign);
} else {
-
+ int16_t k, rr[size - 1], cc[size - 1];
+ c16_t outtemp[12 * nb_rb] __attribute__((aligned(32)));
+ c16_t outtemp1[12 * nb_rb] __attribute__((aligned(32)));
+ c16_t *sub_matrix[size - 1][size - 1];
for (int rtx=0;rtx 0);
if(size==1) {
- return((double complex)a44_cpx[0]*sign);
+ return (a44_cpx[0][0] * sign);
}else {
+ double complex sub_matrix[size - 1][size - 1];
+ int16_t k, rr[size - 1], cc[size - 1];
outtemp1 = 0;
for (int rtx=0;rtx 1);
int16_t k,rr[size-1],cc[size-1];
if(flag) {//fixed point SIMD calc.
//Allocate the submatrix elements
- int32_t **sub_matrix;
- sub_matrix = (int32_t **)malloc16_clear( (size-1)*(size-1)*sizeof(int32_t *) );
- for (int rtx=0;rtx<(size-1);rtx++) {//row
- for (int ctx=0;ctx<(size-1);ctx++) {//column
- sub_matrix[ctx*(size-1)+rtx] = (int32_t *)malloc16_clear( 12*nb_rb*sizeof(int32_t) );
- }
- }
+ c16_t *sub_matrix[size - 1][size - 1];
//Compute Matrix determinant
- nr_determin(a44,//
- ad_bc,//determinant
- size,//size
+ nr_determin(size,
+ a44, //
+ ad_bc, // determinant
nb_rb,
+1,
shift0);
@@ -2049,39 +1908,37 @@ uint8_t nr_matrix_inverse(int32_t **a44,//Input matrix//conjH_H_elements[0]
//fill out the sub matrix corresponds to this element
for (int ridx=0;ridx<(size-1);ridx++)
for (int cidx=0;cidx<(size-1);cidx++)
- sub_matrix[cidx*(size-1)+ridx]= (int32_t *)&a44[cc[cidx]*size+rr[ridx]][0];
+ // To verify
+ sub_matrix[cidx][ridx]=a44[cc[cidx]][rr[ridx]];
- nr_determin(sub_matrix,
- inv_H_h_H[rtx*size+ctx],//out transpose
- size-1,//size
+ nr_determin(size - 1, // size
+ sub_matrix,
+ inv_H_h_H[rtx][ctx], // out transpose
nb_rb,
- ((rtx&1)==1?-1:1)*((ctx&1)==1?-1:1),
+ ((rtx & 1) == 1 ? -1 : 1) * ((ctx & 1) == 1 ? -1 : 1),
shift0);
- //printf("H_h_H(r%d,c%d)=%d+j%d --> inv_H_h_H(%d,%d) = %d+j%d \n",rtx,ctx,((short *)a44[ctx*size+rtx])[0],((short *)a44[ctx*size+rtx])[1],ctx,rtx,((short *)inv_H_h_H[rtx*size+ctx])[0],((short *)inv_H_h_H[rtx*size+ctx])[1]);
}
}
- _mm_empty();
- _m_empty();
}
else {//floating point calc.
//Allocate the submatrix elements
- double complex sub_matrix_cpx[(size-1)*(size-1)];
+ double complex sub_matrix_cpx[size - 1][size - 1];
//Convert the IQ samples (in Q15 format) to float complex
- double complex a44_cpx[size*size];
- double complex inv_H_h_H_cpx[size*size];
+ double complex a44_cpx[size][size];
+ double complex inv_H_h_H_cpx[size][size];
double complex determin_cpx;
for (int i=0; i<12*nb_rb; i++) {
//Convert Q15 to floating point
for (int rtx=0;rtx inv_H_h_H(%d,%d) = %lf+j%lf \n",rtx,ctx,creal(a44_cpx[ctx*size+rtx]),cimag(a44_cpx[ctx*size+rtx]),ctx,rtx,creal(inv_H_h_H_cpx[rtx*size+ctx]),cimag(inv_H_h_H_cpx[rtx*size+ctx]));
- if (creal(inv_H_h_H_cpx[rtx*size+ctx])>0)
- ((short *) inv_H_h_H[rtx*size+ctx])[i<<1] = (short) ((creal(inv_H_h_H_cpx[rtx*size+ctx])*(1<<(shift0-1)))+0.5);//Convert to Q 18
+ if (creal(inv_H_h_H_cpx[rtx][ctx]) > 0)
+ inv_H_h_H[rtx][ctx][i].r = (short)((creal(inv_H_h_H_cpx[rtx][ctx]) * (1 << (shift0 - 1))) + 0.5); // Convert to Q 18
else
- ((short *) inv_H_h_H[rtx*size+ctx])[i<<1] = (short) ((creal(inv_H_h_H_cpx[rtx*size+ctx])*(1<<(shift0-1)))-0.5);//
+ inv_H_h_H[rtx][ctx][i].r = (short)((creal(inv_H_h_H_cpx[rtx][ctx]) * (1 << (shift0 - 1))) - 0.5); //
- if (cimag(inv_H_h_H_cpx[rtx*size+ctx])>0)
- ((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1] = (short) ((cimag(inv_H_h_H_cpx[rtx*size+ctx])*(1<<(shift0-1)))+0.5);//
+ if (cimag(inv_H_h_H_cpx[rtx][ctx]) > 0)
+ inv_H_h_H[rtx][ctx][i].i = (short)((cimag(inv_H_h_H_cpx[rtx][ctx]) * (1 << (shift0 - 1))) + 0.5); //
else
- ((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1] = (short) ((cimag(inv_H_h_H_cpx[rtx*size+ctx])*(1<<(shift0-1)))-0.5);//
+ inv_H_h_H[rtx][ctx][i].i = (short)((cimag(inv_H_h_H_cpx[rtx][ctx]) * (1 << (shift0 - 1))) - 0.5); //
//if (i<4) printf("inv_H_h_H_FP(%d,%d)= %d+j%d \n",ctx,rtx, ((short *) inv_H_h_H[rtx*size+ctx])[i<<1],((short *) inv_H_h_H[rtx*size+ctx])[(i<<1)+1]);
}
@@ -2183,110 +2040,95 @@ void nr_conjch0_mult_ch1(int *ch0,
*
*
* */
-uint8_t nr_zero_forcing_rx(uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- unsigned short nb_rb,
+uint8_t nr_zero_forcing_rx(uint32_t rx_size_symbol,
unsigned char n_rx,
unsigned char n_tx,//number of layer
+ int32_t rxdataF_comp[][n_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT],
+ int32_t dl_ch_mag[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magb[][n_rx][rx_size_symbol],
+ int32_t dl_ch_magr[][n_rx][rx_size_symbol],
+ int32_t dl_ch_estimates_ext[][rx_size_symbol],
+ unsigned short nb_rb,
unsigned char mod_order,
int shift,
unsigned char symbol,
int length)
{
int *ch0r, *ch0c;
- int32_t *** conjH_H_elements;
uint32_t nb_rb_0 = length/12 + ((length%12)?1:0);
- int32_t determ_fin[12*nb_rb_0] __attribute__((aligned(32)));
+ c16_t determ_fin[12 * nb_rb_0] __attribute__((aligned(32)));
///Allocate H^*H matrix elements and sub elements
- conjH_H_elements = (int32_t ***)malloc16_clear( n_rx*sizeof(int32_t **) );
- for (int aarx=0;aarx6
-#define interference_abs_64qam_epi16(psi,int_ch_mag,int_two_ch_mag,int_three_ch_mag,a,c1,c3,c5,c7) tmp_result = _mm_cmplt_epi16(psi,int_two_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result,(*(__m128i*)&nr_ones[0])); tmp_result2 = _mm_cmplt_epi16(psi,int_ch_mag); tmp_result = _mm_xor_si128(tmp_result,tmp_result2); tmp_result4 = _mm_cmpgt_epi16(psi,int_three_ch_mag); tmp_result3 = _mm_xor_si128(tmp_result3,tmp_result4); tmp_result = _mm_and_si128(tmp_result,c3); tmp_result2 = _mm_and_si128(tmp_result2,c1); tmp_result3 = _mm_and_si128(tmp_result3,c5); tmp_result4 = _mm_and_si128(tmp_result4,c7); tmp_result = _mm_or_si128(tmp_result,tmp_result2); tmp_result3 = _mm_or_si128(tmp_result3,tmp_result4); a = _mm_or_si128(tmp_result,tmp_result3);
-
-// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor
-#define square_a_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2);
-
-// calculates a_sq = int_ch_mag*(a_r^2 + a_i^2)*scale_factor for 64-QAM
-#define square_a_64qam_epi16(a_r,a_i,int_ch_mag,scale_factor,a_sq) tmp_result = _mm_mulhi_epi16(a_r,a_r); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result = _mm_mulhi_epi16(tmp_result,scale_factor); tmp_result = _mm_slli_epi16(tmp_result,3); tmp_result = _mm_mulhi_epi16(tmp_result,int_ch_mag); tmp_result = _mm_slli_epi16(tmp_result,1); tmp_result2 = _mm_mulhi_epi16(a_i,a_i); tmp_result2 = _mm_slli_epi16(tmp_result2,1); tmp_result2 = _mm_mulhi_epi16(tmp_result2,scale_factor); tmp_result2 = _mm_slli_epi16(tmp_result2,3); tmp_result2 = _mm_mulhi_epi16(tmp_result2,int_ch_mag); tmp_result2 = _mm_slli_epi16(tmp_result2,1); a_sq = _mm_adds_epi16(tmp_result,tmp_result2);
-
-#elif defined(__arm__) || defined(__aarch64__)
-
+__m128i rho_rmi __attribute__((aligned(16)));
#endif
//==============================================================================================
@@ -703,9 +129,9 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
#endif
#if defined(__x86_64__) || defined(__i386__)
- ch_mag = (__m128i*)&dl_ch_mag[(symbol*nb_rb*12)];
+ ch_mag = (__m128i *)dl_ch_mag;
#elif defined(__arm__) || defined(__aarch64__)
- ch_mag = (int16x8_t*)&dl_ch_mag[(symbol*nb_rb*12)];
+ ch_mag = (int16x8_t *)dl_ch_mag;
#endif
@@ -719,6 +145,7 @@ void nr_dlsch_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
for (i=0; i>2; // length in quad words (4 REs)
len2+=((len_mod4==0)?0:1);
for (i=0; i>2; i+=2) {
// in each iteration, we take 8 complex samples
#if defined(__x86_64__) || defined(__i386__)
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
+ __m128i xmm0 = rho01_128i[i]; // 4 symbols
+ __m128i xmm1 = rho01_128i[i + 1];
// put (rho_r + rho_i)/2sqrt2 in rho_rpi
// put (rho_r - rho_i)/2sqrt2 in rho_rmi
@@ -1113,10 +502,10 @@ void nr_qpsk_qpsk(short *stream0_in,
xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
+ __m128i xmm2 = _mm_unpacklo_epi64(xmm0, xmm1); // Re(rho)
+ __m128i xmm3 = _mm_unpackhi_epi64(xmm0, xmm1); // Im(rho)
+ __m128i rho_rpi = _mm_adds_epi16(xmm2, xmm3); // rho = Re(rho) + Im(rho)
+ __m128i rho_rmi = _mm_subs_epi16(xmm2, xmm3); // rho* = Re(rho) - Im(rho)
// divide by sqrt(8), no shift needed ONE_OVER_SQRT_8 = Q1.16
rho_rpi = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_8);
@@ -1140,11 +529,11 @@ void nr_qpsk_qpsk(short *stream0_in,
xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
+ __m128i y0r = _mm_unpacklo_epi64(xmm0, xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
+ __m128i y0i = _mm_unpackhi_epi64(xmm0, xmm1);
- y0r_over2 = _mm_srai_epi16(y0r,1); // divide by 2
- y0i_over2 = _mm_srai_epi16(y0i,1); // divide by 2
+ __m128i y0r_over2 = _mm_srai_epi16(y0r, 1); // divide by 2
+ __m128i y0i_over2 = _mm_srai_epi16(y0i, 1); // divide by 2
#elif defined(__arm__) || defined(__aarch64__)
@@ -1162,11 +551,11 @@ void nr_qpsk_qpsk(short *stream0_in,
xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
//xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
//xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
+ __m128i y1r = _mm_unpacklo_epi64(xmm0, xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
+ __m128i y1i = _mm_unpackhi_epi64(xmm0, xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
- y1r_over2 = _mm_srai_epi16(y1r,1); // divide by 2
- y1i_over2 = _mm_srai_epi16(y1i,1); // divide by 2
+ __m128i y1r_over2 = _mm_srai_epi16(y1r, 1); // divide by 2
+ __m128i y1i_over2 = _mm_srai_epi16(y1i, 1); // divide by 2
// Compute the terms for the LLR of first bit
@@ -1178,7 +567,7 @@ void nr_qpsk_qpsk(short *stream0_in,
xmm2 = _mm_adds_epi16(A,y0i_over2); // = |y1r/2 - rho/sqrt(8)| + y0i/2
xmm3 = _mm_subs_epi16(y1i_over2,rho_rmi);
B = _mm_abs_epi16(xmm3); // B = |y1i/2 - rho*/sqrt(8)|
- logmax_num_re0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2
+ __m128i logmax_num_re0 = _mm_adds_epi16(B, xmm2); // = |y1r/2 - rho/sqrt(8)|+|y1i/2 - rho*/sqrt(8)| + y0i/2
// 2 term for numerator of LLR
xmm3 = _mm_subs_epi16(y1r_over2,rho_rmi);
@@ -1195,7 +584,7 @@ void nr_qpsk_qpsk(short *stream0_in,
xmm2 = _mm_adds_epi16(E,y0i_over2); // = |y1r/2 + rho*/4| + y0i/2
xmm3 = _mm_subs_epi16(y1i_over2,rho_rpi);
F = _mm_abs_epi16(xmm3); // F = |y1i/2 - rho/4|
- logmax_den_re0 = _mm_adds_epi16(F,xmm2); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2
+ __m128i logmax_den_re0 = _mm_adds_epi16(F, xmm2); // = |y1r/2 + rho*/4| + |y1i/2 - rho/4| + y0i/2
// 2 term for denominator of LLR
xmm3 = _mm_adds_epi16(y1r_over2,rho_rpi);
@@ -1210,7 +599,7 @@ void nr_qpsk_qpsk(short *stream0_in,
// 1 term for nominator of LLR
xmm2 = _mm_adds_epi16(A,y0r_over2);
- logmax_num_im0 = _mm_adds_epi16(B,xmm2); // = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2
+ __m128i logmax_num_im0 = _mm_adds_epi16(B, xmm2); // = |y1r/2 - rho/4| + |y1i/2 - rho*/4| + y0r/2
// 2 term for nominator of LLR
xmm2 = _mm_subs_epi16(E,y0r_over2);
@@ -1220,7 +609,7 @@ void nr_qpsk_qpsk(short *stream0_in,
// 1 term for denominator of LLR
xmm2 = _mm_adds_epi16(C,y0r_over2);
- logmax_den_im0 = _mm_adds_epi16(D,xmm2); // = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2
+ __m128i logmax_den_im0 = _mm_adds_epi16(D, xmm2); // = |y1r/2 - rho*/4| + |y1i/2 + rho/4| - y0r/2
xmm2 = _mm_subs_epi16(G,y0r_over2);
xmm2 = _mm_adds_epi16(xmm2,H); // = |y1r/2 + rho/4| + |y1i/2 + rho*/4| - y0r/2
@@ -1250,7233 +639,3 @@ void nr_qpsk_qpsk(short *stream0_in,
_m_empty();
#endif
}
-
-int nr_dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qpsk_llr: llr is null, symbol %d\n",symbol);
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- nr_qpsk_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<1);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-/*
-#if defined(__x86_64__) || defined(__i386__)
-__m128i ONE_OVER_SQRT_2 __attribute__((aligned(16)));
-__m128i ONE_OVER_SQRT_10 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_10 __attribute__((aligned(16)));
-__m128i ONE_OVER_SQRT_10_Q15 __attribute__((aligned(16)));
-__m128i SQRT_10_OVER_FOUR __attribute__((aligned(16)));
-__m128i ch_mag_int;
-#endif
-*/
-void nr_qpsk_qam16(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
- /*
- This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
-
- Parameters:
- stream0_in = Matched filter output y0' = (h0*g0)*y0
- stream1_in = Matched filter output y1' = (h0*g1)*y0
- stream0_out = LLRs
- rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
- length = number of resource elements
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ch_mag_int __attribute__((aligned(16)));
-#elif defined(__arm__) || defined(__aarch64__)
- int16x8_t *rho01_128i = (int16x8_t *)rho01;
- int16x8_t *stream0_128i_in = (int16x8_t *)stream0_in;
- int16x8_t *stream1_128i_in = (int16x8_t *)stream1_in;
- int16x8_t *stream0_128i_out = (int16x8_t *)stream0_out;
- int16x8_t *ch_mag_128i_i = (int16x8_t *)ch_mag_i;
- int16x8_t ONE_OVER_SQRT_2 = vdupq_n_s16(23170); // round(1/sqrt(2)*2^15)
- int16x8_t ONE_OVER_SQRT_10_Q15 = vdupq_n_s16(10362); // round(1/sqrt(10)*2^15)
- int16x8_t THREE_OVER_SQRT_10 = vdupq_n_s16(31086); // round(3/sqrt(10)*2^15)
- int16x8_t SQRT_10_OVER_FOUR = vdupq_n_s16(25905); // round(sqrt(10)/4*2^15)
- int16x8_t ch_mag_int __attribute__((aligned(16)));
-#endif
-
-#ifdef DEBUG_LLR
- print_shorts2("rho01_128i:\n",rho01_128i);
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // in each iteration, we take 8 complex samples
-
-#if defined(__x86_64__) || defined(__i386__)
-
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
-
- // put (rho_r + rho_i)/2sqrt2 in rho_rpi
- // put (rho_r - rho_i)/2sqrt2 in rho_rmi
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // divide by sqrt(2)
- rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2);
- rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2);
- rho_rpi = _mm_slli_epi16(rho_rpi,1);
- rho_rmi = _mm_slli_epi16(rho_rmi,1);
-
- // Compute LLR for first bit of stream 0
-
- // Compute real and imaginary parts of MF output for stream 0
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // divide by sqrt(2)
- y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2);
- y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2);
- y0r_over2 = _mm_slli_epi16(y0r,1);
- y0i_over2 = _mm_slli_epi16(y0i,1);
-
- y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2);
- y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2);
-
- // Compute real and imaginary parts of MF output for stream 1
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
-
- // compute psi
- xmm3 = _mm_subs_epi16(y1r,rho_rpi);
- psi_r_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rmi);
- psi_i_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1r,rho_rmi);
- psi_r_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rpi);
- psi_i_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rmi);
- psi_r_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rpi);
- psi_i_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rpi);
- psi_r_m1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rmi);
- psi_i_m1_m1 = _mm_abs_epi16(xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // calculate optimal interference amplitudes
- interference_abs_epi16(psi_r_p1_p1 , ch_mag_int, a_r_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1 , ch_mag_int, a_i_p1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1 , ch_mag_int, a_r_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1 , ch_mag_int, a_i_p1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1 , ch_mag_int, a_r_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1 , ch_mag_int, a_i_m1_p1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1 , ch_mag_int, a_r_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1 , ch_mag_int, a_i_m1_m1 , ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // prodsum
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
-
- // squares
- square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1);
- square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1);
- square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1);
- square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1);
-
- // MSB
- logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0
- logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1
-
- y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0);
-
- // LSB
- logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0
- logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1
-
- y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0);
-
- stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)]
-
- if (i<((length>>1) - 1)) // false if only 2 REs remain
- stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i);
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int nr_dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF=(int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i=(int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho=(int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
-
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"nr_dlsch_qpsk_qam64_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- nr_qpsk_qam64((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<1);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-/*
-__m128i ONE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_SQRT_2_42 __attribute__((aligned(16)));
-__m128i SEVEN_OVER_SQRT_2_42 __attribute__((aligned(16)));
-
-__m128i ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i two_ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i three_ch_mag_int_with_sigma2 __attribute__((aligned(16)));
-__m128i SQRT_42_OVER_FOUR __attribute__((aligned(16)));
-*/
-void nr_qpsk_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- This function computes the LLRs of stream 0 (s_0) in presence of the interfering stream 1 (s_1) assuming that both symbols are QPSK. It can be used for both MU-MIMO interference-aware receiver or for SU-MIMO receivers.
-
- Parameters:
- stream0_in = Matched filter output y0' = (h0*g0)*y0
- stream1_in = Matched filter output y1' = (h0*g1)*y0
- stream0_out = LLRs
- rho01 = Correlation between the two effective channels \rho_{10} = (h1*g1)*(h0*g0)
- length = number of resource elements
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.1
- __m128i ch_mag_int;
- __m128i ch_mag_int_with_sigma2;
- __m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
-#ifdef DEBUG_LLR
- print_shorts2("rho01_128i:\n",rho01_128i);
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // in each iteration, we take 8 complex samples
-
-#if defined(__x86_64__) || defined(__i386__)
-
- xmm0 = rho01_128i[i]; // 4 symbols
- xmm1 = rho01_128i[i+1];
-
- // put (rho_r + rho_i)/sqrt2 in rho_rpi
- // put (rho_r - rho_i)/sqrt2 in rho_rmi
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // divide by sqrt(2)
- rho_rpi = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_2);
- rho_rmi = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_2);
- rho_rpi = _mm_slli_epi16(rho_rpi,1);
- rho_rmi = _mm_slli_epi16(rho_rmi,1);
-
- // Compute LLR for first bit of stream 0
-
- // Compute real and imaginary parts of MF output for stream 0
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // divide by sqrt(2)
- y0r_over2 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_2);
- y0i_over2 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_2);
- y0r_over2 = _mm_slli_epi16(y0r,1);
- y0i_over2 = _mm_slli_epi16(y0i,1);
-
- y0_p_1_1 = _mm_adds_epi16(y0r_over2, y0i_over2);
- y0_m_1_1 = _mm_subs_epi16(y0r_over2, y0i_over2);
-
- // Compute real and imaginary parts of MF output for stream 1
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
-
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
-
- // compute psi
- xmm3 = _mm_subs_epi16(y1r,rho_rpi);
- psi_r_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rmi);
- psi_i_p1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1r,rho_rmi);
- psi_r_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rpi);
- psi_i_p1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rmi);
- psi_r_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_subs_epi16(y1i,rho_rpi);
- psi_i_m1_p1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1r,rho_rpi);
- psi_r_m1_m1 = _mm_abs_epi16(xmm3);
- xmm3 = _mm_adds_epi16(y1i,rho_rmi);
- psi_i_m1_m1 = _mm_abs_epi16(xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // prodsum
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
-
- // Multiply by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
-
- square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1);
- square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- bit_met_p1_p1 = _mm_adds_epi16(xmm0, y0_p_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- bit_met_p1_m1 = _mm_adds_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm0, y0_m_1_1);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm0, y0_p_1_1);
-
- // MSB
- logmax_num_re0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_m1); // bit=0
- logmax_den_re0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_m1); // bit=1
-
- y0r = _mm_subs_epi16(logmax_num_re0,logmax_den_re0);
-
- // LSB
- logmax_num_im0 = _mm_max_epi16(bit_met_p1_p1,bit_met_m1_p1); // bit=0
- logmax_den_im0 = _mm_max_epi16(bit_met_p1_m1,bit_met_m1_m1); // bit=1
-
- y0i = _mm_subs_epi16(logmax_num_im0,logmax_den_im0);
-
- stream0_128i_out[i] = _mm_unpacklo_epi16(y0r,y0i); // = [L1(1), L2(1), L1(2), L2(2)]
-
- if (i<((length>>1) - 1)) // false if only 2 REs remain
- stream0_128i_out[i+1] = _mm_unpackhi_epi16(y0r,y0i);
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-//----------------------------------------------------------------------------------------------
-// 16-QAM
-//----------------------------------------------------------------------------------------------
-
-/*
-__m128i ONE_OVER_TWO_SQRT_10 __attribute__((aligned(16)));
-__m128i NINE_OVER_TWO_SQRT_10 __attribute__((aligned(16)));
-
-__m128i y0r_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0i_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0r_three_over_sqrt10 __attribute__ ((aligned(16)));
-__m128i y0i_three_over_sqrt10 __attribute__ ((aligned(16)));
-
-__m128i ch_mag_des __attribute__((aligned(16)));
-__m128i ch_mag_over_10 __attribute__ ((aligned(16)));
-__m128i ch_mag_over_2 __attribute__ ((aligned(16)));
-__m128i ch_mag_9_over_10 __attribute__ ((aligned(16)));
-*/
-
-void nr_qam16_qpsk(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i y0r_over_sqrt10;
- __m128i y0i_over_sqrt10;
- __m128i y0r_three_over_sqrt10;
- __m128i y0i_three_over_sqrt10;
-
- __m128i ch_mag_des;
- __m128i ch_mag_over_10;
- __m128i ch_mag_over_2;
- __m128i ch_mag_9_over_10;
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- int i;
-
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Add psi
- psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1 ,psi_i_p1_p1);
- psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3 ,psi_i_p1_p3);
- psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1 ,psi_i_p3_p1);
- psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3 ,psi_i_p3_p3);
- psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1 ,psi_i_p1_m1);
- psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3 ,psi_i_p1_m3);
- psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1 ,psi_i_p3_m1);
- psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3 ,psi_i_p3_m3);
- psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1 ,psi_i_m1_p1);
- psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3 ,psi_i_m1_p3);
- psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1 ,psi_i_m3_p1);
- psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3 ,psi_i_m3_p3);
- psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1 ,psi_i_m1_m1);
- psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3 ,psi_i_m1_m3);
- psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1 ,psi_i_m3_m1);
- psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3 ,psi_i_m3_m3);
-
- // scale by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1,ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1,1);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3,ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3,1);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1,ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1,1);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3,ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3,1);
-
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1,ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1,1);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3,ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3,1);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1,ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1,1);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3,ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3,1);
-
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1,ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1,1);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3,ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3,1);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1,ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1,1);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3,ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3,1);
-
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1,ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1,1);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3,ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3,1);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1,ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1,1);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3,ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3,1);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1, ch_mag_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1, ch_mag_over_2);
-
- xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1, ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-
-}
-
-int nr_dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_qpsk_llr: llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- nr_qam16_qpsk((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-void nr_qam16_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
-
-
- __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16)
- __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i ch_mag_des,ch_mag_int;
- __m128i y0r_over_sqrt10;
- __m128i y0i_over_sqrt10;
- __m128i y0r_three_over_sqrt10;
- __m128i y0i_three_over_sqrt10;
- __m128i ch_mag_over_10;
- __m128i ch_mag_over_2;
- __m128i ch_mag_9_over_10;
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- int i;
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Compute optimal interfering symbol magnitude
- interference_abs_epi16(psi_r_p1_p1 ,ch_mag_int,a_r_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1 ,ch_mag_int,a_i_p1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p3 ,ch_mag_int,a_r_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p3 ,ch_mag_int,a_i_p1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1 ,ch_mag_int,a_r_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1 ,ch_mag_int,a_i_p1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m3 ,ch_mag_int,a_r_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m3 ,ch_mag_int,a_i_p1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p1 ,ch_mag_int,a_r_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p1 ,ch_mag_int,a_i_p3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p3 ,ch_mag_int,a_r_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p3 ,ch_mag_int,a_i_p3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m1 ,ch_mag_int,a_r_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m1 ,ch_mag_int,a_i_p3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m3 ,ch_mag_int,a_r_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m3 ,ch_mag_int,a_i_p3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1 ,ch_mag_int,a_r_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1 ,ch_mag_int,a_i_m1_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p3 ,ch_mag_int,a_r_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p3 ,ch_mag_int,a_i_m1_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1 ,ch_mag_int,a_r_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1 ,ch_mag_int,a_i_m1_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m3 ,ch_mag_int,a_r_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m3 ,ch_mag_int,a_i_m1_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p1 ,ch_mag_int,a_r_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p1 ,ch_mag_int,a_i_m3_p1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p3 ,ch_mag_int,a_r_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p3 ,ch_mag_int,a_i_m3_p3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m1 ,ch_mag_int,a_r_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m1 ,ch_mag_int,a_i_m3_m1,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m3 ,ch_mag_int,a_r_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m3 ,ch_mag_int,a_i_m3_m3,ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude
- prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3);
-
-
- // squared interference magnitude times int. ch. power
- square_a_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p1);
- square_a_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_p3);
- square_a_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p1);
- square_a_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_p3);
- square_a_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m1);
- square_a_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p1_m3);
- square_a_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m1);
- square_a_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_p3_m3);
- square_a_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p1);
- square_a_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_p3);
- square_a_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p1);
- square_a_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_p3);
- square_a_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m1);
- square_a_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m1_m3);
- square_a_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m1);
- square_a_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_10_OVER_FOUR,a_sq_m3_m3);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint32_t len,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*nb_rb*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*nb_rb*12)];
- int16_t *llr16;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_16qam_llr: llr is null, symbol %d\n",symbol);
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- nr_qam16_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-void nr_qam16_qam64(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag,
- int16_t *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
-
- /*
- Author: Sebastian Wagner
- Date: 2012-06-04
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream!_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 2*h0/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 2*h1/sqrt(00), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *stream0_128i_out = (__m128i *)stream0_out;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
-
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_10 = _mm_set1_epi16(20724); // round(1/sqrt(10)*2^16)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
- __m128i ONE_OVER_TWO_SQRT_10 = _mm_set1_epi16(10362); // round(1/2/sqrt(10)*2^16)
- __m128i NINE_OVER_TWO_SQRT_10 = _mm_set1_epi16(23315); // round(9/2/sqrt(10)*2^14)
- __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.
- __m128i ch_mag_des,ch_mag_int;
- __m128i y0r_over_sqrt10;
- __m128i y0i_over_sqrt10;
- __m128i y0r_three_over_sqrt10;
- __m128i y0i_three_over_sqrt10;
- __m128i ch_mag_over_10;
- __m128i ch_mag_over_2;
- __m128i ch_mag_9_over_10;
- __m128i ch_mag_int_with_sigma2;
- __m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- int i;
-
- for (i=0; i>2; i+=2) {
- // In one iteration, we deal with 8 REs
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi,ONE_OVER_SQRT_10);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi,ONE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi,THREE_OVER_SQRT_10);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi,THREE_OVER_SQRT_10);
- rho_rpi_3_3 = _mm_slli_epi16(rho_rpi_3_3,1);
- rho_rmi_3_3 = _mm_slli_epi16(rho_rmi_3_3,1);
-
- xmm4 = _mm_mulhi_epi16(xmm2,ONE_OVER_SQRT_10); // Re(rho)
- xmm5 = _mm_mulhi_epi16(xmm3,THREE_OVER_SQRT_10); // Im(rho)
- xmm5 = _mm_slli_epi16(xmm5,1);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4,xmm5);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4,xmm5);
-
- xmm6 = _mm_mulhi_epi16(xmm2,THREE_OVER_SQRT_10); // Re(rho)
- xmm7 = _mm_mulhi_epi16(xmm3,ONE_OVER_SQRT_10); // Im(rho)
- xmm6 = _mm_slli_epi16(xmm6,1);
-
- rho_rpi_3_1 = _mm_adds_epi16(xmm6,xmm7);
- rho_rmi_3_1 = _mm_subs_epi16(xmm6,xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- xmm0 = _mm_setzero_si128(); // ZERO
- xmm2 = _mm_subs_epi16(rho_rpi_1_1,y1r); // = [Re(rho)+ Im(rho)]/sqrt(10) - y1r
- psi_r_p1_p1 = _mm_abs_epi16(xmm2); // = |[Re(rho)+ Im(rho)]/sqrt(10) - y1r|
-
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_1,y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_1,y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_1_3,y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rmi_3_3,y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_1,y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_1,y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_1_3,y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_subs_epi16(rho_rpi_3_3,y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_1,y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_1_3,y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_1,y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(rho_rpi_3_3,y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_1);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_1_3);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_1);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_1);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_1);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1r,rho_rmi_3_3);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_1_3);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2= _mm_adds_epi16(y1i,rho_rmi_3_3);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3); // = [|h|^2(1),|h|^2(2),|h|^2(3),|h|^2(4)]*(2/sqrt(10))
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
-
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
-
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Scale MF output of desired signal
- y0r_over_sqrt10 = _mm_mulhi_epi16(y0r,ONE_OVER_SQRT_10);
- y0i_over_sqrt10 = _mm_mulhi_epi16(y0i,ONE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_mulhi_epi16(y0r,THREE_OVER_SQRT_10);
- y0i_three_over_sqrt10 = _mm_mulhi_epi16(y0i,THREE_OVER_SQRT_10);
- y0r_three_over_sqrt10 = _mm_slli_epi16(y0r_three_over_sqrt10,1);
- y0i_three_over_sqrt10 = _mm_slli_epi16(y0i_three_over_sqrt10,1);
-
- // Compute necessary combination of required terms
- y0_p_1_1 = _mm_adds_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
- y0_m_1_1 = _mm_subs_epi16(y0r_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_1_3 = _mm_adds_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_1_3 = _mm_subs_epi16(y0r_over_sqrt10,y0i_three_over_sqrt10);
-
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_over_sqrt10);
-
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt10,y0i_three_over_sqrt10);
-
- // Compute optimal interfering symbol magnitude
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m1 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m3 ,ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3,ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42,FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // Calculation of groups of two terms in the bit metric involving product of psi and interference magnitude
- prodsum_psi_a_epi16(psi_r_p1_p1,a_r_p1_p1,psi_i_p1_p1,a_i_p1_p1,psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_p3,a_r_p1_p3,psi_i_p1_p3,a_i_p1_p3,psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1,a_r_p3_p1,psi_i_p3_p1,a_i_p3_p1,psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_p3,a_r_p3_p3,psi_i_p3_p3,a_i_p3_p3,psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p1_m1,a_r_p1_m1,psi_i_p1_m1,a_i_p1_m1,psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3,a_r_p1_m3,psi_i_p1_m3,a_i_p1_m3,psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p3_m1,a_r_p3_m1,psi_i_p3_m1,a_i_p3_m1,psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3,a_r_p3_m3,psi_i_p3_m3,a_i_p3_m3,psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_m1_p1,a_r_m1_p1,psi_i_m1_p1,a_i_m1_p1,psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_p3,a_r_m1_p3,psi_i_m1_p3,a_i_m1_p3,psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1,a_r_m3_p1,psi_i_m3_p1,a_i_m3_p1,psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_p3,a_r_m3_p3,psi_i_m3_p3,a_i_m3_p3,psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m1_m1,a_r_m1_m1,psi_i_m1_m1,a_i_m1_m1,psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3,a_r_m1_m3,psi_i_m1_m3,a_i_m1_m3,psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m3_m1,a_r_m3_m1,psi_i_m3_m1,a_i_m3_m1,psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3,a_r_m3_m3,psi_i_m3_m3,a_i_m3_m3,psi_a_m3_m3);
-
- // Multiply by sqrt(2)
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2);
-
- // squared interference magnitude times int. ch. power
- square_a_64qam_epi16(a_r_p1_p1,a_i_p1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_p3,a_i_p1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_p3);
- square_a_64qam_epi16(a_r_p3_p1,a_i_p3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p1);
- square_a_64qam_epi16(a_r_p3_p3,a_i_p3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_p3);
- square_a_64qam_epi16(a_r_p1_m1,a_i_p1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m1);
- square_a_64qam_epi16(a_r_p1_m3,a_i_p1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p1_m3);
- square_a_64qam_epi16(a_r_p3_m1,a_i_p3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m1);
- square_a_64qam_epi16(a_r_p3_m3,a_i_p3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_p3_m3);
- square_a_64qam_epi16(a_r_m1_p1,a_i_m1_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_p3,a_i_m1_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_p3);
- square_a_64qam_epi16(a_r_m3_p1,a_i_m3_p1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p1);
- square_a_64qam_epi16(a_r_m3_p3,a_i_m3_p3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_p3);
- square_a_64qam_epi16(a_r_m1_m1,a_i_m1_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m1);
- square_a_64qam_epi16(a_r_m1_m3,a_i_m1_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m1_m3);
- square_a_64qam_epi16(a_r_m3_m1,a_i_m3_m1,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m1);
- square_a_64qam_epi16(a_r_m3_m3,a_i_m3_m3,ch_mag_int,SQRT_42_OVER_FOUR,a_sq_m3_m3);
-
- // Computing different multiples of channel norms
- ch_mag_over_10=_mm_mulhi_epi16(ch_mag_des, ONE_OVER_TWO_SQRT_10);
- ch_mag_over_2=_mm_mulhi_epi16(ch_mag_des, SQRT_10_OVER_FOUR);
- ch_mag_over_2=_mm_slli_epi16(ch_mag_over_2, 1);
- ch_mag_9_over_10=_mm_mulhi_epi16(ch_mag_des, NINE_OVER_TWO_SQRT_10);
- ch_mag_9_over_10=_mm_slli_epi16(ch_mag_9_over_10, 2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p1_p1,a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_1);
- bit_met_p1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_p3,a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_1_3);
- bit_met_p1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m1,a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_1);
- bit_met_p1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p1_m3,a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_1_3);
- bit_met_p1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p1,a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_1);
- bit_met_p3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_p3,a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0,y0_p_3_3);
- bit_met_p3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m1,a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_1);
- bit_met_p3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_p3_m3,a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0,y0_m_3_3);
- bit_met_p3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p1,a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_1);
- bit_met_m1_p1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p3,a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_1_3);
- bit_met_m1_p3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m1,a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_1);
- bit_met_m1_m1= _mm_subs_epi16(xmm1,ch_mag_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_m3,a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_1_3);
- bit_met_m1_m3= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p1,a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_1);
- bit_met_m3_p1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_p3,a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0,y0_m_3_3);
- bit_met_m3_p3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m1,a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_1);
- bit_met_m3_m1= _mm_subs_epi16(xmm1,ch_mag_over_2);
-
- xmm0 = _mm_subs_epi16(psi_a_m3_m3,a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0,y0_p_3_3);
- bit_met_m3_m3= _mm_subs_epi16(xmm1,ch_mag_9_over_10);
-
- // LLR of the first bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re0= _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm1 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of first bit [L1(1), L1(2), L1(3), L1(4), L1(5), L1(6), L1(7), L1(8)]
- y0r = _mm_subs_epi16(logmax_den_re0,logmax_num_re0);
-
- // LLR of the second bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm1 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_re1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of second bit [L2(1), L2(2), L2(3), L2(4)]
- y1r = _mm_subs_epi16(logmax_den_re1,logmax_num_re1);
-
- // LLR of the third bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_m3_p1,bit_met_m3_p3);
- xmm1 = _mm_max_epi16(bit_met_m3_m1,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p3_p1,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_m1,bit_met_p3_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_m1_p1,bit_met_m1_p3);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m1_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_m1,bit_met_p1_m3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im0 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of third bit [L3(1), L3(2), L3(3), L3(4)]
- y0i = _mm_subs_epi16(logmax_den_im0,logmax_num_im0);
-
- // LLR of the fourth bit
- // Bit = 1
- xmm0 = _mm_max_epi16(bit_met_p1_m3,bit_met_p3_m3);
- xmm1 = _mm_max_epi16(bit_met_m1_m3,bit_met_m3_m3);
- xmm2 = _mm_max_epi16(bit_met_p1_p3,bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p3,bit_met_m3_p3);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_num_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // Bit = 0
- xmm0 = _mm_max_epi16(bit_met_p1_m1,bit_met_p3_m1);
- xmm1 = _mm_max_epi16(bit_met_m1_m1,bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1,bit_met_p3_p1);
- xmm3 = _mm_max_epi16(bit_met_m1_p1,bit_met_m3_p1);
- xmm4 = _mm_max_epi16(xmm0,xmm1);
- xmm5 = _mm_max_epi16(xmm2,xmm3);
- logmax_den_im1 = _mm_max_epi16(xmm4,xmm5);
-
- // LLR of fourth bit [L4(1), L4(2), L4(3), L4(4)]
- y1i = _mm_subs_epi16(logmax_den_im1,logmax_num_im1);
-
- // Pack LLRs in output
- // [L1(1), L2(1), L1(2), L2(2), L1(3), L2(3), L1(4), L2(4)]
- xmm0 = _mm_unpacklo_epi16(y0r,y1r);
- // [L1(5), L2(5), L1(6), L2(6), L1(7), L2(7), L1(8), L2(8)]
- xmm1 = _mm_unpackhi_epi16(y0r,y1r);
- // [L3(1), L4(1), L3(2), L4(2), L3(3), L4(3), L3(4), L4(4)]
- xmm2 = _mm_unpacklo_epi16(y0i,y1i);
- // [L3(5), L4(5), L3(6), L4(6), L3(7), L4(7), L3(8), L4(8)]
- xmm3 = _mm_unpackhi_epi16(y0i,y1i);
-
- stream0_128i_out[2*i+0] = _mm_unpacklo_epi32(xmm0,xmm2); // 8LLRs, 2REs
- stream0_128i_out[2*i+1] = _mm_unpackhi_epi32(xmm0,xmm2);
- stream0_128i_out[2*i+2] = _mm_unpacklo_epi32(xmm1,xmm3);
- stream0_128i_out[2*i+3] = _mm_unpackhi_epi32(xmm1,xmm3);
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-int nr_dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int32_t **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- // first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- // printf("symbol %d: qam16_llr, len %d (llr16 %p)\n",symbol,len,llr16);
-
- nr_qam16_qam64((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (len<<2);
- *llr16p = (short *)llr16;
-
- return(0);
-}
-
-//----------------------------------------------------------------------------------------------
-// 64-QAM
-//----------------------------------------------------------------------------------------------
-
-/*
-__m128i ONE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i THREE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_SQRT_42 __attribute__((aligned(16)));
-__m128i SEVEN_OVER_SQRT_42 __attribute__((aligned(16)));
-
-__m128i FORTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i TWENTYNINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i TWENTYFIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i SEVENTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i NINE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i THIRTEEN_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i FIVE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-__m128i ONE_OVER_FOUR_SQRT_42 __attribute__((aligned(16)));
-
-__m128i y0r_one_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_three_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_five_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0r_seven_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_one_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_three_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_five_over_sqrt_21 __attribute__((aligned(16)));
-__m128i y0i_seven_over_sqrt_21 __attribute__((aligned(16)));
-
-__m128i ch_mag_98_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_74_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_58_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_50_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_34_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_18_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_26_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_10_over_42_with_sigma2 __attribute__((aligned(16)));
-__m128i ch_mag_2_over_42_with_sigma2 __attribute__((aligned(16)));
-
-*/
-
-void nr_qam64_qpsk(int16_t *stream0_in,
- int16_t *stream1_in,
- int16_t *ch_mag,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
-
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15)
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
-
-
- __m128i ch_mag_des;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __m128i y0i_seven_over_sqrt_21;
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- int i,j;
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- // divide by sqrt(2)
- psi_r_p7_p7 = _mm_mulhi_epi16(psi_r_p7_p7, ONE_OVER_SQRT_2);
- psi_r_p7_p7 = _mm_slli_epi16(psi_r_p7_p7, 1);
- psi_r_p7_p5 = _mm_mulhi_epi16(psi_r_p7_p5, ONE_OVER_SQRT_2);
- psi_r_p7_p5 = _mm_slli_epi16(psi_r_p7_p5, 1);
- psi_r_p7_p3 = _mm_mulhi_epi16(psi_r_p7_p3, ONE_OVER_SQRT_2);
- psi_r_p7_p3 = _mm_slli_epi16(psi_r_p7_p3, 1);
- psi_r_p7_p1 = _mm_mulhi_epi16(psi_r_p7_p1, ONE_OVER_SQRT_2);
- psi_r_p7_p1 = _mm_slli_epi16(psi_r_p7_p1, 1);
- psi_r_p7_m1 = _mm_mulhi_epi16(psi_r_p7_m1, ONE_OVER_SQRT_2);
- psi_r_p7_m1 = _mm_slli_epi16(psi_r_p7_m1, 1);
- psi_r_p7_m3 = _mm_mulhi_epi16(psi_r_p7_m3, ONE_OVER_SQRT_2);
- psi_r_p7_m3 = _mm_slli_epi16(psi_r_p7_m3, 1);
- psi_r_p7_m5 = _mm_mulhi_epi16(psi_r_p7_m5, ONE_OVER_SQRT_2);
- psi_r_p7_m5 = _mm_slli_epi16(psi_r_p7_m5, 1);
- psi_r_p7_m7 = _mm_mulhi_epi16(psi_r_p7_m7, ONE_OVER_SQRT_2);
- psi_r_p7_m7 = _mm_slli_epi16(psi_r_p7_m7, 1);
- psi_r_p5_p7 = _mm_mulhi_epi16(psi_r_p5_p7, ONE_OVER_SQRT_2);
- psi_r_p5_p7 = _mm_slli_epi16(psi_r_p5_p7, 1);
- psi_r_p5_p5 = _mm_mulhi_epi16(psi_r_p5_p5, ONE_OVER_SQRT_2);
- psi_r_p5_p5 = _mm_slli_epi16(psi_r_p5_p5, 1);
- psi_r_p5_p3 = _mm_mulhi_epi16(psi_r_p5_p3, ONE_OVER_SQRT_2);
- psi_r_p5_p3 = _mm_slli_epi16(psi_r_p5_p3, 1);
- psi_r_p5_p1 = _mm_mulhi_epi16(psi_r_p5_p1, ONE_OVER_SQRT_2);
- psi_r_p5_p1 = _mm_slli_epi16(psi_r_p5_p1, 1);
- psi_r_p5_m1 = _mm_mulhi_epi16(psi_r_p5_m1, ONE_OVER_SQRT_2);
- psi_r_p5_m1 = _mm_slli_epi16(psi_r_p5_m1, 1);
- psi_r_p5_m3 = _mm_mulhi_epi16(psi_r_p5_m3, ONE_OVER_SQRT_2);
- psi_r_p5_m3 = _mm_slli_epi16(psi_r_p5_m3, 1);
- psi_r_p5_m5 = _mm_mulhi_epi16(psi_r_p5_m5, ONE_OVER_SQRT_2);
- psi_r_p5_m5 = _mm_slli_epi16(psi_r_p5_m5, 1);
- psi_r_p5_m7 = _mm_mulhi_epi16(psi_r_p5_m7, ONE_OVER_SQRT_2);
- psi_r_p5_m7 = _mm_slli_epi16(psi_r_p5_m7, 1);
- psi_r_p3_p7 = _mm_mulhi_epi16(psi_r_p3_p7, ONE_OVER_SQRT_2);
- psi_r_p3_p7 = _mm_slli_epi16(psi_r_p3_p7, 1);
- psi_r_p3_p5 = _mm_mulhi_epi16(psi_r_p3_p5, ONE_OVER_SQRT_2);
- psi_r_p3_p5 = _mm_slli_epi16(psi_r_p3_p5, 1);
- psi_r_p3_p3 = _mm_mulhi_epi16(psi_r_p3_p3, ONE_OVER_SQRT_2);
- psi_r_p3_p3 = _mm_slli_epi16(psi_r_p3_p3, 1);
- psi_r_p3_p1 = _mm_mulhi_epi16(psi_r_p3_p1, ONE_OVER_SQRT_2);
- psi_r_p3_p1 = _mm_slli_epi16(psi_r_p3_p1, 1);
- psi_r_p3_m1 = _mm_mulhi_epi16(psi_r_p3_m1, ONE_OVER_SQRT_2);
- psi_r_p3_m1 = _mm_slli_epi16(psi_r_p3_m1, 1);
- psi_r_p3_m3 = _mm_mulhi_epi16(psi_r_p3_m3, ONE_OVER_SQRT_2);
- psi_r_p3_m3 = _mm_slli_epi16(psi_r_p3_m3, 1);
- psi_r_p3_m5 = _mm_mulhi_epi16(psi_r_p3_m5, ONE_OVER_SQRT_2);
- psi_r_p3_m5 = _mm_slli_epi16(psi_r_p3_m5, 1);
- psi_r_p3_m7 = _mm_mulhi_epi16(psi_r_p3_m7, ONE_OVER_SQRT_2);
- psi_r_p3_m7 = _mm_slli_epi16(psi_r_p3_m7, 1);
- psi_r_p1_p7 = _mm_mulhi_epi16(psi_r_p1_p7, ONE_OVER_SQRT_2);
- psi_r_p1_p7 = _mm_slli_epi16(psi_r_p1_p7, 1);
- psi_r_p1_p5 = _mm_mulhi_epi16(psi_r_p1_p5, ONE_OVER_SQRT_2);
- psi_r_p1_p5 = _mm_slli_epi16(psi_r_p1_p5, 1);
- psi_r_p1_p3 = _mm_mulhi_epi16(psi_r_p1_p3, ONE_OVER_SQRT_2);
- psi_r_p1_p3 = _mm_slli_epi16(psi_r_p1_p3, 1);
- psi_r_p1_p1 = _mm_mulhi_epi16(psi_r_p1_p1, ONE_OVER_SQRT_2);
- psi_r_p1_p1 = _mm_slli_epi16(psi_r_p1_p1, 1);
- psi_r_p1_m1 = _mm_mulhi_epi16(psi_r_p1_m1, ONE_OVER_SQRT_2);
- psi_r_p1_m1 = _mm_slli_epi16(psi_r_p1_m1, 1);
- psi_r_p1_m3 = _mm_mulhi_epi16(psi_r_p1_m3, ONE_OVER_SQRT_2);
- psi_r_p1_m3 = _mm_slli_epi16(psi_r_p1_m3, 1);
- psi_r_p1_m5 = _mm_mulhi_epi16(psi_r_p1_m5, ONE_OVER_SQRT_2);
- psi_r_p1_m5 = _mm_slli_epi16(psi_r_p1_m5, 1);
- psi_r_p1_m7 = _mm_mulhi_epi16(psi_r_p1_m7, ONE_OVER_SQRT_2);
- psi_r_p1_m7 = _mm_slli_epi16(psi_r_p1_m7, 1);
- psi_r_m1_p7 = _mm_mulhi_epi16(psi_r_m1_p7, ONE_OVER_SQRT_2);
- psi_r_m1_p7 = _mm_slli_epi16(psi_r_m1_p7, 1);
- psi_r_m1_p5 = _mm_mulhi_epi16(psi_r_m1_p5, ONE_OVER_SQRT_2);
- psi_r_m1_p5 = _mm_slli_epi16(psi_r_m1_p5, 1);
- psi_r_m1_p3 = _mm_mulhi_epi16(psi_r_m1_p3, ONE_OVER_SQRT_2);
- psi_r_m1_p3 = _mm_slli_epi16(psi_r_m1_p3, 1);
- psi_r_m1_p1 = _mm_mulhi_epi16(psi_r_m1_p1, ONE_OVER_SQRT_2);
- psi_r_m1_p1 = _mm_slli_epi16(psi_r_m1_p1, 1);
- psi_r_m1_m1 = _mm_mulhi_epi16(psi_r_m1_m1, ONE_OVER_SQRT_2);
- psi_r_m1_m1 = _mm_slli_epi16(psi_r_m1_m1, 1);
- psi_r_m1_m3 = _mm_mulhi_epi16(psi_r_m1_m3, ONE_OVER_SQRT_2);
- psi_r_m1_m3 = _mm_slli_epi16(psi_r_m1_m3, 1);
- psi_r_m1_m5 = _mm_mulhi_epi16(psi_r_m1_m5, ONE_OVER_SQRT_2);
- psi_r_m1_m5 = _mm_slli_epi16(psi_r_m1_m5, 1);
- psi_r_m1_m7 = _mm_mulhi_epi16(psi_r_m1_m7, ONE_OVER_SQRT_2);
- psi_r_m1_m7 = _mm_slli_epi16(psi_r_m1_m7, 1);
- psi_r_m3_p7 = _mm_mulhi_epi16(psi_r_m3_p7, ONE_OVER_SQRT_2);
- psi_r_m3_p7 = _mm_slli_epi16(psi_r_m3_p7, 1);
- psi_r_m3_p5 = _mm_mulhi_epi16(psi_r_m3_p5, ONE_OVER_SQRT_2);
- psi_r_m3_p5 = _mm_slli_epi16(psi_r_m3_p5, 1);
- psi_r_m3_p3 = _mm_mulhi_epi16(psi_r_m3_p3, ONE_OVER_SQRT_2);
- psi_r_m3_p3 = _mm_slli_epi16(psi_r_m3_p3, 1);
- psi_r_m3_p1 = _mm_mulhi_epi16(psi_r_m3_p1, ONE_OVER_SQRT_2);
- psi_r_m3_p1 = _mm_slli_epi16(psi_r_m3_p1, 1);
- psi_r_m3_m1 = _mm_mulhi_epi16(psi_r_m3_m1, ONE_OVER_SQRT_2);
- psi_r_m3_m1 = _mm_slli_epi16(psi_r_m3_m1, 1);
- psi_r_m3_m3 = _mm_mulhi_epi16(psi_r_m3_m3, ONE_OVER_SQRT_2);
- psi_r_m3_m3 = _mm_slli_epi16(psi_r_m3_m3, 1);
- psi_r_m3_m5 = _mm_mulhi_epi16(psi_r_m3_m5, ONE_OVER_SQRT_2);
- psi_r_m3_m5 = _mm_slli_epi16(psi_r_m3_m5, 1);
- psi_r_m3_m7 = _mm_mulhi_epi16(psi_r_m3_m7, ONE_OVER_SQRT_2);
- psi_r_m3_m7 = _mm_slli_epi16(psi_r_m3_m7, 1);
- psi_r_m5_p7 = _mm_mulhi_epi16(psi_r_m5_p7, ONE_OVER_SQRT_2);
- psi_r_m5_p7 = _mm_slli_epi16(psi_r_m5_p7, 1);
- psi_r_m5_p5 = _mm_mulhi_epi16(psi_r_m5_p5, ONE_OVER_SQRT_2);
- psi_r_m5_p5 = _mm_slli_epi16(psi_r_m5_p5, 1);
- psi_r_m5_p3 = _mm_mulhi_epi16(psi_r_m5_p3, ONE_OVER_SQRT_2);
- psi_r_m5_p3 = _mm_slli_epi16(psi_r_m5_p3, 1);
- psi_r_m5_p1 = _mm_mulhi_epi16(psi_r_m5_p1, ONE_OVER_SQRT_2);
- psi_r_m5_p1 = _mm_slli_epi16(psi_r_m5_p1, 1);
- psi_r_m5_m1 = _mm_mulhi_epi16(psi_r_m5_m1, ONE_OVER_SQRT_2);
- psi_r_m5_m1 = _mm_slli_epi16(psi_r_m5_m1, 1);
- psi_r_m5_m3 = _mm_mulhi_epi16(psi_r_m5_m3, ONE_OVER_SQRT_2);
- psi_r_m5_m3 = _mm_slli_epi16(psi_r_m5_m3, 1);
- psi_r_m5_m5 = _mm_mulhi_epi16(psi_r_m5_m5, ONE_OVER_SQRT_2);
- psi_r_m5_m5 = _mm_slli_epi16(psi_r_m5_m5, 1);
- psi_r_m5_m7 = _mm_mulhi_epi16(psi_r_m5_m7, ONE_OVER_SQRT_2);
- psi_r_m5_m7 = _mm_slli_epi16(psi_r_m5_m7, 1);
- psi_r_m7_p7 = _mm_mulhi_epi16(psi_r_m7_p7, ONE_OVER_SQRT_2);
- psi_r_m7_p7 = _mm_slli_epi16(psi_r_m7_p7, 1);
- psi_r_m7_p5 = _mm_mulhi_epi16(psi_r_m7_p5, ONE_OVER_SQRT_2);
- psi_r_m7_p5 = _mm_slli_epi16(psi_r_m7_p5, 1);
- psi_r_m7_p3 = _mm_mulhi_epi16(psi_r_m7_p3, ONE_OVER_SQRT_2);
- psi_r_m7_p3 = _mm_slli_epi16(psi_r_m7_p3, 1);
- psi_r_m7_p1 = _mm_mulhi_epi16(psi_r_m7_p1, ONE_OVER_SQRT_2);
- psi_r_m7_p1 = _mm_slli_epi16(psi_r_m7_p1, 1);
- psi_r_m7_m1 = _mm_mulhi_epi16(psi_r_m7_m1, ONE_OVER_SQRT_2);
- psi_r_m7_m1 = _mm_slli_epi16(psi_r_m7_m1, 1);
- psi_r_m7_m3 = _mm_mulhi_epi16(psi_r_m7_m3, ONE_OVER_SQRT_2);
- psi_r_m7_m3 = _mm_slli_epi16(psi_r_m7_m3, 1);
- psi_r_m7_m5 = _mm_mulhi_epi16(psi_r_m7_m5, ONE_OVER_SQRT_2);
- psi_r_m7_m5 = _mm_slli_epi16(psi_r_m7_m5, 1);
- psi_r_m7_m7 = _mm_mulhi_epi16(psi_r_m7_m7, ONE_OVER_SQRT_2);
- psi_r_m7_m7 = _mm_slli_epi16(psi_r_m7_m7, 1);
-
- psi_i_p7_p7 = _mm_mulhi_epi16(psi_i_p7_p7, ONE_OVER_SQRT_2);
- psi_i_p7_p7 = _mm_slli_epi16(psi_i_p7_p7, 1);
- psi_i_p7_p5 = _mm_mulhi_epi16(psi_i_p7_p5, ONE_OVER_SQRT_2);
- psi_i_p7_p5 = _mm_slli_epi16(psi_i_p7_p5, 1);
- psi_i_p7_p3 = _mm_mulhi_epi16(psi_i_p7_p3, ONE_OVER_SQRT_2);
- psi_i_p7_p3 = _mm_slli_epi16(psi_i_p7_p3, 1);
- psi_i_p7_p1 = _mm_mulhi_epi16(psi_i_p7_p1, ONE_OVER_SQRT_2);
- psi_i_p7_p1 = _mm_slli_epi16(psi_i_p7_p1, 1);
- psi_i_p7_m1 = _mm_mulhi_epi16(psi_i_p7_m1, ONE_OVER_SQRT_2);
- psi_i_p7_m1 = _mm_slli_epi16(psi_i_p7_m1, 1);
- psi_i_p7_m3 = _mm_mulhi_epi16(psi_i_p7_m3, ONE_OVER_SQRT_2);
- psi_i_p7_m3 = _mm_slli_epi16(psi_i_p7_m3, 1);
- psi_i_p7_m5 = _mm_mulhi_epi16(psi_i_p7_m5, ONE_OVER_SQRT_2);
- psi_i_p7_m5 = _mm_slli_epi16(psi_i_p7_m5, 1);
- psi_i_p7_m7 = _mm_mulhi_epi16(psi_i_p7_m7, ONE_OVER_SQRT_2);
- psi_i_p7_m7 = _mm_slli_epi16(psi_i_p7_m7, 1);
- psi_i_p5_p7 = _mm_mulhi_epi16(psi_i_p5_p7, ONE_OVER_SQRT_2);
- psi_i_p5_p7 = _mm_slli_epi16(psi_i_p5_p7, 1);
- psi_i_p5_p5 = _mm_mulhi_epi16(psi_i_p5_p5, ONE_OVER_SQRT_2);
- psi_i_p5_p5 = _mm_slli_epi16(psi_i_p5_p5, 1);
- psi_i_p5_p3 = _mm_mulhi_epi16(psi_i_p5_p3, ONE_OVER_SQRT_2);
- psi_i_p5_p3 = _mm_slli_epi16(psi_i_p5_p3, 1);
- psi_i_p5_p1 = _mm_mulhi_epi16(psi_i_p5_p1, ONE_OVER_SQRT_2);
- psi_i_p5_p1 = _mm_slli_epi16(psi_i_p5_p1, 1);
- psi_i_p5_m1 = _mm_mulhi_epi16(psi_i_p5_m1, ONE_OVER_SQRT_2);
- psi_i_p5_m1 = _mm_slli_epi16(psi_i_p5_m1, 1);
- psi_i_p5_m3 = _mm_mulhi_epi16(psi_i_p5_m3, ONE_OVER_SQRT_2);
- psi_i_p5_m3 = _mm_slli_epi16(psi_i_p5_m3, 1);
- psi_i_p5_m5 = _mm_mulhi_epi16(psi_i_p5_m5, ONE_OVER_SQRT_2);
- psi_i_p5_m5 = _mm_slli_epi16(psi_i_p5_m5, 1);
- psi_i_p5_m7 = _mm_mulhi_epi16(psi_i_p5_m7, ONE_OVER_SQRT_2);
- psi_i_p5_m7 = _mm_slli_epi16(psi_i_p5_m7, 1);
- psi_i_p3_p7 = _mm_mulhi_epi16(psi_i_p3_p7, ONE_OVER_SQRT_2);
- psi_i_p3_p7 = _mm_slli_epi16(psi_i_p3_p7, 1);
- psi_i_p3_p5 = _mm_mulhi_epi16(psi_i_p3_p5, ONE_OVER_SQRT_2);
- psi_i_p3_p5 = _mm_slli_epi16(psi_i_p3_p5, 1);
- psi_i_p3_p3 = _mm_mulhi_epi16(psi_i_p3_p3, ONE_OVER_SQRT_2);
- psi_i_p3_p3 = _mm_slli_epi16(psi_i_p3_p3, 1);
- psi_i_p3_p1 = _mm_mulhi_epi16(psi_i_p3_p1, ONE_OVER_SQRT_2);
- psi_i_p3_p1 = _mm_slli_epi16(psi_i_p3_p1, 1);
- psi_i_p3_m1 = _mm_mulhi_epi16(psi_i_p3_m1, ONE_OVER_SQRT_2);
- psi_i_p3_m1 = _mm_slli_epi16(psi_i_p3_m1, 1);
- psi_i_p3_m3 = _mm_mulhi_epi16(psi_i_p3_m3, ONE_OVER_SQRT_2);
- psi_i_p3_m3 = _mm_slli_epi16(psi_i_p3_m3, 1);
- psi_i_p3_m5 = _mm_mulhi_epi16(psi_i_p3_m5, ONE_OVER_SQRT_2);
- psi_i_p3_m5 = _mm_slli_epi16(psi_i_p3_m5, 1);
- psi_i_p3_m7 = _mm_mulhi_epi16(psi_i_p3_m7, ONE_OVER_SQRT_2);
- psi_i_p3_m7 = _mm_slli_epi16(psi_i_p3_m7, 1);
- psi_i_p1_p7 = _mm_mulhi_epi16(psi_i_p1_p7, ONE_OVER_SQRT_2);
- psi_i_p1_p7 = _mm_slli_epi16(psi_i_p1_p7, 1);
- psi_i_p1_p5 = _mm_mulhi_epi16(psi_i_p1_p5, ONE_OVER_SQRT_2);
- psi_i_p1_p5 = _mm_slli_epi16(psi_i_p1_p5, 1);
- psi_i_p1_p3 = _mm_mulhi_epi16(psi_i_p1_p3, ONE_OVER_SQRT_2);
- psi_i_p1_p3 = _mm_slli_epi16(psi_i_p1_p3, 1);
- psi_i_p1_p1 = _mm_mulhi_epi16(psi_i_p1_p1, ONE_OVER_SQRT_2);
- psi_i_p1_p1 = _mm_slli_epi16(psi_i_p1_p1, 1);
- psi_i_p1_m1 = _mm_mulhi_epi16(psi_i_p1_m1, ONE_OVER_SQRT_2);
- psi_i_p1_m1 = _mm_slli_epi16(psi_i_p1_m1, 1);
- psi_i_p1_m3 = _mm_mulhi_epi16(psi_i_p1_m3, ONE_OVER_SQRT_2);
- psi_i_p1_m3 = _mm_slli_epi16(psi_i_p1_m3, 1);
- psi_i_p1_m5 = _mm_mulhi_epi16(psi_i_p1_m5, ONE_OVER_SQRT_2);
- psi_i_p1_m5 = _mm_slli_epi16(psi_i_p1_m5, 1);
- psi_i_p1_m7 = _mm_mulhi_epi16(psi_i_p1_m7, ONE_OVER_SQRT_2);
- psi_i_p1_m7 = _mm_slli_epi16(psi_i_p1_m7, 1);
- psi_i_m1_p7 = _mm_mulhi_epi16(psi_i_m1_p7, ONE_OVER_SQRT_2);
- psi_i_m1_p7 = _mm_slli_epi16(psi_i_m1_p7, 1);
- psi_i_m1_p5 = _mm_mulhi_epi16(psi_i_m1_p5, ONE_OVER_SQRT_2);
- psi_i_m1_p5 = _mm_slli_epi16(psi_i_m1_p5, 1);
- psi_i_m1_p3 = _mm_mulhi_epi16(psi_i_m1_p3, ONE_OVER_SQRT_2);
- psi_i_m1_p3 = _mm_slli_epi16(psi_i_m1_p3, 1);
- psi_i_m1_p1 = _mm_mulhi_epi16(psi_i_m1_p1, ONE_OVER_SQRT_2);
- psi_i_m1_p1 = _mm_slli_epi16(psi_i_m1_p1, 1);
- psi_i_m1_m1 = _mm_mulhi_epi16(psi_i_m1_m1, ONE_OVER_SQRT_2);
- psi_i_m1_m1 = _mm_slli_epi16(psi_i_m1_m1, 1);
- psi_i_m1_m3 = _mm_mulhi_epi16(psi_i_m1_m3, ONE_OVER_SQRT_2);
- psi_i_m1_m3 = _mm_slli_epi16(psi_i_m1_m3, 1);
- psi_i_m1_m5 = _mm_mulhi_epi16(psi_i_m1_m5, ONE_OVER_SQRT_2);
- psi_i_m1_m5 = _mm_slli_epi16(psi_i_m1_m5, 1);
- psi_i_m1_m7 = _mm_mulhi_epi16(psi_i_m1_m7, ONE_OVER_SQRT_2);
- psi_i_m1_m7 = _mm_slli_epi16(psi_i_m1_m7, 1);
- psi_i_m3_p7 = _mm_mulhi_epi16(psi_i_m3_p7, ONE_OVER_SQRT_2);
- psi_i_m3_p7 = _mm_slli_epi16(psi_i_m3_p7, 1);
- psi_i_m3_p5 = _mm_mulhi_epi16(psi_i_m3_p5, ONE_OVER_SQRT_2);
- psi_i_m3_p5 = _mm_slli_epi16(psi_i_m3_p5, 1);
- psi_i_m3_p3 = _mm_mulhi_epi16(psi_i_m3_p3, ONE_OVER_SQRT_2);
- psi_i_m3_p3 = _mm_slli_epi16(psi_i_m3_p3, 1);
- psi_i_m3_p1 = _mm_mulhi_epi16(psi_i_m3_p1, ONE_OVER_SQRT_2);
- psi_i_m3_p1 = _mm_slli_epi16(psi_i_m3_p1, 1);
- psi_i_m3_m1 = _mm_mulhi_epi16(psi_i_m3_m1, ONE_OVER_SQRT_2);
- psi_i_m3_m1 = _mm_slli_epi16(psi_i_m3_m1, 1);
- psi_i_m3_m3 = _mm_mulhi_epi16(psi_i_m3_m3, ONE_OVER_SQRT_2);
- psi_i_m3_m3 = _mm_slli_epi16(psi_i_m3_m3, 1);
- psi_i_m3_m5 = _mm_mulhi_epi16(psi_i_m3_m5, ONE_OVER_SQRT_2);
- psi_i_m3_m5 = _mm_slli_epi16(psi_i_m3_m5, 1);
- psi_i_m3_m7 = _mm_mulhi_epi16(psi_i_m3_m7, ONE_OVER_SQRT_2);
- psi_i_m3_m7 = _mm_slli_epi16(psi_i_m3_m7, 1);
- psi_i_m5_p7 = _mm_mulhi_epi16(psi_i_m5_p7, ONE_OVER_SQRT_2);
- psi_i_m5_p7 = _mm_slli_epi16(psi_i_m5_p7, 1);
- psi_i_m5_p5 = _mm_mulhi_epi16(psi_i_m5_p5, ONE_OVER_SQRT_2);
- psi_i_m5_p5 = _mm_slli_epi16(psi_i_m5_p5, 1);
- psi_i_m5_p3 = _mm_mulhi_epi16(psi_i_m5_p3, ONE_OVER_SQRT_2);
- psi_i_m5_p3 = _mm_slli_epi16(psi_i_m5_p3, 1);
- psi_i_m5_p1 = _mm_mulhi_epi16(psi_i_m5_p1, ONE_OVER_SQRT_2);
- psi_i_m5_p1 = _mm_slli_epi16(psi_i_m5_p1, 1);
- psi_i_m5_m1 = _mm_mulhi_epi16(psi_i_m5_m1, ONE_OVER_SQRT_2);
- psi_i_m5_m1 = _mm_slli_epi16(psi_i_m5_m1, 1);
- psi_i_m5_m3 = _mm_mulhi_epi16(psi_i_m5_m3, ONE_OVER_SQRT_2);
- psi_i_m5_m3 = _mm_slli_epi16(psi_i_m5_m3, 1);
- psi_i_m5_m5 = _mm_mulhi_epi16(psi_i_m5_m5, ONE_OVER_SQRT_2);
- psi_i_m5_m5 = _mm_slli_epi16(psi_i_m5_m5, 1);
- psi_i_m5_m7 = _mm_mulhi_epi16(psi_i_m5_m7, ONE_OVER_SQRT_2);
- psi_i_m5_m7 = _mm_slli_epi16(psi_i_m5_m7, 1);
- psi_i_m7_p7 = _mm_mulhi_epi16(psi_i_m7_p7, ONE_OVER_SQRT_2);
- psi_i_m7_p7 = _mm_slli_epi16(psi_i_m7_p7, 1);
- psi_i_m7_p5 = _mm_mulhi_epi16(psi_i_m7_p5, ONE_OVER_SQRT_2);
- psi_i_m7_p5 = _mm_slli_epi16(psi_i_m7_p5, 1);
- psi_i_m7_p3 = _mm_mulhi_epi16(psi_i_m7_p3, ONE_OVER_SQRT_2);
- psi_i_m7_p3 = _mm_slli_epi16(psi_i_m7_p3, 1);
- psi_i_m7_p1 = _mm_mulhi_epi16(psi_i_m7_p1, ONE_OVER_SQRT_2);
- psi_i_m7_p1 = _mm_slli_epi16(psi_i_m7_p1, 1);
- psi_i_m7_m1 = _mm_mulhi_epi16(psi_i_m7_m1, ONE_OVER_SQRT_2);
- psi_i_m7_m1 = _mm_slli_epi16(psi_i_m7_m1, 1);
- psi_i_m7_m3 = _mm_mulhi_epi16(psi_i_m7_m3, ONE_OVER_SQRT_2);
- psi_i_m7_m3 = _mm_slli_epi16(psi_i_m7_m3, 1);
- psi_i_m7_m5 = _mm_mulhi_epi16(psi_i_m7_m5, ONE_OVER_SQRT_2);
- psi_i_m7_m5 = _mm_slli_epi16(psi_i_m7_m5, 1);
- psi_i_m7_m7 = _mm_mulhi_epi16(psi_i_m7_m7, ONE_OVER_SQRT_2);
- psi_i_m7_m7 = _mm_slli_epi16(psi_i_m7_m7, 1);
-
- psi_a_p7_p7 = _mm_adds_epi16(psi_r_p7_p7, psi_i_p7_p7);
- psi_a_p7_p5 = _mm_adds_epi16(psi_r_p7_p5, psi_i_p7_p5);
- psi_a_p7_p3 = _mm_adds_epi16(psi_r_p7_p3, psi_i_p7_p3);
- psi_a_p7_p1 = _mm_adds_epi16(psi_r_p7_p1, psi_i_p7_p1);
- psi_a_p7_m1 = _mm_adds_epi16(psi_r_p7_m1, psi_i_p7_m1);
- psi_a_p7_m3 = _mm_adds_epi16(psi_r_p7_m3, psi_i_p7_m3);
- psi_a_p7_m5 = _mm_adds_epi16(psi_r_p7_m5, psi_i_p7_m5);
- psi_a_p7_m7 = _mm_adds_epi16(psi_r_p7_m7, psi_i_p7_m7);
- psi_a_p5_p7 = _mm_adds_epi16(psi_r_p5_p7, psi_i_p5_p7);
- psi_a_p5_p5 = _mm_adds_epi16(psi_r_p5_p5, psi_i_p5_p5);
- psi_a_p5_p3 = _mm_adds_epi16(psi_r_p5_p3, psi_i_p5_p3);
- psi_a_p5_p1 = _mm_adds_epi16(psi_r_p5_p1, psi_i_p5_p1);
- psi_a_p5_m1 = _mm_adds_epi16(psi_r_p5_m1, psi_i_p5_m1);
- psi_a_p5_m3 = _mm_adds_epi16(psi_r_p5_m3, psi_i_p5_m3);
- psi_a_p5_m5 = _mm_adds_epi16(psi_r_p5_m5, psi_i_p5_m5);
- psi_a_p5_m7 = _mm_adds_epi16(psi_r_p5_m7, psi_i_p5_m7);
- psi_a_p3_p7 = _mm_adds_epi16(psi_r_p3_p7, psi_i_p3_p7);
- psi_a_p3_p5 = _mm_adds_epi16(psi_r_p3_p5, psi_i_p3_p5);
- psi_a_p3_p3 = _mm_adds_epi16(psi_r_p3_p3, psi_i_p3_p3);
- psi_a_p3_p1 = _mm_adds_epi16(psi_r_p3_p1, psi_i_p3_p1);
- psi_a_p3_m1 = _mm_adds_epi16(psi_r_p3_m1, psi_i_p3_m1);
- psi_a_p3_m3 = _mm_adds_epi16(psi_r_p3_m3, psi_i_p3_m3);
- psi_a_p3_m5 = _mm_adds_epi16(psi_r_p3_m5, psi_i_p3_m5);
- psi_a_p3_m7 = _mm_adds_epi16(psi_r_p3_m7, psi_i_p3_m7);
- psi_a_p1_p7 = _mm_adds_epi16(psi_r_p1_p7, psi_i_p1_p7);
- psi_a_p1_p5 = _mm_adds_epi16(psi_r_p1_p5, psi_i_p1_p5);
- psi_a_p1_p3 = _mm_adds_epi16(psi_r_p1_p3, psi_i_p1_p3);
- psi_a_p1_p1 = _mm_adds_epi16(psi_r_p1_p1, psi_i_p1_p1);
- psi_a_p1_m1 = _mm_adds_epi16(psi_r_p1_m1, psi_i_p1_m1);
- psi_a_p1_m3 = _mm_adds_epi16(psi_r_p1_m3, psi_i_p1_m3);
- psi_a_p1_m5 = _mm_adds_epi16(psi_r_p1_m5, psi_i_p1_m5);
- psi_a_p1_m7 = _mm_adds_epi16(psi_r_p1_m7, psi_i_p1_m7);
- psi_a_m1_p7 = _mm_adds_epi16(psi_r_m1_p7, psi_i_m1_p7);
- psi_a_m1_p5 = _mm_adds_epi16(psi_r_m1_p5, psi_i_m1_p5);
- psi_a_m1_p3 = _mm_adds_epi16(psi_r_m1_p3, psi_i_m1_p3);
- psi_a_m1_p1 = _mm_adds_epi16(psi_r_m1_p1, psi_i_m1_p1);
- psi_a_m1_m1 = _mm_adds_epi16(psi_r_m1_m1, psi_i_m1_m1);
- psi_a_m1_m3 = _mm_adds_epi16(psi_r_m1_m3, psi_i_m1_m3);
- psi_a_m1_m5 = _mm_adds_epi16(psi_r_m1_m5, psi_i_m1_m5);
- psi_a_m1_m7 = _mm_adds_epi16(psi_r_m1_m7, psi_i_m1_m7);
- psi_a_m3_p7 = _mm_adds_epi16(psi_r_m3_p7, psi_i_m3_p7);
- psi_a_m3_p5 = _mm_adds_epi16(psi_r_m3_p5, psi_i_m3_p5);
- psi_a_m3_p3 = _mm_adds_epi16(psi_r_m3_p3, psi_i_m3_p3);
- psi_a_m3_p1 = _mm_adds_epi16(psi_r_m3_p1, psi_i_m3_p1);
- psi_a_m3_m1 = _mm_adds_epi16(psi_r_m3_m1, psi_i_m3_m1);
- psi_a_m3_m3 = _mm_adds_epi16(psi_r_m3_m3, psi_i_m3_m3);
- psi_a_m3_m5 = _mm_adds_epi16(psi_r_m3_m5, psi_i_m3_m5);
- psi_a_m3_m7 = _mm_adds_epi16(psi_r_m3_m7, psi_i_m3_m7);
- psi_a_m5_p7 = _mm_adds_epi16(psi_r_m5_p7, psi_i_m5_p7);
- psi_a_m5_p5 = _mm_adds_epi16(psi_r_m5_p5, psi_i_m5_p5);
- psi_a_m5_p3 = _mm_adds_epi16(psi_r_m5_p3, psi_i_m5_p3);
- psi_a_m5_p1 = _mm_adds_epi16(psi_r_m5_p1, psi_i_m5_p1);
- psi_a_m5_m1 = _mm_adds_epi16(psi_r_m5_m1, psi_i_m5_m1);
- psi_a_m5_m3 = _mm_adds_epi16(psi_r_m5_m3, psi_i_m5_m3);
- psi_a_m5_m5 = _mm_adds_epi16(psi_r_m5_m5, psi_i_m5_m5);
- psi_a_m5_m7 = _mm_adds_epi16(psi_r_m5_m7, psi_i_m5_m7);
- psi_a_m7_p7 = _mm_adds_epi16(psi_r_m7_p7, psi_i_m7_p7);
- psi_a_m7_p5 = _mm_adds_epi16(psi_r_m7_p5, psi_i_m7_p5);
- psi_a_m7_p3 = _mm_adds_epi16(psi_r_m7_p3, psi_i_m7_p3);
- psi_a_m7_p1 = _mm_adds_epi16(psi_r_m7_p1, psi_i_m7_p1);
- psi_a_m7_m1 = _mm_adds_epi16(psi_r_m7_m1, psi_i_m7_m1);
- psi_a_m7_m3 = _mm_adds_epi16(psi_r_m7_m3, psi_i_m7_m3);
- psi_a_m7_m5 = _mm_adds_epi16(psi_r_m7_m5, psi_i_m7_m5);
- psi_a_m7_m7 = _mm_adds_epi16(psi_r_m7_m7, psi_i_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm1 = _mm_adds_epi16(psi_a_p7_p7, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p5, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p3, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_p1, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m1, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m3, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m5, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p7_m7, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p7, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p5, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p3, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_p1, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m1, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m3, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m5, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p5_m7, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p7, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p5, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p3, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_p1, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m1, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m3, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m5, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p3_m7, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p7, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p5, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p3, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_p1, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m1, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m3, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m5, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_adds_epi16(psi_a_p1_m7, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm1 = _mm_subs_epi16(psi_a_m1_p7, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p5, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p3, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_p1, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m1, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m3, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m5, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m1_m7, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p7, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p5, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p3, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_p1, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m1, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m3, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m5, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m3_m7, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p7, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p5, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p3, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_p1, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m1, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m3, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m5, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m5_m7, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p7, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p5, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p3, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_p1, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m1, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m3, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m5, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm1 = _mm_subs_epi16(psi_a_m7_m7, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-
-
-int nr_dlsch_64qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- //first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- nr_qam64_qpsk((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (6*len);
- *llr16p = (short *)llr16;
- return(0);
-}
-
-
-
-void nr_qam64_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
-
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(5/sqrt(42)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_SQRT_10_Q15 = _mm_set1_epi16(10362); // round(1/sqrt(10)*2^15)
- __m128i THREE_OVER_SQRT_10 = _mm_set1_epi16(31086); // round(3/sqrt(10)*2^15)
- __m128i SQRT_10_OVER_FOUR = _mm_set1_epi16(25905); // round(sqrt(10)/4*2^15)
-
-
- __m128i ch_mag_int;
- __m128i ch_mag_des;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __m128i y0i_seven_over_sqrt_21;
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- int i,j;
-
-
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64__) || defined(__i386__)
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- interference_abs_epi16(psi_r_p7_p7, ch_mag_int, a_r_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p5, ch_mag_int, a_r_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p3, ch_mag_int, a_r_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_p1, ch_mag_int, a_r_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m1, ch_mag_int, a_r_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m3, ch_mag_int, a_r_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m5, ch_mag_int, a_r_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p7_m7, ch_mag_int, a_r_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p7, ch_mag_int, a_r_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p5, ch_mag_int, a_r_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p3, ch_mag_int, a_r_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_p1, ch_mag_int, a_r_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m1, ch_mag_int, a_r_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m3, ch_mag_int, a_r_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m5, ch_mag_int, a_r_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p5_m7, ch_mag_int, a_r_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p7, ch_mag_int, a_r_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p5, ch_mag_int, a_r_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p3, ch_mag_int, a_r_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_p1, ch_mag_int, a_r_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m1, ch_mag_int, a_r_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m3, ch_mag_int, a_r_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m5, ch_mag_int, a_r_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p3_m7, ch_mag_int, a_r_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p7, ch_mag_int, a_r_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p5, ch_mag_int, a_r_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p3, ch_mag_int, a_r_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_p1, ch_mag_int, a_r_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m1, ch_mag_int, a_r_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m3, ch_mag_int, a_r_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m5, ch_mag_int, a_r_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_p1_m7, ch_mag_int, a_r_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p7, ch_mag_int, a_r_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p5, ch_mag_int, a_r_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p3, ch_mag_int, a_r_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_p1, ch_mag_int, a_r_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m1, ch_mag_int, a_r_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m3, ch_mag_int, a_r_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m5, ch_mag_int, a_r_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m1_m7, ch_mag_int, a_r_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p7, ch_mag_int, a_r_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p5, ch_mag_int, a_r_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p3, ch_mag_int, a_r_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_p1, ch_mag_int, a_r_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m1, ch_mag_int, a_r_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m3, ch_mag_int, a_r_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m5, ch_mag_int, a_r_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m3_m7, ch_mag_int, a_r_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p7, ch_mag_int, a_r_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p5, ch_mag_int, a_r_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p3, ch_mag_int, a_r_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_p1, ch_mag_int, a_r_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m1, ch_mag_int, a_r_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m3, ch_mag_int, a_r_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m5, ch_mag_int, a_r_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m5_m7, ch_mag_int, a_r_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p7, ch_mag_int, a_r_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p5, ch_mag_int, a_r_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p3, ch_mag_int, a_r_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_p1, ch_mag_int, a_r_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m1, ch_mag_int, a_r_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m3, ch_mag_int, a_r_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m5, ch_mag_int, a_r_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_r_m7_m7, ch_mag_int, a_r_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- interference_abs_epi16(psi_i_p7_p7, ch_mag_int, a_i_p7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p5, ch_mag_int, a_i_p7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p3, ch_mag_int, a_i_p7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_p1, ch_mag_int, a_i_p7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m1, ch_mag_int, a_i_p7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m3, ch_mag_int, a_i_p7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m5, ch_mag_int, a_i_p7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p7_m7, ch_mag_int, a_i_p7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p7, ch_mag_int, a_i_p5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p5, ch_mag_int, a_i_p5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p3, ch_mag_int, a_i_p5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_p1, ch_mag_int, a_i_p5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m1, ch_mag_int, a_i_p5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m3, ch_mag_int, a_i_p5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m5, ch_mag_int, a_i_p5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p5_m7, ch_mag_int, a_i_p5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p7, ch_mag_int, a_i_p3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p5, ch_mag_int, a_i_p3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p3, ch_mag_int, a_i_p3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_p1, ch_mag_int, a_i_p3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m1, ch_mag_int, a_i_p3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m3, ch_mag_int, a_i_p3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m5, ch_mag_int, a_i_p3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p3_m7, ch_mag_int, a_i_p3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p7, ch_mag_int, a_i_p1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p5, ch_mag_int, a_i_p1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p3, ch_mag_int, a_i_p1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_p1, ch_mag_int, a_i_p1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m1, ch_mag_int, a_i_p1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m3, ch_mag_int, a_i_p1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m5, ch_mag_int, a_i_p1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_p1_m7, ch_mag_int, a_i_p1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p7, ch_mag_int, a_i_m1_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p5, ch_mag_int, a_i_m1_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p3, ch_mag_int, a_i_m1_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_p1, ch_mag_int, a_i_m1_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m1, ch_mag_int, a_i_m1_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m3, ch_mag_int, a_i_m1_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m5, ch_mag_int, a_i_m1_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m1_m7, ch_mag_int, a_i_m1_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p7, ch_mag_int, a_i_m3_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p5, ch_mag_int, a_i_m3_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p3, ch_mag_int, a_i_m3_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_p1, ch_mag_int, a_i_m3_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m1, ch_mag_int, a_i_m3_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m3, ch_mag_int, a_i_m3_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m5, ch_mag_int, a_i_m3_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m3_m7, ch_mag_int, a_i_m3_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p7, ch_mag_int, a_i_m5_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p5, ch_mag_int, a_i_m5_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p3, ch_mag_int, a_i_m5_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_p1, ch_mag_int, a_i_m5_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m1, ch_mag_int, a_i_m5_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m3, ch_mag_int, a_i_m5_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m5, ch_mag_int, a_i_m5_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m5_m7, ch_mag_int, a_i_m5_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p7, ch_mag_int, a_i_m7_p7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p5, ch_mag_int, a_i_m7_p5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p3, ch_mag_int, a_i_m7_p3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_p1, ch_mag_int, a_i_m7_p1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m1, ch_mag_int, a_i_m7_m1, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m3, ch_mag_int, a_i_m7_m3, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m5, ch_mag_int, a_i_m7_m5, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
- interference_abs_epi16(psi_i_m7_m7, ch_mag_int, a_i_m7_m7, ONE_OVER_SQRT_10_Q15, THREE_OVER_SQRT_10);
-
- // Calculation of a group of two terms in the bit metric involving product of psi and interference
- prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7);
- prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5);
- prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3);
- prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1);
- prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1);
- prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3);
- prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5);
- prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7);
- prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7);
- prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5);
- prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3);
- prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1);
- prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1);
- prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3);
- prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5);
- prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7);
- prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7);
- prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5);
- prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5);
- prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7);
- prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7);
- prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5);
- prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5);
- prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7);
- prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7);
- prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5);
- prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5);
- prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7);
- prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7);
- prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5);
- prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3);
- prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5);
- prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7);
- prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7);
- prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5);
- prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3);
- prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1);
- prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1);
- prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3);
- prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5);
- prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7);
- prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7);
- prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5);
- prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3);
- prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1);
- prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1);
- prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3);
- prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5);
- prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7);
-
- // Calculation of a group of two terms in the bit metric involving squares of interference
- square_a_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p7);
- square_a_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p5);
- square_a_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p3);
- square_a_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_p1);
- square_a_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m1);
- square_a_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m3);
- square_a_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m5);
- square_a_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p7_m7);
- square_a_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p7);
- square_a_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p5);
- square_a_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p3);
- square_a_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_p1);
- square_a_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m1);
- square_a_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m3);
- square_a_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m5);
- square_a_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p5_m7);
- square_a_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p7);
- square_a_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p5);
- square_a_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p3);
- square_a_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_p1);
- square_a_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m1);
- square_a_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m3);
- square_a_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m5);
- square_a_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p3_m7);
- square_a_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p7);
- square_a_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p5);
- square_a_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p3);
- square_a_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_p1);
- square_a_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m1);
- square_a_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m3);
- square_a_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m5);
- square_a_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_p1_m7);
- square_a_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p7);
- square_a_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p5);
- square_a_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p3);
- square_a_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_p1);
- square_a_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m1);
- square_a_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m3);
- square_a_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m5);
- square_a_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m1_m7);
- square_a_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p7);
- square_a_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p5);
- square_a_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p3);
- square_a_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_p1);
- square_a_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m1);
- square_a_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m3);
- square_a_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m5);
- square_a_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m3_m7);
- square_a_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p7);
- square_a_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p5);
- square_a_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p3);
- square_a_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_p1);
- square_a_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m1);
- square_a_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m3);
- square_a_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m5);
- square_a_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m5_m7);
- square_a_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p7);
- square_a_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p5);
- square_a_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p3);
- square_a_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_p1);
- square_a_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m1);
- square_a_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m3);
- square_a_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m5);
- square_a_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_10_OVER_FOUR, a_sq_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-
-}
-
-
-int nr_dlsch_64qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **dl_ch_mag_i,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- int16_t **llr16p)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*frame_parms->N_RB_DL*12)];
- int16_t *llr16;
- int len;
- uint8_t symbol_mod = (symbol >= (7-frame_parms->Ncp))? (symbol-(7-frame_parms->Ncp)) : symbol;
-
- //first symbol has different structure due to more pilots
- if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
- if ((symbol_mod==0) || (symbol_mod==(4-frame_parms->Ncp))) {
- // if symbol has pilots
- if (frame_parms->nb_antenna_ports_gNB!=1)
- // in 2 antenna ports we have 8 REs per symbol per RB
- len = (nb_rb*8) - (2*pbch_pss_sss_adjust/3);
- else
- // for 1 antenna port we have 10 REs per symbol per RB
- len = (nb_rb*10) - (5*pbch_pss_sss_adjust/6);
- } else {
- // symbol has no pilots
- len = (nb_rb*12) - pbch_pss_sss_adjust;
- }
-
- nr_qam64_qam16((short *)rxF,
- (short *)rxF_i,
- (short *)ch_mag,
- (short *)ch_mag_i,
- (short *)llr16,
- (short *)rho,
- len);
-
- llr16 += (6*len);
- *llr16p = (short *)llr16;
- return(0);
-}
-
-#if 0
-void qam64_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length
- )
-{
-
- /*
- Author: S. Wagner
- Date: 31-07-12
-
- Input:
- stream0_in: MF filter for 1st stream, i.e., y0=h0'*y
- stream1_in: MF filter for 2nd stream, i.e., y1=h1'*y
- ch_mag: 4*h0/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- ch_mag_i: 4*h1/sqrt(42), [Re0 Im0 Re1 Im1] s.t. Im0=Re0, Im1=Re1, etc
- rho01: Channel cross correlation, i.e., h1'*h0
-
- Output:
- stream0_out: output LLRs for 1st stream
- */
-
-#if defined(__x86_64__) || defined(__i386__)
-
- __m128i *rho01_128i = (__m128i *)rho01;
- __m128i *stream0_128i_in = (__m128i *)stream0_in;
- __m128i *stream1_128i_in = (__m128i *)stream1_in;
- __m128i *ch_mag_128i = (__m128i *)ch_mag;
- __m128i *ch_mag_128i_i = (__m128i *)ch_mag_i;
-
- __m128i ONE_OVER_SQRT_42 = _mm_set1_epi16(10112); // round(1/sqrt(42)*2^16)
- __m128i THREE_OVER_SQRT_42 = _mm_set1_epi16(30337); // round(3/sqrt(42)*2^16)
- __m128i FIVE_OVER_SQRT_42 = _mm_set1_epi16(25281); // round(5/sqrt(42)*2^15)
- __m128i SEVEN_OVER_SQRT_42 = _mm_set1_epi16(17697); // round(7/sqrt(42)*2^14) Q2.14
- __m128i ONE_OVER_SQRT_2 = _mm_set1_epi16(23170); // round(1/sqrt(2)*2^15)
- __m128i ONE_OVER_SQRT_2_42 = _mm_set1_epi16(3575); // round(1/sqrt(2*42)*2^15)
- __m128i THREE_OVER_SQRT_2_42 = _mm_set1_epi16(10726); // round(3/sqrt(2*42)*2^15)
- __m128i FIVE_OVER_SQRT_2_42 = _mm_set1_epi16(17876); // round(5/sqrt(2*42)*2^15)
- __m128i SEVEN_OVER_SQRT_2_42 = _mm_set1_epi16(25027); // round(7/sqrt(2*42)*2^15)
- __m128i FORTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(30969); // round(49/(4*sqrt(42))*2^14), Q2.14
- __m128i THIRTYSEVEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(23385); // round(37/(4*sqrt(42))*2^14), Q2.14
- __m128i TWENTYFIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(31601); // round(25/(4*sqrt(42))*2^15)
- __m128i TWENTYNINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(18329); // round(29/(4*sqrt(42))*2^15), Q2.14
- __m128i SEVENTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(21489); // round(17/(4*sqrt(42))*2^15)
- __m128i NINE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(11376); // round(9/(4*sqrt(42))*2^15)
- __m128i THIRTEEN_OVER_FOUR_SQRT_42 = _mm_set1_epi16(16433); // round(13/(4*sqrt(42))*2^15)
- __m128i FIVE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(6320); // round(5/(4*sqrt(42))*2^15)
- __m128i ONE_OVER_FOUR_SQRT_42 = _mm_set1_epi16(1264); // round(1/(4*sqrt(42))*2^15)
- __m128i SQRT_42_OVER_FOUR = _mm_set1_epi16(13272); // round(sqrt(42)/4*2^13), Q3.12
-
- __m128i ch_mag_des;
- __m128i ch_mag_int;
- __m128i ch_mag_98_over_42_with_sigma2;
- __m128i ch_mag_74_over_42_with_sigma2;
- __m128i ch_mag_58_over_42_with_sigma2;
- __m128i ch_mag_50_over_42_with_sigma2;
- __m128i ch_mag_34_over_42_with_sigma2;
- __m128i ch_mag_18_over_42_with_sigma2;
- __m128i ch_mag_26_over_42_with_sigma2;
- __m128i ch_mag_10_over_42_with_sigma2;
- __m128i ch_mag_2_over_42_with_sigma2;
- __m128i y0r_one_over_sqrt_21;
- __m128i y0r_three_over_sqrt_21;
- __m128i y0r_five_over_sqrt_21;
- __m128i y0r_seven_over_sqrt_21;
- __m128i y0i_one_over_sqrt_21;
- __m128i y0i_three_over_sqrt_21;
- __m128i y0i_five_over_sqrt_21;
- __m128i y0i_seven_over_sqrt_21;
- __m128i ch_mag_int_with_sigma2;
- __m128i two_ch_mag_int_with_sigma2;
- __m128i three_ch_mag_int_with_sigma2;
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- int i,j;
-
-
- for (i=0; i>2; i+=2) {
-
-#if defined(__x86_64__) || defined(__i386__)
-
- // Get rho
- xmm0 = rho01_128i[i];
- xmm1 = rho01_128i[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- xmm2 = _mm_unpacklo_epi64(xmm0,xmm1); // Re(rho)
- xmm3 = _mm_unpackhi_epi64(xmm0,xmm1); // Im(rho)
- rho_rpi = _mm_adds_epi16(xmm2,xmm3); // rho = Re(rho) + Im(rho)
- rho_rmi = _mm_subs_epi16(xmm2,xmm3); // rho* = Re(rho) - Im(rho)
-
- // Compute the different rhos
- rho_rpi_1_1 = _mm_mulhi_epi16(rho_rpi, ONE_OVER_SQRT_42);
- rho_rmi_1_1 = _mm_mulhi_epi16(rho_rmi, ONE_OVER_SQRT_42);
- rho_rpi_3_3 = _mm_mulhi_epi16(rho_rpi, THREE_OVER_SQRT_42);
- rho_rmi_3_3 = _mm_mulhi_epi16(rho_rmi, THREE_OVER_SQRT_42);
- rho_rpi_5_5 = _mm_mulhi_epi16(rho_rpi, FIVE_OVER_SQRT_42);
- rho_rmi_5_5 = _mm_mulhi_epi16(rho_rmi, FIVE_OVER_SQRT_42);
- rho_rpi_7_7 = _mm_mulhi_epi16(rho_rpi, SEVEN_OVER_SQRT_42);
- rho_rmi_7_7 = _mm_mulhi_epi16(rho_rmi, SEVEN_OVER_SQRT_42);
-
- rho_rpi_5_5 = _mm_slli_epi16(rho_rpi_5_5, 1);
- rho_rmi_5_5 = _mm_slli_epi16(rho_rmi_5_5, 1);
- rho_rpi_7_7 = _mm_slli_epi16(rho_rpi_7_7, 2);
- rho_rmi_7_7 = _mm_slli_epi16(rho_rmi_7_7, 2);
-
- xmm4 = _mm_mulhi_epi16(xmm2, ONE_OVER_SQRT_42);
- xmm5 = _mm_mulhi_epi16(xmm3, ONE_OVER_SQRT_42);
- xmm6 = _mm_mulhi_epi16(xmm3, THREE_OVER_SQRT_42);
- xmm7 = _mm_mulhi_epi16(xmm3, FIVE_OVER_SQRT_42);
- xmm8 = _mm_mulhi_epi16(xmm3, SEVEN_OVER_SQRT_42);
- xmm7 = _mm_slli_epi16(xmm7, 1);
- xmm8 = _mm_slli_epi16(xmm8, 2);
-
- rho_rpi_1_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_1_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_1_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_1_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_1_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_1_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, THREE_OVER_SQRT_42);
- rho_rpi_3_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_3_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_3_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_3_5 = _mm_subs_epi16(xmm4, xmm7);
- rho_rpi_3_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_3_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, FIVE_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 1);
- rho_rpi_5_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_5_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_5_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_5_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_5_7 = _mm_adds_epi16(xmm4, xmm8);
- rho_rmi_5_7 = _mm_subs_epi16(xmm4, xmm8);
-
- xmm4 = _mm_mulhi_epi16(xmm2, SEVEN_OVER_SQRT_42);
- xmm4 = _mm_slli_epi16(xmm4, 2);
- rho_rpi_7_1 = _mm_adds_epi16(xmm4, xmm5);
- rho_rmi_7_1 = _mm_subs_epi16(xmm4, xmm5);
- rho_rpi_7_3 = _mm_adds_epi16(xmm4, xmm6);
- rho_rmi_7_3 = _mm_subs_epi16(xmm4, xmm6);
- rho_rpi_7_5 = _mm_adds_epi16(xmm4, xmm7);
- rho_rmi_7_5 = _mm_subs_epi16(xmm4, xmm7);
-
- // Rearrange interfering MF output
- xmm0 = stream1_128i_in[i];
- xmm1 = stream1_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y1r = _mm_unpacklo_epi64(xmm0,xmm1); //[y1r(1),y1r(2),y1r(3),y1r(4)]
- y1i = _mm_unpackhi_epi64(xmm0,xmm1); //[y1i(1),y1i(2),y1i(3),y1i(4)]
-
- // Psi_r calculation from rho_rpi or rho_rmi
- xmm0 = _mm_setzero_si128(); // ZERO for abs_pi16
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1r);
- psi_r_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1r);
- psi_r_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1r);
- psi_r_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1r);
- psi_r_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1r);
- psi_r_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1r);
- psi_r_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1r);
- psi_r_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1r);
- psi_r_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1r);
- psi_r_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1r);
- psi_r_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1r);
- psi_r_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1r);
- psi_r_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1r);
- psi_r_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1r);
- psi_r_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1r);
- psi_r_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1r);
- psi_r_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1r);
- psi_r_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1r);
- psi_r_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1r);
- psi_r_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1r);
- psi_r_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1r);
- psi_r_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1r);
- psi_r_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1r);
- psi_r_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1r);
- psi_r_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1r);
- psi_r_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1r);
- psi_r_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1r);
- psi_r_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1r);
- psi_r_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1r);
- psi_r_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1r);
- psi_r_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1r);
- psi_r_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1r);
- psi_r_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1r);
- psi_r_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1r);
- psi_r_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1r);
- psi_r_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1r);
- psi_r_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1r);
- psi_r_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1r);
- psi_r_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1r);
- psi_r_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1r);
- psi_r_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1r);
- psi_r_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1r);
- psi_r_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1r);
- psi_r_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1r);
- psi_r_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1r);
- psi_r_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1r);
- psi_r_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1r);
- psi_r_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1r);
- psi_r_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1r);
- psi_r_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1r);
- psi_r_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1r);
- psi_r_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1r);
- psi_r_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1r);
- psi_r_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1r);
- psi_r_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1r);
- psi_r_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1r);
- psi_r_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1r);
- psi_r_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1r);
- psi_r_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1r);
- psi_r_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1r);
- psi_r_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1r);
- psi_r_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1r);
- psi_r_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1r);
- psi_r_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1r);
- psi_r_m7_m7 = _mm_abs_epi16(xmm2);
-
- // Psi_i calculation from rho_rpi or rho_rmi
- xmm2 = _mm_subs_epi16(rho_rmi_7_7, y1i);
- psi_i_p7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_7, y1i);
- psi_i_p7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_7, y1i);
- psi_i_p7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_7, y1i);
- psi_i_p7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_7, y1i);
- psi_i_p7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_7, y1i);
- psi_i_p7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_7, y1i);
- psi_i_p7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_7, y1i);
- psi_i_p7_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_5, y1i);
- psi_i_p5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_5, y1i);
- psi_i_p5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_5, y1i);
- psi_i_p5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_5, y1i);
- psi_i_p5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_5, y1i);
- psi_i_p5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_5, y1i);
- psi_i_p5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_5, y1i);
- psi_i_p5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_5, y1i);
- psi_i_p5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_3, y1i);
- psi_i_p3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_3, y1i);
- psi_i_p3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_3, y1i);
- psi_i_p3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_3, y1i);
- psi_i_p3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_3, y1i);
- psi_i_p3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_3, y1i);
- psi_i_p3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_3, y1i);
- psi_i_p3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_3, y1i);
- psi_i_p3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_7_1, y1i);
- psi_i_p1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_5_1, y1i);
- psi_i_p1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_3_1, y1i);
- psi_i_p1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rmi_1_1, y1i);
- psi_i_p1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_1_1, y1i);
- psi_i_p1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_3_1, y1i);
- psi_i_p1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_5_1, y1i);
- psi_i_p1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rpi_7_1, y1i);
- psi_i_p1_m7 = _mm_abs_epi16(xmm2);
-
- xmm2 = _mm_subs_epi16(rho_rpi_7_1, y1i);
- psi_i_m1_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_1, y1i);
- psi_i_m1_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_1, y1i);
- psi_i_m1_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_1, y1i);
- psi_i_m1_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_1, y1i);
- psi_i_m1_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_1, y1i);
- psi_i_m1_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_1, y1i);
- psi_i_m1_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_1, y1i);
- psi_i_m1_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_3, y1i);
- psi_i_m3_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_3, y1i);
- psi_i_m3_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_3, y1i);
- psi_i_m3_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_3, y1i);
- psi_i_m3_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_3, y1i);
- psi_i_m3_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_3, y1i);
- psi_i_m3_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_3, y1i);
- psi_i_m3_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_3, y1i);
- psi_i_m3_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_5, y1i);
- psi_i_m5_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_5, y1i);
- psi_i_m5_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_5, y1i);
- psi_i_m5_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_5, y1i);
- psi_i_m5_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_5, y1i);
- psi_i_m5_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_5, y1i);
- psi_i_m5_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_5, y1i);
- psi_i_m5_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_5, y1i);
- psi_i_m5_m7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_7_7, y1i);
- psi_i_m7_p7 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_5_7, y1i);
- psi_i_m7_p5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_3_7, y1i);
- psi_i_m7_p3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_subs_epi16(rho_rpi_1_7, y1i);
- psi_i_m7_p1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_1_7, y1i);
- psi_i_m7_m1 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_3_7, y1i);
- psi_i_m7_m3 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_5_7, y1i);
- psi_i_m7_m5 = _mm_abs_epi16(xmm2);
- xmm2 = _mm_adds_epi16(rho_rmi_7_7, y1i);
- psi_i_m7_m7 = _mm_abs_epi16(xmm2);
-
-
- // Rearrange desired MF output
- xmm0 = stream0_128i_in[i];
- xmm1 = stream0_128i_in[i+1];
- xmm0 = _mm_shufflelo_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shufflehi_epi16(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm0 = _mm_shuffle_epi32(xmm0,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflelo_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shufflehi_epi16(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm1 = _mm_shuffle_epi32(xmm1,0xd8); //_MM_SHUFFLE(0,2,1,3));
- //xmm0 = [Re(0,1) Re(2,3) Im(0,1) Im(2,3)]
- //xmm1 = [Re(4,5) Re(6,7) Im(4,5) Im(6,7)]
- y0r = _mm_unpacklo_epi64(xmm0,xmm1); // = [y0r(1),y0r(2),y0r(3),y0r(4)]
- y0i = _mm_unpackhi_epi64(xmm0,xmm1);
-
- // Rearrange desired channel magnitudes
- xmm2 = ch_mag_128i[i]; // = [|h|^2(1),|h|^2(1),|h|^2(2),|h|^2(2)]*(2/sqrt(10))
- xmm3 = ch_mag_128i[i+1]; // = [|h|^2(3),|h|^2(3),|h|^2(4),|h|^2(4)]*(2/sqrt(10))
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_des = _mm_unpacklo_epi64(xmm2,xmm3);
-
- // Rearrange interfering channel magnitudes
- xmm2 = ch_mag_128i_i[i];
- xmm3 = ch_mag_128i_i[i+1];
- xmm2 = _mm_shufflelo_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shufflehi_epi16(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm2 = _mm_shuffle_epi32(xmm2,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflelo_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shufflehi_epi16(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- xmm3 = _mm_shuffle_epi32(xmm3,0xd8); //_MM_SHUFFLE(0,2,1,3));
- ch_mag_int = _mm_unpacklo_epi64(xmm2,xmm3);
-
- y0r_one_over_sqrt_21 = _mm_mulhi_epi16(y0r, ONE_OVER_SQRT_42);
- y0r_three_over_sqrt_21 = _mm_mulhi_epi16(y0r, THREE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_mulhi_epi16(y0r, FIVE_OVER_SQRT_42);
- y0r_five_over_sqrt_21 = _mm_slli_epi16(y0r_five_over_sqrt_21, 1);
- y0r_seven_over_sqrt_21 = _mm_mulhi_epi16(y0r, SEVEN_OVER_SQRT_42);
- y0r_seven_over_sqrt_21 = _mm_slli_epi16(y0r_seven_over_sqrt_21, 2); // Q2.14
-
- y0i_one_over_sqrt_21 = _mm_mulhi_epi16(y0i, ONE_OVER_SQRT_42);
- y0i_three_over_sqrt_21 = _mm_mulhi_epi16(y0i, THREE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_mulhi_epi16(y0i, FIVE_OVER_SQRT_42);
- y0i_five_over_sqrt_21 = _mm_slli_epi16(y0i_five_over_sqrt_21, 1);
- y0i_seven_over_sqrt_21 = _mm_mulhi_epi16(y0i, SEVEN_OVER_SQRT_42);
- y0i_seven_over_sqrt_21 = _mm_slli_epi16(y0i_seven_over_sqrt_21, 2); // Q2.14
-
- y0_p_7_1 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_7_3 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_7_5 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_7_7 = _mm_adds_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_5_1 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_5_3 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_5_5 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_5_7 = _mm_adds_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_3_1 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_3_3 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_3_5 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_3_7 = _mm_adds_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_p_1_1 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_p_1_3 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_p_1_5 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_p_1_7 = _mm_adds_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- y0_m_1_1 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_1_3 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_1_5 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_1_7 = _mm_subs_epi16(y0r_one_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_3_1 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_3_3 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_3_5 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_3_7 = _mm_subs_epi16(y0r_three_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_5_1 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_5_3 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_5_5 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_5_7 = _mm_subs_epi16(y0r_five_over_sqrt_21, y0i_seven_over_sqrt_21);
- y0_m_7_1 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_one_over_sqrt_21);
- y0_m_7_3 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_three_over_sqrt_21);
- y0_m_7_5 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_five_over_sqrt_21);
- y0_m_7_7 = _mm_subs_epi16(y0r_seven_over_sqrt_21, y0i_seven_over_sqrt_21);
-
- // Detection of interference term
- ch_mag_int_with_sigma2 = _mm_srai_epi16(ch_mag_int, 1); // *2
- two_ch_mag_int_with_sigma2 = ch_mag_int; // *4
- three_ch_mag_int_with_sigma2 = _mm_adds_epi16(ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2); // *6
-
- interference_abs_64qam_epi16(psi_r_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_r_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_r_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- interference_abs_64qam_epi16(psi_i_p7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_p1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_p1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m1_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m1_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m3_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m3_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m5_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m5_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_p1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_p1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m1, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m1, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m3, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m3, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m5, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m5, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
- interference_abs_64qam_epi16(psi_i_m7_m7, ch_mag_int_with_sigma2, two_ch_mag_int_with_sigma2, three_ch_mag_int_with_sigma2, a_i_m7_m7, ONE_OVER_SQRT_2_42, THREE_OVER_SQRT_2_42, FIVE_OVER_SQRT_2_42,
- SEVEN_OVER_SQRT_2_42);
-
- // Calculation of a group of two terms in the bit metric involving product of psi and interference
- prodsum_psi_a_epi16(psi_r_p7_p7, a_r_p7_p7, psi_i_p7_p7, a_i_p7_p7, psi_a_p7_p7);
- prodsum_psi_a_epi16(psi_r_p7_p5, a_r_p7_p5, psi_i_p7_p5, a_i_p7_p5, psi_a_p7_p5);
- prodsum_psi_a_epi16(psi_r_p7_p3, a_r_p7_p3, psi_i_p7_p3, a_i_p7_p3, psi_a_p7_p3);
- prodsum_psi_a_epi16(psi_r_p7_p1, a_r_p7_p1, psi_i_p7_p1, a_i_p7_p1, psi_a_p7_p1);
- prodsum_psi_a_epi16(psi_r_p7_m1, a_r_p7_m1, psi_i_p7_m1, a_i_p7_m1, psi_a_p7_m1);
- prodsum_psi_a_epi16(psi_r_p7_m3, a_r_p7_m3, psi_i_p7_m3, a_i_p7_m3, psi_a_p7_m3);
- prodsum_psi_a_epi16(psi_r_p7_m5, a_r_p7_m5, psi_i_p7_m5, a_i_p7_m5, psi_a_p7_m5);
- prodsum_psi_a_epi16(psi_r_p7_m7, a_r_p7_m7, psi_i_p7_m7, a_i_p7_m7, psi_a_p7_m7);
- prodsum_psi_a_epi16(psi_r_p5_p7, a_r_p5_p7, psi_i_p5_p7, a_i_p5_p7, psi_a_p5_p7);
- prodsum_psi_a_epi16(psi_r_p5_p5, a_r_p5_p5, psi_i_p5_p5, a_i_p5_p5, psi_a_p5_p5);
- prodsum_psi_a_epi16(psi_r_p5_p3, a_r_p5_p3, psi_i_p5_p3, a_i_p5_p3, psi_a_p5_p3);
- prodsum_psi_a_epi16(psi_r_p5_p1, a_r_p5_p1, psi_i_p5_p1, a_i_p5_p1, psi_a_p5_p1);
- prodsum_psi_a_epi16(psi_r_p5_m1, a_r_p5_m1, psi_i_p5_m1, a_i_p5_m1, psi_a_p5_m1);
- prodsum_psi_a_epi16(psi_r_p5_m3, a_r_p5_m3, psi_i_p5_m3, a_i_p5_m3, psi_a_p5_m3);
- prodsum_psi_a_epi16(psi_r_p5_m5, a_r_p5_m5, psi_i_p5_m5, a_i_p5_m5, psi_a_p5_m5);
- prodsum_psi_a_epi16(psi_r_p5_m7, a_r_p5_m7, psi_i_p5_m7, a_i_p5_m7, psi_a_p5_m7);
- prodsum_psi_a_epi16(psi_r_p3_p7, a_r_p3_p7, psi_i_p3_p7, a_i_p3_p7, psi_a_p3_p7);
- prodsum_psi_a_epi16(psi_r_p3_p5, a_r_p3_p5, psi_i_p3_p5, a_i_p3_p5, psi_a_p3_p5);
- prodsum_psi_a_epi16(psi_r_p3_p3, a_r_p3_p3, psi_i_p3_p3, a_i_p3_p3, psi_a_p3_p3);
- prodsum_psi_a_epi16(psi_r_p3_p1, a_r_p3_p1, psi_i_p3_p1, a_i_p3_p1, psi_a_p3_p1);
- prodsum_psi_a_epi16(psi_r_p3_m1, a_r_p3_m1, psi_i_p3_m1, a_i_p3_m1, psi_a_p3_m1);
- prodsum_psi_a_epi16(psi_r_p3_m3, a_r_p3_m3, psi_i_p3_m3, a_i_p3_m3, psi_a_p3_m3);
- prodsum_psi_a_epi16(psi_r_p3_m5, a_r_p3_m5, psi_i_p3_m5, a_i_p3_m5, psi_a_p3_m5);
- prodsum_psi_a_epi16(psi_r_p3_m7, a_r_p3_m7, psi_i_p3_m7, a_i_p3_m7, psi_a_p3_m7);
- prodsum_psi_a_epi16(psi_r_p1_p7, a_r_p1_p7, psi_i_p1_p7, a_i_p1_p7, psi_a_p1_p7);
- prodsum_psi_a_epi16(psi_r_p1_p5, a_r_p1_p5, psi_i_p1_p5, a_i_p1_p5, psi_a_p1_p5);
- prodsum_psi_a_epi16(psi_r_p1_p3, a_r_p1_p3, psi_i_p1_p3, a_i_p1_p3, psi_a_p1_p3);
- prodsum_psi_a_epi16(psi_r_p1_p1, a_r_p1_p1, psi_i_p1_p1, a_i_p1_p1, psi_a_p1_p1);
- prodsum_psi_a_epi16(psi_r_p1_m1, a_r_p1_m1, psi_i_p1_m1, a_i_p1_m1, psi_a_p1_m1);
- prodsum_psi_a_epi16(psi_r_p1_m3, a_r_p1_m3, psi_i_p1_m3, a_i_p1_m3, psi_a_p1_m3);
- prodsum_psi_a_epi16(psi_r_p1_m5, a_r_p1_m5, psi_i_p1_m5, a_i_p1_m5, psi_a_p1_m5);
- prodsum_psi_a_epi16(psi_r_p1_m7, a_r_p1_m7, psi_i_p1_m7, a_i_p1_m7, psi_a_p1_m7);
- prodsum_psi_a_epi16(psi_r_m1_p7, a_r_m1_p7, psi_i_m1_p7, a_i_m1_p7, psi_a_m1_p7);
- prodsum_psi_a_epi16(psi_r_m1_p5, a_r_m1_p5, psi_i_m1_p5, a_i_m1_p5, psi_a_m1_p5);
- prodsum_psi_a_epi16(psi_r_m1_p3, a_r_m1_p3, psi_i_m1_p3, a_i_m1_p3, psi_a_m1_p3);
- prodsum_psi_a_epi16(psi_r_m1_p1, a_r_m1_p1, psi_i_m1_p1, a_i_m1_p1, psi_a_m1_p1);
- prodsum_psi_a_epi16(psi_r_m1_m1, a_r_m1_m1, psi_i_m1_m1, a_i_m1_m1, psi_a_m1_m1);
- prodsum_psi_a_epi16(psi_r_m1_m3, a_r_m1_m3, psi_i_m1_m3, a_i_m1_m3, psi_a_m1_m3);
- prodsum_psi_a_epi16(psi_r_m1_m5, a_r_m1_m5, psi_i_m1_m5, a_i_m1_m5, psi_a_m1_m5);
- prodsum_psi_a_epi16(psi_r_m1_m7, a_r_m1_m7, psi_i_m1_m7, a_i_m1_m7, psi_a_m1_m7);
- prodsum_psi_a_epi16(psi_r_m3_p7, a_r_m3_p7, psi_i_m3_p7, a_i_m3_p7, psi_a_m3_p7);
- prodsum_psi_a_epi16(psi_r_m3_p5, a_r_m3_p5, psi_i_m3_p5, a_i_m3_p5, psi_a_m3_p5);
- prodsum_psi_a_epi16(psi_r_m3_p3, a_r_m3_p3, psi_i_m3_p3, a_i_m3_p3, psi_a_m3_p3);
- prodsum_psi_a_epi16(psi_r_m3_p1, a_r_m3_p1, psi_i_m3_p1, a_i_m3_p1, psi_a_m3_p1);
- prodsum_psi_a_epi16(psi_r_m3_m1, a_r_m3_m1, psi_i_m3_m1, a_i_m3_m1, psi_a_m3_m1);
- prodsum_psi_a_epi16(psi_r_m3_m3, a_r_m3_m3, psi_i_m3_m3, a_i_m3_m3, psi_a_m3_m3);
- prodsum_psi_a_epi16(psi_r_m3_m5, a_r_m3_m5, psi_i_m3_m5, a_i_m3_m5, psi_a_m3_m5);
- prodsum_psi_a_epi16(psi_r_m3_m7, a_r_m3_m7, psi_i_m3_m7, a_i_m3_m7, psi_a_m3_m7);
- prodsum_psi_a_epi16(psi_r_m5_p7, a_r_m5_p7, psi_i_m5_p7, a_i_m5_p7, psi_a_m5_p7);
- prodsum_psi_a_epi16(psi_r_m5_p5, a_r_m5_p5, psi_i_m5_p5, a_i_m5_p5, psi_a_m5_p5);
- prodsum_psi_a_epi16(psi_r_m5_p3, a_r_m5_p3, psi_i_m5_p3, a_i_m5_p3, psi_a_m5_p3);
- prodsum_psi_a_epi16(psi_r_m5_p1, a_r_m5_p1, psi_i_m5_p1, a_i_m5_p1, psi_a_m5_p1);
- prodsum_psi_a_epi16(psi_r_m5_m1, a_r_m5_m1, psi_i_m5_m1, a_i_m5_m1, psi_a_m5_m1);
- prodsum_psi_a_epi16(psi_r_m5_m3, a_r_m5_m3, psi_i_m5_m3, a_i_m5_m3, psi_a_m5_m3);
- prodsum_psi_a_epi16(psi_r_m5_m5, a_r_m5_m5, psi_i_m5_m5, a_i_m5_m5, psi_a_m5_m5);
- prodsum_psi_a_epi16(psi_r_m5_m7, a_r_m5_m7, psi_i_m5_m7, a_i_m5_m7, psi_a_m5_m7);
- prodsum_psi_a_epi16(psi_r_m7_p7, a_r_m7_p7, psi_i_m7_p7, a_i_m7_p7, psi_a_m7_p7);
- prodsum_psi_a_epi16(psi_r_m7_p5, a_r_m7_p5, psi_i_m7_p5, a_i_m7_p5, psi_a_m7_p5);
- prodsum_psi_a_epi16(psi_r_m7_p3, a_r_m7_p3, psi_i_m7_p3, a_i_m7_p3, psi_a_m7_p3);
- prodsum_psi_a_epi16(psi_r_m7_p1, a_r_m7_p1, psi_i_m7_p1, a_i_m7_p1, psi_a_m7_p1);
- prodsum_psi_a_epi16(psi_r_m7_m1, a_r_m7_m1, psi_i_m7_m1, a_i_m7_m1, psi_a_m7_m1);
- prodsum_psi_a_epi16(psi_r_m7_m3, a_r_m7_m3, psi_i_m7_m3, a_i_m7_m3, psi_a_m7_m3);
- prodsum_psi_a_epi16(psi_r_m7_m5, a_r_m7_m5, psi_i_m7_m5, a_i_m7_m5, psi_a_m7_m5);
- prodsum_psi_a_epi16(psi_r_m7_m7, a_r_m7_m7, psi_i_m7_m7, a_i_m7_m7, psi_a_m7_m7);
-
- // Multiply by sqrt(2)
- psi_a_p7_p7 = _mm_mulhi_epi16(psi_a_p7_p7, ONE_OVER_SQRT_2);
- psi_a_p7_p7 = _mm_slli_epi16(psi_a_p7_p7, 2);
- psi_a_p7_p5 = _mm_mulhi_epi16(psi_a_p7_p5, ONE_OVER_SQRT_2);
- psi_a_p7_p5 = _mm_slli_epi16(psi_a_p7_p5, 2);
- psi_a_p7_p3 = _mm_mulhi_epi16(psi_a_p7_p3, ONE_OVER_SQRT_2);
- psi_a_p7_p3 = _mm_slli_epi16(psi_a_p7_p3, 2);
- psi_a_p7_p1 = _mm_mulhi_epi16(psi_a_p7_p1, ONE_OVER_SQRT_2);
- psi_a_p7_p1 = _mm_slli_epi16(psi_a_p7_p1, 2);
- psi_a_p7_m1 = _mm_mulhi_epi16(psi_a_p7_m1, ONE_OVER_SQRT_2);
- psi_a_p7_m1 = _mm_slli_epi16(psi_a_p7_m1, 2);
- psi_a_p7_m3 = _mm_mulhi_epi16(psi_a_p7_m3, ONE_OVER_SQRT_2);
- psi_a_p7_m3 = _mm_slli_epi16(psi_a_p7_m3, 2);
- psi_a_p7_m5 = _mm_mulhi_epi16(psi_a_p7_m5, ONE_OVER_SQRT_2);
- psi_a_p7_m5 = _mm_slli_epi16(psi_a_p7_m5, 2);
- psi_a_p7_m7 = _mm_mulhi_epi16(psi_a_p7_m7, ONE_OVER_SQRT_2);
- psi_a_p7_m7 = _mm_slli_epi16(psi_a_p7_m7, 2);
- psi_a_p5_p7 = _mm_mulhi_epi16(psi_a_p5_p7, ONE_OVER_SQRT_2);
- psi_a_p5_p7 = _mm_slli_epi16(psi_a_p5_p7, 2);
- psi_a_p5_p5 = _mm_mulhi_epi16(psi_a_p5_p5, ONE_OVER_SQRT_2);
- psi_a_p5_p5 = _mm_slli_epi16(psi_a_p5_p5, 2);
- psi_a_p5_p3 = _mm_mulhi_epi16(psi_a_p5_p3, ONE_OVER_SQRT_2);
- psi_a_p5_p3 = _mm_slli_epi16(psi_a_p5_p3, 2);
- psi_a_p5_p1 = _mm_mulhi_epi16(psi_a_p5_p1, ONE_OVER_SQRT_2);
- psi_a_p5_p1 = _mm_slli_epi16(psi_a_p5_p1, 2);
- psi_a_p5_m1 = _mm_mulhi_epi16(psi_a_p5_m1, ONE_OVER_SQRT_2);
- psi_a_p5_m1 = _mm_slli_epi16(psi_a_p5_m1, 2);
- psi_a_p5_m3 = _mm_mulhi_epi16(psi_a_p5_m3, ONE_OVER_SQRT_2);
- psi_a_p5_m3 = _mm_slli_epi16(psi_a_p5_m3, 2);
- psi_a_p5_m5 = _mm_mulhi_epi16(psi_a_p5_m5, ONE_OVER_SQRT_2);
- psi_a_p5_m5 = _mm_slli_epi16(psi_a_p5_m5, 2);
- psi_a_p5_m7 = _mm_mulhi_epi16(psi_a_p5_m7, ONE_OVER_SQRT_2);
- psi_a_p5_m7 = _mm_slli_epi16(psi_a_p5_m7, 2);
- psi_a_p3_p7 = _mm_mulhi_epi16(psi_a_p3_p7, ONE_OVER_SQRT_2);
- psi_a_p3_p7 = _mm_slli_epi16(psi_a_p3_p7, 2);
- psi_a_p3_p5 = _mm_mulhi_epi16(psi_a_p3_p5, ONE_OVER_SQRT_2);
- psi_a_p3_p5 = _mm_slli_epi16(psi_a_p3_p5, 2);
- psi_a_p3_p3 = _mm_mulhi_epi16(psi_a_p3_p3, ONE_OVER_SQRT_2);
- psi_a_p3_p3 = _mm_slli_epi16(psi_a_p3_p3, 2);
- psi_a_p3_p1 = _mm_mulhi_epi16(psi_a_p3_p1, ONE_OVER_SQRT_2);
- psi_a_p3_p1 = _mm_slli_epi16(psi_a_p3_p1, 2);
- psi_a_p3_m1 = _mm_mulhi_epi16(psi_a_p3_m1, ONE_OVER_SQRT_2);
- psi_a_p3_m1 = _mm_slli_epi16(psi_a_p3_m1, 2);
- psi_a_p3_m3 = _mm_mulhi_epi16(psi_a_p3_m3, ONE_OVER_SQRT_2);
- psi_a_p3_m3 = _mm_slli_epi16(psi_a_p3_m3, 2);
- psi_a_p3_m5 = _mm_mulhi_epi16(psi_a_p3_m5, ONE_OVER_SQRT_2);
- psi_a_p3_m5 = _mm_slli_epi16(psi_a_p3_m5, 2);
- psi_a_p3_m7 = _mm_mulhi_epi16(psi_a_p3_m7, ONE_OVER_SQRT_2);
- psi_a_p3_m7 = _mm_slli_epi16(psi_a_p3_m7, 2);
- psi_a_p1_p7 = _mm_mulhi_epi16(psi_a_p1_p7, ONE_OVER_SQRT_2);
- psi_a_p1_p7 = _mm_slli_epi16(psi_a_p1_p7, 2);
- psi_a_p1_p5 = _mm_mulhi_epi16(psi_a_p1_p5, ONE_OVER_SQRT_2);
- psi_a_p1_p5 = _mm_slli_epi16(psi_a_p1_p5, 2);
- psi_a_p1_p3 = _mm_mulhi_epi16(psi_a_p1_p3, ONE_OVER_SQRT_2);
- psi_a_p1_p3 = _mm_slli_epi16(psi_a_p1_p3, 2);
- psi_a_p1_p1 = _mm_mulhi_epi16(psi_a_p1_p1, ONE_OVER_SQRT_2);
- psi_a_p1_p1 = _mm_slli_epi16(psi_a_p1_p1, 2);
- psi_a_p1_m1 = _mm_mulhi_epi16(psi_a_p1_m1, ONE_OVER_SQRT_2);
- psi_a_p1_m1 = _mm_slli_epi16(psi_a_p1_m1, 2);
- psi_a_p1_m3 = _mm_mulhi_epi16(psi_a_p1_m3, ONE_OVER_SQRT_2);
- psi_a_p1_m3 = _mm_slli_epi16(psi_a_p1_m3, 2);
- psi_a_p1_m5 = _mm_mulhi_epi16(psi_a_p1_m5, ONE_OVER_SQRT_2);
- psi_a_p1_m5 = _mm_slli_epi16(psi_a_p1_m5, 2);
- psi_a_p1_m7 = _mm_mulhi_epi16(psi_a_p1_m7, ONE_OVER_SQRT_2);
- psi_a_p1_m7 = _mm_slli_epi16(psi_a_p1_m7, 2);
- psi_a_m1_p7 = _mm_mulhi_epi16(psi_a_m1_p7, ONE_OVER_SQRT_2);
- psi_a_m1_p7 = _mm_slli_epi16(psi_a_m1_p7, 2);
- psi_a_m1_p5 = _mm_mulhi_epi16(psi_a_m1_p5, ONE_OVER_SQRT_2);
- psi_a_m1_p5 = _mm_slli_epi16(psi_a_m1_p5, 2);
- psi_a_m1_p3 = _mm_mulhi_epi16(psi_a_m1_p3, ONE_OVER_SQRT_2);
- psi_a_m1_p3 = _mm_slli_epi16(psi_a_m1_p3, 2);
- psi_a_m1_p1 = _mm_mulhi_epi16(psi_a_m1_p1, ONE_OVER_SQRT_2);
- psi_a_m1_p1 = _mm_slli_epi16(psi_a_m1_p1, 2);
- psi_a_m1_m1 = _mm_mulhi_epi16(psi_a_m1_m1, ONE_OVER_SQRT_2);
- psi_a_m1_m1 = _mm_slli_epi16(psi_a_m1_m1, 2);
- psi_a_m1_m3 = _mm_mulhi_epi16(psi_a_m1_m3, ONE_OVER_SQRT_2);
- psi_a_m1_m3 = _mm_slli_epi16(psi_a_m1_m3, 2);
- psi_a_m1_m5 = _mm_mulhi_epi16(psi_a_m1_m5, ONE_OVER_SQRT_2);
- psi_a_m1_m5 = _mm_slli_epi16(psi_a_m1_m5, 2);
- psi_a_m1_m7 = _mm_mulhi_epi16(psi_a_m1_m7, ONE_OVER_SQRT_2);
- psi_a_m1_m7 = _mm_slli_epi16(psi_a_m1_m7, 2);
- psi_a_m3_p7 = _mm_mulhi_epi16(psi_a_m3_p7, ONE_OVER_SQRT_2);
- psi_a_m3_p7 = _mm_slli_epi16(psi_a_m3_p7, 2);
- psi_a_m3_p5 = _mm_mulhi_epi16(psi_a_m3_p5, ONE_OVER_SQRT_2);
- psi_a_m3_p5 = _mm_slli_epi16(psi_a_m3_p5, 2);
- psi_a_m3_p3 = _mm_mulhi_epi16(psi_a_m3_p3, ONE_OVER_SQRT_2);
- psi_a_m3_p3 = _mm_slli_epi16(psi_a_m3_p3, 2);
- psi_a_m3_p1 = _mm_mulhi_epi16(psi_a_m3_p1, ONE_OVER_SQRT_2);
- psi_a_m3_p1 = _mm_slli_epi16(psi_a_m3_p1, 2);
- psi_a_m3_m1 = _mm_mulhi_epi16(psi_a_m3_m1, ONE_OVER_SQRT_2);
- psi_a_m3_m1 = _mm_slli_epi16(psi_a_m3_m1, 2);
- psi_a_m3_m3 = _mm_mulhi_epi16(psi_a_m3_m3, ONE_OVER_SQRT_2);
- psi_a_m3_m3 = _mm_slli_epi16(psi_a_m3_m3, 2);
- psi_a_m3_m5 = _mm_mulhi_epi16(psi_a_m3_m5, ONE_OVER_SQRT_2);
- psi_a_m3_m5 = _mm_slli_epi16(psi_a_m3_m5, 2);
- psi_a_m3_m7 = _mm_mulhi_epi16(psi_a_m3_m7, ONE_OVER_SQRT_2);
- psi_a_m3_m7 = _mm_slli_epi16(psi_a_m3_m7, 2);
- psi_a_m5_p7 = _mm_mulhi_epi16(psi_a_m5_p7, ONE_OVER_SQRT_2);
- psi_a_m5_p7 = _mm_slli_epi16(psi_a_m5_p7, 2);
- psi_a_m5_p5 = _mm_mulhi_epi16(psi_a_m5_p5, ONE_OVER_SQRT_2);
- psi_a_m5_p5 = _mm_slli_epi16(psi_a_m5_p5, 2);
- psi_a_m5_p3 = _mm_mulhi_epi16(psi_a_m5_p3, ONE_OVER_SQRT_2);
- psi_a_m5_p3 = _mm_slli_epi16(psi_a_m5_p3, 2);
- psi_a_m5_p1 = _mm_mulhi_epi16(psi_a_m5_p1, ONE_OVER_SQRT_2);
- psi_a_m5_p1 = _mm_slli_epi16(psi_a_m5_p1, 2);
- psi_a_m5_m1 = _mm_mulhi_epi16(psi_a_m5_m1, ONE_OVER_SQRT_2);
- psi_a_m5_m1 = _mm_slli_epi16(psi_a_m5_m1, 2);
- psi_a_m5_m3 = _mm_mulhi_epi16(psi_a_m5_m3, ONE_OVER_SQRT_2);
- psi_a_m5_m3 = _mm_slli_epi16(psi_a_m5_m3, 2);
- psi_a_m5_m5 = _mm_mulhi_epi16(psi_a_m5_m5, ONE_OVER_SQRT_2);
- psi_a_m5_m5 = _mm_slli_epi16(psi_a_m5_m5, 2);
- psi_a_m5_m7 = _mm_mulhi_epi16(psi_a_m5_m7, ONE_OVER_SQRT_2);
- psi_a_m5_m7 = _mm_slli_epi16(psi_a_m5_m7, 2);
- psi_a_m7_p7 = _mm_mulhi_epi16(psi_a_m7_p7, ONE_OVER_SQRT_2);
- psi_a_m7_p7 = _mm_slli_epi16(psi_a_m7_p7, 2);
- psi_a_m7_p5 = _mm_mulhi_epi16(psi_a_m7_p5, ONE_OVER_SQRT_2);
- psi_a_m7_p5 = _mm_slli_epi16(psi_a_m7_p5, 2);
- psi_a_m7_p3 = _mm_mulhi_epi16(psi_a_m7_p3, ONE_OVER_SQRT_2);
- psi_a_m7_p3 = _mm_slli_epi16(psi_a_m7_p3, 2);
- psi_a_m7_p1 = _mm_mulhi_epi16(psi_a_m7_p1, ONE_OVER_SQRT_2);
- psi_a_m7_p1 = _mm_slli_epi16(psi_a_m7_p1, 2);
- psi_a_m7_m1 = _mm_mulhi_epi16(psi_a_m7_m1, ONE_OVER_SQRT_2);
- psi_a_m7_m1 = _mm_slli_epi16(psi_a_m7_m1, 2);
- psi_a_m7_m3 = _mm_mulhi_epi16(psi_a_m7_m3, ONE_OVER_SQRT_2);
- psi_a_m7_m3 = _mm_slli_epi16(psi_a_m7_m3, 2);
- psi_a_m7_m5 = _mm_mulhi_epi16(psi_a_m7_m5, ONE_OVER_SQRT_2);
- psi_a_m7_m5 = _mm_slli_epi16(psi_a_m7_m5, 2);
- psi_a_m7_m7 = _mm_mulhi_epi16(psi_a_m7_m7, ONE_OVER_SQRT_2);
- psi_a_m7_m7 = _mm_slli_epi16(psi_a_m7_m7, 2);
-
- // Calculation of a group of two terms in the bit metric involving squares of interference
- square_a_64qam_epi16(a_r_p7_p7, a_i_p7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p7);
- square_a_64qam_epi16(a_r_p7_p5, a_i_p7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p5);
- square_a_64qam_epi16(a_r_p7_p3, a_i_p7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p3);
- square_a_64qam_epi16(a_r_p7_p1, a_i_p7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_p1);
- square_a_64qam_epi16(a_r_p7_m1, a_i_p7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m1);
- square_a_64qam_epi16(a_r_p7_m3, a_i_p7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m3);
- square_a_64qam_epi16(a_r_p7_m5, a_i_p7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m5);
- square_a_64qam_epi16(a_r_p7_m7, a_i_p7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p7_m7);
- square_a_64qam_epi16(a_r_p5_p7, a_i_p5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p7);
- square_a_64qam_epi16(a_r_p5_p5, a_i_p5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p5);
- square_a_64qam_epi16(a_r_p5_p3, a_i_p5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p3);
- square_a_64qam_epi16(a_r_p5_p1, a_i_p5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_p1);
- square_a_64qam_epi16(a_r_p5_m1, a_i_p5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m1);
- square_a_64qam_epi16(a_r_p5_m3, a_i_p5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m3);
- square_a_64qam_epi16(a_r_p5_m5, a_i_p5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m5);
- square_a_64qam_epi16(a_r_p5_m7, a_i_p5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p5_m7);
- square_a_64qam_epi16(a_r_p3_p7, a_i_p3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p7);
- square_a_64qam_epi16(a_r_p3_p5, a_i_p3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p5);
- square_a_64qam_epi16(a_r_p3_p3, a_i_p3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p3);
- square_a_64qam_epi16(a_r_p3_p1, a_i_p3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_p1);
- square_a_64qam_epi16(a_r_p3_m1, a_i_p3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m1);
- square_a_64qam_epi16(a_r_p3_m3, a_i_p3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m3);
- square_a_64qam_epi16(a_r_p3_m5, a_i_p3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m5);
- square_a_64qam_epi16(a_r_p3_m7, a_i_p3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p3_m7);
- square_a_64qam_epi16(a_r_p1_p7, a_i_p1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p7);
- square_a_64qam_epi16(a_r_p1_p5, a_i_p1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p5);
- square_a_64qam_epi16(a_r_p1_p3, a_i_p1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p3);
- square_a_64qam_epi16(a_r_p1_p1, a_i_p1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_p1);
- square_a_64qam_epi16(a_r_p1_m1, a_i_p1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m1);
- square_a_64qam_epi16(a_r_p1_m3, a_i_p1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m3);
- square_a_64qam_epi16(a_r_p1_m5, a_i_p1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m5);
- square_a_64qam_epi16(a_r_p1_m7, a_i_p1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_p1_m7);
- square_a_64qam_epi16(a_r_m1_p7, a_i_m1_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p7);
- square_a_64qam_epi16(a_r_m1_p5, a_i_m1_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p5);
- square_a_64qam_epi16(a_r_m1_p3, a_i_m1_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p3);
- square_a_64qam_epi16(a_r_m1_p1, a_i_m1_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_p1);
- square_a_64qam_epi16(a_r_m1_m1, a_i_m1_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m1);
- square_a_64qam_epi16(a_r_m1_m3, a_i_m1_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m3);
- square_a_64qam_epi16(a_r_m1_m5, a_i_m1_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m5);
- square_a_64qam_epi16(a_r_m1_m7, a_i_m1_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m1_m7);
- square_a_64qam_epi16(a_r_m3_p7, a_i_m3_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p7);
- square_a_64qam_epi16(a_r_m3_p5, a_i_m3_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p5);
- square_a_64qam_epi16(a_r_m3_p3, a_i_m3_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p3);
- square_a_64qam_epi16(a_r_m3_p1, a_i_m3_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_p1);
- square_a_64qam_epi16(a_r_m3_m1, a_i_m3_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m1);
- square_a_64qam_epi16(a_r_m3_m3, a_i_m3_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m3);
- square_a_64qam_epi16(a_r_m3_m5, a_i_m3_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m5);
- square_a_64qam_epi16(a_r_m3_m7, a_i_m3_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m3_m7);
- square_a_64qam_epi16(a_r_m5_p7, a_i_m5_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p7);
- square_a_64qam_epi16(a_r_m5_p5, a_i_m5_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p5);
- square_a_64qam_epi16(a_r_m5_p3, a_i_m5_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p3);
- square_a_64qam_epi16(a_r_m5_p1, a_i_m5_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_p1);
- square_a_64qam_epi16(a_r_m5_m1, a_i_m5_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m1);
- square_a_64qam_epi16(a_r_m5_m3, a_i_m5_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m3);
- square_a_64qam_epi16(a_r_m5_m5, a_i_m5_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m5);
- square_a_64qam_epi16(a_r_m5_m7, a_i_m5_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m5_m7);
- square_a_64qam_epi16(a_r_m7_p7, a_i_m7_p7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p7);
- square_a_64qam_epi16(a_r_m7_p5, a_i_m7_p5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p5);
- square_a_64qam_epi16(a_r_m7_p3, a_i_m7_p3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p3);
- square_a_64qam_epi16(a_r_m7_p1, a_i_m7_p1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_p1);
- square_a_64qam_epi16(a_r_m7_m1, a_i_m7_m1, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m1);
- square_a_64qam_epi16(a_r_m7_m3, a_i_m7_m3, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m3);
- square_a_64qam_epi16(a_r_m7_m5, a_i_m7_m5, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m5);
- square_a_64qam_epi16(a_r_m7_m7, a_i_m7_m7, ch_mag_int, SQRT_42_OVER_FOUR, a_sq_m7_m7);
-
- // Computing different multiples of ||h0||^2
- // x=1, y=1
- ch_mag_2_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,ONE_OVER_FOUR_SQRT_42);
- ch_mag_2_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_2_over_42_with_sigma2,1);
- // x=1, y=3
- ch_mag_10_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FIVE_OVER_FOUR_SQRT_42);
- ch_mag_10_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_10_over_42_with_sigma2,1);
- // x=1, x=5
- ch_mag_26_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTEEN_OVER_FOUR_SQRT_42);
- ch_mag_26_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_26_over_42_with_sigma2,1);
- // x=1, y=7
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=3, y=3
- ch_mag_18_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,NINE_OVER_FOUR_SQRT_42);
- ch_mag_18_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_18_over_42_with_sigma2,1);
- // x=3, y=5
- ch_mag_34_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,SEVENTEEN_OVER_FOUR_SQRT_42);
- ch_mag_34_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_34_over_42_with_sigma2,1);
- // x=3, y=7
- ch_mag_58_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_58_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_58_over_42_with_sigma2,2);
- // x=5, y=5
- ch_mag_50_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,TWENTYFIVE_OVER_FOUR_SQRT_42);
- ch_mag_50_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_50_over_42_with_sigma2,1);
- // x=5, y=7
- ch_mag_74_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,THIRTYSEVEN_OVER_FOUR_SQRT_42);
- ch_mag_74_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_74_over_42_with_sigma2,2);
- // x=7, y=7
- ch_mag_98_over_42_with_sigma2 = _mm_mulhi_epi16(ch_mag_des,FORTYNINE_OVER_FOUR_SQRT_42);
- ch_mag_98_over_42_with_sigma2 = _mm_slli_epi16(ch_mag_98_over_42_with_sigma2,2);
-
- // Computing Metrics
- xmm0 = _mm_subs_epi16(psi_a_p7_p7, a_sq_p7_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_7);
- bit_met_p7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p5, a_sq_p7_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_5);
- bit_met_p7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p3, a_sq_p7_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_3);
- bit_met_p7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_p1, a_sq_p7_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_7_1);
- bit_met_p7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m1, a_sq_p7_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_1);
- bit_met_p7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m3, a_sq_p7_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_3);
- bit_met_p7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m5, a_sq_p7_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_5);
- bit_met_p7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p7_m7, a_sq_p7_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_7_7);
- bit_met_p7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p7, a_sq_p5_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_7);
- bit_met_p5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p5, a_sq_p5_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_5);
- bit_met_p5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p3, a_sq_p5_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_3);
- bit_met_p5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_p1, a_sq_p5_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_5_1);
- bit_met_p5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m1, a_sq_p5_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_1);
- bit_met_p5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m3, a_sq_p5_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_3);
- bit_met_p5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m5, a_sq_p5_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_5);
- bit_met_p5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p5_m7, a_sq_p5_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_5_7);
- bit_met_p5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p7, a_sq_p3_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_7);
- bit_met_p3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p5, a_sq_p3_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_5);
- bit_met_p3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p3, a_sq_p3_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_3);
- bit_met_p3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_p1, a_sq_p3_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_3_1);
- bit_met_p3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m1, a_sq_p3_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_1);
- bit_met_p3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m3, a_sq_p3_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_3);
- bit_met_p3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m5, a_sq_p3_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_5);
- bit_met_p3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p3_m7, a_sq_p3_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_3_7);
- bit_met_p3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p7, a_sq_p1_p7);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_7);
- bit_met_p1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p5, a_sq_p1_p5);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_5);
- bit_met_p1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p3, a_sq_p1_p3);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_3);
- bit_met_p1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_p1, a_sq_p1_p1);
- xmm1 = _mm_adds_epi16(xmm0, y0_p_1_1);
- bit_met_p1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m1, a_sq_p1_m1);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_1);
- bit_met_p1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m3, a_sq_p1_m3);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_3);
- bit_met_p1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m5, a_sq_p1_m5);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_5);
- bit_met_p1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_p1_m7, a_sq_p1_m7);
- xmm1 = _mm_adds_epi16(xmm0, y0_m_1_7);
- bit_met_p1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
-
- xmm0 = _mm_subs_epi16(psi_a_m1_p7, a_sq_m1_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_7);
- bit_met_m1_p7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p5, a_sq_m1_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_5);
- bit_met_m1_p5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p3, a_sq_m1_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_3);
- bit_met_m1_p3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_p1, a_sq_m1_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_1_1);
- bit_met_m1_p1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m1, a_sq_m1_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_1);
- bit_met_m1_m1 = _mm_subs_epi16(xmm1, ch_mag_2_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m3, a_sq_m1_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_3);
- bit_met_m1_m3 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m5, a_sq_m1_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_5);
- bit_met_m1_m5 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m1_m7, a_sq_m1_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_1_7);
- bit_met_m1_m7 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p7, a_sq_m3_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_7);
- bit_met_m3_p7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p5, a_sq_m3_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_5);
- bit_met_m3_p5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p3, a_sq_m3_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_3);
- bit_met_m3_p3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_p1, a_sq_m3_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_3_1);
- bit_met_m3_p1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m1, a_sq_m3_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_1);
- bit_met_m3_m1 = _mm_subs_epi16(xmm1, ch_mag_10_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m3, a_sq_m3_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_3);
- bit_met_m3_m3 = _mm_subs_epi16(xmm1, ch_mag_18_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m5, a_sq_m3_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_5);
- bit_met_m3_m5 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m3_m7, a_sq_m3_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_3_7);
- bit_met_m3_m7 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p7, a_sq_m5_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_7);
- bit_met_m5_p7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p5, a_sq_m5_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_5);
- bit_met_m5_p5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p3, a_sq_m5_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_3);
- bit_met_m5_p3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_p1, a_sq_m5_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_5_1);
- bit_met_m5_p1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m1, a_sq_m5_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_1);
- bit_met_m5_m1 = _mm_subs_epi16(xmm1, ch_mag_26_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m3, a_sq_m5_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_3);
- bit_met_m5_m3 = _mm_subs_epi16(xmm1, ch_mag_34_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m5, a_sq_m5_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_5);
- bit_met_m5_m5 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m5_m7, a_sq_m5_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_5_7);
- bit_met_m5_m7 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p7, a_sq_m7_p7);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_7);
- bit_met_m7_p7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p5, a_sq_m7_p5);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_5);
- bit_met_m7_p5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p3, a_sq_m7_p3);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_3);
- bit_met_m7_p3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_p1, a_sq_m7_p1);
- xmm1 = _mm_subs_epi16(xmm0, y0_m_7_1);
- bit_met_m7_p1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m1, a_sq_m7_m1);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_1);
- bit_met_m7_m1 = _mm_subs_epi16(xmm1, ch_mag_50_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m3, a_sq_m7_m3);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_3);
- bit_met_m7_m3 = _mm_subs_epi16(xmm1, ch_mag_58_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m5, a_sq_m7_m5);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_5);
- bit_met_m7_m5 = _mm_subs_epi16(xmm1, ch_mag_74_over_42_with_sigma2);
- xmm0 = _mm_subs_epi16(psi_a_m7_m7, a_sq_m7_m7);
- xmm1 = _mm_subs_epi16(xmm0, y0_p_7_7);
- bit_met_m7_m7 = _mm_subs_epi16(xmm1, ch_mag_98_over_42_with_sigma2);
-
- // Detection for 1st bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_m7_p7, bit_met_m7_p5);
- xmm1 = _mm_max_epi16(bit_met_m7_p3, bit_met_m7_p1);
- xmm2 = _mm_max_epi16(bit_met_m7_m1, bit_met_m7_m3);
- xmm3 = _mm_max_epi16(bit_met_m7_m5, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_p7, bit_met_m5_p5);
- xmm1 = _mm_max_epi16(bit_met_m5_p3, bit_met_m5_p1);
- xmm2 = _mm_max_epi16(bit_met_m5_m1, bit_met_m5_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_p7, bit_met_m3_p5);
- xmm1 = _mm_max_epi16(bit_met_m3_p3, bit_met_m3_p1);
- xmm2 = _mm_max_epi16(bit_met_m3_m1, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m3_m5, bit_met_m3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_p7, bit_met_m1_p5);
- xmm1 = _mm_max_epi16(bit_met_m1_p3, bit_met_m1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m1_m3);
- xmm3 = _mm_max_epi16(bit_met_m1_m5, bit_met_m1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p7_p5);
- xmm1 = _mm_max_epi16(bit_met_p7_p3, bit_met_p7_p1);
- xmm2 = _mm_max_epi16(bit_met_p7_m1, bit_met_p7_m3);
- xmm3 = _mm_max_epi16(bit_met_p7_m5, bit_met_p7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_p7, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p5_p3, bit_met_p5_p1);
- xmm2 = _mm_max_epi16(bit_met_p5_m1, bit_met_p5_m3);
- xmm3 = _mm_max_epi16(bit_met_p5_m5, bit_met_p5_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_p7, bit_met_p3_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p3_p1);
- xmm2 = _mm_max_epi16(bit_met_p3_m1, bit_met_p3_m3);
- xmm3 = _mm_max_epi16(bit_met_p3_m5, bit_met_p3_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_p7, bit_met_p1_p5);
- xmm1 = _mm_max_epi16(bit_met_p1_p3, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_p1_m1, bit_met_p1_m3);
- xmm3 = _mm_max_epi16(bit_met_p1_m5, bit_met_p1_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 2nd bit (LTE mapping)
- // bit = 1
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- // bit = 0
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 3rd bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2r = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 4th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m7_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y0i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // Detection for 5th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_m7_m7, bit_met_m7_m5);
- xmm1 = _mm_max_epi16(bit_met_m7_m3, bit_met_m7_m1);
- xmm2 = _mm_max_epi16(bit_met_m7_p1, bit_met_m7_p3);
- xmm3 = _mm_max_epi16(bit_met_m7_p5, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m1_m7, bit_met_m1_m5);
- xmm1 = _mm_max_epi16(bit_met_m1_m3, bit_met_m1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m1_p3);
- xmm3 = _mm_max_epi16(bit_met_m1_p5, bit_met_m1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p1_m7, bit_met_p1_m5);
- xmm1 = _mm_max_epi16(bit_met_p1_m3, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_p1_p1, bit_met_p1_p3);
- xmm3 = _mm_max_epi16(bit_met_p1_p5, bit_met_p1_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p7_m5);
- xmm1 = _mm_max_epi16(bit_met_p7_m3, bit_met_p7_m1);
- xmm2 = _mm_max_epi16(bit_met_p7_p1, bit_met_p7_p3);
- xmm3 = _mm_max_epi16(bit_met_p7_p5, bit_met_p7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_m5_m7, bit_met_m5_m5);
- xmm1 = _mm_max_epi16(bit_met_m5_m3, bit_met_m5_m1);
- xmm2 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_m3_m7, bit_met_m3_m5);
- xmm1 = _mm_max_epi16(bit_met_m3_m3, bit_met_m3_m1);
- xmm2 = _mm_max_epi16(bit_met_m3_p1, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m3_p5, bit_met_m3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p3_m7, bit_met_p3_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p3_m1);
- xmm2 = _mm_max_epi16(bit_met_p3_p1, bit_met_p3_p3);
- xmm3 = _mm_max_epi16(bit_met_p3_p5, bit_met_p3_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p5_m7, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p5_m3, bit_met_p5_m1);
- xmm2 = _mm_max_epi16(bit_met_p5_p1, bit_met_p5_p3);
- xmm3 = _mm_max_epi16(bit_met_p5_p5, bit_met_p5_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y1i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
- // Detection for 6th bit (LTE mapping)
- xmm0 = _mm_max_epi16(bit_met_p7_p7, bit_met_p5_p7);
- xmm1 = _mm_max_epi16(bit_met_p3_p7, bit_met_p1_p7);
- xmm2 = _mm_max_epi16(bit_met_m1_p7, bit_met_m3_p7);
- xmm3 = _mm_max_epi16(bit_met_m5_p7, bit_met_m7_p7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p1, bit_met_p5_p1);
- xmm1 = _mm_max_epi16(bit_met_p3_p1, bit_met_p1_p1);
- xmm2 = _mm_max_epi16(bit_met_m1_p1, bit_met_m3_p1);
- xmm3 = _mm_max_epi16(bit_met_m5_p1, bit_met_m5_p1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m1, bit_met_p5_m1);
- xmm1 = _mm_max_epi16(bit_met_p3_m1, bit_met_p1_m1);
- xmm2 = _mm_max_epi16(bit_met_m1_m1, bit_met_m3_m1);
- xmm3 = _mm_max_epi16(bit_met_m5_m1, bit_met_m7_m1);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m7, bit_met_p5_m7);
- xmm1 = _mm_max_epi16(bit_met_p3_m7, bit_met_p1_m7);
- xmm2 = _mm_max_epi16(bit_met_m1_m7, bit_met_m3_m7);
- xmm3 = _mm_max_epi16(bit_met_m5_m7, bit_met_m7_m7);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm4);
- logmax_den_re0 = _mm_max_epi16(logmax_den_re0, xmm5);
-
- xmm0 = _mm_max_epi16(bit_met_p7_m5, bit_met_p5_m5);
- xmm1 = _mm_max_epi16(bit_met_p3_m5, bit_met_p1_m5);
- xmm2 = _mm_max_epi16(bit_met_m1_m5, bit_met_m3_m5);
- xmm3 = _mm_max_epi16(bit_met_m5_m5, bit_met_m7_m5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(xmm4, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_m3, bit_met_p5_m3);
- xmm1 = _mm_max_epi16(bit_met_p3_m3, bit_met_p1_m3);
- xmm2 = _mm_max_epi16(bit_met_m1_m3, bit_met_m3_m3);
- xmm3 = _mm_max_epi16(bit_met_m5_m3, bit_met_m7_m3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p3, bit_met_p5_p3);
- xmm1 = _mm_max_epi16(bit_met_p3_p3, bit_met_p1_p3);
- xmm2 = _mm_max_epi16(bit_met_m1_p3, bit_met_m3_p3);
- xmm3 = _mm_max_epi16(bit_met_m5_p3, bit_met_m7_p3);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
- xmm0 = _mm_max_epi16(bit_met_p7_p5, bit_met_p5_p5);
- xmm1 = _mm_max_epi16(bit_met_p3_p5, bit_met_p1_p5);
- xmm2 = _mm_max_epi16(bit_met_m1_p5, bit_met_m3_p5);
- xmm3 = _mm_max_epi16(bit_met_m5_p5, bit_met_m7_p5);
- xmm4 = _mm_max_epi16(xmm0, xmm1);
- xmm5 = _mm_max_epi16(xmm2, xmm3);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm4);
- logmax_num_re0 = _mm_max_epi16(logmax_num_re0, xmm5);
-
- y2i = _mm_subs_epi16(logmax_num_re0, logmax_den_re0);
-
-
- // map to output stream, difficult to do in SIMD since we have 6 16bit LLRs
- // RE 1
- j = 24*i;
- stream0_out[j + 0] = ((short *)&y0r)[0];
- stream0_out[j + 1] = ((short *)&y1r)[0];
- stream0_out[j + 2] = ((short *)&y2r)[0];
- stream0_out[j + 3] = ((short *)&y0i)[0];
- stream0_out[j + 4] = ((short *)&y1i)[0];
- stream0_out[j + 5] = ((short *)&y2i)[0];
- // RE 2
- stream0_out[j + 6] = ((short *)&y0r)[1];
- stream0_out[j + 7] = ((short *)&y1r)[1];
- stream0_out[j + 8] = ((short *)&y2r)[1];
- stream0_out[j + 9] = ((short *)&y0i)[1];
- stream0_out[j + 10] = ((short *)&y1i)[1];
- stream0_out[j + 11] = ((short *)&y2i)[1];
- // RE 3
- stream0_out[j + 12] = ((short *)&y0r)[2];
- stream0_out[j + 13] = ((short *)&y1r)[2];
- stream0_out[j + 14] = ((short *)&y2r)[2];
- stream0_out[j + 15] = ((short *)&y0i)[2];
- stream0_out[j + 16] = ((short *)&y1i)[2];
- stream0_out[j + 17] = ((short *)&y2i)[2];
- // RE 4
- stream0_out[j + 18] = ((short *)&y0r)[3];
- stream0_out[j + 19] = ((short *)&y1r)[3];
- stream0_out[j + 20] = ((short *)&y2r)[3];
- stream0_out[j + 21] = ((short *)&y0i)[3];
- stream0_out[j + 22] = ((short *)&y1i)[3];
- stream0_out[j + 23] = ((short *)&y2i)[3];
- // RE 5
- stream0_out[j + 24] = ((short *)&y0r)[4];
- stream0_out[j + 25] = ((short *)&y1r)[4];
- stream0_out[j + 26] = ((short *)&y2r)[4];
- stream0_out[j + 27] = ((short *)&y0i)[4];
- stream0_out[j + 28] = ((short *)&y1i)[4];
- stream0_out[j + 29] = ((short *)&y2i)[4];
- // RE 6
- stream0_out[j + 30] = ((short *)&y0r)[5];
- stream0_out[j + 31] = ((short *)&y1r)[5];
- stream0_out[j + 32] = ((short *)&y2r)[5];
- stream0_out[j + 33] = ((short *)&y0i)[5];
- stream0_out[j + 34] = ((short *)&y1i)[5];
- stream0_out[j + 35] = ((short *)&y2i)[5];
- // RE 7
- stream0_out[j + 36] = ((short *)&y0r)[6];
- stream0_out[j + 37] = ((short *)&y1r)[6];
- stream0_out[j + 38] = ((short *)&y2r)[6];
- stream0_out[j + 39] = ((short *)&y0i)[6];
- stream0_out[j + 40] = ((short *)&y1i)[6];
- stream0_out[j + 41] = ((short *)&y2i)[6];
- // RE 8
- stream0_out[j + 42] = ((short *)&y0r)[7];
- stream0_out[j + 43] = ((short *)&y1r)[7];
- stream0_out[j + 44] = ((short *)&y2r)[7];
- stream0_out[j + 45] = ((short *)&y0i)[7];
- stream0_out[j + 46] = ((short *)&y1i)[7];
- stream0_out[j + 47] = ((short *)&y2i)[7];
-
-#elif defined(__arm__) || defined(__aarch64__)
-
-#endif
-
- }
-
-#if defined(__x86_64__) || defined(__i386__)
- _mm_empty();
- _m_empty();
-#endif
-}
-#endif
-
-
-int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int32_t **dl_ch_mag,
- int32_t **dl_ch_mag_i,
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint32_t len,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adjust,
- //int16_t **llr16p,
- uint32_t llr_offset)
-{
-
- int16_t *rxF = (int16_t*)&rxdataF_comp[0][(symbol*nb_rb*12)];
- int16_t *rxF_i = (int16_t*)&rxdataF_comp_i[0][(symbol*nb_rb*12)];
- int16_t *ch_mag = (int16_t*)&dl_ch_mag[0][(symbol*nb_rb*12)];
- int16_t *ch_mag_i = (int16_t*)&dl_ch_mag_i[0][(symbol*nb_rb*12)];
- int16_t *rho = (int16_t*)&rho_i[0][(symbol*nb_rb*12)];
- int16_t *llr16;
- int8_t *pllr_symbol; // pointer where llrs should filled for this ofdm symbol
-
- //first symbol has different structure due to more pilots
- /*if (first_symbol_flag == 1) {
- llr16 = (int16_t*)dlsch_llr;
- } else {
- llr16 = (int16_t*)(*llr16p);
- }*/
-
- llr16 = (int16_t*)dlsch_llr;
-
- AssertFatal(llr16!=NULL,"nr_dlsch_16qam_64qam_llr:llr is null, symbol %d\n",symbol);
-
-
- pllr_symbol = (int8_t*)dlsch_llr;
- pllr_symbol += llr_offset;
- //printf("nr_dlsch_64qam_64qam_llr: symbol %d,nb_rb %d, len %d,pbch_pss_sss_adjust %d\n",symbol,nb_rb,len,pbch_pss_sss_adjust);
- /*LOG_I(PHY,"nr_dlsch_64qam_64qam_llr [symb %d / FirstSym %d / Length %d / LLR Offset %d]: @LLR Buff %x, @LLR Buff(symb) %x, , @Compute LLR Buff(symb) %x \n",
- symbol,
- first_symbol_flag,
- len,
- llr_offset,
- (int16_t*)dlsch_llr,
- llr16,
- pllr_symbol);*/
-
- // Round length up to multiple of 16 words
- uint32_t len256i = ((len+16)>>4)*16;
- int32_t *rxF_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *rxF_i_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *ch_mag_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *ch_mag_i_256i = (int32_t*) malloc16_clear(len256i*4);
- int32_t *rho_256i = (int32_t*) malloc16_clear(len256i*4);
-
- memcpy(rxF_256i, rxF, len*4);
- memcpy(rxF_i_256i, rxF_i, len*4);
- memcpy(ch_mag_256i, ch_mag, len*4);
- memcpy(ch_mag_i_256i, ch_mag_i, len*4);
- memcpy(rho_256i, rho, len*4);
-
-#if 0
- qam64_qam16_avx2((short *)rxF_256i,
- (short *)rxF_i_256i,
- (short *)ch_mag_256i,
- (short *)ch_mag_i_256i,
- (short *)llr16,
- (short *) rho_256i,
- len);
-#else
- qam64_qam64_avx2((int32_t *)rxF_256i,
- (int32_t *)rxF_i_256i,
- (int32_t *)ch_mag_256i,
- (int32_t *)ch_mag_i_256i,
- (int16_t *)llr16,
- (int32_t *) rho_256i,
- len);
-#endif
-
- free16(rxF_256i, sizeof(rxF_256i));
- free16(rxF_i_256i, sizeof(rxF_i_256i));
- free16(ch_mag_256i, sizeof(ch_mag_256i));
- free16(ch_mag_i_256i, sizeof(ch_mag_i_256i));
- free16(rho_256i, sizeof(rho_256i));
-
- llr16 += (6*len);
- //*llr16p = (short *)llr16;
-
- return(0);
-}
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 746c4ff5ca..7432c82aac 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -87,361 +87,6 @@ int32_t nr_dlsch_qpsk_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
uint16_t pbch_pss_sss_adj,
int16_t **llr128p);
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/16QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qpsk_qam16(int16_t *stream0_in,
- int16_t *stream1_in,
- short *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length);
-
-/** \brief This function perform LLR computation for dual-stream (QPSK/16QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr128p pointer to pointer to symbol in dlsch_llr*/
-int32_t nr_dlsch_qpsk_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adj,
- int16_t **llr128p);
-
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream QPSK/64QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qpsk_qam64(int16_t *stream0_in,
- int16_t *stream1_in,
- short *ch_mag_i,
- int16_t *stream0_out,
- int16_t *rho01,
- int32_t length);
-
-/** \brief This function perform LLR computation for dual-stream (QPSK/64QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr128p pointer to pointer to symbol in dlsch_llr*/
-int32_t nr_dlsch_qpsk_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int32_t **rxdataF_comp,
- int32_t **rxdataF_comp_i,
- int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int32_t **rho_i,
- int16_t *dlsch_llr,
- uint8_t symbol,
- uint8_t first_symbol_flag,
- uint16_t nb_rb,
- uint16_t pbch_pss_sss_adj,
- int16_t **llr128p);
-
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/QPSK reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qam16_qpsk(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *stream0_out,
- short *rho01,
- int length);
-/** \brief This function perform LLR computation for dual-stream (16QAM/QPSK) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_16qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- short **llr16p);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/16QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qam16_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function perform LLR computation for dual-stream (16QAM/16QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_16qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- uint32_t len,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- short **llr16p);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 16QAM/64QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qam16_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function perform LLR computation for dual-stream (16QAM/64QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_16qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag, //|h_0|^2*(2/sqrt{10})
- int **dl_ch_mag_i, //|h_1|^2*(2/sqrt{10})
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- short **llr16p);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qam64_qpsk(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_64qam_qpsk_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag,
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- short **llr16p);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void nr_qam64_qam16(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/16QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void qam64_qam16_avx2(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function perform LLR computation for dual-stream (64QAM/16QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_64qam_16qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag,
- int **dl_ch_mag_i,
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- short **llr16p);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void qam64_qam64(short *stream0_in,
- short *stream1_in,
- short *ch_mag,
- short *ch_mag_i,
- short *stream0_out,
- short *rho01,
- int length);
-
-/** \brief This function computes the LLRs for ML (max-logsum approximation) dual-stream 64QAM/64QAM reception.
- @param stream0_in Input from channel compensated (MR combined) stream 0
- @param stream1_in Input from channel compensated (MR combined) stream 1
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param stream0_out Output from LLR unit for stream0
- @param rho01 Cross-correlation between channels (MR combined)
- @param length in complex channel outputs*/
-void qam64_qam64_avx2(int32_t *stream0_in,
- int32_t *stream1_in,
- int32_t *ch_mag,
- int32_t *ch_mag_i,
- int16_t *stream0_out,
- int32_t *rho01,
- int length);
-
-/** \brief This function perform LLR computation for dual-stream (64QAM/64QAM) transmission.
- @param frame_parms Frame descriptor structure
- @param rxdataF_comp Compensated channel output
- @param rxdataF_comp_i Compensated channel output for interference
- @param ch_mag Input from scaled channel magnitude square of h0'*g0
- @param ch_mag_i Input from scaled channel magnitude square of h0'*g1
- @param rho_i Correlation between channel of signal and inteference
- @param dlsch_llr llr output
- @param symbol OFDM symbol index in sub-frame
- @param first_symbol_flag flag to indicate this is the first symbol of the dlsch
- @param nb_rb number of RBs for this allocation
- @param pbch_pss_sss_adj Number of channel bits taken by PBCH/PSS/SSS
- @param llr16p pointer to pointer to symbol in dlsch_llr*/
-int nr_dlsch_64qam_64qam_llr(NR_DL_FRAME_PARMS *frame_parms,
- int **rxdataF_comp,
- int **rxdataF_comp_i,
- int **dl_ch_mag,
- int **dl_ch_mag_i,
- int **rho_i,
- short *dlsch_llr,
- unsigned char symbol,
- uint32_t len,
- unsigned char first_symbol_flag,
- unsigned short nb_rb,
- uint16_t pbch_pss_sss_adjust,
- //short **llr16p,
- uint32_t llr_offset);
-
-
/** \brief This function generates log-likelihood ratios (decoder input) for single-stream QPSK received waveforms.
@param frame_parms Frame descriptor structure
@param rxdataF_comp Compensated channel output
@@ -518,95 +163,6 @@ void nr_dlsch_256qam_llr(NR_DL_FRAME_PARMS *frame_parms,
uint8_t first_symbol_flag,
uint16_t nb_rb);
-
-/** \fn dlsch_extract_rbs(int32_t **rxdataF,
- int32_t **dl_ch_estimates,
- int32_t **rxdataF_ext,
- int32_t **dl_ch_estimates_ext,
- unsigned char symbol
- uint8_t pilots,
- uint8_t config_type,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- uint8_t n_dmrs_cdm_groups,
- uint8_t Nl,
- NR_DL_FRAME_PARMS *frame_parms,
- uint16_t dlDmrsSymbPos)
- \brief This function extracts the received resource blocks, both channel estimates and data symbols,
- for the current allocation and for multiple layer antenna gNB transmission.
- @param rxdataF Raw FFT output of received signal
- @param dl_ch_estimates Channel estimates of current slot
- @param rxdataF_ext FFT output for RBs in this allocation
- @param dl_ch_estimates_ext Channel estimates for RBs in this allocation
- @param Nl nb of antenna layers
- @param symbol Symbol to extract
- @param n_dmrs_cdm_groups
- @param frame_parms Pointer to frame descriptor
-*/
-void nr_dlsch_extract_rbs(uint32_t rxdataF_sz,
- c16_t rxdataF[][rxdataF_sz],
- const uint32_t rx_size,
- const uint32_t pdsch_est_size,
- int32_t dl_ch_estimates[][pdsch_est_size],
- int32_t rxdataF_ext[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- unsigned char symbol,
- uint8_t pilots,
- uint8_t config_type,
- unsigned short start_rb,
- unsigned short nb_rb_pdsch,
- uint8_t n_dmrs_cdm_groups,
- uint8_t Nl,
- NR_DL_FRAME_PARMS *frame_parms,
- uint16_t dlDmrsSymbPos,
- int chest_time_type);
-
-/** \brief This function performs channel compensation (matched filtering) on the received RBs for this allocation. In addition, it computes the squared-magnitude of the channel with weightings for 16QAM/64QAM detection as well as dual-stream detection (cross-correlation)
- @param rxdataF_ext Frequency-domain received signal in RBs to be demodulated
- @param dl_ch_estimates_ext Frequency-domain channel estimates in RBs to be demodulated
- @param dl_ch_mag First Channel magnitudes (16QAM/64QAM)
- @param dl_ch_magb Second weighted Channel magnitudes (64QAM)
- @param rxdataF_comp Compensated received waveform
- @param rho Cross-correlation between two spatial channels on each RX antenna
- @param frame_parms Pointer to frame descriptor
- @param symbol Symbol on which to operate
- @param first_symbol_flag set to 1 on first DLSCH symbol
- @param mod_order Modulation order of allocation
- @param nb_rb Number of RBs in allocation
- @param output_shift Rescaling for compensated output (should be energy-normalizing)
- @param phy_measurements Pointer to UE PHY measurements
-*/
-void nr_dlsch_channel_compensation(uint32_t rx_size,
- int32_t rxdataF_ext[][rx_size],
- int32_t dl_ch_estimates_ext[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
- int32_t rxdataF_comp[][rx_size],
- int ***rho,
- NR_DL_FRAME_PARMS *frame_parms,
- uint8_t nb_aatx,
- unsigned char symbol,
- int length,
- uint8_t first_symbol_flag,
- unsigned char mod_order,
- unsigned short nb_rb,
- unsigned char output_shift,
- PHY_NR_MEASUREMENTS *measurements);
-
-void nr_dlsch_channel_compensation_core(int **rxdataF_ext,
- int **dl_ch_estimates_ext,
- int **dl_ch_mag,
- int **dl_ch_magb,
- int **rxdataF_comp,
- int ***rho,
- unsigned char n_tx,
- unsigned char n_rx,
- unsigned char mod_order,
- unsigned char output_shift,
- int length,
- int start_point);
-
void nr_dlsch_deinterleaving(uint8_t symbol,
uint8_t start_symbol,
uint16_t L,
@@ -614,63 +170,12 @@ void nr_dlsch_deinterleaving(uint8_t symbol,
uint16_t *llr_deint,
uint16_t nb_rb_pdsch);
-void nr_dlsch_channel_level_median(uint32_t rx_size,
- int32_t dl_ch_estimates[][rx_size],
- int32_t *median,
- int n_tx,
- int n_rx,
- int length,
- int start_point);
-
-void nr_dlsch_detection_mrc(uint32_t rx_size,
- int32_t rxdataF_comp[][rx_size],
- int ***rho,
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
- short n_tx,
- short n_rx,
- unsigned char symbol,
- unsigned short nb_rb,
- int length);
-
void nr_conjch0_mult_ch1(int *ch0,
int *ch1,
int32_t *ch0conj_ch1,
unsigned short nb_rb,
unsigned char output_shift0);
-void nr_a_sum_b(__m128i *input_x,
- __m128i *input_y,
- unsigned short nb_rb);
-
-
-/** \brief This function computes the average channel level over all allocated RBs and antennas (TX/RX) in order to compute output shift for compensated signal
- @param dl_ch_estimates_ext Channel estimates in allocated RBs
- @param frame_parms Pointer to frame descriptor
- @param avg Pointer to average signal strength
- @param pilots_flag Flag to indicate pilots in symbol
- @param nb_rb Number of allocated RBs
-*/
-void nr_dlsch_channel_level(uint32_t rx_size,
- int32_t dl_ch_estimates[][rx_size],
- NR_DL_FRAME_PARMS *frame_parms,
- uint8_t n_tx,
- int32_t *avg,
- uint8_t symbol,
- uint32_t len,
- unsigned short nb_rb);
-
-void nr_dlsch_scale_channel(uint32_t rx_size,
- int32_t dl_ch_estimates[][rx_size],
- NR_DL_FRAME_PARMS *frame_parms,
- uint8_t n_tx,
- uint8_t n_rx,
- uint8_t symbol,
- uint8_t pilots,
- uint32_t len,
- unsigned short nb_rb);
-
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
threads (on multi-core machines) corresponding to different HARQ processes. The routine first
computes the segmentation information, followed by rate dematching and sub-block deinterleaving the of the
@@ -877,23 +382,20 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
uint32_t pdsch_est_size,
int32_t dl_ch_estimates[][pdsch_est_size],
int16_t *llr[2],
- c16_t ptrs_phase_per_slot[][NR_SYMBOLS_PER_SLOT],
- int32_t ptrs_re_per_slot[][NR_SYMBOLS_PER_SLOT],
uint32_t dl_valid_re[NR_SYMBOLS_PER_SLOT],
- uint32_t rx_size,
- int32_t dl_ch_estimates_ext[][rx_size],
- int32_t rxdataF_ext[][rx_size],
- int32_t rxdataF_comp[][rx_size],
- int32_t dl_ch_mag[][rx_size],
- int32_t dl_ch_magb[][rx_size],
- int32_t dl_ch_magr[][rx_size],
c16_t rxdataF[][ue->frame_parms.samples_per_slot_wCP],
uint32_t llr_offset[NR_SYMBOLS_PER_SLOT],
- int32_t *log2_maxh);
+ int32_t *log2_maxhrx_size_symbol,
+ int rx_size_symbol,
+ int nbRx,
+ int32_t rxdataF_comp[][nbRx][rx_size_symbol],
+ c16_t ptrs_phase_per_slot[][NR_SYMBOLS_PER_SLOT],
+ int32_t ptrs_re_per_slot[][NR_SYMBOLS_PER_SLOT]);
int32_t generate_nr_prach(PHY_VARS_NR_UE *ue, uint8_t gNB_id, int frame, uint8_t slot);
void dump_nrdlsch(PHY_VARS_NR_UE *ue,uint8_t gNB_id,uint8_t nr_slot_rx,unsigned int *coded_bits_per_codeword,int round, unsigned char harq_pid);
+void nr_a_sum_b(c16_t *input_x, c16_t *input_y, unsigned short nb_rb);
/**@}*/
#endif
diff --git a/openair1/PHY/TOOLS/tools_defs.h b/openair1/PHY/TOOLS/tools_defs.h
index 62945456c3..aa3ea6fc41 100644
--- a/openair1/PHY/TOOLS/tools_defs.h
+++ b/openair1/PHY/TOOLS/tools_defs.h
@@ -97,6 +97,20 @@ extern "C" {
#define squaredMod(a) ((a).r*(a).r + (a).i*(a).i)
#define csum(res, i1, i2) (res).r = (i1).r + (i2).r ; (res).i = (i1).i + (i2).i
+ __attribute__((always_inline)) inline c16_t c16Shift(const c16_t a, const int Shift) {
+ return (c16_t) {
+ .r = (int16_t)(a.r >> Shift),
+ .i = (int16_t)(a.i >> Shift)
+ };
+ }
+
+ __attribute__((always_inline)) inline c16_t c16addShift(const c16_t a, const c16_t b, const int Shift) {
+ return (c16_t) {
+ .r = (int16_t)((a.r + b.r) >> Shift),
+ .i = (int16_t)((a.i + b.i) >> Shift)
+ };
+ }
+
__attribute__((always_inline)) inline c16_t c16mulShift(const c16_t a, const c16_t b, const int Shift) {
return (c16_t) {
.r = (int16_t)((a.r * b.r - a.i * b.i) >> Shift),
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index a68411c4cf..57b3dff776 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -577,9 +577,19 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
LOG_D(PHY,"[UE %d] nr_slot_rx %d, harq_pid %d (%d), rb_start %d, nb_rb %d, symbol_start %d, nb_symbols %d, DMRS mask %x, Nl %d\n",
ue->Mod_id,nr_slot_rx,harq_pid,dlsch0_harq->status,pdsch_start_rb,pdsch_nb_rb,s0,s1,dlsch0->dlsch_config.dlDmrsSymbPos, dlsch0->Nl);
- const uint32_t pdsch_est_size = ((ue->frame_parms.symbols_per_slot*ue->frame_parms.ofdm_symbol_size+15)/16)*16;
- __attribute__ ((aligned(32))) int32_t pdsch_dl_ch_estimates[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][pdsch_est_size];
- memset(pdsch_dl_ch_estimates, 0, sizeof(int32_t)*ue->frame_parms.nb_antennas_rx*dlsch0->Nl*pdsch_est_size);
+ const uint32_t pdsch_est_size = ((ue->frame_parms.symbols_per_slot * ue->frame_parms.ofdm_symbol_size + 15) / 16) * 16;
+ __attribute__((aligned(32))) int32_t pdsch_dl_ch_estimates[ue->frame_parms.nb_antennas_rx * dlsch0->Nl][pdsch_est_size];
+ memset(pdsch_dl_ch_estimates, 0, sizeof(int32_t) * ue->frame_parms.nb_antennas_rx * dlsch0->Nl * pdsch_est_size);
+
+ c16_t ptrs_phase_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
+ memset(ptrs_phase_per_slot, 0, sizeof(ptrs_phase_per_slot));
+
+ int32_t ptrs_re_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
+ memset(ptrs_re_per_slot, 0, sizeof(ptrs_re_per_slot));
+
+ const uint32_t rx_size_symbol = dlsch[0].dlsch_config.number_rbs * NR_NB_SC_PER_RB;
+ __attribute__((aligned(32))) int32_t rxdataF_comp[ue->frame_parms.nb_antennas_tx][ue->frame_parms.nb_antennas_rx][rx_size_symbol * NR_SYMBOLS_PER_SLOT];
+ memset(rxdataF_comp, 0, sizeof(rxdataF_comp));
for (m = s0; m < (s0 +s1); m++) {
if (dlsch0->dlsch_config.dlDmrsSymbPos & (1 << m)) {
@@ -598,7 +608,7 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
pdsch_nb_rb,
pdsch_est_size,
pdsch_dl_ch_estimates,
- rxdataF);
+ ue->frame_parms.samples_per_slot_wCP, rxdataF);
#if 0
///LOG_M: the channel estimation
int nr_frame_rx = proc->frame_rx;
@@ -635,35 +645,9 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
first_symbol_with_data++;
}
- c16_t ptrs_phase_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
- memset(ptrs_phase_per_slot, 0, ue->frame_parms.nb_antennas_rx*NR_SYMBOLS_PER_SLOT*sizeof(c16_t));
-
- int32_t ptrs_re_per_slot[ue->frame_parms.nb_antennas_rx][NR_SYMBOLS_PER_SLOT];
- memset(ptrs_re_per_slot, 0, ue->frame_parms.nb_antennas_rx*NR_SYMBOLS_PER_SLOT*sizeof(c16_t));
-
uint32_t dl_valid_re[NR_SYMBOLS_PER_SLOT] = {0};
uint32_t llr_offset[NR_SYMBOLS_PER_SLOT] = {0};
- const uint32_t rx_size = ((NR_SYMBOLS_PER_SLOT * dlsch[0].dlsch_config.number_rbs * NR_NB_SC_PER_RB + 15) >> 4) << 4;
-
- __attribute__ ((aligned(32))) int32_t dl_ch_estimates_ext[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(dl_ch_estimates_ext, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
- __attribute__ ((aligned(32))) int32_t rxdataF_ext[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(rxdataF_ext, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
- __attribute__ ((aligned(32))) int32_t rxdataF_comp[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(rxdataF_comp, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
- __attribute__ ((aligned(32))) int32_t dl_ch_mag[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(dl_ch_mag, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
- __attribute__ ((aligned(32))) int32_t dl_ch_magb[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(dl_ch_magb, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
- __attribute__ ((aligned(32))) int32_t dl_ch_magr[ue->frame_parms.nb_antennas_rx*dlsch0->Nl][rx_size];
- memset(dl_ch_magr, 0, ue->frame_parms.nb_antennas_rx*dlsch0->Nl*rx_size*sizeof(int32_t));
-
int32_t log2_maxh = 0;
start_meas(&ue->rx_pdsch_stats);
for (m = s0; m < (s1 + s0); m++) {
@@ -688,19 +672,16 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
pdsch_est_size,
pdsch_dl_ch_estimates,
llr,
- ptrs_phase_per_slot,
- ptrs_re_per_slot,
dl_valid_re,
- rx_size,
- dl_ch_estimates_ext,
- rxdataF_ext,
- rxdataF_comp,
- dl_ch_mag,
- dl_ch_magb,
- dl_ch_magr,
rxdataF,
llr_offset,
- &log2_maxh) < 0)
+ &log2_maxh,
+ rx_size_symbol,
+ ue->frame_parms.nb_antennas_rx,
+ rxdataF_comp,
+ ptrs_phase_per_slot,
+ ptrs_re_per_slot)
+ < 0)
return -1;
stop_meas(&ue->dlsch_llr_stats_parallelization[slot]);
@@ -711,17 +692,6 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue,
}
} // CRNTI active
stop_meas(&ue->rx_pdsch_stats);
-
- UEscopeCopy(ue, pdschRxdataF_comp, rxdataF_comp, sizeof(struct complex16), ue->frame_parms.nb_antennas_rx*dlsch0->Nl, rx_size);
-
- if (ue->phy_sim_pdsch_rxdataF_comp)
- memcpy(ue->phy_sim_pdsch_rxdataF_comp, rxdataF_comp, sizeof(int32_t)*rx_size*ue->frame_parms.nb_antennas_rx*dlsch0->Nl);
- if (ue->phy_sim_pdsch_rxdataF_ext)
- memcpy(ue->phy_sim_pdsch_rxdataF_ext, rxdataF_ext, sizeof(int32_t)*rx_size*ue->frame_parms.nb_antennas_rx*dlsch0->Nl);
- if (ue->phy_sim_pdsch_dl_ch_estimates_ext)
- memcpy(ue->phy_sim_pdsch_dl_ch_estimates_ext, dl_ch_estimates_ext, sizeof(int32_t)*rx_size*ue->frame_parms.nb_antennas_rx*dlsch0->Nl);
- if (ue->phy_sim_pdsch_dl_ch_estimates)
- memcpy(ue->phy_sim_pdsch_dl_ch_estimates, dl_ch_estimates_ext, sizeof(int32_t)*rx_size*ue->frame_parms.nb_antennas_rx*dlsch0->Nl);
}
return 0;
}
@@ -909,7 +879,6 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
const double N_TA_max = Ta_max * bw_scaling * tc_factor;
NR_UE_MAC_INST_t *mac = get_mac_inst(0);
- NR_BWP_Id_t dl_bwp = mac->current_DL_BWP.bwp_id;
NR_BWP_Id_t ul_bwp = mac->current_UL_BWP.bwp_id;
NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
@@ -938,17 +907,8 @@ bool nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
long mapping_type_ul = pusch_TimeDomainAllocationList ? pusch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PUSCH_TimeDomainResourceAllocation__mappingType_typeA;
- NR_PDSCH_Config_t *pdsch_Config = NULL;
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
- if(dl_bwp){
- pdsch_Config = (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup) ? mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
- if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
- else if (mac->DLbwp[dl_bwp-1] && mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
- }
- else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
- pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ NR_PDSCH_Config_t *pdsch_Config = mac->current_DL_BWP.pdsch_Config;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = mac->current_DL_BWP.tdaList_Common;
long mapping_type_dl = pdsch_TimeDomainAllocationList ? pdsch_TimeDomainAllocationList->list.array[0]->mappingType : NR_PDSCH_TimeDomainResourceAllocation__mappingType_typeA;
NR_DMRS_DownlinkConfig_t *NR_DMRS_dlconfig = NULL;
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 1fe4229c04..ed171523de 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -256,9 +256,10 @@ void nr_dlsim_preprocessor(module_id_t module_id,
* configuration */
current_BWP->mcsTableIdx = g_mcsTableIdx;
sched_pdsch->time_domain_allocation = get_dl_tda(RC.nrmac[module_id], scc, slot);
- AssertFatal(sched_pdsch->time_domain_allocation>=0,"Unable to find PDSCH time domain allocation in list\n");
+ AssertFatal(sched_pdsch->time_domain_allocation >= 0,"Unable to find PDSCH time domain allocation in list\n");
- sched_pdsch->tda_info = nr_get_pdsch_tda_info(current_BWP, sched_pdsch->time_domain_allocation);
+ sched_pdsch->tda_info = get_dl_tda_info(current_BWP, sched_ctrl->search_space->searchSpaceType->present, sched_pdsch->time_domain_allocation,
+ NR_MIB__dmrs_TypeA_Position_pos2, 1, NR_RNTI_C, sched_ctrl->coreset->controlResourceSetId, false);
sched_pdsch->dmrs_parms = get_dl_dmrs_params(scc,
current_BWP,
@@ -309,6 +310,7 @@ int NB_UE_INST = 1;
int main(int argc, char **argv)
{
+ setbuf(stdout, NULL);
char c;
int i,aa;//,l;
double sigma2, sigma2_dB=10, SNR, snr0=-2.0, snr1=2.0;
@@ -1219,9 +1221,11 @@ int main(int argc, char **argv)
uint8_t nb_symb_sch = rel15->NrOfSymbols;
available_bits = nr_get_G(nb_rb, nb_symb_sch, nb_re_dmrs, length_dmrs, mod_order, rel15->nrOfLayers);
- if(pdu_bit_map & 0x1) {
- available_bits-= (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2);
- printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n",available_bits, (ptrsSymbPerSlot * ptrsRePerSymb *rel15->nrOfLayers* 2) );
+ if (pdu_bit_map & 0x1) {
+ available_bits -= (ptrsSymbPerSlot * ptrsRePerSymb * rel15->nrOfLayers * 2);
+ if (trial == 0 && round == 0) {
+ printf("[DLSIM][PTRS] Available bits are: %5u, removed PTRS bits are: %5u \n", available_bits, (ptrsSymbPerSlot * ptrsRePerSymb * rel15->nrOfLayers * 2));
+ }
}
for (i = 0; i < available_bits; i++) {
diff --git a/openair2/COMMON/f1ap_messages_types.h b/openair2/COMMON/f1ap_messages_types.h
index 159af160ea..d8aac0fff1 100644
--- a/openair2/COMMON/f1ap_messages_types.h
+++ b/openair2/COMMON/f1ap_messages_types.h
@@ -356,7 +356,7 @@ typedef struct cu_to_du_rrc_information_s {
uint32_t measConfig_length;
}cu_to_du_rrc_information_t;
-typedef struct du_to_du_rrc_information_s {
+typedef struct du_to_cu_rrc_information_s {
uint8_t * cellGroupConfig;
uint32_t cellGroupConfig_length;
uint8_t * measGapConfig;
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index fec7e90178..4af6eb02e6 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -574,9 +574,10 @@ typedef struct NR_UE_DL_BWP {
uint16_t BWPStart;
uint16_t initial_BWPSize;
uint16_t initial_BWPStart;
- NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
NR_PDSCH_Config_t *pdsch_Config;
NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig;
+ long *pdsch_HARQ_ACK_Codebook;
uint8_t mcsTableIdx;
nr_dci_format_t dci_format;
} NR_UE_DL_BWP_t;
@@ -590,18 +591,40 @@ typedef struct NR_UE_UL_BWP {
uint16_t BWPStart;
uint16_t initial_BWPSize;
uint16_t initial_BWPStart;
+ NR_RACH_ConfigCommon_t *rach_ConfigCommon;
NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig;
- NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList_Common;
+ NR_ConfiguredGrantConfig_t *configuredGrantConfig;
NR_PUSCH_Config_t *pusch_Config;
NR_PUCCH_Config_t *pucch_Config;
NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
+ long *harq_ACK_SpatialBundlingPUCCH;
NR_CSI_MeasConfig_t *csi_MeasConfig;
NR_SRS_Config_t *srs_Config;
+ long *msg3_DeltaPreamble;
uint8_t transform_precoding;
uint8_t mcs_table;
nr_dci_format_t dci_format;
int max_fb_time;
} NR_UE_UL_BWP_t;
+typedef enum {
+ defaultA = 0,
+ defaultB = 1,
+ defaultC = 2
+} default_table_type_t;
+
+typedef enum {
+ typeA = 0,
+ typeB = 1
+} mappingType_t;
+
+typedef struct NR_tda_info {
+ mappingType_t mapping_type;
+ int startSymbolIndex;
+ int nrOfSymbols;
+ long k2;
+} NR_tda_info_t;
+
#endif /*__LAYER2_MAC_H__ */
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
index 619f64dee9..7ee06c4406 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.c
@@ -419,79 +419,230 @@ const char table_38211_6_3_1_5_5[22][4][2] = {
{{'1', '1'}, {'o', 'o'}, {'j', 'o'}, {'1', 'n'}} // tpmi 21
};
-void get_info_from_tda_tables(int default_abc,
- int tda,
- int dmrs_TypeA_Position,
- int normal_CP,
- bool *is_mapping_typeA,
- int *startSymbolIndex,
- int *nrOfSymbols) {
+// Default PUSCH time domain resource allocation tables from 38.214
+const uint8_t table_6_1_2_1_1_2[16][4] = {
+ {0, 0, 0, 14}, // row index 1
+ {0, 0, 0, 12}, // row index 2
+ {0, 0, 0, 10}, // row index 3
+ {1, 0, 2, 10}, // row index 4
+ {1, 0, 4, 10}, // row index 5
+ {1, 0, 4, 8}, // row index 6
+ {1, 0, 4, 6}, // row index 7
+ {0, 1, 0, 14}, // row index 8
+ {0, 1, 0, 12}, // row index 9
+ {0, 1, 0, 10}, // row index 10
+ {0, 2, 0, 14}, // row index 11
+ {0, 2, 0, 12}, // row index 12
+ {0, 2, 0, 10}, // row index 13
+ {1, 0, 8, 6}, // row index 14
+ {0, 3, 0, 14}, // row index 15
+ {0, 3, 0, 10} // row index 16
+};
+
+const uint8_t table_6_1_2_1_1_3[16][4] = {
+ {0, 0, 0, 8}, // row index 1
+ {0, 0, 0, 12}, // row index 2
+ {0, 0, 0, 10}, // row index 3
+ {1, 0, 2, 10}, // row index 4
+ {1, 0, 4, 4}, // row index 5
+ {1, 0, 4, 8}, // row index 6
+ {1, 0, 4, 6}, // row index 7
+ {0, 1, 0, 8}, // row index 8
+ {0, 1, 0, 12}, // row index 9
+ {0, 1, 0, 10}, // row index 10
+ {0, 2, 0, 6}, // row index 11
+ {0, 2, 0, 12}, // row index 12
+ {0, 2, 0, 10}, // row index 13
+ {1, 0, 8, 4}, // row index 14
+ {0, 3, 0, 8}, // row index 15
+ {0, 3, 0, 10} // row index 16
+};
+
+NR_tda_info_t get_ul_tda_info(const NR_UE_UL_BWP_t *ul_bwp, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type, int tda_index)
+{
+ NR_tda_info_t tda_info = {0};
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdalist = get_ul_tdalist(ul_bwp, controlResourceSetId, ss_type, rnti_type);
+ // Definition of value j in Table 6.1.2.1.1-4 of 38.214
+ int scs = ul_bwp->scs;
+ AssertFatal(scs >= 0 && scs < 5, "Subcarrier spacing indicatior %d invalid value\n", scs);
+ int j = scs == 0 ? 1 : scs;
+ if (tdalist) {
+ AssertFatal(tda_index < tdalist->list.count, "TDA index from DCI %d exceeds TDA list array size %d\n", tda_index, tdalist->list.count);
+ NR_PUSCH_TimeDomainResourceAllocation_t *tda = tdalist->list.array[tda_index];
+ tda_info.mapping_type = tda->mappingType;
+ // As described in 38.331, when the field is absent the UE applies the value 1 when PUSCH SCS is 15/30KHz
+ // 2 when PUSCH SCS is 60KHz and 3 when PUSCH SCS is 120KHz. This equates to the parameter j.
+ tda_info.k2 = tda->k2 ? *tda->k2 : j;
+ int S, L;
+ SLIV2SL(tda->startSymbolAndLength, &S, &L);
+ tda_info.startSymbolIndex = S;
+ tda_info.nrOfSymbols = L;
+ } else {
+ bool normal_CP = ul_bwp->cyclicprefix ? false : true;
+ if (normal_CP) {
+ tda_info.mapping_type = table_6_1_2_1_1_2[tda_index][0];
+ tda_info.k2 = table_6_1_2_1_1_2[tda_index][1] + j;
+ tda_info.startSymbolIndex = table_6_1_2_1_1_2[tda_index][2];
+ tda_info.nrOfSymbols = table_6_1_2_1_1_2[tda_index][3];
+ } else {
+ tda_info.mapping_type = table_6_1_2_1_1_3[tda_index][0];
+ tda_info.k2 = table_6_1_2_1_1_3[tda_index][1] + j;
+ tda_info.startSymbolIndex = table_6_1_2_1_1_3[tda_index][2];
+ tda_info.nrOfSymbols = table_6_1_2_1_1_3[tda_index][3];
+ }
+ }
+ return tda_info;
+}
+
+NR_tda_info_t get_info_from_tda_tables(default_table_type_t table_type,
+ int tda,
+ int dmrs_TypeA_Position,
+ int normal_CP)
+{
+ NR_tda_info_t tda_info = {0};
+ bool is_mapping_typeA;
int k0 = 0;
- switch(default_abc){
- case 1:
+ switch(table_type){
+ case defaultA:
if (normal_CP){
if (dmrs_TypeA_Position){
- *is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][0];
k0 = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos3[tda][3];
}
else{
- *is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][0];
k0 = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_2_time_dom_res_alloc_A_dmrs_typeA_pos2[tda][3];
}
}
else{
if (dmrs_TypeA_Position){
- *is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][0];
k0 = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos3[tda][3];
}
else{
- *is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][0];
k0 = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_3_time_dom_res_alloc_A_extCP_dmrs_typeA_pos2[tda][3];
}
}
break;
- case 2:
+ case defaultB:
if (dmrs_TypeA_Position){
- *is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][0];
k0 = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos3[tda][3];
}
else{
- *is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][0];
k0 = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_4_time_dom_res_alloc_B_dmrs_typeA_pos2[tda][3];
}
break;
- case 3:
+ case defaultC:
if (dmrs_TypeA_Position){
- *is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][0];
k0 = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos3[tda][3];
}
else{
- *is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][0];
+ is_mapping_typeA = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][0];
k0 = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][1];
- *startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][2];
- *nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][3];
+ tda_info.startSymbolIndex = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][2];
+ tda_info.nrOfSymbols = table_5_1_2_1_1_5_time_dom_res_alloc_C_dmrs_typeA_pos2[tda][3];
}
break;
default:
- AssertFatal(1==0,"Invalid default time domaing allocation type\n");
+ AssertFatal(1 == 0, "Invalid default time domaing allocation type\n");
}
- AssertFatal(k0==0,"Only k0 = 0 is supported\n");
+ AssertFatal(k0 == 0, "Only k0 = 0 is supported\n");
+ tda_info.mapping_type = is_mapping_typeA ? typeA : typeB;
+ return tda_info;
}
+default_table_type_t get_default_table_type(int mux_pattern)
+{
+ switch (mux_pattern) {
+ case 1:
+ return defaultA;
+ case 2:
+ return defaultB;
+ case 3:
+ return defaultC;
+ default :
+ AssertFatal(1 == 0, "Invalid multiplexing type %d\n", mux_pattern);
+ }
+}
+
+NR_tda_info_t set_tda_info_from_list(NR_PDSCH_TimeDomainResourceAllocationList_t *tdalist, int tda_index)
+{
+ NR_tda_info_t tda_info = {0};
+ AssertFatal(tda_index < tdalist->list.count, "TDA index from DCI %d exceeds TDA list array size %d\n", tda_index, tdalist->list.count);
+ NR_PDSCH_TimeDomainResourceAllocation_t *tda = tdalist->list.array[tda_index];
+ tda_info.mapping_type = tda->mappingType;
+ int S, L;
+ SLIV2SL(tda->startSymbolAndLength, &S, &L);
+ tda_info.startSymbolIndex = S;
+ tda_info.nrOfSymbols = L;
+ return tda_info;
+}
+
+NR_tda_info_t get_dl_tda_info(const NR_UE_DL_BWP_t *dl_BWP, int ss_type, int tda_index, int dmrs_typeA_pos,
+ int mux_pattern, nr_rnti_type_t rnti_type, int coresetid, bool sib1)
+{
+ NR_tda_info_t tda_info;
+ bool normal_CP = dl_BWP->cyclicprefix ? false : true;
+ // implements Table 5.1.2.1.1-1 of 38.214
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdalist = get_dl_tdalist(dl_BWP, coresetid, ss_type, rnti_type);
+ switch (rnti_type) {
+ case NR_RNTI_SI:
+ if(sib1) {
+ default_table_type_t table_type = get_default_table_type(mux_pattern);
+ tda_info = get_info_from_tda_tables(table_type, tda_index, dmrs_typeA_pos, normal_CP);
+ }
+ else {
+ if(tdalist)
+ tda_info = set_tda_info_from_list(tdalist, tda_index);
+ else {
+ default_table_type_t table_type = get_default_table_type(mux_pattern);
+ tda_info = get_info_from_tda_tables(table_type, tda_index, dmrs_typeA_pos, normal_CP);
+ }
+ }
+ break;
+ case NR_RNTI_P:
+ if(tdalist)
+ tda_info = set_tda_info_from_list(tdalist, tda_index);
+ else {
+ default_table_type_t table_type = get_default_table_type(mux_pattern);
+ tda_info = get_info_from_tda_tables(table_type, tda_index, dmrs_typeA_pos, normal_CP);
+ }
+ break;
+ case NR_RNTI_C:
+ case NR_RNTI_CS:
+ case NR_RNTI_MCS_C:
+ case NR_RNTI_RA:
+ case NR_RNTI_TC:
+ if(tdalist)
+ tda_info = set_tda_info_from_list(tdalist, tda_index);
+ else
+ tda_info = get_info_from_tda_tables(defaultA, tda_index, dmrs_typeA_pos, normal_CP);
+ break;
+ default :
+ AssertFatal(1 == 0, "Invalid RNTI type\n");
+ }
+ return tda_info;
+}
+
+
const char *prachfmt[]={"0","1","2","3", "A1","A2","A3","B1","B4","C0","C2","A1/B1","A2/B2","A3/B3"};
uint16_t get_NCS(uint8_t index, uint16_t format0, uint8_t restricted_set_config) {
@@ -2701,38 +2852,15 @@ uint16_t get_nr_srs_offset(NR_SRS_PeriodicityAndOffset_t periodicityAndOffset) {
// Set the transform precoding status according to 6.1.3 of 3GPP TS 38.214 version 16.3.0 Release 16:
// - "UE procedure for applying transform precoding on PUSCH"
-uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP,
- const NR_PUSCH_Config_t *pusch_config,
- const NR_BWP_UplinkDedicated_t *ubwp,
- uint8_t *dci_format,
- int rnti_type,
- uint8_t configuredGrant){
+uint8_t get_transformPrecoding(const NR_UE_UL_BWP_t *current_UL_BWP, nr_dci_format_t dci_format, uint8_t configuredGrant)
+{
+ if (configuredGrant && current_UL_BWP->configuredGrantConfig && current_UL_BWP->configuredGrantConfig->transformPrecoder)
+ return *current_UL_BWP->configuredGrantConfig->transformPrecoder;
- if (configuredGrant) {
- if (ubwp->configuredGrantConfig) {
- if (ubwp->configuredGrantConfig->choice.setup->transformPrecoder) {
- return *ubwp->configuredGrantConfig->choice.setup->transformPrecoder;
- }
- }
- }
-
- if (rnti_type != NR_RNTI_RA && rnti_type != NR_RNTI_TC) {
- if (*dci_format != NR_UL_DCI_FORMAT_0_0) {
- if (pusch_config && pusch_config->transformPrecoder != NULL) {
- return *pusch_config->transformPrecoder;
- }
- }
- }
-
- if (initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder == NULL) {
- return 1; // Transformprecoding disabled
- } else {
- LOG_D(PHY, "MAC_COMMON: Transform Precodig enabled through msg3_transformPrecoder\n");
- return 0; // Enabled
- }
-
- LOG_E(MAC, "In %s: could not fetch transform precoder status...\n", __FUNCTION__);
- return -1;
+ if (dci_format == NR_UL_DCI_FORMAT_0_1 && current_UL_BWP && current_UL_BWP->pusch_Config && current_UL_BWP->pusch_Config->transformPrecoder)
+ return *current_UL_BWP->pusch_Config->transformPrecoder;
+ else
+ return current_UL_BWP->rach_ConfigCommon->msg3_transformPrecoder ? 0 : 1;
}
uint8_t get_pusch_nb_antenna_ports(NR_PUSCH_Config_t *pusch_Config,
@@ -3130,6 +3258,27 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
return nbits;
}
+NR_PDSCH_TimeDomainResourceAllocationList_t *get_dl_tdalist(const NR_UE_DL_BWP_t *DL_BWP, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type)
+{
+ if (!DL_BWP)
+ return NULL;
+ // see table 5.1.2.1.1-1 in 38.214
+ if ((rnti_type == NR_RNTI_CS || rnti_type == NR_RNTI_C || rnti_type == NR_RNTI_MCS_C) && !(ss_type == NR_SearchSpace__searchSpaceType_PR_common && controlResourceSetId == 0)
+ && (DL_BWP->pdsch_Config && DL_BWP->pdsch_Config->pdsch_TimeDomainAllocationList))
+ return DL_BWP->pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
+ else
+ return DL_BWP->tdaList_Common;
+}
+
+NR_PUSCH_TimeDomainResourceAllocationList_t *get_ul_tdalist(const NR_UE_UL_BWP_t *UL_BWP, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type)
+{
+ if ((rnti_type == NR_RNTI_CS || rnti_type == NR_RNTI_C || rnti_type == NR_RNTI_MCS_C) && !(ss_type == NR_SearchSpace__searchSpaceType_PR_common && controlResourceSetId == 0)
+ && (UL_BWP->pusch_Config && UL_BWP->pusch_Config->pusch_TimeDomainAllocationList))
+ return UL_BWP->pusch_Config->pusch_TimeDomainAllocationList->choice.setup;
+ else
+ return UL_BWP->tdaList_Common;
+}
+
uint16_t get_rb_bwp_dci(nr_dci_format_t format,
int ss_type,
uint16_t cset0_bwp_size,
@@ -3155,15 +3304,13 @@ uint16_t get_rb_bwp_dci(nr_dci_format_t format,
return N_RB;
}
-uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
- const NR_BWP_UplinkCommon_t *initialUplinkBWP,
- const NR_UE_DL_BWP_t *DL_BWP,
+uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
const NR_UE_UL_BWP_t *UL_BWP,
const NR_CellGroupConfig_t *cg,
dci_pdu_rel15_t *dci_pdu,
nr_dci_format_t format,
nr_rnti_type_t rnti_type,
- int controlResourceSetId,
+ NR_ControlResourceSet_t *coreset,
int bwp_id,
int ss_type,
uint16_t cset0_bwp_size,
@@ -3175,43 +3322,10 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
long rbg_size_config;
int num_entries = 0;
- NR_UplinkConfig_t *uplinkConfig = NULL;
- if (cg && cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated) {
- uplinkConfig = cg->spCellConfig->spCellConfigDedicated->uplinkConfig;
- }
-
- const NR_BWP_DownlinkDedicated_t *bwpd = NULL;
- const NR_BWP_UplinkDedicated_t *ubwpd = NULL;
- const NR_BWP_DownlinkCommon_t *bwpc = NULL;
- const NR_BWP_UplinkCommon_t *ubwpc = NULL;
- NR_PDSCH_Config_t *pdsch_Config = NULL;
- NR_PUSCH_Config_t *pusch_Config = NULL;
- NR_PUCCH_Config_t *pucch_Config = NULL;
- NR_PDCCH_Config_t *pdcch_Config = NULL;
- NR_SRS_Config_t *srs_config = NULL;
- if(bwp_id > 0) {
- AssertFatal(cg!=NULL,"Cellgroup is null and bwp_id!=0");
- bwpd = cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated;
- bwpc = cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Common;
- ubwpd = uplinkConfig ? uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Dedicated : NULL;
- ubwpc = uplinkConfig ? uplinkConfig->uplinkBWP_ToAddModList->list.array[bwp_id-1]->bwp_Common : NULL;
- pdsch_Config = (bwpd->pdsch_Config) ? bwpd->pdsch_Config->choice.setup : NULL;
- pdcch_Config = (bwpd->pdcch_Config) ? bwpd->pdcch_Config->choice.setup : NULL;
- pucch_Config = (ubwpd->pucch_Config) ? ubwpd->pucch_Config->choice.setup : NULL;
- pusch_Config = (ubwpd->pusch_Config) ? ubwpd->pusch_Config->choice.setup : NULL;
- srs_config = (ubwpd->srs_Config) ? ubwpd->srs_Config->choice.setup : NULL;
- } else if (cg) {
- bwpc = initialDownlinkBWP;
- ubwpc = initialUplinkBWP;
- bwpd = cg->spCellConfig && cg->spCellConfig->spCellConfigDedicated ?
- cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP : NULL;
- ubwpd = uplinkConfig ? uplinkConfig->initialUplinkBWP : NULL;
- pdsch_Config = (bwpd && bwpd->pdsch_Config) ? bwpd->pdsch_Config->choice.setup : NULL;
- pdcch_Config = (bwpd && bwpd->pdcch_Config) ? bwpd->pdcch_Config->choice.setup : NULL;
- pucch_Config = (ubwpd && ubwpd->pucch_Config) ? ubwpd->pucch_Config->choice.setup : NULL;
- pusch_Config = (ubwpd && ubwpd->pusch_Config) ? ubwpd->pusch_Config->choice.setup : NULL;
- srs_config = (ubwpd && ubwpd->srs_Config) ? ubwpd->srs_Config->choice.setup: NULL;
- }
+ NR_PDSCH_Config_t *pdsch_Config = DL_BWP ? DL_BWP->pdsch_Config : NULL;
+ NR_PUSCH_Config_t *pusch_Config = UL_BWP ? UL_BWP->pusch_Config : NULL;
+ NR_PUCCH_Config_t *pucch_Config = UL_BWP ? UL_BWP->pucch_Config : NULL;
+ NR_SRS_Config_t *srs_config = UL_BWP ? UL_BWP->srs_Config : NULL;
uint16_t N_RB = cset0_bwp_size;
if (DL_BWP)
@@ -3223,7 +3337,6 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
UL_BWP->initial_BWPSize,
DL_BWP->initial_BWPSize);
- int n_ul_bwp = 1,n_dl_bwp = 1;
switch(format) {
case NR_UL_DCI_FORMAT_0_0:
/// fixed: Format identifier 1, Hop flag 1, MCS 5, NDI 1, RV 2, HARQ PID 4, PUSCH TPC 2 Time Domain assgnmt 4 --20
@@ -3253,14 +3366,11 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
size += dci_pdu->ul_sul_indicator.nbits;
}
// BWP Indicator
- n_ul_bwp = 0;
- if (cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList)
- n_ul_bwp = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList->list.count;
- if (n_ul_bwp < 2)
- dci_pdu->bwp_indicator.nbits = n_ul_bwp;
+ if (UL_BWP->n_ul_bwp < 2)
+ dci_pdu->bwp_indicator.nbits = UL_BWP->n_ul_bwp;
else
dci_pdu->bwp_indicator.nbits = 2;
+ LOG_D(NR_MAC, "BWP indicator nbits %d, num UL BWPs %d\n", dci_pdu->bwp_indicator.nbits, UL_BWP->n_ul_bwp);
size += dci_pdu->bwp_indicator.nbits;
// Freq domain assignment
if (pusch_Config) {
@@ -3278,19 +3388,13 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
}
else
dci_pdu->frequency_domain_assignment.nbits = (int)ceil(log2((N_RB * (N_RB + 1)) >> 1));
- LOG_D(NR_MAC,"PUSCH Frequency Domain Assignment nbits %d, N_RB %d\n",dci_pdu->frequency_domain_assignment.nbits,N_RB);
+ LOG_D(NR_MAC, "PUSCH Frequency Domain Assignment nbits %d, N_RB %d\n", dci_pdu->frequency_domain_assignment.nbits, N_RB);
size += dci_pdu->frequency_domain_assignment.nbits;
// Time domain assignment
- if (pusch_Config==NULL || pusch_Config->pusch_TimeDomainAllocationList==NULL) {
- if (ubwpc->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList==NULL)
- num_entries = 16; // num of entries in default table
- else
- num_entries = ubwpc->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.count;
- }
- else
- num_entries = pusch_Config->pusch_TimeDomainAllocationList->choice.setup->list.count;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdalistul = get_ul_tdalist(UL_BWP, coreset->controlResourceSetId, ss_type, rnti_type);
+ num_entries = tdalistul ? tdalistul->list.count : 16; // 16 in default table
dci_pdu->time_domain_assignment.nbits = (int)ceil(log2(num_entries));
- LOG_D(NR_MAC,"PUSCH Time Domain Allocation nbits %d, pusch_Config %p\n",dci_pdu->time_domain_assignment.nbits,pusch_Config);
+ LOG_D(NR_MAC, "PUSCH Time Domain Allocation nbits %d, pusch_Config %p\n", dci_pdu->time_domain_assignment.nbits, pusch_Config);
size += dci_pdu->time_domain_assignment.nbits;
// Frequency Hopping flag
if (pusch_Config &&
@@ -3300,21 +3404,19 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
size += 1;
}
// 1st DAI
- if (cg->physicalCellGroupConfig && cg->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook == NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic)
+ if (DL_BWP->pdsch_HARQ_ACK_Codebook && *DL_BWP->pdsch_HARQ_ACK_Codebook == NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic)
dci_pdu->dai[0].nbits = 2;
else
dci_pdu->dai[0].nbits = 1;
size += dci_pdu->dai[0].nbits;
LOG_D(NR_MAC, "DAI1 nbits %d\n", dci_pdu->dai[0].nbits);
// 2nd DAI
- if (cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig && cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup
- && cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) { // TODO not sure about that
+ if (DL_BWP->pdsch_servingcellconfig && DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
dci_pdu->dai[1].nbits = 2;
size += dci_pdu->dai[1].nbits;
}
// SRS resource indicator
- NR_PUSCH_ServingCellConfig_t *pusch_servingcellconfig = uplinkConfig && uplinkConfig->pusch_ServingCellConfig ? uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL;
- dci_pdu->srs_resource_indicator.nbits = compute_srs_resource_indicator(pusch_servingcellconfig, pusch_Config, srs_config, NULL, NULL);
+ dci_pdu->srs_resource_indicator.nbits = compute_srs_resource_indicator(UL_BWP->pusch_servingcellconfig, pusch_Config, srs_config, NULL, NULL);
size += dci_pdu->srs_resource_indicator.nbits;
LOG_D(NR_MAC, "dci_pdu->srs_resource_indicator.nbits %d\n", dci_pdu->srs_resource_indicator.nbits);
// Precoding info and number of layers
@@ -3322,7 +3424,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
size += dci_pdu->precoding_information.nbits;
LOG_D(NR_MAC, "dci_pdu->precoding_informaiton.nbits=%d\n", dci_pdu->precoding_information.nbits);
// Antenna ports
- long transformPrecoder = get_transformPrecoding(initialUplinkBWP, pusch_Config, ubwpd, (uint8_t *)&format, rnti_type, 0);
+ long transformPrecoder = get_transformPrecoding(UL_BWP, format, 0);
NR_DMRS_UplinkConfig_t *NR_DMRS_UplinkConfig = NULL;
int xa = 0;
int xb = 0;
@@ -3348,16 +3450,15 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
dci_pdu->srs_request.nbits = 3;
size += dci_pdu->srs_request.nbits;
// CSI request
- if (cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig != NULL) {
- if (cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup->reportTriggerSize != NULL) {
- dci_pdu->csi_request.nbits = *cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup->reportTriggerSize;
+ if (UL_BWP->csi_MeasConfig != NULL) {
+ if (UL_BWP->csi_MeasConfig->reportTriggerSize != NULL) {
+ dci_pdu->csi_request.nbits = *UL_BWP->csi_MeasConfig->reportTriggerSize;
size += dci_pdu->csi_request.nbits;
}
}
// CBGTI
- if (cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig &&
- cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) {
- int num = cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
+ if (UL_BWP->pusch_servingcellconfig && UL_BWP->pusch_servingcellconfig->codeBlockGroupTransmission != NULL) {
+ int num = UL_BWP->pusch_servingcellconfig->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock;
dci_pdu->cbgti.nbits = 2 + (num<<1);
size += dci_pdu->cbgti.nbits;
}
@@ -3403,7 +3504,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
break;
case NR_DL_DCI_FORMAT_1_1:
- LOG_D(NR_MAC,"DCI_FORMAT 1_1 : pdsch_Config %p, pucch_Config %p\n",pdsch_Config,pucch_Config);
+ LOG_D(NR_MAC, "DCI_FORMAT 1_1 : pdsch_Config %p, pucch_Config %p\n", pdsch_Config, pucch_Config);
// General note: 0 bits condition is ignored as default nbits is 0.
// Format identifier
size = 1;
@@ -3414,11 +3515,8 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
}
// BWP Indicator
- n_dl_bwp = 0;
- if (cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList)
- n_dl_bwp = cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList->list.count;
- if (n_dl_bwp < 2)
- dci_pdu->bwp_indicator.nbits = n_dl_bwp;
+ if (DL_BWP->n_dl_bwp < 2)
+ dci_pdu->bwp_indicator.nbits = DL_BWP->n_dl_bwp;
else
dci_pdu->bwp_indicator.nbits = 2;
size += dci_pdu->bwp_indicator.nbits;
@@ -3435,15 +3533,8 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
dci_pdu->frequency_domain_assignment.nbits = ((int)ceil(log2((N_RB * (N_RB + 1)) >> 1)) > numRBG) ? (int)ceil(log2((N_RB * (N_RB + 1)) >> 1)) + 1 : numRBG + 1;
size += dci_pdu->frequency_domain_assignment.nbits;
LOG_D(NR_MAC,"dci_pdu->frequency_domain_assignment.nbits %d (N_RB %d)\n",dci_pdu->frequency_domain_assignment.nbits,N_RB);
- // Time domain assignment (see table 5.1.2.1.1-1 in 38.214
- if (pdsch_Config == NULL || pdsch_Config->pdsch_TimeDomainAllocationList==NULL) {
- if (bwpc->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList==NULL)
- num_entries = 16; // num of entries in default table
- else
- num_entries = bwpc->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList->list.count;
- }
- else
- num_entries = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup->list.count;
+ NR_PDSCH_TimeDomainResourceAllocationList_t *tdalist = get_dl_tdalist(DL_BWP, coreset->controlResourceSetId, ss_type, rnti_type);
+ num_entries = tdalist ? tdalist->list.count : 16; // 16 in default table
dci_pdu->time_domain_assignment.nbits = (int)ceil(log2(num_entries));
LOG_D(NR_MAC,"pdsch tda.nbits= %d\n",dci_pdu->time_domain_assignment.nbits);
size += dci_pdu->time_domain_assignment.nbits;
@@ -3485,8 +3576,7 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
// HARQ PID
size += 4;
// DAI
- if (cg->physicalCellGroupConfig &&
- cg->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook == NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic) { // FIXME in case of more than one serving cell
+ if (DL_BWP->pdsch_HARQ_ACK_Codebook && *DL_BWP->pdsch_HARQ_ACK_Codebook == NR_PhysicalCellGroupConfig__pdsch_HARQ_ACK_Codebook_dynamic) { // FIXME in case of more than one serving cell
dci_pdu->dai[0].nbits = 2;
size += dci_pdu->dai[0].nbits;
}
@@ -3508,15 +3598,9 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
size += dci_pdu->antenna_ports.nbits;
LOG_D(NR_MAC,"dci_pdu->antenna_ports.nbits %d\n",dci_pdu->antenna_ports.nbits);
// Tx Config Indication
- for (int i = 0; i < pdcch_Config->controlResourceSetToAddModList->list.count; i++) {
- if (pdcch_Config->controlResourceSetToAddModList->list.array[i]->controlResourceSetId == controlResourceSetId) {
- long *isTciEnable = pdcch_Config->controlResourceSetToAddModList->list.array[i]->tci_PresentInDCI;
- if (isTciEnable != NULL) {
- dci_pdu->transmission_configuration_indication.nbits = 3;
- size += dci_pdu->transmission_configuration_indication.nbits;
- }
- break;
- }
+ if (coreset->tci_PresentInDCI != NULL) {
+ dci_pdu->transmission_configuration_indication.nbits = 3;
+ size += dci_pdu->transmission_configuration_indication.nbits;
}
// SRS request
if (cg->spCellConfig->spCellConfigDedicated->supplementaryUplink==NULL)
@@ -3525,16 +3609,14 @@ uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
dci_pdu->srs_request.nbits = 3;
size += dci_pdu->srs_request.nbits;
// CBGTI
- if (cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig &&
- cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup &&
- cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) {
- uint8_t maxCBGperTB = (cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock + 1) * 2;
+ if (DL_BWP->pdsch_servingcellconfig && DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
+ uint8_t maxCBGperTB = (DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup->maxCodeBlockGroupsPerTransportBlock + 1) * 2;
long *maxCWperDCI_rrc = pdsch_Config->maxNrofCodeWordsScheduledByDCI;
uint8_t maxCW = (maxCWperDCI_rrc == NULL) ? 1 : *maxCWperDCI_rrc;
dci_pdu->cbgti.nbits = maxCBGperTB * maxCW;
size += dci_pdu->cbgti.nbits;
// CBGFI
- if (cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator) {
+ if (DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission->choice.setup->codeBlockGroupFlushIndicator) {
dci_pdu->cbgfi.nbits = 1;
size += dci_pdu->cbgfi.nbits;
}
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
index 8aee2cc5a3..a6cc264c02 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac_common.h
@@ -51,11 +51,6 @@ typedef enum {
pusch_len2 = 2
} pusch_maxLength_t;
-typedef enum {
- typeA = 0,
- typeB = 1
-} mappingType_t;
-
uint32_t get_Y(const NR_SearchSpace_t *ss, int slot, rnti_t rnti);
uint8_t get_BG(uint32_t A, uint16_t R);
@@ -89,15 +84,22 @@ uint8_t compute_precoding_information(NR_PUSCH_Config_t *pusch_Config,
const uint8_t *nrOfLayers,
uint32_t *val);
-uint16_t nr_dci_size(const NR_BWP_DownlinkCommon_t *initialDownlinkBWP,
- const NR_BWP_UplinkCommon_t *initialUplinkBWP,
- const NR_UE_DL_BWP_t *DL_BWP,
+NR_PDSCH_TimeDomainResourceAllocationList_t *get_dl_tdalist(const NR_UE_DL_BWP_t *DL_BWP, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type);
+
+NR_PUSCH_TimeDomainResourceAllocationList_t *get_ul_tdalist(const NR_UE_UL_BWP_t *UL_BWP, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type);
+
+NR_tda_info_t get_ul_tda_info(const NR_UE_UL_BWP_t *ul_bwp, int controlResourceSetId, int ss_type, nr_rnti_type_t rnti_type, int tda_index);
+
+NR_tda_info_t get_dl_tda_info(const NR_UE_DL_BWP_t *dl_BWP, int ss_type, int tda_index, int dmrs_typeA_pos,
+ int mux_pattern, nr_rnti_type_t rnti_type, int coresetid, bool sib1);
+
+uint16_t nr_dci_size(const NR_UE_DL_BWP_t *DL_BWP,
const NR_UE_UL_BWP_t *UL_BWP,
const NR_CellGroupConfig_t *cg,
dci_pdu_rel15_t *dci_pdu,
nr_dci_format_t format,
nr_rnti_type_t rnti_type,
- int controlResourceSetId,
+ NR_ControlResourceSet_t *coreset,
int bwp_id,
int ss_type,
uint16_t cset0_bwp_size,
@@ -220,13 +222,12 @@ void get_type0_PDCCH_CSS_config_parameters(NR_Type0_PDCCH_CSS_config_t *type0_PD
uint16_t get_ssb_start_symbol(const long band, NR_SubcarrierSpacing_t scs, int i_ssb);
-void get_info_from_tda_tables(int default_abc,
- int tda,
- int dmrs_TypeA_Position,
- int normal_CP,
- bool *is_mapping_typeA,
- int *startSymbolIndex,
- int *nrOfSymbols);
+NR_tda_info_t get_info_from_tda_tables(default_table_type_t table_type,
+ int tda,
+ int dmrs_TypeA_Position,
+ int normal_CP);
+
+default_table_type_t get_default_table_type(int mux_pattern);
void fill_coresetZero(NR_ControlResourceSet_t *coreset0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
void fill_searchSpaceZero(NR_SearchSpace_t *ss0, NR_Type0_PDCCH_CSS_config_t *type0_PDCCH_CSS_config);
@@ -273,12 +274,7 @@ bool set_ul_ptrs_values(NR_PTRS_UplinkConfig_t *ul_ptrs_config,
@param rnti_type rnti type
@param configuredGrant indicates whether a configured grant was received or not
@returns transformPrecoding value */
-uint8_t get_transformPrecoding(const NR_BWP_UplinkCommon_t *initialUplinkBWP,
- const NR_PUSCH_Config_t *pusch_config,
- const NR_BWP_UplinkDedicated_t *ubwp,
- uint8_t *dci_format,
- int rnti_type,
- uint8_t configuredGrant);
+uint8_t get_transformPrecoding(const NR_UE_UL_BWP_t *current_UL_BWP, nr_dci_format_t dci_format, uint8_t configuredGrant);
void nr_mac_gNB_rrc_ul_failure(const module_id_t Mod_instP,
const int CC_idP,
diff --git a/openair2/LAYER2/NR_MAC_UE/config_ue.c b/openair2/LAYER2/NR_MAC_UE/config_ue.c
index ac48e17b62..5b5587a7e7 100644
--- a/openair2/LAYER2/NR_MAC_UE/config_ue.c
+++ b/openair2/LAYER2/NR_MAC_UE/config_ue.c
@@ -547,27 +547,68 @@ void configure_current_BWP(NR_UE_MAC_INST_t *mac,
NR_UE_UL_BWP_t *UL_BWP = &mac->current_UL_BWP;
NR_BWP_t dl_genericParameters = {0};
NR_BWP_t ul_genericParameters = {0};
+ NR_BWP_DownlinkCommon_t *bwp_dlcommon = NULL;
+ NR_BWP_UplinkCommon_t *bwp_ulcommon = NULL;
+ DL_BWP->n_dl_bwp = 0;
+ UL_BWP->n_ul_bwp = 0;
if(scc) {
DL_BWP->bwp_id = 0;
UL_BWP->bwp_id = 0;
- dl_genericParameters = scc->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+ bwp_dlcommon = &scc->downlinkConfigCommon.initialDownlinkBWP;
+ bwp_ulcommon = &scc->uplinkConfigCommon->initialUplinkBWP;
+ dl_genericParameters = bwp_dlcommon->genericParameters;
if(scc->uplinkConfigCommon)
ul_genericParameters = scc->uplinkConfigCommon->initialUplinkBWP.genericParameters;
else
- ul_genericParameters = scc->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
+ ul_genericParameters = bwp_dlcommon->genericParameters;
+
+ DL_BWP->pdsch_Config = NULL;
+ if (bwp_dlcommon->pdsch_ConfigCommon)
+ DL_BWP->tdaList_Common = bwp_dlcommon->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ if (bwp_ulcommon->pusch_ConfigCommon) {
+ UL_BWP->tdaList_Common = bwp_ulcommon->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ UL_BWP->msg3_DeltaPreamble = bwp_ulcommon->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble;
+ }
+ if (bwp_ulcommon->pucch_ConfigCommon)
+ UL_BWP->pucch_ConfigCommon = bwp_ulcommon->pucch_ConfigCommon->choice.setup;
+ if (bwp_ulcommon->rach_ConfigCommon)
+ UL_BWP->rach_ConfigCommon = bwp_ulcommon->rach_ConfigCommon->choice.setup;
}
+
if(cell_group_config) {
+ if (cell_group_config->physicalCellGroupConfig) {
+ DL_BWP->pdsch_HARQ_ACK_Codebook = &cell_group_config->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook;
+ UL_BWP->harq_ACK_SpatialBundlingPUCCH = cell_group_config->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH;
+ }
if (cell_group_config->spCellConfig &&
cell_group_config->spCellConfig->spCellConfigDedicated) {
struct NR_ServingCellConfig *spCellConfigDedicated = cell_group_config->spCellConfig->spCellConfigDedicated;
+ UL_BWP->csi_MeasConfig = spCellConfigDedicated->csi_MeasConfig ? spCellConfigDedicated->csi_MeasConfig->choice.setup : NULL;
+ UL_BWP->pusch_servingcellconfig =
+ spCellConfigDedicated->uplinkConfig && spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig ? spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL;
+ DL_BWP->pdsch_servingcellconfig = spCellConfigDedicated->pdsch_ServingCellConfig ? spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup : NULL;
+
if (spCellConfigDedicated->firstActiveDownlinkBWP_Id)
DL_BWP->bwp_id = *spCellConfigDedicated->firstActiveDownlinkBWP_Id;
if (spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id)
UL_BWP->bwp_id = *spCellConfigDedicated->uplinkConfig->firstActiveUplinkBWP_Id;
+ if (mac->scc) {
+ bwp_dlcommon = mac->scc->downlinkConfigCommon->initialDownlinkBWP;
+ bwp_ulcommon = mac->scc->uplinkConfigCommon->initialUplinkBWP;
+ }
+ else if (mac->scc_SIB) {
+ bwp_dlcommon = &mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
+ bwp_ulcommon = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
+ }
+ else
+ AssertFatal(false, "Either SCC or SCC SIB should be non-NULL\n");
+
NR_BWP_Downlink_t *bwp_downlink = NULL;
const struct NR_ServingCellConfig__downlinkBWP_ToAddModList *bwpList = spCellConfigDedicated->downlinkBWP_ToAddModList;
+ if (bwpList)
+ DL_BWP->n_dl_bwp = bwpList->list.count;
if (bwpList && DL_BWP->bwp_id > 0) {
for (int i = 0; i < bwpList->list.count; i++) {
bwp_downlink = bwpList->list.array[i];
@@ -576,17 +617,21 @@ void configure_current_BWP(NR_UE_MAC_INST_t *mac,
}
AssertFatal(bwp_downlink != NULL,"Couldn't find DLBWP corresponding to BWP ID %ld\n", DL_BWP->bwp_id);
dl_genericParameters = bwp_downlink->bwp_Common->genericParameters;
+ DL_BWP->pdsch_Config = bwp_downlink->bwp_Dedicated->pdsch_Config->choice.setup;
+ DL_BWP->tdaList_Common = bwp_downlink->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
}
else {
- if(mac->scc) {
- dl_genericParameters = mac->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters;
- }
- if(mac->scc_SIB) {
- dl_genericParameters = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.genericParameters;
- }
+ dl_genericParameters = bwp_dlcommon->genericParameters;
+ DL_BWP->pdsch_Config = spCellConfigDedicated->initialDownlinkBWP->pdsch_Config->choice.setup;
+ DL_BWP->tdaList_Common = bwp_dlcommon->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
}
+
+ UL_BWP->msg3_DeltaPreamble = bwp_ulcommon->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble;
+
NR_BWP_Uplink_t *bwp_uplink = NULL;
const struct NR_UplinkConfig__uplinkBWP_ToAddModList *ubwpList = spCellConfigDedicated->uplinkConfig->uplinkBWP_ToAddModList;
+ if (ubwpList)
+ UL_BWP->n_ul_bwp = ubwpList->list.count;
if (ubwpList && UL_BWP->bwp_id > 0) {
for (int i = 0; i < ubwpList->list.count; i++) {
bwp_uplink = ubwpList->list.array[i];
@@ -595,14 +640,26 @@ void configure_current_BWP(NR_UE_MAC_INST_t *mac,
}
AssertFatal(bwp_uplink != NULL,"Couldn't find ULBWP corresponding to BWP ID %ld\n",UL_BWP->bwp_id);
ul_genericParameters = bwp_uplink->bwp_Common->genericParameters;
+ UL_BWP->tdaList_Common = bwp_uplink->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ UL_BWP->pusch_Config = bwp_uplink->bwp_Dedicated->pusch_Config->choice.setup;
+ UL_BWP->pucch_Config = bwp_uplink->bwp_Dedicated->pucch_Config->choice.setup;
+ UL_BWP->srs_Config = bwp_uplink->bwp_Dedicated->srs_Config->choice.setup;
+ UL_BWP->configuredGrantConfig = bwp_uplink->bwp_Dedicated->configuredGrantConfig ? bwp_uplink->bwp_Dedicated->configuredGrantConfig->choice.setup : NULL;
+ if (bwp_uplink->bwp_Common->pucch_ConfigCommon)
+ UL_BWP->pucch_ConfigCommon = bwp_uplink->bwp_Common->pucch_ConfigCommon->choice.setup;
+ if (bwp_uplink->bwp_Common->rach_ConfigCommon)
+ UL_BWP->rach_ConfigCommon = bwp_uplink->bwp_Common->rach_ConfigCommon->choice.setup;
}
else {
- if(mac->scc) {
- ul_genericParameters = mac->scc->uplinkConfigCommon->initialUplinkBWP->genericParameters;
- }
- if(mac->scc_SIB) {
- ul_genericParameters = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.genericParameters;
- }
+ UL_BWP->tdaList_Common = bwp_ulcommon->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ UL_BWP->pusch_Config = spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pusch_Config->choice.setup;
+ UL_BWP->pucch_Config = spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
+ UL_BWP->srs_Config = spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
+ UL_BWP->configuredGrantConfig =
+ spCellConfigDedicated->uplinkConfig->initialUplinkBWP->configuredGrantConfig ? spCellConfigDedicated->uplinkConfig->initialUplinkBWP->configuredGrantConfig->choice.setup : NULL;
+ ul_genericParameters = bwp_ulcommon->genericParameters;
+ if (bwp_ulcommon->rach_ConfigCommon)
+ UL_BWP->rach_ConfigCommon = bwp_ulcommon->rach_ConfigCommon->choice.setup;
}
}
else
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_proto.h b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
index bf6b89f71c..eb773672d4 100644
--- a/openair2/LAYER2/NR_MAC_UE/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_proto.h
@@ -251,29 +251,8 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
void ue_dci_configuration(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_request_t *dl_config, frame_t frame, int slot);
-void get_bwp_info(NR_UE_MAC_INST_t *mac,
- int dl_bwp_id,
- int ul_bwp_id,
- NR_BWP_DownlinkDedicated_t **bwpd,
- NR_BWP_DownlinkCommon_t **bwpc,
- NR_BWP_UplinkDedicated_t **ubwpd,
- NR_BWP_UplinkCommon_t **ubwpc);
-
NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id);
-NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon);
-NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon);
-
-int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList,
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
- nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
- fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
- int *mappingtype,
- uint8_t time_domain_ind,
- int default_abc,
- bool use_default);
-
uint8_t nr_ue_get_sdu(module_id_t module_idP,
int cc_id,
frame_t frameP,
@@ -475,7 +454,7 @@ int16_t compute_nr_SSB_PL(NR_UE_MAC_INST_t *mac, short ssb_rsrp_dBm);
// - in which ULSCH should be scheduled. K2 is configured in RRC configuration.
// PUSCH Msg3 scheduler:
// - scheduled by RAR UL grant according to 8.3 of TS 38.213
-int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac, uint8_t is_Msg3, frame_t current_frame, int current_slot, frame_t *frame_tx, int *slot_tx, uint8_t tda_id);
+int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac, uint8_t is_Msg3, frame_t current_frame, int current_slot, frame_t *frame_tx, int *slot_tx, long k2);
int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti);
@@ -487,11 +466,6 @@ int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti);
// - 6.1.4.2 of TS 38.214
// - 6.4.1.1.1 of TS 38.211
// - 6.3.1.7 of 38.211
-int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
- nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
- dci_pdu_rel15_t *dci,
- RAR_grant_t *rar_grant,
- uint16_t rnti,
- uint8_t *dci_format);
+int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, NR_tda_info_t *tda_info, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, RAR_grant_t *rar_grant, uint16_t rnti, uint8_t *dci_format);
#endif
/** @}*/
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
index e4bbb546d8..f871796230 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ra_procedures.c
@@ -138,8 +138,8 @@ void init_RA(module_id_t mod_id,
NR_PRACH_RESOURCES_t *prach_resources,
NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon,
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric,
- NR_RACH_ConfigDedicated_t *rach_ConfigDedicated) {
-
+ NR_RACH_ConfigDedicated_t *rach_ConfigDedicated)
+{
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
RA_config_t *ra = &mac->ra;
@@ -278,16 +278,13 @@ void init_RA(module_id_t mod_id,
}
}
-
/* TS 38.321 subclause 7.3 - return DELTA_PREAMBLE values in dB */
-int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_format){
-
+int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_format)
+{
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
- NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc!=NULL) ?
- mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP.rach_ConfigCommon;
NR_SubcarrierSpacing_t scs = *nr_rach_ConfigCommon->msg1_SubcarrierSpacing;
- int prach_sequence_length = (mac->scc!=NULL)?(mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present - 1) : (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup->prach_RootSequenceIndex.present-1);
+ int prach_sequence_length = nr_rach_ConfigCommon->prach_RootSequenceIndex.present - 1;
uint8_t prachConfigIndex, mu;
AssertFatal(CC_id == 0, "Transmission on secondary CCs is not supported yet\n");
@@ -385,13 +382,13 @@ int8_t nr_get_DELTA_PREAMBLE(module_id_t mod_id, int CC_id, uint16_t prach_forma
// - RA_PREAMBLE_POWER_RAMPING_STEP dB
// - POWER_OFFSET_2STEP_RA dB
// returns receivedTargerPower in dBm
-int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t mod_id, uint8_t CC_id){
-
+int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t mod_id, uint8_t CC_id)
+{
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
int8_t receivedTargerPower;
int8_t delta_preamble;
- NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc != NULL) ? mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup: mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP.rach_ConfigCommon;
long preambleReceivedTargetPower = nr_rach_ConfigCommon->rach_ConfigGeneric.preambleReceivedTargetPower;
delta_preamble = nr_get_DELTA_PREAMBLE(mod_id, CC_id, prach_resources->prach_format);
@@ -402,8 +399,8 @@ int nr_get_Po_NOMINAL_PUSCH(NR_PRACH_RESOURCES_t *prach_resources, module_id_t m
return receivedTargerPower;
}
-void ssb_rach_config(RA_config_t *ra, NR_PRACH_RESOURCES_t *prach_resources, NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon){
-
+void ssb_rach_config(RA_config_t *ra, NR_PRACH_RESOURCES_t *prach_resources, NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon)
+{
// Determine the SSB to RACH mapping ratio
// =======================================
@@ -489,14 +486,11 @@ void ra_preambles_config(NR_PRACH_RESOURCES_t *prach_resources, NR_UE_MAC_INST_t
unsigned short int *seed = (unsigned short int*)&tmp;
RA_config_t *ra = &mac->ra;
- NR_RACH_ConfigCommon_t *setup;
- if (mac->scc) setup = mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
- else setup = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *setup = mac->current_UL_BWP.rach_ConfigCommon;
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
- NR_BWP_UplinkCommon_t *initialUplinkBWP = (mac->scc) ? mac->scc->uplinkConfigCommon->initialUplinkBWP : &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- if (initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble){
- deltaPreamble_Msg3 = (*initialUplinkBWP->pusch_ConfigCommon->choice.setup->msg3_DeltaPreamble) * 2; // dB
+ if (mac->current_UL_BWP.msg3_DeltaPreamble) {
+ deltaPreamble_Msg3 = (*mac->current_UL_BWP.msg3_DeltaPreamble) * 2; // dB
LOG_D(MAC, "In %s: deltaPreamble_Msg3 set to %ld\n", __FUNCTION__, deltaPreamble_Msg3);
}
@@ -661,9 +655,7 @@ void nr_get_prach_resources(module_id_t mod_id,
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
RA_config_t *ra = &mac->ra;
- NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc)?
- mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup :
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP.rach_ConfigCommon;
LOG_D(MAC, "In %s: getting PRACH resources frame (first_Msg3 %d)\n", __FUNCTION__, ra->first_Msg3);
@@ -701,12 +693,8 @@ void nr_Msg3_transmitted(module_id_t mod_id, uint8_t CC_id, frame_t frameP, slot
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
RA_config_t *ra = &mac->ra;
- NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = (mac->scc) ?
- mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
- long mu = (mac->scc) ?
- mac->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing :
- mac->scc_SIB->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+ NR_RACH_ConfigCommon_t *nr_rach_ConfigCommon = mac->current_UL_BWP.rach_ConfigCommon;
+ long mu = mac->current_UL_BWP.scs;
int subframes_per_slot = nr_slots_per_frame[mu]/10;
// start contention resolution timer (cnt in slots)
@@ -934,9 +922,7 @@ void nr_get_RA_window(NR_UE_MAC_INST_t *mac){
uint8_t mu, ra_ResponseWindow;
RA_config_t *ra = &mac->ra;
- NR_RACH_ConfigCommon_t *setup;
- if (mac->scc) setup = mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
- else setup = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *setup = mac->current_UL_BWP.rach_ConfigCommon;
AssertFatal(&setup->rach_ConfigGeneric != NULL, "In %s: FATAL! rach_ConfigGeneric is NULL...\n", __FUNCTION__);
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
long scs = (mac->scc) ?
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
index 2815a42c16..9d691514ed 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_dci_configuration.c
@@ -93,20 +93,9 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
uint16_t monitoringSymbolsWithinSlot = 0;
int sps = 0;
- AssertFatal(mac->scc == NULL || mac->scc_SIB == NULL, "both scc and scc_SIB cannot be non-null\n");
-
NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP;
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
NR_BWP_Id_t dl_bwp_id = current_DL_BWP ? current_DL_BWP->bwp_id : 0;
- NR_ServingCellConfigCommon_t *scc = mac->scc;
- NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB;
- NR_BWP_DownlinkCommon_t *initialDownlinkBWP=NULL;
- NR_BWP_UplinkCommon_t *initialUplinkBWP=NULL;
-
- if (scc!=NULL || scc_SIB != NULL) {
- initialDownlinkBWP = scc!=NULL ? scc->downlinkConfigCommon->initialDownlinkBWP : &scc_SIB->downlinkConfigCommon.initialDownlinkBWP;
- initialUplinkBWP = scc!=NULL ? scc->uplinkConfigCommon->initialUplinkBWP : &scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- }
NR_SearchSpace_t *ss;
NR_ControlResourceSet_t *coreset;
@@ -173,24 +162,24 @@ void config_dci_pdu(NR_UE_MAC_INST_t *mac, fapi_nr_dl_config_dci_dl_pdu_rel15_t
// computing alternative size for padding
dci_pdu_rel15_t temp_pdu;
if(dci_format == NR_DL_DCI_FORMAT_1_0)
- alt_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- mac->cg, &temp_pdu,
- NR_UL_DCI_FORMAT_0_0, rnti_type, coreset_id, dl_bwp_id,
- ss->searchSpaceType->present, mac->type0_PDCCH_CSS_config.num_rbs, 0);
+ alt_size =
+ nr_dci_size(current_DL_BWP, current_UL_BWP, mac->cg, &temp_pdu, NR_UL_DCI_FORMAT_0_0, rnti_type, coreset, dl_bwp_id, ss->searchSpaceType->present, mac->type0_PDCCH_CSS_config.num_rbs, 0);
if(dci_format == NR_UL_DCI_FORMAT_0_0)
- alt_size = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- mac->cg, &temp_pdu,
- NR_DL_DCI_FORMAT_1_0, rnti_type, coreset_id, dl_bwp_id,
- ss->searchSpaceType->present, mac->type0_PDCCH_CSS_config.num_rbs, 0);
+ alt_size =
+ nr_dci_size(current_DL_BWP, current_UL_BWP, mac->cg, &temp_pdu, NR_DL_DCI_FORMAT_1_0, rnti_type, coreset, dl_bwp_id, ss->searchSpaceType->present, mac->type0_PDCCH_CSS_config.num_rbs, 0);
}
- rel15->dci_length_options[i] = nr_dci_size(initialDownlinkBWP,initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- mac->cg, &mac->def_dci_pdu_rel15[dci_format],
- dci_format, NR_RNTI_TC, coreset_id, dl_bwp_id,
- ss->searchSpaceType->present, mac->type0_PDCCH_CSS_config.num_rbs, alt_size);
+ rel15->dci_length_options[i] = nr_dci_size(current_DL_BWP,
+ current_UL_BWP,
+ mac->cg,
+ &mac->def_dci_pdu_rel15[dci_format],
+ dci_format,
+ NR_RNTI_TC,
+ coreset,
+ dl_bwp_id,
+ ss->searchSpaceType->present,
+ mac->type0_PDCCH_CSS_config.num_rbs,
+ alt_size);
rel15->BWPStart = coreset_id == 0 ? mac->type0_PDCCH_CSS_config.cset_start_rb : current_DL_BWP->BWPStart;
rel15->BWPSize = coreset_id == 0 ? mac->type0_PDCCH_CSS_config.num_rbs : current_DL_BWP->BWPSize;
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index 17dde4c9c9..02ad48a655 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -180,51 +180,6 @@ void nr_ue_init_mac(module_id_t module_idP) {
}
}
-void get_bwp_info(NR_UE_MAC_INST_t *mac,
- int dl_bwp_id,
- int ul_bwp_id,
- NR_BWP_DownlinkDedicated_t **bwpd,
- NR_BWP_DownlinkCommon_t **bwpc,
- NR_BWP_UplinkDedicated_t **ubwpd,
- NR_BWP_UplinkCommon_t **ubwpc) {
-
- if (dl_bwp_id > 0) {
- AssertFatal(mac->DLbwp[dl_bwp_id-1]!=NULL,"mac->DLbwp[%d] is null, shouldn't be\n", (int)dl_bwp_id-1);
- *bwpd = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated;
- } else {
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP)
- *bwpd = mac->cg->spCellConfig->spCellConfigDedicated->initialDownlinkBWP;
- }
-
- *bwpc = get_bwp_downlink_common(mac, dl_bwp_id);
- AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
-
- if (ul_bwp_id > 0) {
- AssertFatal(mac->ULbwp[ul_bwp_id-1]!=NULL,"mac->ULbwp[%d] is null, shouldn't be\n",
- ul_bwp_id-1);
- *ubwpd = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated;
- if (mac->ULbwp[ul_bwp_id-1]->bwp_Common) *ubwpc = mac->ULbwp[ul_bwp_id-1]->bwp_Common;
- else if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
- else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- AssertFatal(*bwpc!=NULL,"bwpc shouldn't be null\n");
-
- }
- else {
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
- *ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- if (mac->scc) *ubwpc = mac->scc->uplinkConfigCommon->initialUplinkBWP;
- else if (mac->scc_SIB) *ubwpc = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
- AssertFatal(*ubwpc!=NULL,"ubwpc shouldn't be null\n");
- }
-}
-
NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_Id_t dl_bwp_id) {
NR_BWP_DownlinkCommon_t *bwp_Common = NULL;
if (dl_bwp_id > 0 && mac->cg->spCellConfig->spCellConfigDedicated->downlinkBWP_ToAddModList) {
@@ -237,33 +192,8 @@ NR_BWP_DownlinkCommon_t *get_bwp_downlink_common(NR_UE_MAC_INST_t *mac, NR_BWP_I
return bwp_Common;
}
-NR_PDSCH_TimeDomainResourceAllocationList_t *choose_dl_tda_list(NR_PDSCH_Config_t *pdsch_Config,NR_PDSCH_ConfigCommon_t *pdsch_ConfigCommon) {
-
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList=NULL;
-
- if (pdsch_Config &&
- pdsch_Config->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = pdsch_Config->pdsch_TimeDomainAllocationList->choice.setup;
- else if (pdsch_ConfigCommon->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = pdsch_ConfigCommon->pdsch_TimeDomainAllocationList;
-
- return(pdsch_TimeDomainAllocationList);
-}
-
-NR_PUSCH_TimeDomainResourceAllocationList_t *choose_ul_tda_list(const NR_PUSCH_Config_t *pusch_Config,NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon) {
-
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList=NULL;
-
- if (pusch_Config &&
- pusch_Config->pusch_TimeDomainAllocationList)
- pusch_TimeDomainAllocationList = pusch_Config->pusch_TimeDomainAllocationList->choice.setup;
- else if (pusch_ConfigCommon->pusch_TimeDomainAllocationList)
- pusch_TimeDomainAllocationList = pusch_ConfigCommon->pusch_TimeDomainAllocationList;
-
- return(pusch_TimeDomainAllocationList);
-}
-
-int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti){
+int get_rnti_type(NR_UE_MAC_INST_t *mac, uint16_t rnti)
+{
RA_config_t *ra = &mac->ra;
int rnti_type;
@@ -481,138 +411,6 @@ int8_t nr_ue_process_dci_freq_dom_resource_assignment(nfapi_nr_ue_pusch_pdu_t *p
return 0;
}
-int8_t nr_ue_process_dci_time_dom_resource_assignment(NR_UE_MAC_INST_t *mac,
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList,
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList,
- nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
- fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu,
- int *mapping_type,
- uint8_t time_domain_ind,
- int default_abc,
- bool use_default){
-
- int dmrs_typeA_pos = (mac->scc != NULL) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position;
-
-// uint8_t k_offset=0;
- int sliv_S=0;
- int sliv_L=0;
- uint8_t mu_pusch = 1;
-
- // definition table j Table 6.1.2.1.1-4
- uint8_t j = (mu_pusch==3)?3:(mu_pusch==2)?2:1;
- uint8_t table_6_1_2_1_1_2_time_dom_res_alloc_A[16][3]={ // for PUSCH from TS 38.214 subclause 6.1.2.1.1
- {j, 0,14}, // row index 1
- {j, 0,12}, // row index 2
- {j, 0,10}, // row index 3
- {j, 2,10}, // row index 4
- {j, 4,10}, // row index 5
- {j, 4,8}, // row index 6
- {j, 4,6}, // row index 7
- {j+1,0,14}, // row index 8
- {j+1,0,12}, // row index 9
- {j+1,0,10}, // row index 10
- {j+2,0,14}, // row index 11
- {j+2,0,12}, // row index 12
- {j+2,0,10}, // row index 13
- {j, 8,6}, // row index 14
- {j+3,0,14}, // row index 15
- {j+3,0,10} // row index 16
- };
- /*uint8_t table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[16][3]={ // for PUSCH from TS 38.214 subclause 6.1.2.1.1
- {j, 0,8}, // row index 1
- {j, 0,12}, // row index 2
- {j, 0,10}, // row index 3
- {j, 2,10}, // row index 4
- {j, 4,4}, // row index 5
- {j, 4,8}, // row index 6
- {j, 4,6}, // row index 7
- {j+1,0,8}, // row index 8
- {j+1,0,12}, // row index 9
- {j+1,0,10}, // row index 10
- {j+2,0,6}, // row index 11
- {j+2,0,12}, // row index 12
- {j+2,0,10}, // row index 13
- {j, 8,4}, // row index 14
- {j+3,0,8}, // row index 15
- {j+3,0,10} // row index 16
- };*/
-
- /*
- * TS 38.214 subclause 5.1.2.1 Resource allocation in time domain (downlink)
- */
- if(dlsch_config_pdu != NULL){
- if (pdsch_TimeDomainAllocationList && use_default==false) {
-
- if (time_domain_ind >= pdsch_TimeDomainAllocationList->list.count) {
- LOG_E(MAC, "time_domain_ind %d >= pdsch->TimeDomainAllocationList->list.count %d\n",
- time_domain_ind, pdsch_TimeDomainAllocationList->list.count);
- dlsch_config_pdu->start_symbol = 0;
- dlsch_config_pdu->number_symbols = 0;
- return -1;
- }
-
- int startSymbolAndLength = pdsch_TimeDomainAllocationList->list.array[time_domain_ind]->startSymbolAndLength;
- int S,L;
- SLIV2SL(startSymbolAndLength,&S,&L);
- dlsch_config_pdu->start_symbol=S;
- dlsch_config_pdu->number_symbols=L;
-
- LOG_D(MAC,"SLIV = %i\n", startSymbolAndLength);
- LOG_D(MAC,"start_symbol = %i\n", dlsch_config_pdu->start_symbol);
- LOG_D(MAC,"number_symbols = %i\n", dlsch_config_pdu->number_symbols);
-
- }
- else {// Default configuration from tables
-
- bool is_typeA;
- get_info_from_tda_tables(default_abc,
- time_domain_ind,
- dmrs_typeA_pos,
- 1, // normal CP
- &is_typeA,
- &sliv_S,
- &sliv_L);
- *mapping_type = is_typeA? typeA : typeB;
- dlsch_config_pdu->number_symbols = sliv_L;
- dlsch_config_pdu->start_symbol = sliv_S;
- }
- } /*
- * TS 38.214 subclause 6.1.2.1 Resource allocation in time domain (uplink)
- */
- if(pusch_config_pdu != NULL){
- if (pusch_TimeDomainAllocationList && use_default==false) {
- if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) {
- LOG_E(NR_MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
- time_domain_ind, pusch_TimeDomainAllocationList->list.count);
- pusch_config_pdu->start_symbol_index=0;
- pusch_config_pdu->nr_of_symbols=0;
- return -1;
- }
-
- LOG_D(NR_MAC,"Filling Time-Domain Allocation from pusch_TimeDomainAllocationList\n");
- int startSymbolAndLength = pusch_TimeDomainAllocationList->list.array[time_domain_ind]->startSymbolAndLength;
- int S,L;
- SLIV2SL(startSymbolAndLength,&S,&L);
- pusch_config_pdu->start_symbol_index=S;
- pusch_config_pdu->nr_of_symbols=L;
- }
- else {
- LOG_D(NR_MAC,"Filling Time-Domain Allocation from tables\n");
-// k_offset = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind-1][0];
- sliv_S = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind][1];
- sliv_L = table_6_1_2_1_1_2_time_dom_res_alloc_A[time_domain_ind][2];
- // k_offset = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][0];
- // sliv_S = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][1];
- // sliv_L = table_6_1_2_1_1_3_time_dom_res_alloc_A_extCP[nr_pdci_info_extracted->time_dom_resource_assignment][2];
- pusch_config_pdu->nr_of_symbols = sliv_L;
- pusch_config_pdu->start_symbol_index = sliv_S;
- }
- LOG_D(NR_MAC,"start_symbol = %i\n", pusch_config_pdu->start_symbol_index);
- LOG_D(NR_MAC,"number_symbols = %i\n", pusch_config_pdu->nr_of_symbols);
- }
- return 0;
-}
-
int nr_ue_process_dci_indication_pdu(module_id_t module_id,int cc_id, int gNB_index, frame_t frame, int slot, fapi_nr_dci_indication_pdu_t *dci) {
NR_UE_MAC_INST_t *mac = get_mac_inst(module_id);
@@ -634,6 +432,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
uint16_t rnti = dci_ind->rnti;
uint8_t dci_format = dci_ind->dci_format;
+ int coreset_type = dci_ind->coreset_type == NFAPI_NR_CSET_CONFIG_PDCCH_CONFIG; // 0 for coreset0, 1 otherwise
int ret = 0;
int pucch_res_set_cnt = 0, valid = 0;
frame_t frame_tx = 0;
@@ -645,11 +444,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
uint8_t is_Msg3 = 0;
NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP;
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t dl_bwp_id = current_DL_BWP->bwp_id;
- NR_BWP_Id_t ul_bwp_id = current_UL_BWP->bwp_id;
- int default_abc = 1;
+ int mux_pattern = 1;
LOG_D(MAC, "In %s: Processing received DCI format %s\n", __FUNCTION__, dci_formats[dci_format]);
+ NR_tda_info_t tda_info = {0};
+ NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config;
switch(dci_format){
case NR_UL_DCI_FORMAT_0_0: {
@@ -674,7 +473,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
// - SUL_IND_0_0
// Schedule PUSCH
- ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, dci->time_domain_assignment.val);
+ tda_info = get_ul_tda_info(current_UL_BWP, coreset_type, dci_ind->ss_type, get_rnti_type(mac, rnti), dci->time_domain_assignment.val);
+ if (tda_info.nrOfSymbols == 0)
+ ret = -1;
+ else
+ ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, tda_info.k2);
if (ret != -1){
@@ -693,9 +496,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
pthread_mutex_unlock(&ul_config->mutex_ul_config);
// Config PUSCH PDU
- ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format);
- }
-
+ ret = nr_config_pusch_pdu(mac, &tda_info, pusch_config_pdu, dci, NULL, rnti, &dci_format);
+ } else
+ LOG_E(MAC, "Cannot schedule PUSCH\n");
break;
}
@@ -734,7 +537,11 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
// - SRS_RESOURCE_IND
// Schedule PUSCH
- ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, dci->time_domain_assignment.val);
+ tda_info = get_ul_tda_info(current_UL_BWP, coreset_type, dci_ind->ss_type, get_rnti_type(mac, rnti), dci->time_domain_assignment.val);
+ if (tda_info.nrOfSymbols == 0)
+ ret = -1;
+ else
+ ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, tda_info.k2);
if (ret != -1){
@@ -755,8 +562,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
pthread_mutex_unlock(&ul_config->mutex_ul_config);
// Config PUSCH PDU
- ret = nr_config_pusch_pdu(mac, pusch_config_pdu, dci, NULL, rnti, &dci_format);
- } else AssertFatal(1==0,"Cannot schedule PUSCH\n");
+ ret = nr_config_pusch_pdu(mac, &tda_info, pusch_config_pdu, dci, NULL, rnti, &dci_format);
+ } else
+ LOG_E(MAC, "Cannot schedule PUSCH\n");
break;
}
@@ -815,8 +623,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
fapi_nr_dl_config_dlsch_pdu_rel15_t *dlsch_config_pdu_1_0 = &dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.dlsch_config_rel15;
- NR_PDSCH_Config_t *pdsch_config= (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) ? mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup : NULL;
- int is_common=0;
+ NR_PDSCH_Config_t *pdsch_config = current_DL_BWP ? current_DL_BWP->pdsch_Config : NULL;
+ int is_common = 0;
if (dci_ind->ss_type == NR_SearchSpace__searchSpaceType_PR_common) {
dlsch_config_pdu_1_0->BWPSize = mac->type0_PDCCH_CSS_config.num_rbs ? mac->type0_PDCCH_CSS_config.num_rbs : current_DL_BWP->initial_BWPSize;
dlsch_config_pdu_1_0->BWPStart = dci_ind->cset_start;
@@ -827,7 +635,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
}
if(rnti == SI_RNTI) {
NR_Type0_PDCCH_CSS_config_t type0_PDCCH_CSS_config = mac->type0_PDCCH_CSS_config;
- default_abc = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
+ mux_pattern = type0_PDCCH_CSS_config.type0_pdcch_ss_mux_pattern;
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_SI_DLSCH;
dlsch_config_pdu_1_0->SubcarrierSpacing = mac->mib->subCarrierSpacingCommon;
if (pdsch_config) pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup->dmrs_AdditionalPosition = NULL; // For PDSCH with mapping type A, the UE shall assume dmrs-AdditionalPosition='pos2'
@@ -838,17 +646,10 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
} else {
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
}
- if( (ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti) ) {
- if (mac->scc == NULL) { // use coreset0
- is_common=1;
- }
- if (!get_softmodem_params()->sa) { // NSA mode is not using the Initial BWP
- pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
- }
- } else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1]) {
- pdsch_config = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup;
- } else if (mac->scc)
- pdsch_config = NULL;
+ if ((ra->RA_window_cnt >= 0 && rnti == ra->ra_rnti) || (rnti == ra->t_crnti)) {
+ if (mac->scc == NULL) // use coreset0
+ is_common = 1;
+ }
}
/* IDENTIFIER_DCI_FORMATS */
@@ -858,36 +659,18 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
return -1;
}
-
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = NULL;
- if (dl_bwp_id>0 &&
- mac->DLbwp[dl_bwp_id-1] &&
- mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated &&
- mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config &&
- mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->pdsch_TimeDomainAllocationList->choice.setup;
- else if (dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] && mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList)
- pdsch_TimeDomainAllocationList = mac->DLbwp[dl_bwp_id-1]->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
- else if (mac->scc_SIB && mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup)
- pdsch_TimeDomainAllocationList = mac->scc_SIB->downlinkConfigCommon.initialDownlinkBWP.pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
-
- int mappingtype;
/* TIME_DOM_RESOURCE_ASSIGNMENT */
- if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,pdsch_TimeDomainAllocationList,
- NULL,dlsch_config_pdu_1_0,&mappingtype,
- dci->time_domain_assignment.val,
- default_abc,rnti==SI_RNTI) < 0) {
- LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
- return -1;
- }
- if(pdsch_TimeDomainAllocationList && rnti!=SI_RNTI)
- mappingtype = pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
+ int dmrs_typeA_pos = (mac->scc != NULL) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position;
+ // TODO need to differentiate SI_RNTI between SIB1 and other SIB
+ NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP, dci_ind->ss_type, dci->time_domain_assignment.val,
+ dmrs_typeA_pos, mux_pattern, get_rnti_type(mac, rnti), coreset_type, rnti == SI_RNTI);
+
+ dlsch_config_pdu_1_0->number_symbols = tda_info.nrOfSymbols;
+ dlsch_config_pdu_1_0->start_symbol = tda_info.startSymbolIndex;
struct NR_DMRS_DownlinkConfig *dl_dmrs_config = NULL;
- if(dl_bwp_id>0 && mac->DLbwp[dl_bwp_id-1] != NULL)
- dl_dmrs_config = (mappingtype == typeA) ?
- mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
- mac->DLbwp[dl_bwp_id-1]->bwp_Dedicated->pdsch_Config->choice.setup->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
+ if (pdsch_config)
+ dl_dmrs_config = (tda_info.mapping_type == typeA) ? pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup : pdsch_config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
dlsch_config_pdu_1_0->nscid = 0;
if(dl_dmrs_config && dl_dmrs_config->scramblingID0)
@@ -901,7 +684,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
(get_softmodem_params()->nsa) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position,
dlsch_config_pdu_1_0->number_symbols,
dlsch_config_pdu_1_0->start_symbol,
- mappingtype,
+ tda_info.mapping_type,
1);
dlsch_config_pdu_1_0->dmrsConfigType = (dl_dmrs_config != NULL) ?
@@ -971,36 +754,16 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
if (dci->tpc == 3) dlsch_config_pdu_1_0->accumulated_delta_PUCCH = 3;
// Sanity check for pucch_resource_indicator value received to check for false DCI.
valid = 0;
- if (ul_bwp_id > 0 &&
- mac->ULbwp[ul_bwp_id-1] &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup&&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList) {
- pucch_res_set_cnt = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+ if (pucch_Config && pucch_Config->resourceSetToAddModList) {
+ pucch_res_set_cnt = pucch_Config->resourceSetToAddModList->list.count;
for (int id = 0; id < pucch_res_set_cnt; id++) {
- if (dci->pucch_resource_indicator < mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
- valid = 1;
- break;
- }
- }
- }
- else if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList){
- pucch_res_set_cnt = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
- for (int id = 0; id < pucch_res_set_cnt; id++) {
- if (dci->pucch_resource_indicator < mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+ if (dci->pucch_resource_indicator < pucch_Config->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
valid = 1;
break;
}
}
- } else valid=1;
+ } else
+ valid = 1;
if (!valid) {
LOG_W(MAC, "[%d.%d] pucch_resource_indicator value %d is out of bounds. Possibly due to false DCI. Ignoring DCI!\n", frame, slot, dci->pucch_resource_indicator);
return -1;
@@ -1084,16 +847,8 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
LOG_W(NR_MAC,"[%d.%d] bwp_indicator %d > NR_MAX_NUM_BWP Possibly due to false DCI. Ignoring DCI!\n", frame, slot,dci->bwp_indicator.val);
return -1;
}
- NR_BWP_Id_t dl_bwp_id = mac->current_DL_BWP.bwp_id;
- NR_BWP_Id_t ul_bwp_id = mac->current_UL_BWP.bwp_id;
- NR_PDSCH_Config_t *pdsch_Config=NULL;
- NR_BWP_DownlinkDedicated_t *bwpd=NULL;
- NR_BWP_DownlinkCommon_t *bwpc=NULL;
- NR_BWP_UplinkDedicated_t *ubwpd=NULL;
- NR_BWP_UplinkCommon_t *ubwpc=NULL;
- get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
+ NR_PDSCH_Config_t *pdsch_Config = current_DL_BWP->pdsch_Config;
- pdsch_Config = bwpd->pdsch_Config->choice.setup;
dl_config->dl_config_list[dl_config->number_pdus].pdu_type = FAPI_NR_DL_CONFIG_TYPE_DLSCH;
dl_config->dl_config_list[dl_config->number_pdus].dlsch_config_pdu.rnti = rnti;
@@ -1113,18 +868,14 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
return -1;
}
/* TIME_DOM_RESOURCE_ASSIGNMENT */
- int mappingtype;
- NR_PDSCH_TimeDomainResourceAllocationList_t *pdsch_TimeDomainAllocationList = choose_dl_tda_list(pdsch_Config,bwpc->pdsch_ConfigCommon->choice.setup);
- if (nr_ue_process_dci_time_dom_resource_assignment(mac,NULL,pdsch_TimeDomainAllocationList,
- NULL,dlsch_config_pdu_1_1,&mappingtype,
- dci->time_domain_assignment.val,0,false) < 0) {
- LOG_W(MAC, "[%d.%d] Invalid time_domain_assignment. Possibly due to false DCI. Ignoring DCI!\n", frame, slot);
- return -1;
- }
- if(pdsch_TimeDomainAllocationList)
- mappingtype = pdsch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
+ int dmrs_typeA_pos = (mac->scc != NULL) ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position;
+ NR_tda_info_t tda_info = get_dl_tda_info(current_DL_BWP, dci_ind->ss_type, dci->time_domain_assignment.val,
+ dmrs_typeA_pos, mux_pattern, get_rnti_type(mac, rnti), coreset_type, false);
- struct NR_DMRS_DownlinkConfig *dl_dmrs_config = (mappingtype == typeA) ?
+ dlsch_config_pdu_1_1->number_symbols = tda_info.nrOfSymbols;
+ dlsch_config_pdu_1_1->start_symbol = tda_info.startSymbolIndex;
+
+ struct NR_DMRS_DownlinkConfig *dl_dmrs_config = (tda_info.mapping_type == typeA) ?
pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeA->choice.setup :
pdsch_Config->dmrs_DownlinkForPDSCH_MappingTypeB->choice.setup;
@@ -1194,9 +945,9 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
// Sanity check for pucch_resource_indicator value received to check for false DCI.
valid = 0;
- pucch_res_set_cnt = ubwpd->pucch_Config->choice.setup->resourceSetToAddModList->list.count;
+ pucch_res_set_cnt = pucch_Config->resourceSetToAddModList->list.count;
for (int id = 0; id < pucch_res_set_cnt; id++) {
- if (dci->pucch_resource_indicator < ubwpd->pucch_Config->choice.setup->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
+ if (dci->pucch_resource_indicator < pucch_Config->resourceSetToAddModList->list.array[id]->resourceList.list.count) {
valid = 1;
break;
}
@@ -1311,7 +1062,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
mac->scc? mac->scc->dmrs_TypeA_Position:mac->mib->dmrs_TypeA_Position,
dlsch_config_pdu_1_1->number_symbols,
dlsch_config_pdu_1_1->start_symbol,
- mappingtype,
+ tda_info.mapping_type,
dlsch_config_pdu_1_1->n_front_load_symb);
/* TCI */
@@ -1332,8 +1083,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
/* PDSCH_TO_HARQ_FEEDBACK_TIME_IND */
// according to TS 38.213 Table 9.2.3-1
- uint8_t feedback_ti =
- ubwpd->pucch_Config->choice.setup->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
+ uint8_t feedback_ti = pucch_Config->dl_DataToUL_ACK->list.array[dci->pdsch_to_harq_feedback_timing_indicator.val][0];
AssertFatal(feedback_ti>=DURATION_RX_TO_TX,"PDSCH to HARQ feedback time (%d) cannot be less than DURATION_RX_TO_TX (%d). Min feedback time set in config file (min_rxtxtime).\n",
feedback_ti,DURATION_RX_TO_TX);
@@ -1374,7 +1124,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
nb_rb_oh, 0, Nl);
// TBS_LBRM according to section 5.4.2.1 of 38.212
- long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers;
+ long *maxMIMO_Layers = current_DL_BWP->pdsch_servingcellconfig->ext1->maxMIMO_Layers;
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
int nl_tbslbrm = *maxMIMO_Layers < 4 ? *maxMIMO_Layers : 4;
int bw_tbslbrm = get_dlbw_tbslbrm(current_DL_BWP->initial_BWPSize, mac->cg);
@@ -1414,25 +1164,7 @@ int8_t nr_ue_process_dci(module_id_t module_id, int cc_id, uint8_t gNB_index, fr
break;
}
-
- if(rnti == SI_RNTI){
-
- // }else if(rnti == mac->ra_rnti){
-
- }else if(rnti == P_RNTI){
-
- }else{ // c-rnti
-
- /// check if this is pdcch order
- //dci->random_access_preamble_index;
- //dci->ss_pbch_index;
- //dci->prach_mask_index;
-
- /// else normal DL-SCH grant
- }
-
return ret;
-
}
int8_t nr_ue_process_csirs_measurements(module_id_t module_id,
@@ -1496,7 +1228,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
int O_CRC = 0; //FIXME
uint16_t O_uci = O_CSI + O_ACK;
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t bwp_id = current_UL_BWP->bwp_id;
+ NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP;
NR_PUCCH_FormatConfig_t *pucchfmt;
long *pusch_id = NULL;
long *id0 = NULL;
@@ -1512,10 +1244,10 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
// only for ack/nack
if (pucch->initial_pucch_id > -1 &&
pucch->pucch_resource == NULL) {
-
- pucch_pdu->format_type = initial_pucch_resource[pucch->initial_pucch_id].format;
- pucch_pdu->start_symbol_index = initial_pucch_resource[pucch->initial_pucch_id].startingSymbolIndex;
- pucch_pdu->nr_of_symbols = initial_pucch_resource[pucch->initial_pucch_id].nrofSymbols;
+ int pucch_resourcecommon = *current_UL_BWP->pucch_ConfigCommon->pucch_ResourceCommon;
+ pucch_pdu->format_type = initial_pucch_resource[pucch_resourcecommon].format;
+ pucch_pdu->start_symbol_index = initial_pucch_resource[pucch_resourcecommon].startingSymbolIndex;
+ pucch_pdu->nr_of_symbols = initial_pucch_resource[pucch_resourcecommon].nrofSymbols;
pucch_pdu->bwp_size = current_UL_BWP->BWPSize;
pucch_pdu->bwp_start = current_UL_BWP->BWPStart;
@@ -1523,19 +1255,20 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
pucch_pdu->prb_size = 1; // format 0 or 1
int RB_BWP_offset;
if (pucch->initial_pucch_id == 15)
- RB_BWP_offset = pucch_pdu->bwp_size>>2;
+ RB_BWP_offset = pucch_pdu->bwp_size >> 2;
else
- RB_BWP_offset = initial_pucch_resource[pucch->initial_pucch_id].PRB_offset;
+ RB_BWP_offset = initial_pucch_resource[pucch_resourcecommon].PRB_offset;
- int N_CS = initial_pucch_resource[pucch->initial_pucch_id].nb_CS_indexes;
- pucch_pdu->prb_start = RB_BWP_offset + (pucch->initial_pucch_id/N_CS);
- if (pucch->initial_pucch_id>>3 == 0) {
- pucch_pdu->second_hop_prb = pucch_pdu->bwp_size - 1 - RB_BWP_offset - (pucch->initial_pucch_id/N_CS);
- pucch_pdu->initial_cyclic_shift = initial_pucch_resource[pucch->initial_pucch_id].initial_CS_indexes[pucch->initial_pucch_id%N_CS];
- }
- else {
- pucch_pdu->second_hop_prb = pucch_pdu->bwp_size - 1 - RB_BWP_offset - ((pucch->initial_pucch_id - 8)/N_CS);
- pucch_pdu->initial_cyclic_shift = initial_pucch_resource[pucch->initial_pucch_id].initial_CS_indexes[(pucch->initial_pucch_id - 8)%N_CS];
+ int N_CS = initial_pucch_resource[pucch_resourcecommon].nb_CS_indexes;
+
+ if (pucch->initial_pucch_id >> 3 == 0) {
+ pucch_pdu->prb_start = RB_BWP_offset + (pucch->initial_pucch_id / N_CS);
+ pucch_pdu->second_hop_prb = pucch_pdu->bwp_size - 1 - RB_BWP_offset - (pucch->initial_pucch_id / N_CS);
+ pucch_pdu->initial_cyclic_shift = initial_pucch_resource[pucch_resourcecommon].initial_CS_indexes[pucch->initial_pucch_id % N_CS];
+ } else {
+ pucch_pdu->prb_start = pucch_pdu->bwp_size - 1 - RB_BWP_offset - ((pucch->initial_pucch_id - 8) / N_CS);
+ pucch_pdu->second_hop_prb = RB_BWP_offset + ((pucch->initial_pucch_id - 8) / N_CS);
+ pucch_pdu->initial_cyclic_shift = initial_pucch_resource[pucch_resourcecommon].initial_CS_indexes[(pucch->initial_pucch_id - 8) % N_CS];
}
pucch_pdu->freq_hop_flag = 1;
pucch_pdu->time_domain_occ_idx = 0;
@@ -1551,48 +1284,25 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
NR_PUCCH_Resource_t *pucchres = pucch->pucch_resource;
- if (mac->cg &&
- mac->cg->physicalCellGroupConfig &&
- (mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL ||
- mac->cg->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook != 1)) {
+ if (current_UL_BWP->harq_ACK_SpatialBundlingPUCCH != NULL || *current_DL_BWP->pdsch_HARQ_ACK_Codebook != 1) {
LOG_E(MAC,"PUCCH Unsupported cell group configuration\n");
return;
- }
- else if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup &&
- mac->cg->spCellConfig->spCellConfigDedicated->pdsch_ServingCellConfig->choice.setup->codeBlockGroupTransmission != NULL) {
+ } else if (current_DL_BWP && current_DL_BWP->pdsch_servingcellconfig && current_DL_BWP->pdsch_servingcellconfig->codeBlockGroupTransmission != NULL) {
LOG_E(MAC,"PUCCH Unsupported code block group for serving cell config\n");
return;
}
- NR_PUCCH_Config_t *pucch_Config;
- if (bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
- NR_PUSCH_Config_t *pusch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup;
+
+ NR_PUSCH_Config_t *pusch_Config = current_UL_BWP ? current_UL_BWP->pusch_Config : NULL;
+ if (pusch_Config) {
pusch_id = pusch_Config->dataScramblingIdentityPUSCH;
if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA != NULL)
id0 = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeA->choice.setup->transformPrecodingDisabled->scramblingID0;
else if (pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB != NULL)
id0 = pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->transformPrecodingDisabled->scramblingID0;
- else *id0 = mac->physCellId;
- pucch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
}
- else if (bwp_id==0 &&
- mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
- }
- else AssertFatal(1==0,"no pucch_Config\n");
+
+ NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config;
+ AssertFatal(pucch_Config, "no pucch_Config\n");
pucch_pdu->bwp_size = current_UL_BWP->BWPSize;
pucch_pdu->bwp_start = current_UL_BWP->BWPStart;
@@ -1642,8 +1352,8 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
pucch_pdu->n_bit = O_uci+O_SR;
pucch_pdu->nr_of_symbols = pucchres->format.choice.format2->nrofSymbols;
pucch_pdu->start_symbol_index = pucchres->format.choice.format2->startingSymbolIndex;
- pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : mac->physCellId;
- pucch_pdu->dmrs_scrambling_id = id0!= NULL ? *id0 : mac->physCellId;
+ pucch_pdu->data_scrambling_id = pusch_id != NULL ? *pusch_id : mac->physCellId;
+ pucch_pdu->dmrs_scrambling_id = id0 != NULL ? *id0 : mac->physCellId;
pucch_pdu->prb_size = compute_pucch_prb_size(2,pucchres->format.choice.format2->nrofPRBs,
O_uci+O_SR,O_CSI,pucch_Config->format2->choice.setup->maxCodeRate,
2,pucchres->format.choice.format2->nrofSymbols,8);
@@ -1653,7 +1363,7 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
pucch_pdu->n_bit = O_uci+O_SR;
pucch_pdu->nr_of_symbols = pucchres->format.choice.format3->nrofSymbols;
pucch_pdu->start_symbol_index = pucchres->format.choice.format3->startingSymbolIndex;
- pucch_pdu->data_scrambling_id = pusch_id!= NULL ? *pusch_id : mac->physCellId;
+ pucch_pdu->data_scrambling_id = pusch_id != NULL ? *pusch_id : mac->physCellId;
if (pucch_Config->format3 == NULL) {
pucch_pdu->pi_2bpsk = 0;
pucch_pdu->add_dmrs_flag = 0;
@@ -1712,14 +1422,8 @@ void nr_ue_configure_pucch(NR_UE_MAC_INST_t *mac,
}
else AssertFatal(1==0,"problem with pucch configuration\n");
- NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon;
- if (bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Common &&
- mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon)
- pucch_ConfigCommon = mac->ULbwp[bwp_id-1]->bwp_Common->pucch_ConfigCommon->choice.setup;
- else if (mac->scc) pucch_ConfigCommon = mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
- else pucch_ConfigCommon = mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup;
+ NR_PUCCH_ConfigCommon_t *pucch_ConfigCommon = current_UL_BWP->pucch_ConfigCommon;
+
if (pucch_ConfigCommon->hoppingId != NULL)
pucch_pdu->hopping_id = *pucch_ConfigCommon->hoppingId;
else
@@ -1759,11 +1463,9 @@ int16_t get_pucch_tx_power_ue(NR_UE_MAC_INST_t *mac,
int subframe_number,
int O_ACK, int O_SR,
int O_CSI, int O_CRC) {
-
+ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
int PUCCH_POWER_DEFAULT = 0;
- int16_t P_O_NOMINAL_PUCCH;
- if (mac->scc) P_O_NOMINAL_PUCCH = *mac->scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->p0_nominal;
- else P_O_NOMINAL_PUCCH = *mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pucch_ConfigCommon->choice.setup->p0_nominal;
+ int16_t P_O_NOMINAL_PUCCH = *current_UL_BWP->pucch_ConfigCommon->p0_nominal;
struct NR_PUCCH_PowerControl *power_config = pucch_Config->pucch_PowerControl;
@@ -1907,7 +1609,7 @@ int get_deltatf(uint16_t nb_of_prbs,
int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
int pucch_resource_set_id = 0;
- NR_BWP_Id_t bwp_id = mac->current_DL_BWP.bwp_id;
+ NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config;
//long *pucch_max_pl_bits = NULL;
@@ -1920,23 +1622,7 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
*/
/* look for the first resource set which supports uci_size number of bits for payload */
while (pucch_resource_set_id < MAX_NB_OF_PUCCH_RESOURCE_SETS) {
- if ((bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) ||
- (bwp_id==0 &&
- mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL)) {
+ if (pucch_Config && pucch_Config->resourceSetToAddModList && pucch_Config->resourceSetToAddModList->list.array[pucch_resource_set_id] != NULL) {
// PUCCH with format0 can be up to 3 bits (2 ack/nacks + 1 sr is 3 max bits)
if (uci_size <= 3) {
pucch_resource_set_id = 0;
@@ -1975,34 +1661,12 @@ int find_pucch_resource_set(NR_UE_MAC_INST_t *mac, int uci_size) {
*
*********************************************************************/
-void select_pucch_resource(NR_UE_MAC_INST_t *mac,
- PUCCH_sched_t *pucch) {
-
+void select_pucch_resource(NR_UE_MAC_INST_t *mac, PUCCH_sched_t *pucch)
+{
NR_PUCCH_ResourceId_t *current_resource_id = NULL;
- NR_BWP_Id_t bwp_id = mac->current_UL_BWP.bwp_id;
+ NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config;
int n_list;
-
- if (pucch->is_common == 1 ||
- (bwp_id == 0 &&
- mac->cg == NULL) ||
- (bwp_id == 0 &&
- mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL) ||
- (mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList->list.array[0] == NULL)
- ){
-
+ if (pucch->is_common == 1 || !pucch_Config || !pucch_Config->resourceSetToAddModList || pucch_Config->resourceSetToAddModList->list.array[0] == NULL) {
/* see TS 38.213 9.2.1 PUCCH Resource Sets */
int delta_PRI = pucch->resource_indicator;
int n_CCE_0 = pucch->n_CCE;
@@ -2013,21 +1677,9 @@ void select_pucch_resource(NR_UE_MAC_INST_t *mac,
int r_PUCCH = ((2 * n_CCE_0)/N_CCE_0) + (2 * delta_PRI);
pucch->initial_pucch_id = r_PUCCH;
pucch->pucch_resource = NULL;
- }
- else {
- struct NR_PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList = NULL;
- struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList = NULL;
- if (bwp_id > 0 && mac->ULbwp[bwp_id-1]) {
- AssertFatal(mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList!=NULL,
- "mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList is null\n");
- resourceSetToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceSetToAddModList;
- resourceToAddModList = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup->resourceToAddModList;
- }
- else if (bwp_id == 0 && mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList!=NULL) {
- resourceSetToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceSetToAddModList;
- resourceToAddModList = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup->resourceToAddModList;
- }
-
+ } else {
+ struct NR_PUCCH_Config__resourceSetToAddModList *resourceSetToAddModList = pucch_Config->resourceSetToAddModList;
+ struct NR_PUCCH_Config__resourceToAddModList *resourceToAddModList = pucch_Config->resourceToAddModList;
n_list = resourceSetToAddModList->list.count;
if (pucch->resource_set_id > n_list) {
LOG_E(MAC,"Invalid PUCCH resource set id %d\n",pucch->resource_set_id);
@@ -2107,19 +1759,8 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
NR_UE_DL_BWP_t *current_DL_BWP = &mac->current_DL_BWP;
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t dl_bwp_id = current_DL_BWP->bwp_id;
- NR_BWP_Id_t ul_bwp_id = current_UL_BWP->bwp_id;
- NR_BWP_DownlinkDedicated_t *bwpd=NULL;
- NR_BWP_DownlinkCommon_t *bwpc=NULL;
- NR_BWP_UplinkDedicated_t *ubwpd=NULL;
- NR_BWP_UplinkCommon_t *ubwpc=NULL;
- get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
- if (bwpd &&
- bwpd->pdsch_Config &&
- bwpd->pdsch_Config->choice.setup &&
- bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI &&
- bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0] == 2) {
+ if (current_DL_BWP && current_DL_BWP->pdsch_Config && current_DL_BWP->pdsch_Config->maxNrofCodeWordsScheduledByDCI && current_DL_BWP->pdsch_Config->maxNrofCodeWordsScheduledByDCI[0] == 2) {
two_transport_blocks = true;
number_of_code_word = 2;
}
@@ -2144,8 +1785,7 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
sched_frame = (sched_frame + 1) % 1024;
}
AssertFatal(sched_slot < slots_per_frame, "sched_slot was calculated incorrect %d\n", sched_slot);
- LOG_D(PHY,"HARQ pid %d is active for %d.%d (dl_slot %d, feedback_to_ul %d, is_common %d\n",
- dl_harq_pid, sched_frame,sched_slot,current_harq->dl_slot,current_harq->feedback_to_ul,current_harq->is_common);
+ LOG_D(PHY, "HARQ pid %d is active for %d.%d (dl_slot %d, feedback_to_ul %d\n", dl_harq_pid, sched_frame, sched_slot, current_harq->dl_slot, current_harq->feedback_to_ul);
/* check if current tx slot should transmit downlink acknowlegment */
if (sched_frame == frame && sched_slot == slot) {
if (get_softmodem_params()->emulate_l1) {
@@ -2209,10 +1849,8 @@ uint8_t get_downlink_ack(NR_UE_MAC_INST_t *mac,
U_DAI_c = number_harq_feedback/number_of_code_word;
N_m_c_rx = number_harq_feedback;
int N_SPS_c = 0; /* FFS TODO_NR multicells and SPS are not supported at the moment */
- if (mac->cg != NULL &&
- mac->cg->physicalCellGroupConfig != NULL &&
- mac->cg->physicalCellGroupConfig->harq_ACK_SpatialBundlingPUCCH != NULL) {
- int N_TB_max_DL = bwpd->pdsch_Config->choice.setup->maxNrofCodeWordsScheduledByDCI[0];
+ if (current_UL_BWP->harq_ACK_SpatialBundlingPUCCH != NULL) {
+ int N_TB_max_DL = current_DL_BWP->pdsch_Config->maxNrofCodeWordsScheduledByDCI[0];
pucch->n_HARQ_ACK = (((V_DAI_m_DL - U_DAI_c)%4) * N_TB_max_DL) + N_m_c_rx + N_SPS_c;
LOG_D(MAC, "PUCCH power n(%d) = ( V(%d) - U(%d) )mod4 * N_TB(%d) + N(%d) \n", pucch->n_HARQ_ACK, V_DAI_m_DL, U_DAI_c, N_TB_max_DL, N_m_c_rx);
}
@@ -2305,28 +1943,10 @@ bool trigger_periodic_scheduling_request(NR_UE_MAC_INST_t *mac,
int slot) {
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t bwp_id = current_UL_BWP->bwp_id;
- NR_PUCCH_Config_t *pucch_Config = NULL;
+ NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config;
const int n_slots_frame = nr_slots_per_frame[current_UL_BWP->scs];
- if (bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
- pucch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
- }
- else if (bwp_id==0 &&
- mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
- }
if(!pucch_Config ||
!pucch_Config->schedulingRequestResourceToAddModList ||
pucch_Config->schedulingRequestResourceToAddModList->list.count==0)
@@ -2419,15 +2039,11 @@ uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
NR_BWP_Id_t bwp_id = current_UL_BWP->bwp_id;
- NR_PUCCH_Config_t *pucch_Config = NULL;
+ NR_PUCCH_Config_t *pucch_Config = current_UL_BWP->pucch_Config;
int csi_bits = 0;
- if(mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig) {
-
- NR_CSI_MeasConfig_t *csi_measconfig = mac->cg->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ if (current_UL_BWP->csi_MeasConfig) {
+ NR_CSI_MeasConfig_t *csi_measconfig = current_UL_BWP->csi_MeasConfig;
for (int csi_report_id = 0; csi_report_id < csi_measconfig->csi_ReportConfigToAddModList->list.count; csi_report_id++){
NR_CSI_ReportConfig_t *csirep = csi_measconfig->csi_ReportConfigToAddModList->list.array[csi_report_id];
@@ -2441,21 +2057,6 @@ uint8_t nr_get_csi_measurements(NR_UE_MAC_INST_t *mac,
int period, offset;
csi_period_offset(csirep, NULL, &period, &offset);
- if (bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
- pucch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
- }
- else if (bwp_id==0 &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
- }
-
const int n_slots_frame = nr_slots_per_frame[current_UL_BWP->scs];
if (((n_slots_frame*frame + slot - offset)%period) == 0 && pucch_Config) {
LOG_D(NR_MAC, "Preparing CSI report in frame %d slot %d CSI report ID %d\n", frame, slot, csi_report_id);
@@ -4074,7 +3675,13 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
#endif
// Schedule Msg3
- ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, rar_grant.Msg3_t_alloc);
+ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
+ NR_tda_info_t tda_info = get_ul_tda_info(current_UL_BWP, *ra->ss->controlResourceSetId, ra->ss->searchSpaceType->present, NR_RNTI_RA, rar_grant.Msg3_t_alloc);
+ if (tda_info.nrOfSymbols == 0) {
+ LOG_E(MAC, "Cannot schedule Msg3. Something wrong in TDA information\n");
+ return -1;
+ }
+ ret = nr_ue_pusch_scheduler(mac, is_Msg3, frame, slot, &frame_tx, &slot_tx, tda_info.k2);
if (ret != -1){
@@ -4102,7 +3709,7 @@ int nr_ue_process_rar(nr_downlink_indication_t *dl_info, NR_UL_TIME_ALIGNMENT_t
pthread_mutex_unlock(&ul_config->mutex_ul_config);
// Config Msg3 PDU
- nr_config_pusch_pdu(mac, pusch_config_pdu, NULL, &rar_grant, rnti, NULL);
+ nr_config_pusch_pdu(mac, &tda_info, pusch_config_pdu, NULL, &rar_grant, rnti, NULL);
}
} else {
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
index 813292f462..a6acf1fa77 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_scheduler.c
@@ -100,49 +100,6 @@ void fill_scheduled_response(nr_scheduled_response_t *scheduled_response,
}
-/*
- * This function returns the slot offset K2 corresponding to a given time domain
- * indication value from RRC configuration.
- */
-long get_k2(NR_UE_MAC_INST_t *mac, uint8_t time_domain_ind) {
- long k2 = -1;
-
- NR_BWP_Id_t ul_bwp_id = mac->current_UL_BWP.bwp_id;
- // Get K2 from RRC configuration
- NR_PUSCH_Config_t *pusch_config= ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : NULL;
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = NULL;
- if (pusch_config && pusch_config->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = pusch_config->pusch_TimeDomainAllocationList->choice.setup;
- }
- else if (ul_bwp_id > 0 &&
- mac->ULbwp[ul_bwp_id-1] &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Common&&
- mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon&&
- mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList) {
- pusch_TimeDomainAllocationList = mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
- }
- else if (mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList)
- pusch_TimeDomainAllocationList=mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
- else AssertFatal(1==0,"need to fall back to default PUSCH time-domain allocations\n");
-
- if (pusch_TimeDomainAllocationList) {
- if (time_domain_ind >= pusch_TimeDomainAllocationList->list.count) {
- LOG_E(NR_MAC, "time_domain_ind %d >= pusch->TimeDomainAllocationList->list.count %d\n",
- time_domain_ind, pusch_TimeDomainAllocationList->list.count);
- return -1;
- }
- k2 = *pusch_TimeDomainAllocationList->list.array[time_domain_ind]->k2;
- }
-
- AssertFatal(k2 >= DURATION_RX_TO_TX,
- "Slot offset K2 (%ld) cannot be less than DURATION_RX_TO_TX (%d). K2 set according to min_rxtxtime in config file.\n",
- k2,DURATION_RX_TO_TX);
-
- LOG_D(NR_MAC, "get_k2(): k2 is %ld\n", k2);
- return k2;
-}
-
/*
* This function returns the UL config corresponding to a given UL slot
* from MAC instance .
@@ -179,37 +136,13 @@ fapi_nr_ul_config_request_t *get_ul_config_request(NR_UE_MAC_INST_t *mac, int sl
return &mac->ul_config_request[index];
}
-void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
+void ul_layers_config(NR_UE_MAC_INST_t *mac, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, nr_dci_format_t dci_format)
+{
+ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
+ NR_SRS_Config_t *srs_config = current_UL_BWP->srs_Config;
+ NR_PUSCH_Config_t *pusch_Config = current_UL_BWP->pusch_Config;
- NR_ServingCellConfigCommon_t *scc = mac->scc;
- NR_BWP_Id_t ul_bwp_id = mac->current_UL_BWP.bwp_id;
- NR_BWP_UplinkDedicated_t *ubwpd=NULL;
- NR_SRS_Config_t *srs_config = NULL;
-
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
- ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
- }
-
- NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup :
- (ubwpd?
- ubwpd->pusch_Config->choice.setup:
- NULL);
-
- long transformPrecoder;
- if (pusch_Config && pusch_Config->transformPrecoder)
- transformPrecoder = *pusch_Config->transformPrecoder;
- else {
- if(scc && scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
- transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
- else
- transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
- }
+ long transformPrecoder = get_transformPrecoding(current_UL_BWP, dci_format, 0);
pusch_config_pdu->transform_precoding = transformPrecoder;
/* PRECOD_NBR_LAYERS */
@@ -336,33 +269,14 @@ void ul_layers_config(NR_UE_MAC_INST_t * mac, nfapi_nr_ue_pusch_pdu_t *pusch_con
}
// todo: this function shall be reviewed completely because of the many comments left by the author
-void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci) {
-
+void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, nr_dci_format_t dci_format)
+{
uint8_t rank = pusch_config_pdu->nrOfLayers;
- NR_BWP_Id_t ul_bwp_id = mac->current_UL_BWP.bwp_id;
- NR_ServingCellConfigCommon_t *scc = mac->scc;
- NR_BWP_UplinkDedicated_t *ubwpd=NULL;
-
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP)
- ubwpd = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
-
- NR_PUSCH_Config_t *pusch_Config = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ? mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup : (ubwpd?ubwpd->pusch_Config->choice.setup:NULL);
+ NR_PUSCH_Config_t *pusch_Config = mac->current_UL_BWP.pusch_Config;
AssertFatal(pusch_Config!=NULL,"pusch_Config shouldn't be null\n");
- long transformPrecoder;
- if (pusch_Config->transformPrecoder)
- transformPrecoder = *pusch_Config->transformPrecoder;
- else {
- if(scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg3_transformPrecoder)
- transformPrecoder = NR_PUSCH_Config__transformPrecoder_enabled;
- else
- transformPrecoder = NR_PUSCH_Config__transformPrecoder_disabled;
- }
+ long transformPrecoder = get_transformPrecoding(&mac->current_UL_BWP, dci_format, 0);
long *max_length = NULL;
long *dmrs_type = NULL;
LOG_D(NR_MAC,"transformPrecoder %s\n",transformPrecoder==NR_PUSCH_Config__transformPrecoder_disabled?"disabled":"enabled");
@@ -535,18 +449,11 @@ void ul_ports_config(NR_UE_MAC_INST_t *mac, int *n_front_load_symb, nfapi_nr_ue_
// - 6.1.4.2 of TS 38.214
// - 6.4.1.1.1 of TS 38.211
// - 6.3.1.7 of 38.211
-int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
- nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu,
- dci_pdu_rel15_t *dci,
- RAR_grant_t *rar_grant,
- uint16_t rnti,
- uint8_t *dci_format)
+int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac, NR_tda_info_t *tda_info, nfapi_nr_ue_pusch_pdu_t *pusch_config_pdu, dci_pdu_rel15_t *dci, RAR_grant_t *rar_grant, uint16_t rnti, uint8_t *dci_format)
{
int f_alloc;
int mask;
- int StartSymbolIndex;
- int NrOfSymbols;
uint8_t nb_dmrs_re_per_rb;
uint16_t l_prime_mask = 0;
@@ -555,7 +462,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
int rnti_type = get_rnti_type(mac, rnti);
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t ul_bwp_id = current_UL_BWP->bwp_id;
// Common configuration
pusch_config_pdu->dmrs_config_type = pusch_dmrs_type1;
@@ -563,36 +469,14 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->nrOfLayers = 1;
pusch_config_pdu->Tpmi = 0;
pusch_config_pdu->rnti = rnti;
- NR_BWP_UplinkCommon_t *initialUplinkBWP;
- if (mac->scc) initialUplinkBWP = mac->scc->uplinkConfigCommon->initialUplinkBWP;
- else initialUplinkBWP = &mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP;
pusch_dmrs_AdditionalPosition_t add_pos = pusch_dmrs_pos2;
int dmrslength = 1;
+ NR_PUSCH_Config_t *pusch_Config = current_UL_BWP->pusch_Config;
if (rar_grant) {
// Note: for Msg3 or MsgA PUSCH transmission the N_PRB_oh is always set to 0
- NR_BWP_Uplink_t *ubwp = ul_bwp_id > 0 ? mac->ULbwp[ul_bwp_id - 1] : NULL;
- NR_BWP_UplinkDedicated_t *ibwp;
- int startSymbolAndLength,mappingtype;
- NR_PUSCH_Config_t *pusch_Config=NULL;
- if (mac->cg && ubwp &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
-
- ibwp = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP;
- pusch_Config = ibwp->pusch_Config->choice.setup;
- startSymbolAndLength = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[rar_grant->Msg3_t_alloc]->startSymbolAndLength;
- mappingtype = ubwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[rar_grant->Msg3_t_alloc]->mappingType;
-
- }
- else {
- startSymbolAndLength = initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[rar_grant->Msg3_t_alloc]->startSymbolAndLength;
- mappingtype = initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList->list.array[rar_grant->Msg3_t_alloc]->mappingType;
- }
int ibwp_start = current_UL_BWP->initial_BWPStart;
int ibwp_size = current_UL_BWP->initial_BWPSize;
int abwp_start = current_UL_BWP->BWPStart;
@@ -623,14 +507,14 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
//pusch_config_pdu->rb_start += ibwp_start - abwp_start;
// Time domain allocation
- SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
- pusch_config_pdu->start_symbol_index = StartSymbolIndex;
- pusch_config_pdu->nr_of_symbols = NrOfSymbols;
+ pusch_config_pdu->start_symbol_index = tda_info->startSymbolIndex;
+ pusch_config_pdu->nr_of_symbols = tda_info->nrOfSymbols;
- l_prime_mask = get_l_prime(NrOfSymbols, mappingtype, add_pos, dmrslength, StartSymbolIndex, mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
- LOG_D(NR_MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d, DMRS_MASK:%x\n", pusch_config_pdu->start_symbol_index, pusch_config_pdu->nr_of_symbols, mappingtype, l_prime_mask);
+ l_prime_mask =
+ get_l_prime(tda_info->nrOfSymbols, tda_info->mapping_type, add_pos, dmrslength, tda_info->startSymbolIndex, mac->scc ? mac->scc->dmrs_TypeA_Position : mac->mib->dmrs_TypeA_Position);
+ LOG_D(NR_MAC, "MSG3 start_sym:%d NR Symb:%d mappingtype:%d, DMRS_MASK:%x\n", pusch_config_pdu->start_symbol_index, pusch_config_pdu->nr_of_symbols, tda_info->mapping_type, l_prime_mask);
- #ifdef DEBUG_MSG3
+#ifdef DEBUG_MSG3
LOG_D(NR_MAC, "In %s BWP assignment (BWP (start %d, size %d) \n", __FUNCTION__, pusch_config_pdu->bwp_start, pusch_config_pdu->bwp_size);
#endif
@@ -648,10 +532,10 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->scid = 0;
// Transform precoding according to 6.1.3 UE procedure for applying transform precoding on PUSCH in 38.214
- pusch_config_pdu->transform_precoding = get_transformPrecoding(initialUplinkBWP, pusch_Config, NULL, NULL, NR_RNTI_TC, 0); // TBR fix rnti and take out
+ pusch_config_pdu->transform_precoding = get_transformPrecoding(current_UL_BWP, NR_UL_DCI_FORMAT_0_0, 0); // as if it was DCI 0_0
// Resource allocation in frequency domain according to 6.1.2.2 in TS 38.214
- pusch_config_pdu->resource_alloc = (mac->cg) ? pusch_Config->resourceAllocation : 1;
+ pusch_config_pdu->resource_alloc = 1;
//// Completing PUSCH PDU
pusch_config_pdu->mcs_table = 0;
@@ -669,13 +553,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->tbslbrm = 0;
} else if (dci) {
- NR_BWP_Id_t dl_bwp_id = mac->current_DL_BWP.bwp_id;
NR_BWP_Id_t ul_bwp_id = mac->current_UL_BWP.bwp_id;
- NR_BWP_DownlinkDedicated_t *bwpd=NULL;
- NR_BWP_DownlinkCommon_t *bwpc=NULL;
- NR_BWP_UplinkDedicated_t *ubwpd=NULL;
- NR_BWP_UplinkCommon_t *ubwpc=NULL;
- get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
int target_ss;
bool valid_ptrs_setup = 0;
@@ -683,8 +561,6 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->bwp_start = current_UL_BWP->BWPStart;
pusch_config_pdu->bwp_size = current_UL_BWP->BWPSize;
- const NR_PUSCH_Config_t *pusch_Config = ubwpd? ubwpd->pusch_Config->choice.setup : NULL;
-
// Basic sanity check for MCS value to check for a false or erroneous DCI
if (dci->mcs > 28) {
LOG_W(NR_MAC, "MCS value %d out of bounds! Possibly due to false DCI. Ignoring DCI!\n", dci->mcs);
@@ -693,7 +569,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
/* Transform precoding */
if (rnti_type != NR_RNTI_CS || (rnti_type == NR_RNTI_CS && dci->ndi == 1)) {
- pusch_config_pdu->transform_precoding = get_transformPrecoding(initialUplinkBWP, pusch_Config, NULL, dci_format, rnti_type, 0);
+ pusch_config_pdu->transform_precoding = get_transformPrecoding(current_UL_BWP, *dci_format, 0);
}
/*DCI format-related configuration*/
@@ -703,11 +579,9 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
} else if (*dci_format == NR_UL_DCI_FORMAT_0_1) {
- get_bwp_info(mac,dl_bwp_id,ul_bwp_id,&bwpd,&bwpc,&ubwpd,&ubwpc);
-
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
- ul_layers_config(mac, pusch_config_pdu, dci);
- ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci);
+ ul_layers_config(mac, pusch_config_pdu, dci, *dci_format);
+ ul_ports_config(mac, &dmrslength, pusch_config_pdu, dci, *dci_format);
} else {
@@ -716,10 +590,7 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
}
- NR_PUSCH_ConfigCommon_t *pusch_ConfigCommon = ubwpc->pusch_ConfigCommon->choice.setup;
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = choose_ul_tda_list(pusch_Config,pusch_ConfigCommon);
-
- int mappingtype = pusch_TimeDomainAllocationList->list.array[dci->time_domain_assignment.val]->mappingType;
+ int mappingtype = tda_info->mapping_type;
NR_DMRS_UplinkConfig_t *NR_DMRS_ulconfig = NULL;
if(pusch_Config) {
@@ -774,10 +645,9 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
if (nr_ue_process_dci_freq_dom_resource_assignment(pusch_config_pdu, NULL, current_UL_BWP->BWPSize, 0, dci->frequency_domain_assignment.val) < 0){
return -1;
}
- /* TIME_DOM_RESOURCE_ASSIGNMENT */
- if (nr_ue_process_dci_time_dom_resource_assignment(mac, pusch_TimeDomainAllocationList, NULL, pusch_config_pdu, NULL, NULL, dci->time_domain_assignment.val,0,false) < 0) {
- return -1;
- }
+
+ pusch_config_pdu->start_symbol_index = tda_info->startSymbolIndex;
+ pusch_config_pdu->nr_of_symbols = tda_info->nrOfSymbols;
/* FREQ_HOPPING_FLAG */
if ((pusch_Config!=NULL) && (pusch_Config->frequencyHopping!=NULL) && (pusch_Config->resourceAllocation != NR_PUSCH_Config__resourceAllocation_resourceAllocationType0)){
@@ -837,23 +707,13 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
}
// Num PRB Overhead from PUSCH-ServingCellConfig
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->xOverhead)
- N_PRB_oh = *mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->xOverhead;
+ if (current_UL_BWP->pusch_servingcellconfig && current_UL_BWP->pusch_servingcellconfig->xOverhead)
+ N_PRB_oh = *current_UL_BWP->pusch_servingcellconfig->xOverhead;
+ else
+ N_PRB_oh = 0;
- else N_PRB_oh = 0;
-
- if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->rateMatching) {
- long *maxMIMO_Layers = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->pusch_ServingCellConfig->choice.setup->ext1->maxMIMO_Layers;
+ if (current_UL_BWP->pusch_servingcellconfig && current_UL_BWP->pusch_servingcellconfig->rateMatching) {
+ long *maxMIMO_Layers = current_UL_BWP->pusch_servingcellconfig->ext1->maxMIMO_Layers;
if (!maxMIMO_Layers)
maxMIMO_Layers = pusch_Config ? pusch_Config->maxRank : NULL;
AssertFatal (maxMIMO_Layers != NULL,"Option with max MIMO layers not configured is not supported\n");
@@ -861,33 +721,30 @@ int nr_config_pusch_pdu(NR_UE_MAC_INST_t *mac,
pusch_config_pdu->tbslbrm = nr_compute_tbslbrm(pusch_config_pdu->mcs_table,
bw_tbslbrm,
*maxMIMO_Layers);
- }
- else
+ } else
pusch_config_pdu->tbslbrm = 0;
/* PTRS */
- if (ul_bwp_id > 0 &&
- mac->ULbwp[ul_bwp_id-1] &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
+ if (pusch_Config && pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB && pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS) {
if (pusch_config_pdu->transform_precoding == NR_PUSCH_Config__transformPrecoder_disabled) {
nfapi_nr_ue_ptrs_ports_t ptrs_ports_list;
pusch_config_pdu->pusch_ptrs.ptrs_ports_list = &ptrs_ports_list;
- valid_ptrs_setup = set_ul_ptrs_values(mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->pusch_Config->choice.setup->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
- pusch_config_pdu->rb_size, pusch_config_pdu->mcs_index, pusch_config_pdu->mcs_table,
- &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,&pusch_config_pdu->pusch_ptrs.ptrs_time_density,
- &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,&pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
- &pusch_config_pdu->pusch_ptrs.ul_ptrs_power, pusch_config_pdu->nr_of_symbols);
+ valid_ptrs_setup = set_ul_ptrs_values(pusch_Config->dmrs_UplinkForPUSCH_MappingTypeB->choice.setup->phaseTrackingRS->choice.setup,
+ pusch_config_pdu->rb_size,
+ pusch_config_pdu->mcs_index,
+ pusch_config_pdu->mcs_table,
+ &pusch_config_pdu->pusch_ptrs.ptrs_freq_density,
+ &pusch_config_pdu->pusch_ptrs.ptrs_time_density,
+ &pusch_config_pdu->pusch_ptrs.ptrs_ports_list->ptrs_re_offset,
+ &pusch_config_pdu->pusch_ptrs.num_ptrs_ports,
+ &pusch_config_pdu->pusch_ptrs.ul_ptrs_power,
+ pusch_config_pdu->nr_of_symbols);
if(valid_ptrs_setup==true) {
pusch_config_pdu->pdu_bit_map |= PUSCH_PDU_BITMAP_PUSCH_PTRS;
}
LOG_D(NR_MAC, "UL PTRS values: PTRS time den: %d, PTRS freq den: %d\n", pusch_config_pdu->pusch_ptrs.ptrs_time_density, pusch_config_pdu->pusch_ptrs.ptrs_freq_density);
}
}
-
}
LOG_D(NR_MAC, "In %s: received UL grant (rb_start %d, rb_size %d, start_symbol_index %d, nr_of_symbols %d) for RNTI type %s \n",
@@ -937,21 +794,8 @@ bool nr_ue_periodic_srs_scheduling(module_id_t mod_id, frame_t frame, slot_t slo
NR_UE_MAC_INST_t *mac = get_mac_inst(mod_id);
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t ul_bwp_id = current_UL_BWP->bwp_id;
- NR_SRS_Config_t *srs_config = NULL;
- if (ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1]) {
- if (mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config) {
- srs_config = mac->ULbwp[ul_bwp_id-1]->bwp_Dedicated->srs_Config->choice.setup;
- }
- } else if (mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP) {
- srs_config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->srs_Config->choice.setup;
- }
+ NR_SRS_Config_t *srs_config = current_UL_BWP->srs_Config;
if (!srs_config) {
return false;
@@ -1559,30 +1403,25 @@ int nr_get_sf_retxBSRTimer(uint8_t sf_offset) {
// PUSCH Msg3 scheduler:
// - scheduled by RAR UL grant according to 8.3 of TS 38.213
// Note: Msg3 tx in the uplink symbols of mixed slot
-int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
- uint8_t is_Msg3,
- frame_t current_frame,
- int current_slot,
- frame_t *frame_tx,
- int *slot_tx,
- uint8_t tda_id){
+int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac, uint8_t is_Msg3, frame_t current_frame, int current_slot, frame_t *frame_tx, int *slot_tx, long k2)
+{
+ AssertFatal(k2 >= DURATION_RX_TO_TX,
+ "Slot offset K2 (%ld) cannot be less than DURATION_RX_TO_TX (%d). Please set min_rxtxtime at least to %d in gNB config file or gNBs.[0].min_rxtxtime=%d via command line.\n",
+ k2,
+ DURATION_RX_TO_TX,
+ DURATION_RX_TO_TX,
+ DURATION_RX_TO_TX);
int delta = 0;
NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- NR_BWP_Id_t ul_bwp_id = current_UL_BWP->bwp_id;
// Get the numerology to calculate the Tx frame and slot
int mu = current_UL_BWP->scs;
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp_id > 0 && mac->ULbwp[ul_bwp_id-1] ?
- mac->ULbwp[ul_bwp_id-1]->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList:
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
// k2 as per 3GPP TS 38.214 version 15.9.0 Release 15 ch 6.1.2.1.1
// PUSCH time domain resource allocation is higher layer configured from uschTimeDomainAllocationList in either pusch-ConfigCommon
- int k2;
if (is_Msg3) {
- k2 = *pusch_TimeDomainAllocationList->list.array[tda_id]->k2;
switch (mu) {
case 0:
@@ -1599,9 +1438,12 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
break;
}
- AssertFatal((k2+delta) >= DURATION_RX_TO_TX,
- "Slot offset (%d) for Msg3 cannot be less than DURATION_RX_TO_TX (%d)\n",
- k2+delta,DURATION_RX_TO_TX);
+ AssertFatal((k2 + delta) >= DURATION_RX_TO_TX,
+ "Slot offset (%ld) for Msg3 cannot be less than DURATION_RX_TO_TX (%d). Please set min_rxtxtime at least to %d in gNB config file or gNBs.[0].min_rxtxtime=%d via command line.\n",
+ k2,
+ DURATION_RX_TO_TX,
+ DURATION_RX_TO_TX,
+ DURATION_RX_TO_TX);
*slot_tx = (current_slot + k2 + delta) % nr_slots_per_frame[mu];
if (current_slot + k2 + delta > nr_slots_per_frame[mu]){
@@ -1612,10 +1454,8 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
} else {
- // Get slot offset K2 which will be used to calculate TX slot
- k2 = get_k2(mac, tda_id);
if (k2 < 0) { // This can happen when a false DCI is received
- LOG_W(PHY,"%d.%d. Received k2 %d, tda_id %d\n",current_frame,current_slot,k2,tda_id);
+ LOG_W(PHY, "%d.%d. Received k2 %ld\n", current_frame, current_slot, k2);
return -1;
}
@@ -1625,10 +1465,9 @@ int nr_ue_pusch_scheduler(NR_UE_MAC_INST_t *mac,
}
- LOG_D(NR_MAC, "In %s: currently at [%d.%d] UL transmission in [%d.%d] (k2 %d delta %d)\n", __FUNCTION__, current_frame, current_slot, *frame_tx, *slot_tx, k2, delta);
+ LOG_D(NR_MAC, "[%04d.%02d] UL transmission in [%04d.%02d] (k2 %ld delta %d)\n", current_frame, current_slot, *frame_tx, *slot_tx, k2, delta);
return 0;
-
}
// Build the list of all the valid RACH occasions in the maximum association pattern period according to the PRACH config
@@ -1649,7 +1488,7 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) {
uint8_t format2 = 0xff;
int nb_fdm;
- uint8_t config_index, mu;
+ uint8_t config_index;
int msg1_FDM;
uint8_t prach_conf_period_idx;
@@ -1657,20 +1496,16 @@ static void build_ro_list(NR_UE_MAC_INST_t *mac) {
uint8_t prach_conf_period_frame_idx;
int64_t *prach_config_info_p;
- NR_RACH_ConfigCommon_t *setup = (mac->scc) ?
- mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *setup = mac->current_UL_BWP.rach_ConfigCommon;
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
config_index = rach_ConfigGeneric->prach_ConfigurationIndex;
- if (setup->msg1_SubcarrierSpacing) {
+ int mu;
+ if (setup->msg1_SubcarrierSpacing)
mu = *setup->msg1_SubcarrierSpacing;
- } else if(mac->scc) {
- mu = mac->scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
- } else {
- mu = get_softmodem_params()->numerology;
- }
+ else
+ mu = mac->current_UL_BWP.scs;
msg1_FDM = rach_ConfigGeneric->msg1_FDM;
@@ -1905,9 +1740,7 @@ static void map_ssb_to_ro(NR_UE_MAC_INST_t *mac) {
// Map SSBs to PRACH occasions
// ===========================
// WIP: Assumption: No PRACH occasion is rejected because of a conflict with SSBs or TDD_UL_DL_ConfigurationCommon schedule
- NR_RACH_ConfigCommon_t *setup = (mac->scc) ?
- mac->scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup:
- mac->scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *setup = mac->current_UL_BWP.rach_ConfigCommon;
NR_RACH_ConfigCommon__ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR ssb_perRACH_config = setup->ssb_perRACH_OccasionAndCB_PreamblesPerSSB->present;
bool multiple_ssb_per_ro; // true if more than one or exactly one SSB per RACH occasion, false if more than one RO per SSB
@@ -2317,27 +2150,7 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, vo
// ACKNACK
O_ACK = get_downlink_ack(mac, frameP, slotP, &pucch);
- NR_BWP_Id_t bwp_id = mac->current_UL_BWP.bwp_id;
- NR_PUCCH_Config_t *pucch_Config = NULL;
-
- if (bwp_id>0 &&
- mac->ULbwp[bwp_id-1] &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config &&
- mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup) {
- pucch_Config = mac->ULbwp[bwp_id-1]->bwp_Dedicated->pucch_Config->choice.setup;
- }
- else if (bwp_id==0 &&
- mac->cg &&
- mac->cg->spCellConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config &&
- mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup) {
- pucch_Config = mac->cg->spCellConfig->spCellConfigDedicated->uplinkConfig->initialUplinkBWP->pucch_Config->choice.setup;
- }
-
+ NR_PUCCH_Config_t *pucch_Config = mac->current_UL_BWP.pucch_Config;
// if multiplexing of HARQ and CSI is not possible, transmit only HARQ bits
if ((O_ACK != 0) && (O_CSI != 0) &&
@@ -2377,7 +2190,6 @@ void nr_ue_pucch_scheduler(module_id_t module_idP, frame_t frameP, int slotP, vo
&pucch,
pucch_pdu,
O_SR, O_ACK, O_CSI);
- LOG_D(NR_MAC, "Configuring pucch, is_common = %d\n", pucch.is_common);
nr_scheduled_response_t scheduled_response;
fill_scheduled_response(&scheduled_response, NULL, ul_config, NULL, module_idP, 0 /*TBR fix*/, frameP, slotP, phy_data);
if(mac->if_module != NULL && mac->if_module->scheduled_response != NULL)
@@ -2391,13 +2203,12 @@ void nr_schedule_csi_for_im(NR_UE_MAC_INST_t *mac, int frame, int slot) {
if (mac->ra.ra_state != RA_SUCCEEDED && get_softmodem_params()->phy_test == 0)
return;
- NR_CellGroupConfig_t *CellGroup = mac->cg;
+ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
- !CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig)
+ if (!current_UL_BWP->csi_MeasConfig)
return;
- NR_CSI_MeasConfig_t *csi_measconfig = CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_CSI_MeasConfig_t *csi_measconfig = current_UL_BWP->csi_MeasConfig;
if (csi_measconfig->csi_IM_ResourceToAddModList == NULL)
return;
@@ -2449,13 +2260,12 @@ void nr_schedule_csirs_reception(NR_UE_MAC_INST_t *mac, int frame, int slot) {
if (mac->ra.ra_state != RA_SUCCEEDED && get_softmodem_params()->phy_test == 0)
return;
- NR_CellGroupConfig_t *CellGroup = mac->cg;
+ NR_UE_UL_BWP_t *current_UL_BWP = &mac->current_UL_BWP;
- if (!CellGroup || !CellGroup->spCellConfig || !CellGroup->spCellConfig->spCellConfigDedicated ||
- !CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig)
+ if (!current_UL_BWP->csi_MeasConfig)
return;
- NR_CSI_MeasConfig_t *csi_measconfig = CellGroup->spCellConfig->spCellConfigDedicated->csi_MeasConfig->choice.setup;
+ NR_CSI_MeasConfig_t *csi_measconfig = current_UL_BWP->csi_MeasConfig;
if (csi_measconfig->nzp_CSI_RS_ResourceToAddModList == NULL)
return;
@@ -2636,9 +2446,7 @@ void nr_ue_prach_scheduler(module_id_t module_idP, frame_t frameP, sub_frame_t s
NR_ServingCellConfigCommon_t *scc = mac->scc;
NR_ServingCellConfigCommonSIB_t *scc_SIB = mac->scc_SIB;
- NR_RACH_ConfigCommon_t *setup;
- if (scc!=NULL) setup = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
- else setup = scc_SIB->uplinkConfigCommon->initialUplinkBWP.rach_ConfigCommon->choice.setup;
+ NR_RACH_ConfigCommon_t *setup = mac->current_UL_BWP.rach_ConfigCommon;
NR_RACH_ConfigGeneric_t *rach_ConfigGeneric = &setup->rach_ConfigGeneric;
NR_TDD_UL_DL_ConfigCommon_t *tdd_config = scc==NULL ? scc_SIB->tdd_UL_DL_ConfigurationCommon : scc->tdd_UL_DL_ConfigurationCommon;
diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c
index f55a3f1a27..08a3f291fb 100644
--- a/openair2/LAYER2/NR_MAC_gNB/config.c
+++ b/openair2/LAYER2/NR_MAC_gNB/config.c
@@ -474,9 +474,11 @@ int rrc_mac_config_req_gNB(module_id_t Mod_idP,
if (scc != NULL ) {
AssertFatal((scc->ssb_PositionsInBurst->present > 0) && (scc->ssb_PositionsInBurst->present < 4), "SSB Bitmap type %d is not valid\n",scc->ssb_PositionsInBurst->present);
- const int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL =
- calloc(n * MAX_BWP_SIZE, sizeof(uint16_t));
+ int n = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
+ if (*scc->ssbSubcarrierSpacing == 0)
+ n <<= 1; // to have enough room for feedback possibly beyond the frame we need a larger array at 15kHz SCS
+ RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL = calloc(n * MAX_BWP_SIZE, sizeof(uint16_t));
+ RC.nrmac[Mod_idP]->vrb_map_UL_size = n;
AssertFatal(RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL,
"could not allocate memory for RC.nrmac[]->common_channels[0].vrb_map_UL\n");
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index 3009dc6b6c..895f0bd0dc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -59,40 +59,40 @@
const uint8_t nr_rv_round_map[4] = { 0, 2, 3, 1 };
uint16_t nr_pdcch_order_table[6] = { 31, 31, 511, 2047, 2047, 8191 };
-uint8_t vnf_first_sched_entry = 1;
-
void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
int CC_idP,
frame_t frameP,
sub_frame_t slotP)
{
+
NR_ServingCellConfigCommon_t *scc = gNB->common_channels->ServingCellConfigCommon;
const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- UL_tti_req_ahead_initialization(gNB, scc, num_slots, CC_idP, frameP);
+ UL_tti_req_ahead_initialization(gNB, scc, num_slots, CC_idP, frameP, slotP, *scc->ssbSubcarrierSpacing);
nfapi_nr_dl_tti_request_t *DL_req = &gNB->DL_req[0];
nfapi_nr_dl_tti_pdcch_pdu_rel15_t **pdcch = (nfapi_nr_dl_tti_pdcch_pdu_rel15_t **)gNB->pdcch_pdu_idx[CC_idP];
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &gNB->UL_tti_req_ahead[CC_idP][(slotP + num_slots - 1) % num_slots];
nfapi_nr_ul_dci_request_t *UL_dci_req = &gNB->UL_dci_req[0];
nfapi_nr_tx_data_request_t *TX_req = &gNB->TX_req[0];
gNB->pdu_index[CC_idP] = 0;
- DL_req[CC_idP].SFN = frameP;
- DL_req[CC_idP].Slot = slotP;
+ DL_req[CC_idP].SFN = frameP;
+ DL_req[CC_idP].Slot = slotP;
DL_req[CC_idP].dl_tti_request_body.nPDUs = 0;
- DL_req[CC_idP].dl_tti_request_body.nGroup = 0;
- //DL_req[CC_idP].dl_tti_request_body.transmission_power_pcfich = 6000;
+ DL_req[CC_idP].dl_tti_request_body.nGroup = 0;
memset(pdcch, 0, sizeof(*pdcch) * MAX_NUM_CORESET);
- UL_dci_req[CC_idP].SFN = frameP;
- UL_dci_req[CC_idP].Slot = slotP;
- UL_dci_req[CC_idP].numPdus = 0;
+ UL_dci_req[CC_idP].SFN = frameP;
+ UL_dci_req[CC_idP].Slot = slotP;
+ UL_dci_req[CC_idP].numPdus = 0;
/* advance last round's future UL_tti_req to be ahead of current frame/slot */
- future_ul_tti_req->SFN = (slotP == 0 ? frameP : frameP + 1) % 1024;
- LOG_D(NR_MAC, "In %s: UL_tti_req_ahead SFN.slot = %d.%d for slot %d \n", __FUNCTION__, future_ul_tti_req->SFN, future_ul_tti_req->Slot, (slotP + num_slots - 1) % num_slots);
+ const int size = gNB->UL_tti_req_ahead_size;
+ const int prev_slot = frameP * num_slots + slotP + size - 1;
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &gNB->UL_tti_req_ahead[CC_idP][prev_slot % size];
+ future_ul_tti_req->SFN = (prev_slot / num_slots) % 1024;
+ LOG_D(NR_MAC, "%d.%d UL_tti_req_ahead SFN.slot = %d.%d for index %d \n", frameP, slotP, future_ul_tti_req->SFN, future_ul_tti_req->Slot, prev_slot % size);
/* future_ul_tti_req->Slot is fixed! */
future_ul_tti_req->n_pdus = 0;
future_ul_tti_req->n_ulsch = 0;
@@ -101,9 +101,9 @@ void clear_nr_nfapi_information(gNB_MAC_INST * gNB,
/* UL_tti_req is a simple pointer into the current UL_tti_req_ahead, i.e.,
* it walks over UL_tti_req_ahead in a circular fashion */
- gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][slotP];
-
- TX_req[CC_idP].Number_of_PDUs = 0;
+ const int current_index = ul_buffer_index(frameP, slotP, *scc->ssbSubcarrierSpacing, gNB->UL_tti_req_ahead_size);
+ gNB->UL_tti_req[CC_idP] = &gNB->UL_tti_req_ahead[CC_idP][current_index];
+ TX_req[CC_idP].Number_of_PDUs = 0;
}
@@ -113,9 +113,10 @@ bool is_xlsch_in_slot(uint64_t bitmap, sub_frame_t slot) {
void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
frame_t frame,
- sub_frame_t slot){
+ sub_frame_t slot)
+{
- protocol_ctxt_t ctxt={0};
+ protocol_ctxt_t ctxt = {0};
PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_YES, NOT_A_RNTI, frame, slot,module_idP);
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
@@ -135,7 +136,7 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
gNB->frame = frame;
gNB->slot = slot;
- start_meas(&RC.nrmac[module_idP]->eNB_scheduler);
+ start_meas(&gNB->eNB_scheduler);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_IN);
pdcp_run(&ctxt);
@@ -155,32 +156,18 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
memset(cc[CC_id].vrb_map, 0, sizeof(uint16_t) * MAX_BWP_SIZE);
// clear last scheduled slot's content (only)!
const int num_slots = nr_slots_per_frame[*scc->ssbSubcarrierSpacing];
- const int last_slot = (slot + num_slots - 1) % num_slots;
+ const int size = gNB->vrb_map_UL_size;
+ const int prev_slot = frame * num_slots + slot + size - 1;
uint16_t *vrb_map_UL = cc[CC_id].vrb_map_UL;
- memcpy(&vrb_map_UL[last_slot * MAX_BWP_SIZE], &RC.nrmac[module_idP]->ulprbbl, sizeof(uint16_t) * MAX_BWP_SIZE);
+ memcpy(&vrb_map_UL[prev_slot % size * MAX_BWP_SIZE], &gNB->ulprbbl, sizeof(uint16_t) * MAX_BWP_SIZE);
- clear_nr_nfapi_information(RC.nrmac[module_idP], CC_id, frame, slot);
+ clear_nr_nfapi_information(gNB, CC_id, frame, slot);
- /*VNF first entry into scheduler. Since frame numbers for future_ul_tti_req of some future slots
- will not be set before we encounter them, set them here */
-
- if (NFAPI_MODE == NFAPI_MODE_VNF){
- if(vnf_first_sched_entry == 1)
- {
- for (int i = 0; iUL_tti_req_ahead[CC_id][i].SFN = (frame + 1) % 1024;
- else
- gNB->UL_tti_req_ahead[CC_id][i].SFN = frame;
- }
- vnf_first_sched_entry = 0;
- }
- }
}
if ((slot == 0) && (frame & 127) == 0) {
char stats_output[16000] = {0};
- dump_mac_stats(RC.nrmac[module_idP], stats_output, sizeof(stats_output), true);
+ dump_mac_stats(gNB, stats_output, sizeof(stats_output), true);
LOG_I(NR_MAC, "Frame.Slot %d.%d\n%s\n", frame, slot, stats_output);
}
@@ -232,11 +219,11 @@ void gNB_dlsch_ulsch_scheduler(module_id_t module_idP,
nr_schedule_ue_spec(module_idP, frame, slot);
stop_meas(&gNB->schedule_dlsch);
- nr_sr_reporting(RC.nrmac[module_idP], frame, slot);
+ nr_sr_reporting(gNB, frame, slot);
- nr_schedule_pucch(RC.nrmac[module_idP], frame, slot);
+ nr_schedule_pucch(gNB, frame, slot);
- stop_meas(&RC.nrmac[module_idP]->eNB_scheduler);
+ stop_meas(&gNB->eNB_scheduler);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_gNB_DLSCH_ULSCH_SCHEDULER,VCD_FUNCTION_OUT);
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
index 6d968a513e..06d58bae57 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_RA.c
@@ -245,24 +245,25 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
gNB_MAC_INST *gNB = RC.nrmac[module_idP];
NR_COMMON_channels_t *cc = gNB->common_channels;
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
- nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][slotP];
+ int mu;
+ if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing)
+ mu = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing;
+ else
+ mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
+ int index = ul_buffer_index(frameP, slotP, mu, gNB->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *UL_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[0][index];
nfapi_nr_config_request_scf_t *cfg = &RC.nrmac[module_idP]->config[0];
if (is_nr_UL_slot(scc->tdd_UL_DL_ConfigurationCommon, slotP, cc->frame_type)) {
uint8_t config_index = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->rach_ConfigGeneric.prach_ConfigurationIndex;
- uint8_t mu,N_dur,N_t_slot,start_symbol = 0,N_RA_slot;
+ uint8_t N_dur, N_t_slot, start_symbol = 0, N_RA_slot;
uint16_t RA_sfn_index = -1;
uint8_t config_period = 1;
uint16_t format;
int slot_index = 0;
uint16_t prach_occasion_id = -1;
- if (scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing)
- mu = *scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup->msg1_SubcarrierSpacing;
- else
- mu = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
-
int bwp_start = NRRIV2PRBOFFSET(scc->uplinkConfigCommon->initialUplinkBWP->genericParameters.locationAndBandwidth, MAX_BWP_SIZE);
uint8_t fdm = cfg->prach_config.num_prach_fd_occasions.value;
@@ -391,7 +392,8 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, sub_frame_t slotP
const uint8_t mu_pusch =
scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
const int16_t N_RA_RB = get_N_RA_RB(cfg->prach_config.prach_sub_c_spacing.value, mu_pusch);
- uint16_t *vrb_map_UL = &cc->vrb_map_UL[slotP * MAX_BWP_SIZE];
+ index = ul_buffer_index(frameP, slotP, mu, gNB->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &cc->vrb_map_UL[index * MAX_BWP_SIZE];
for (int i = 0; i < N_RA_RB * fdm; ++i)
vrb_map_UL[bwp_start + rach_ConfigGeneric->msg1_FrequencyStart + i] |= SL_to_bitmap(start_symbol, N_t_slot*N_dur);
}
@@ -700,13 +702,13 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
NR_ServingCellConfigCommon_t *scc = cc->ServingCellConfigCommon;
NR_UE_UL_BWP_t *ul_bwp = &ra->UL_BWP;
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp->tdaList;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp->tdaList_Common;
int mu = ul_bwp->scs;
uint8_t K2 = *pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->k2;
const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
- if (is_xlsch_in_slot(RC.nrmac[module_idP]->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) {
+ if (is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot)) {
// beam association for FR2
int16_t *tdd_beam_association = nr_mac->tdd_beam_association;
if (*scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0] >= 257) {
@@ -729,7 +731,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
SLIV2SL(startSymbolAndLength, &StartSymbolIndex, &NrOfSymbols);
int mappingtype = pusch_TimeDomainAllocationList->list.array[ra->Msg3_tda_id]->mappingType;
- uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+ int buffer_index = ul_buffer_index(sched_frame, sched_slot, mu, nr_mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &nr_mac->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
const int BWPSize = ul_bwp->initial_BWPSize;
const int BWPStart = ul_bwp->initial_BWPStart;
@@ -749,7 +752,8 @@ void nr_generate_Msg3_retransmission(module_id_t module_idP, int CC_id, frame_t
LOG_I(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d Scheduling retransmission of Msg3 in (%d,%d)\n",
module_idP, frame, slot, CC_id, sched_frame, sched_slot);
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][sched_slot];
+ buffer_index = ul_buffer_index(sched_frame, sched_slot, mu, nr_mac->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nr_mac->UL_tti_req_ahead[CC_id][buffer_index];
AssertFatal(future_ul_tti_req->SFN == sched_frame
&& future_ul_tti_req->Slot == sched_slot,
"future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
@@ -871,12 +875,14 @@ void nr_get_Msg3alloc(module_id_t module_id,
sub_frame_t current_slot,
frame_t current_frame,
NR_RA_t *ra,
- int16_t *tdd_beam_association) {
+ int16_t *tdd_beam_association)
+{
// msg3 is scheduled in mixed slot in the following TDD period
uint16_t msg3_nb_rb = 8; // sdu has 6 or 8 bytes
- frame_type_t frame_type = RC.nrmac[module_id]->common_channels->frame_type;
+ gNB_MAC_INST *mac = RC.nrmac[module_id];
+ frame_type_t frame_type = mac->common_channels->frame_type;
NR_UE_UL_BWP_t *ul_bwp = &ra->UL_BWP;
@@ -888,7 +894,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
int Msg3maxsymb = 14, Msg3start = 0;
ra->Msg3_tda_id = 16; // initialization to a value above limit
- NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp->tdaList;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *pusch_TimeDomainAllocationList = ul_bwp->tdaList_Common;
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
const int n_slots_frame = nr_slots_per_frame[mu];
@@ -915,7 +921,7 @@ void nr_get_Msg3alloc(module_id_t module_id,
abs_slot = (current_slot + k2 + DELTA[mu]);
int temp_slot = abs_slot % nr_slots_per_frame[mu]; // msg3 slot according to 8.3 in 38.213
if ((temp_slot % nb_slots_per_period) == msg3_slot &&
- is_xlsch_in_slot(RC.nrmac[module_id]->ulsch_slot_bitmap[temp_slot / 64], temp_slot) &&
+ is_xlsch_in_slot(mac->ulsch_slot_bitmap[temp_slot / 64], temp_slot) &&
StartSymbolIndex == Msg3start &&
NrOfSymbols <= Msg3maxsymb) {
ra->Msg3_tda_id = i;
@@ -953,8 +959,8 @@ void nr_get_Msg3alloc(module_id_t module_id,
}
LOG_I(NR_MAC, "[RAPROC] Msg3 slot %d: current slot %u Msg3 frame %u k2 %u Msg3_tda_id %u\n", ra->Msg3_slot, current_slot, ra->Msg3_frame, k2,ra->Msg3_tda_id);
- uint16_t *vrb_map_UL =
- &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
+ const int buffer_index = ul_buffer_index(ra->Msg3_frame, ra->Msg3_slot, mu, mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &mac->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
int bwpSize = ul_bwp->initial_BWPSize;
int bwpStart = ul_bwp->initial_BWPStart;
@@ -1080,8 +1086,10 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
return;
}
+ const int scs = ul_bwp->scs;
const uint16_t mask = SL_to_bitmap(ra->msg3_startsymb, ra->msg3_nrsymb);
- uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[ra->Msg3_slot * MAX_BWP_SIZE];
+ int buffer_index = ul_buffer_index(ra->Msg3_frame, ra->Msg3_slot, scs, mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &RC.nrmac[module_idP]->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
for (int i = 0; i < ra->msg3_nb_rb; ++i) {
AssertFatal(!(vrb_map_UL[i + ra->msg3_first_rb + ra->msg3_bwp_start] & mask),
"RB %d in %4d.%2d is already taken, cannot allocate Msg3!\n",
@@ -1092,8 +1100,8 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
}
LOG_D(NR_MAC, "[gNB %d][RAPROC] Frame %d, Slot %d : CC_id %d RA is active, Msg3 in (%d,%d)\n", module_idP, frameP, slotP, CC_id, ra->Msg3_frame, ra->Msg3_slot);
-
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][ra->Msg3_slot];
+ buffer_index = ul_buffer_index(ra->Msg3_frame, ra->Msg3_slot, scs, mac->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_idP]->UL_tti_req_ahead[CC_id][buffer_index];
AssertFatal(future_ul_tti_req->SFN == ra->Msg3_frame
&& future_ul_tti_req->Slot == ra->Msg3_slot,
"future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
@@ -1107,10 +1115,9 @@ void nr_add_msg3(module_id_t module_idP, int CC_id, frame_t frameP, sub_frame_t
memset(pusch_pdu, 0, sizeof(nfapi_nr_pusch_pdu_t));
const int ibwp_size = ul_bwp->initial_BWPSize;
- const int scs = ul_bwp->scs;
const int fh = (ul_bwp->pusch_Config && ul_bwp->pusch_Config->frequencyHopping) ? 1 : 0;
- const int startSymbolAndLength = ul_bwp->tdaList->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
- const int mappingtype = ul_bwp->tdaList->list.array[ra->Msg3_tda_id]->mappingType;
+ const int startSymbolAndLength = ul_bwp->tdaList_Common->list.array[ra->Msg3_tda_id]->startSymbolAndLength;
+ const int mappingtype = ul_bwp->tdaList_Common->list.array[ra->Msg3_tda_id]->mappingType;
LOG_D(NR_MAC, "Frame %d, Slot %d Adding Msg3 UL Config Request for (%d,%d) : (%d,%d,%d) for rnti: %d\n",
frameP,
@@ -1162,14 +1169,14 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
BWPSize = type0_PDCCH_CSS_config->num_rbs;
}
+ NR_ControlResourceSet_t *coreset = ra->coreset;
+ AssertFatal(coreset != NULL,"Coreset cannot be null for RA-Msg2\n");
+ const int coresetid = coreset->controlResourceSetId;
// Calculate number of symbols
int time_domain_assignment = get_dl_tda(nr_mac, scc, slotP);
- NR_tda_info_t tda_info = nr_get_pdsch_tda_info(dl_bwp,
- time_domain_assignment);
-
- NR_ControlResourceSet_t *coreset = ra->coreset;
-
- AssertFatal(coreset!=NULL,"Coreset cannot be null for RA-Msg2\n");
+ int mux_pattern = type0_PDCCH_CSS_config ? type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern : 1;
+ NR_tda_info_t tda_info = get_dl_tda_info(dl_bwp, ss->searchSpaceType->present, time_domain_assignment,
+ scc->dmrs_TypeA_Position, mux_pattern, NR_RNTI_RA, coresetid, false);
uint16_t *vrb_map = cc[CC_id].vrb_map;
for (int i = 0; (i < rbSize) && (rbStart <= (BWPSize - rbSize)); i++) {
@@ -1209,7 +1216,6 @@ void nr_generate_Msg2(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
// look up the PDCCH PDU for this CC, BWP, and CORESET. If it does not exist, create it. This is especially
// important if we have multiple RAs, and the DLSCH has to reuse them, so we need to mark them
- const int coresetid = coreset->controlResourceSetId;
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15 = nr_mac->pdcch_pdu_idx[CC_id][coresetid];
if (!pdcch_pdu_rel15) {
nfapi_nr_dl_tti_request_pdu_t *dl_tti_pdcch_pdu = &dl_req->dl_tti_pdu_list[dl_req->nPDUs];
@@ -1481,7 +1487,10 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
}
uint8_t time_domain_assignment = get_dl_tda(nr_mac, scc, slotP);
- NR_tda_info_t msg4_tda = nr_get_pdsch_tda_info(dl_bwp, time_domain_assignment);
+ int mux_pattern = type0_PDCCH_CSS_config ? type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern : 1;
+ NR_tda_info_t msg4_tda = get_dl_tda_info(dl_bwp, ss->searchSpaceType->present, time_domain_assignment,
+ scc->dmrs_TypeA_Position, mux_pattern, NR_RNTI_TC, coreset->controlResourceSetId, false);
+
NR_pdsch_dmrs_t dmrs_info = get_dl_dmrs_params(scc,
dl_bwp,
&msg4_tda,
@@ -1540,7 +1549,7 @@ void nr_generate_Msg4(module_id_t module_idP, int CC_id, frame_t frameP, sub_fra
LOG_D(NR_MAC,"[RAPROC] Msg4 r_pucch %d (CCEIndex %d, delta_PRI %d)\n", r_pucch, CCEIndex, delta_PRI);
int alloc = nr_acknack_scheduling(nr_mac, UE, frameP, slotP, r_pucch, 1);
- if (alloc<0) {
+ if (alloc < 0) {
LOG_D(NR_MAC,"Couldn't find a pucch allocation for ack nack (msg4) in frame %d slot %d\n",frameP,slotP);
return;
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index dc2467e904..8db40a26c7 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -569,23 +569,11 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
for (int k=0;ktype0_pdcch_ss_mux_pattern);
+ // assuming normal CP
+ NR_tda_info_t tda_info = get_info_from_tda_tables(table_type, time_domain_allocation, gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position, true);
- get_info_from_tda_tables(type0_PDCCH_CSS_config->type0_pdcch_ss_mux_pattern,
- time_domain_allocation,
- gNB_mac->common_channels->ServingCellConfigCommon->dmrs_TypeA_Position,
- 1, &is_typeA,
- &startSymbolIndex, &nrOfSymbols);
-
- AssertFatal((startSymbolIndex+nrOfSymbols)<14,"SIB1 TDA %d would cause overlap with CSI-RS. Please select a different SIB1 TDA.\n",time_domain_allocation);
-
- NR_tda_info_t tda_info = {
- .mapping_type = is_typeA ? typeA : typeB,
- .startSymbolIndex = startSymbolIndex,
- .nrOfSymbols = nrOfSymbols
- };
+ AssertFatal((tda_info.startSymbolIndex + tda_info.nrOfSymbols) < 14, "SIB1 TDA %d would cause overlap with CSI-RS. Please select a different SIB1 TDA.\n", time_domain_allocation);
NR_pdsch_dmrs_t dmrs_parms = get_dl_dmrs_params(scc,
NULL,
@@ -603,7 +591,7 @@ void schedule_nr_sib1(module_id_t module_idP, frame_t frameP, sub_frame_t slotP)
nfapi_nr_dl_tti_request_body_t *dl_req = &gNB_mac->DL_req[CC_id].dl_tti_request_body;
int pdu_index = gNB_mac->pdu_index[0]++;
- nr_fill_nfapi_dl_sib1_pdu(module_idP, dl_req, pdu_index, type0_PDCCH_CSS_config, TBS, startSymbolIndex, nrOfSymbols);
+ nr_fill_nfapi_dl_sib1_pdu(module_idP, dl_req, pdu_index, type0_PDCCH_CSS_config, TBS, tda_info.startSymbolIndex, tda_info.nrOfSymbols);
const int ntx_req = gNB_mac->TX_req[CC_id].Number_of_PDUs;
nfapi_nr_pdu_t *tx_req = &gNB_mac->TX_req[CC_id].pdu_list[ntx_req];
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
index 7cd98a5e28..08611fccd5 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_dlsch.c
@@ -411,7 +411,9 @@ bool allocate_dl_retransmission(module_id_t module_id,
/* Check first whether the old TDA can be reused
* this helps allocate retransmission when TDA changes (e.g. new nrOfSymbols > old nrOfSymbols) */
- NR_tda_info_t temp_tda = nr_get_pdsch_tda_info(dl_bwp, tda);
+ NR_tda_info_t temp_tda = get_dl_tda_info(dl_bwp, sched_ctrl->search_space->searchSpaceType->present, tda,
+ scc->dmrs_TypeA_Position, 1, NR_RNTI_C, coresetid, false);
+
bool reuse_old_tda = (retInfo->tda_info.startSymbolIndex == temp_tda.startSymbolIndex) && (retInfo->tda_info.nrOfSymbols <= temp_tda.nrOfSymbols);
LOG_D(NR_MAC, "[UE %x] %s old TDA, %s number of layers\n",
UE->rnti,
@@ -729,7 +731,9 @@ void pf_dl(module_id_t module_id,
sched_pdsch->time_domain_allocation = get_dl_tda(mac, scc, slot);
AssertFatal(sched_pdsch->time_domain_allocation>=0,"Unable to find PDSCH time domain allocation in list\n");
- sched_pdsch->tda_info = nr_get_pdsch_tda_info(dl_bwp, sched_pdsch->time_domain_allocation);
+ sched_pdsch->tda_info = get_dl_tda_info(dl_bwp, sched_ctrl->search_space->searchSpaceType->present, sched_pdsch->time_domain_allocation,
+ scc->dmrs_TypeA_Position, 1, NR_RNTI_C, coresetid, false);
+
NR_tda_info_t *tda_info = &sched_pdsch->tda_info;
const uint16_t slbitmap = SL_to_bitmap(tda_info->startSymbolIndex, tda_info->nrOfSymbols);
@@ -798,13 +802,12 @@ void nr_fr1_dlsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
NR_UE_DL_BWP_t *current_BWP = &UE->current_DL_BWP;
const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
int startSymbolIndex, nrOfSymbols;
- const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = current_BWP->tdaList;
+ const int coresetid = sched_ctrl->coreset->controlResourceSetId;
+ const struct NR_PDSCH_TimeDomainResourceAllocationList *tdaList = get_dl_tdalist(current_BWP, coresetid, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C);
AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
- const int coresetid = sched_ctrl->coreset->controlResourceSetId;
-
const uint16_t bwpSize = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_size : current_BWP->BWPSize;
const uint16_t BWPStart = coresetid == 0 ? RC.nrmac[module_id]->cset0_bwp_start : current_BWP->BWPStart;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index e2b4542a80..96756d41cd 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -59,7 +59,9 @@ void nr_preprocessor_phytest(module_id_t module_id,
const int CC_id = 0;
const int tda = get_dl_tda(RC.nrmac[module_id], scc, slot);
- NR_tda_info_t tda_info = nr_get_pdsch_tda_info(dl_bwp, tda);
+ NR_tda_info_t tda_info = get_dl_tda_info(dl_bwp, sched_ctrl->search_space->searchSpaceType->present, tda,
+ scc->dmrs_TypeA_Position, 1, NR_RNTI_C, sched_ctrl->coreset->controlResourceSetId, false);
+
sched_ctrl->sched_pdsch.tda_info = tda_info;
sched_ctrl->sched_pdsch.time_domain_allocation = tda;
@@ -205,7 +207,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
const int mu = ul_bwp->scs;
- const struct NR_PUSCH_TimeDomainResourceAllocationList *tdaList = ul_bwp->tdaList;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = get_ul_tdalist(ul_bwp, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C);
const int temp_tda = get_ul_tda(nr_mac, scc, frame, slot);
if (temp_tda < 0)
return false;
@@ -213,7 +215,7 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
"time domain assignment %d >= %d\n",
temp_tda,
tdaList->list.count);
- int K2 = get_K2(ul_bwp->tdaList, temp_tda, mu);
+ int K2 = get_K2(tdaList, temp_tda, mu);
const int sched_frame = frame + (slot + K2 >= nr_slots_per_frame[mu]);
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
const int tda = get_ul_tda(nr_mac, scc, sched_frame, sched_slot);
@@ -240,11 +242,11 @@ bool nr_ul_preprocessor_phytest(module_id_t module_id, frame_t frame, sub_frame_
else
rbSize = target_ul_bw;
- NR_tda_info_t tda_info = nr_get_pusch_tda_info(ul_bwp, tda);
+ NR_tda_info_t tda_info = get_ul_tda_info(ul_bwp, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C, tda);
sched_ctrl->sched_pusch.tda_info = tda_info;
- uint16_t *vrb_map_UL =
- &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+ const int buffer_index = ul_buffer_index(sched_frame, sched_slot, mu, nr_mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &nr_mac->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
for (int i = rbStart; i < rbStart + rbSize; ++i) {
if ((vrb_map_UL[i+BWPStart] & SL_to_bitmap(tda_info.startSymbolIndex, tda_info.nrOfSymbols)) != 0) {
LOG_E(MAC,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index 4814250fd9..fea0531bee 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -563,30 +563,6 @@ bool nr_find_nb_rb(uint16_t Qm,
return *tbs >= bytes && *nb_rb <= nb_rb_max;
}
-NR_tda_info_t nr_get_pdsch_tda_info(const NR_UE_DL_BWP_t *dl_bwp,
- const int tda) {
-
- NR_tda_info_t tda_info = {0};
- NR_PDSCH_TimeDomainResourceAllocationList_t *tdaList = dl_bwp->tdaList;
- AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
- tda_info.mapping_type = tdaList->list.array[tda]->mappingType;
- const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
- SLIV2SL(startSymbolAndLength, &tda_info.startSymbolIndex, &tda_info.nrOfSymbols);
- return tda_info;
-}
-
-NR_tda_info_t nr_get_pusch_tda_info(const NR_UE_UL_BWP_t *ul_bwp,
- const int tda) {
-
- NR_tda_info_t tda_info = {0};
- NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = ul_bwp->tdaList;
- AssertFatal(tda < tdaList->list.count, "time_domain_allocation %d>=%d\n", tda, tdaList->list.count);
- tda_info.mapping_type = tdaList->list.array[tda]->mappingType;
- const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
- SLIV2SL(startSymbolAndLength, &tda_info.startSymbolIndex, &tda_info.nrOfSymbols);
- return tda_info;
-}
-
NR_pusch_dmrs_t get_ul_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
const NR_UE_UL_BWP_t *ul_bwp,
const NR_tda_info_t *tda_info,
@@ -1078,12 +1054,8 @@ void set_r_pucch_parms(int rsetindex,
*start_symbol_index = default_pucch_firstsymb[rsetindex];
}
-void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
- const NR_UE_DL_BWP_t *current_BWP,
- const NR_ControlResourceSet_t *coreset,
- dci_pdu_rel15_t *dci_pdu_rel15,
- nr_dci_format_t format) {
-
+void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *current_BWP, const NR_ControlResourceSet_t *coreset, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format)
+{
AssertFatal(CellGroup!=NULL,"CellGroup shouldn't be null here\n");
const NR_PDSCH_Config_t *pdsch_Config = current_BWP ? current_BWP->pdsch_Config : NULL;
@@ -1157,7 +1129,6 @@ void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
}
}
-
void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
const NR_CellGroupConfig_t *CellGroup,
const NR_UE_DL_BWP_t *current_DL_BWP,
@@ -1177,7 +1148,6 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
*dci_pdu = 0;
uint16_t alt_size = 0;
uint16_t N_RB;
- const int controlResourceSetId = *ss->controlResourceSetId;
if(current_DL_BWP) {
N_RB = get_rb_bwp_dci(dci_format,
ss->searchSpaceType->present,
@@ -1190,28 +1160,16 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
// computing alternative size for padding
dci_pdu_rel15_t temp_pdu;
if(dci_format == NR_DL_DCI_FORMAT_1_0)
- alt_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,
- scc->uplinkConfigCommon->initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- CellGroup, &temp_pdu, NR_UL_DCI_FORMAT_0_0, rnti_type,
- controlResourceSetId, bwp_id, ss->searchSpaceType->present, cset0_bwp_size, 0);
+ alt_size = nr_dci_size(current_DL_BWP, current_UL_BWP, CellGroup, &temp_pdu, NR_UL_DCI_FORMAT_0_0, rnti_type, coreset, bwp_id, ss->searchSpaceType->present, cset0_bwp_size, 0);
if(dci_format == NR_UL_DCI_FORMAT_0_0)
- alt_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,
- scc->uplinkConfigCommon->initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- CellGroup, &temp_pdu, NR_DL_DCI_FORMAT_1_0, rnti_type,
- controlResourceSetId, bwp_id, ss->searchSpaceType->present, cset0_bwp_size, 0);
+ alt_size = nr_dci_size(current_DL_BWP, current_UL_BWP, CellGroup, &temp_pdu, NR_DL_DCI_FORMAT_1_0, rnti_type, coreset, bwp_id, ss->searchSpaceType->present, cset0_bwp_size, 0);
}
else
N_RB = cset0_bwp_size;
- int dci_size = nr_dci_size(scc->downlinkConfigCommon->initialDownlinkBWP,
- scc->uplinkConfigCommon->initialUplinkBWP,
- current_DL_BWP, current_UL_BWP,
- CellGroup, dci_pdu_rel15, dci_format, rnti_type, controlResourceSetId,
- bwp_id, ss->searchSpaceType->present, cset0_bwp_size, alt_size);
+ int dci_size = nr_dci_size(current_DL_BWP, current_UL_BWP, CellGroup, dci_pdu_rel15, dci_format, rnti_type, coreset, bwp_id, ss->searchSpaceType->present, cset0_bwp_size, alt_size);
pdcch_dci_pdu->PayloadSizeBits = dci_size;
AssertFatal(dci_size <= 64, "DCI sizes above 64 bits not yet supported");
if (dci_format == NR_DL_DCI_FORMAT_1_1 || dci_format == NR_UL_DCI_FORMAT_0_1)
@@ -2087,13 +2045,17 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
NR_BWP_Uplink_t *ul_bwp = NULL;
NR_BWP_DownlinkDedicated_t *bwpd = NULL;
NR_BWP_UplinkDedicated_t *ubwpd = NULL;
- DL_BWP->n_dl_bwp = 1;
- UL_BWP->n_ul_bwp = 1;
+ // number of additional BWPs (excluding initial BWP)
+ DL_BWP->n_dl_bwp = 0;
+ UL_BWP->n_ul_bwp = 0;
int old_dl_bwp_id = DL_BWP->bwp_id;
int old_ul_bwp_id = UL_BWP->bwp_id;
int target_ss;
+ if (CellGroup && CellGroup->physicalCellGroupConfig)
+ DL_BWP->pdsch_HARQ_ACK_Codebook = &CellGroup->physicalCellGroupConfig->pdsch_HARQ_ACK_Codebook;
+
if (CellGroup &&
CellGroup->spCellConfig &&
CellGroup->spCellConfig->spCellConfigDedicated) {
@@ -2102,6 +2064,7 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
DL_BWP->pdsch_servingcellconfig = servingCellConfig->pdsch_ServingCellConfig ? servingCellConfig->pdsch_ServingCellConfig->choice.setup : NULL;
UL_BWP->pusch_servingcellconfig = servingCellConfig->uplinkConfig && servingCellConfig->uplinkConfig->pusch_ServingCellConfig ?
servingCellConfig->uplinkConfig->pusch_ServingCellConfig->choice.setup : NULL;
+
target_ss = NR_SearchSpace__searchSpaceType_PR_ue_Specific;
if(UE && UE->Msg3_dcch_dtch) {
@@ -2167,6 +2130,7 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
ubwpd = servingCellConfig->uplinkConfig->initialUplinkBWP;
DL_BWP->pdsch_Config = bwpd->pdsch_Config->choice.setup;
+ UL_BWP->configuredGrantConfig = ubwpd->configuredGrantConfig ? ubwpd->configuredGrantConfig->choice.setup : NULL;
UL_BWP->pusch_Config = ubwpd->pusch_Config->choice.setup;
UL_BWP->pucch_Config = ubwpd->pucch_Config->choice.setup;
UL_BWP->srs_Config = ubwpd->srs_Config->choice.setup;
@@ -2180,6 +2144,7 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
UL_BWP->pusch_Config = NULL;
UL_BWP->pucch_Config = NULL;
UL_BWP->csi_MeasConfig = NULL;
+ UL_BWP->configuredGrantConfig = NULL;
}
if (old_dl_bwp_id != DL_BWP->bwp_id)
@@ -2189,14 +2154,14 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
// TDA lists
if (DL_BWP->bwp_id>0)
- DL_BWP->tdaList = dl_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ DL_BWP->tdaList_Common = dl_bwp->bwp_Common->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
else
- DL_BWP->tdaList = scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
+ DL_BWP->tdaList_Common = scc->downlinkConfigCommon->initialDownlinkBWP->pdsch_ConfigCommon->choice.setup->pdsch_TimeDomainAllocationList;
if(UL_BWP->bwp_id>0)
- UL_BWP->tdaList = ul_bwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ UL_BWP->tdaList_Common = ul_bwp->bwp_Common->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
else
- UL_BWP->tdaList = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
+ UL_BWP->tdaList_Common = scc->uplinkConfigCommon->initialUplinkBWP->pusch_ConfigCommon->choice.setup->pusch_TimeDomainAllocationList;
// setting generic parameters
NR_BWP_t dl_genericParameters = (DL_BWP->bwp_id > 0 && dl_bwp) ?
@@ -2226,10 +2191,13 @@ void configure_UE_BWP(gNB_MAC_INST *nr_mac,
else
UL_BWP->transform_precoding = *UL_BWP->pusch_Config->transformPrecoder;
- if(UL_BWP->bwp_id>0)
+ if (UL_BWP->bwp_id > 0) {
UL_BWP->pucch_ConfigCommon = ul_bwp->bwp_Common->pucch_ConfigCommon->choice.setup;
- else
+ UL_BWP->rach_ConfigCommon = ul_bwp->bwp_Common->rach_ConfigCommon->choice.setup;
+ } else {
UL_BWP->pucch_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup;
+ UL_BWP->rach_ConfigCommon = scc->uplinkConfigCommon->initialUplinkBWP->rach_ConfigCommon->choice.setup;
+ }
if(UE) {
@@ -2893,20 +2861,33 @@ void schedule_nr_bwp_switch(module_id_t module_id,
}
}
-void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid, frame_t frameP) {
+int ul_buffer_index(int frame, int slot, int scs, int size)
+{
+ const int abs_slot = frame * nr_slots_per_frame[scs] + slot;
+ return abs_slot % size;
+}
- if(gNB->UL_tti_req_ahead[CCid]) return;
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid, frame_t frameP, int slotP, int scs)
+{
- gNB->UL_tti_req_ahead[CCid] = calloc(n, sizeof(nfapi_nr_ul_tti_request_t));
- AssertFatal(gNB->UL_tti_req_ahead[CCid],
- "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
+ if(gNB->UL_tti_req_ahead[CCid])
+ return;
+
+ int size = n;
+ if (scs == 0)
+ size <<= 1; // to have enough room for feedback possibly beyond the frame we need a larger array at 15kHz SCS
+
+ gNB->UL_tti_req_ahead_size = size;
+ gNB->UL_tti_req_ahead[CCid] = calloc(size, sizeof(nfapi_nr_ul_tti_request_t));
+ AssertFatal(gNB->UL_tti_req_ahead[CCid], "could not allocate memory for RC.nrmac[]->UL_tti_req_ahead[]\n");
/* fill in slot/frame numbers: slot is fixed, frame will be updated by scheduler
* consider that scheduler runs sl_ahead: the first sl_ahead slots are
* already "in the past" and thus we put frame 1 instead of 0! */
- for (int i = 0; i < n; ++i) {
- nfapi_nr_ul_tti_request_t *req = &gNB->UL_tti_req_ahead[CCid][i];
- req->SFN = frameP + (i < (gNB->if_inst->sl_ahead-1));
- req->Slot = i;
+ for (int i = 0; i < size; ++i) {
+ int abs_slot = frameP * n + slotP + i;
+ nfapi_nr_ul_tti_request_t *req = &gNB->UL_tti_req_ahead[CCid][abs_slot % size];
+ req->SFN = abs_slot / n;
+ req->Slot = abs_slot % n;
}
}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
index ef98c82eab..8a85448c7f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_srs.c
@@ -137,7 +137,7 @@ void nr_srs_ri_computation(const nfapi_nr_srs_normalized_channel_iq_matrix_t *nr
}
-void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int CC_id, NR_UE_info_t *UE, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource)
+void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int CC_id, NR_UE_info_t *UE, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource, int buffer_index)
{
NR_UE_UL_BWP_t *current_BWP = &UE->current_UL_BWP;
@@ -190,15 +190,17 @@ void nr_configure_srs(nfapi_nr_srs_pdu_t *srs_pdu, int slot, int module_id, int
srs_pdu->beamforming.prg_size = 1;
}
- uint16_t *vrb_map_UL = &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[slot * MAX_BWP_SIZE];
+ uint16_t *vrb_map_UL = &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[buffer_index * MAX_BWP_SIZE];
uint64_t mask = SL_to_bitmap(13 - srs_pdu->time_start_position, srs_pdu->num_symbols);
for (int i = 0; i < srs_pdu->bwp_size; ++i)
vrb_map_UL[i + srs_pdu->bwp_start] |= mask;
}
-void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, sub_frame_t slot, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource) {
+void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, int frame, int slot, NR_SRS_ResourceSet_t *srs_resource_set, NR_SRS_Resource_t *srs_resource)
+{
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][slot];
+ int index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][index];
AssertFatal(future_ul_tti_req->n_pdus <
sizeof(future_ul_tti_req->pdus_list) / sizeof(future_ul_tti_req->pdus_list[0]),
"Invalid future_ul_tti_req->n_pdus %d\n", future_ul_tti_req->n_pdus);
@@ -207,8 +209,8 @@ void nr_fill_nfapi_srs(int module_id, int CC_id, NR_UE_info_t* UE, sub_frame_t s
nfapi_nr_srs_pdu_t *srs_pdu = &future_ul_tti_req->pdus_list[future_ul_tti_req->n_pdus].srs_pdu;
memset(srs_pdu, 0, sizeof(nfapi_nr_srs_pdu_t));
future_ul_tti_req->n_pdus += 1;
-
- nr_configure_srs(srs_pdu, slot, module_id, CC_id, UE, srs_resource_set, srs_resource);
+ index = ul_buffer_index(frame, slot, UE->current_UL_BWP.scs, RC.nrmac[module_id]->vrb_map_UL_size);
+ nr_configure_srs(srs_pdu, slot, module_id, CC_id, UE, srs_resource_set, srs_resource, index);
}
/*******************************************************************
@@ -274,11 +276,12 @@ void nr_schedule_srs(int module_id, frame_t frame, int slot)
continue;
}
- const int num_tda = current_BWP->tdaList->list.count;
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = get_ul_tdalist(current_BWP, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C);
+ const int num_tda = tdaList->list.count;
int max_k2 = 0;
// avoid last one in the list (for msg3)
for (int i = 0; i < num_tda - 1; i++) {
- int k2 = get_K2(current_BWP->tdaList, i, current_BWP->scs);
+ int k2 = get_K2(tdaList, i, current_BWP->scs);
max_k2 = k2 > max_k2 ? k2 : max_k2;
}
@@ -293,7 +296,7 @@ void nr_schedule_srs(int module_id, frame_t frame, int slot)
// Check if UE will transmit the SRS in this frame
if ((sched_frame * n_slots_frame + sched_slot - offset) % period == 0) {
LOG_D(NR_MAC," %d.%d Scheduling SRS reception for %d.%d\n", frame, slot, sched_frame, sched_slot);
- nr_fill_nfapi_srs(module_id, CC_id, UE, sched_slot, srs_resource_set, srs_resource);
+ nr_fill_nfapi_srs(module_id, CC_id, UE, sched_frame, sched_slot, srs_resource_set, srs_resource);
sched_ctrl->sched_srs.frame = sched_frame;
sched_ctrl->sched_srs.slot = sched_slot;
sched_ctrl->sched_srs.srs_scheduled = true;
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
index 5caea0c2c7..1a5561e05b 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_uci.c
@@ -45,7 +45,8 @@ static void nr_fill_nfapi_pucch(gNB_MAC_INST *nrmac,
NR_UE_info_t* UE)
{
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nrmac->UL_tti_req_ahead[0][pucch->ul_slot];
+ const int index = ul_buffer_index(pucch->frame, pucch->ul_slot, UE->current_UL_BWP.scs, nrmac->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nrmac->UL_tti_req_ahead[0][index];
if (future_ul_tti_req->SFN != pucch->frame || future_ul_tti_req->Slot != pucch->ul_slot)
LOG_W(MAC,
"Current %d.%d : future UL_tti_req's frame.slot %4d.%2d does not match PUCCH %4d.%2d\n",
@@ -182,9 +183,10 @@ void nr_schedule_pucch(gNB_MAC_INST *nrmac,
void nr_csi_meas_reporting(int Mod_idP,
frame_t frame,
- sub_frame_t slot) {
-
- UE_iterator(RC.nrmac[Mod_idP]->UE_info.list, UE ) {
+ sub_frame_t slot)
+{
+ gNB_MAC_INST *nrmac = RC.nrmac[Mod_idP];
+ UE_iterator(nrmac->UE_info.list, UE ) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
const int n_slots_frame = nr_slots_per_frame[ul_bwp->scs];
@@ -216,7 +218,7 @@ void nr_csi_meas_reporting(int Mod_idP,
if ((sched_frame*n_slots_frame + sched_slot - offset)%period != 0)
continue;
- AssertFatal(is_xlsch_in_slot(RC.nrmac[Mod_idP]->ulsch_slot_bitmap[sched_slot / 64], sched_slot), "CSI reporting slot %d is not set for an uplink slot\n", sched_slot);
+ AssertFatal(is_xlsch_in_slot(nrmac->ulsch_slot_bitmap[sched_slot / 64], sched_slot), "CSI reporting slot %d is not set for an uplink slot\n", sched_slot);
LOG_D(NR_MAC, "CSI reporting in frame %d slot %d CSI report ID %ld\n", sched_frame, sched_slot, csirep->reportConfigId);
const NR_PUCCH_ResourceSet_t *pucchresset = pucch_Config->resourceSetToAddModList->list.array[1]; // set with formats >1
@@ -228,9 +230,9 @@ void nr_csi_meas_reporting(int Mod_idP,
AssertFatal(res_index < n,
"CSI pucch resource %ld not found among PUCCH resources\n", pucchcsires->pucch_Resource);
- const NR_ServingCellConfigCommon_t *scc = RC.nrmac[Mod_idP]->common_channels[0].ServingCellConfigCommon;
+ const NR_ServingCellConfigCommon_t *scc = nrmac->common_channels[0].ServingCellConfigCommon;
const NR_TDD_UL_DL_Pattern_t *tdd = scc->tdd_UL_DL_ConfigurationCommon ? &scc->tdd_UL_DL_ConfigurationCommon->pattern1 : NULL;
- AssertFatal(tdd || RC.nrmac[Mod_idP]->common_channels[0].frame_type == FDD, "Dynamic TDD not handled yet\n");
+ AssertFatal(tdd || nrmac->common_channels[0].frame_type == FDD, "Dynamic TDD not handled yet\n");
const int pucch_index = get_pucch_index(sched_frame, sched_slot, n_slots_frame, tdd, sched_ctrl->sched_pucch_size);
NR_sched_pucch_t *curr_pucch = &sched_ctrl->sched_pucch[pucch_index];
AssertFatal(curr_pucch->active == false, "CSI structure is scheduled in advance. It should be free!\n");
@@ -244,7 +246,8 @@ void nr_csi_meas_reporting(int Mod_idP,
int bwp_start = ul_bwp->BWPStart;
// going through the list of PUCCH resources to find the one indexed by resource_id
- uint16_t *vrb_map_UL = &RC.nrmac[Mod_idP]->common_channels[0].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+ const int index = ul_buffer_index(sched_frame, sched_slot, ul_bwp->scs, nrmac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &nrmac->common_channels[0].vrb_map_UL[index * MAX_BWP_SIZE];
const int m = pucch_Config->resourceToAddModList->list.count;
for (int j = 0; j < m; j++) {
NR_PUCCH_Resource_t *pucchres = pucch_Config->resourceToAddModList->list.array[j];
@@ -1015,14 +1018,10 @@ void handle_nr_uci_pucch_2_3_4(module_id_t mod_id,
}
}
-void set_pucch_allocation(const NR_PUCCH_Config_t *pucch_Config,
- const NR_ServingCellConfigCommon_t *scc,
- const int r_pucch,
- const int bwp_size,
- NR_sched_pucch_t *pucch)
+void set_pucch_allocation(const NR_UE_UL_BWP_t *ul_bwp, const int r_pucch, const int bwp_size, NR_sched_pucch_t *pucch)
{
if(r_pucch<0){
- const NR_PUCCH_Resource_t *resource = pucch_Config->resourceToAddModList->list.array[0];
+ const NR_PUCCH_Resource_t *resource = ul_bwp->pucch_Config->resourceToAddModList->list.array[0];
DevAssert(resource->format.present == NR_PUCCH_Resource__format_PR_format0);
pucch->second_hop_prb = resource->secondHopPRB!= NULL ? *resource->secondHopPRB : 0;
pucch->nr_of_symb = resource->format.choice.format0->nrofSymbols;
@@ -1030,7 +1029,7 @@ void set_pucch_allocation(const NR_PUCCH_Config_t *pucch_Config,
pucch->prb_start = resource->startingPRB;
}
else{
- int rsetindex = *scc->uplinkConfigCommon->initialUplinkBWP->pucch_ConfigCommon->choice.setup->pucch_ResourceCommon;
+ int rsetindex = *ul_bwp->pucch_ConfigCommon->pucch_ResourceCommon;
set_r_pucch_parms(rsetindex,
r_pucch,
bwp_size,
@@ -1155,15 +1154,16 @@ int nr_acknack_scheduling(gNB_MAC_INST *mac,
}
else { // unoccupied occasion
// checking if in ul_slot the resources potentially to be assigned to this PUCCH are available
- set_pucch_allocation(pucch_Config, scc, r_pucch, bwp_size, curr_pucch);
- uint16_t *vrb_map_UL = &mac->common_channels[CC_id].vrb_map_UL[pucch_slot * MAX_BWP_SIZE];
+ set_pucch_allocation(ul_bwp, r_pucch, bwp_size, curr_pucch);
+ const int index = ul_buffer_index(pucch_frame, pucch_slot, ul_bwp->scs, mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &mac->common_channels[CC_id].vrb_map_UL[index * MAX_BWP_SIZE];
bool ret = test_pucch0_vrb_occupation(curr_pucch,
vrb_map_UL,
bwp_start,
bwp_size);
if(!ret) {
LOG_D(NR_MAC, "DL %4d.%2d, UL_ACK %4d.%2d PRB resources for this occasion are already occupied, move to the following occasion\n",
- frame,slot,curr_pucch->frame,curr_pucch->ul_slot);
+ frame, slot, pucch_frame, pucch_slot);
continue;
}
// allocating a new PUCCH structure for this occasion
@@ -1176,7 +1176,7 @@ int nr_acknack_scheduling(gNB_MAC_INST *mac,
curr_pucch->r_pucch=r_pucch;
LOG_D(NR_MAC, "DL %4d.%2d, UL_ACK %4d.%2d Scheduling ACK/NACK in PUCCH %d with timing indicator %d DAI %d\n",
- frame,slot,curr_pucch->frame,curr_pucch->ul_slot,pucch_index,f,curr_pucch->dai_c);
+ frame, slot, curr_pucch->frame, curr_pucch->ul_slot, pucch_index, f, curr_pucch->dai_c);
// blocking resources for current PUCCH in VRB map
set_pucch0_vrb_occupation(curr_pucch, vrb_map_UL, bwp_start);
@@ -1246,10 +1246,11 @@ void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t SFN, sub_frame_t slot)
continue;
}
else {
- uint16_t *vrb_map_UL = &nrmac->common_channels[CC_id].vrb_map_UL[slot * MAX_BWP_SIZE];
+ const int index = ul_buffer_index(SFN, slot, ul_bwp->scs, nrmac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &nrmac->common_channels[CC_id].vrb_map_UL[index * MAX_BWP_SIZE];
const int bwp_start = ul_bwp->BWPStart;
const int bwp_size = ul_bwp->BWPSize;
- set_pucch_allocation(pucch_Config, scc, -1, bwp_size, curr_pucch);
+ set_pucch_allocation(ul_bwp, -1, bwp_size, curr_pucch);
bool ret = test_pucch0_vrb_occupation(curr_pucch,
vrb_map_UL,
bwp_start,
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index a3c5a2e95c..25089b2edf 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -1424,13 +1424,14 @@ static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac,
const int CC_id = 0;
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
NR_sched_pusch_t *retInfo = &sched_ctrl->ul_harq_processes[harq_pid].sched_pusch;
+ NR_UE_UL_BWP_t *ul_bwp = &UE->current_UL_BWP;
int rbStart = 0; // wrt BWP start
- const uint16_t bwpSize = UE->current_UL_BWP.BWPSize;
+ const uint16_t bwpSize = ul_bwp->BWPSize;
const uint8_t nrOfLayers = retInfo->nrOfLayers;
LOG_D(NR_MAC,"retInfo->time_domain_allocation = %d, tda = %d\n", retInfo->time_domain_allocation, tda);
LOG_D(NR_MAC,"tbs %d\n",retInfo->tb_size);
- NR_tda_info_t tda_info = nr_get_pusch_tda_info(&UE->current_UL_BWP, tda);
+ NR_tda_info_t tda_info = get_ul_tda_info(ul_bwp, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C, tda);
bool reuse_old_tda = (retInfo->tda_info.startSymbolIndex == tda_info.startSymbolIndex) && (retInfo->tda_info.nrOfSymbols <= tda_info.nrOfSymbols);
if (reuse_old_tda && nrOfLayers == retInfo->nrOfLayers) {
/* Check the resource is enough for retransmission */
@@ -1450,7 +1451,7 @@ static bool allocate_ul_retransmission(gNB_MAC_INST *nrmac,
LOG_D(NR_MAC, "%s(): retransmission keeping TDA %d and TBS %d\n", __func__, tda, retInfo->tb_size);
} else {
NR_pusch_dmrs_t dmrs_info = get_ul_dmrs_params(scc,
- &UE->current_UL_BWP,
+ ul_bwp,
&tda_info,
nrOfLayers);
/* the retransmission will use a different time domain allocation, check
@@ -1666,7 +1667,7 @@ void pf_ul(module_id_t module_id,
sched_pusch->nrOfLayers = sched_ctrl->srs_feedback.ul_ri + 1;
sched_pusch->time_domain_allocation = get_ul_tda(nrmac, scc, sched_pusch->frame, sched_pusch->slot);
- sched_pusch->tda_info = nr_get_pusch_tda_info(current_BWP, sched_pusch->time_domain_allocation);
+ sched_pusch->tda_info = get_ul_tda_info(current_BWP, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C, sched_pusch->time_domain_allocation);
sched_pusch->dmrs_info = get_ul_dmrs_params(scc,
current_BWP,
&sched_pusch->tda_info,
@@ -1766,7 +1767,7 @@ void pf_ul(module_id_t module_id,
sched_pusch->nrOfLayers = sched_ctrl->srs_feedback.ul_ri + 1;
sched_pusch->time_domain_allocation = get_ul_tda(nrmac, scc, sched_pusch->frame, sched_pusch->slot);
- sched_pusch->tda_info = nr_get_pusch_tda_info(current_BWP, sched_pusch->time_domain_allocation);
+ sched_pusch->tda_info = get_ul_tda_info(current_BWP, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C, sched_pusch->time_domain_allocation);
sched_pusch->dmrs_info = get_ul_dmrs_params(scc,
current_BWP,
&sched_pusch->tda_info,
@@ -1868,13 +1869,14 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
NR_UE_UL_BWP_t *current_BWP = &nr_mac->UE_info.list[0]->current_UL_BWP;
int mu = current_BWP->scs;
const int temp_tda = get_ul_tda(nr_mac, scc, frame, slot);
- int K2 = get_K2(current_BWP->tdaList, temp_tda, mu);
+ NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList = get_ul_tdalist(current_BWP, sched_ctrl->coreset->controlResourceSetId, sched_ctrl->search_space->searchSpaceType->present, NR_RNTI_C);
+ int K2 = get_K2(tdaList, temp_tda, mu);
const int sched_frame = (frame + (slot + K2 >= nr_slots_per_frame[mu])) & 1023;
const int sched_slot = (slot + K2) % nr_slots_per_frame[mu];
const int tda = get_ul_tda(nr_mac, scc, sched_frame, sched_slot);
if (tda < 0)
return false;
- DevAssert(K2 == get_K2(current_BWP->tdaList, tda, mu));
+ DevAssert(K2 == get_K2(tdaList, tda, mu));
if (!is_xlsch_in_slot(nr_mac->ulsch_slot_bitmap[sched_slot / 64], sched_slot))
return false;
@@ -1883,9 +1885,9 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
sched_ctrl->sched_pusch.frame = sched_frame;
UE_iterator(nr_mac->UE_info.list, UE2) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE2->UE_sched_ctrl;
- AssertFatal(K2 == get_K2(current_BWP->tdaList, tda, mu),
+ AssertFatal(K2 == get_K2(tdaList, tda, mu),
"Different K2, %d(UE%d) != %ld(UE%04x)\n",
- K2, 0, get_K2(current_BWP->tdaList, tda, mu), UE2->rnti);
+ K2, 0, get_K2(tdaList, tda, mu), UE2->rnti);
sched_ctrl->sched_pusch.slot = sched_slot;
sched_ctrl->sched_pusch.frame = sched_frame;
}
@@ -1893,13 +1895,13 @@ bool nr_fr1_ulsch_preprocessor(module_id_t module_id, frame_t frame, sub_frame_t
/* Change vrb_map_UL to rballoc_mask: check which symbols per RB (in
* vrb_map_UL) overlap with the "default" tda and exclude those RBs.
* Calculate largest contiguous RBs */
- uint16_t *vrb_map_UL =
- &RC.nrmac[module_id]->common_channels[CC_id].vrb_map_UL[sched_slot * MAX_BWP_SIZE];
+ const int index = ul_buffer_index(sched_frame, sched_slot, mu, nr_mac->vrb_map_UL_size);
+ uint16_t *vrb_map_UL = &nr_mac->common_channels[CC_id].vrb_map_UL[index * MAX_BWP_SIZE];
const uint16_t bwpSize = current_BWP->BWPSize;
const uint16_t bwpStart = current_BWP->BWPStart;
- const int startSymbolAndLength = current_BWP->tdaList->list.array[tda]->startSymbolAndLength;
+ const int startSymbolAndLength = tdaList->list.array[tda]->startSymbolAndLength;
int startSymbolIndex, nrOfSymbols;
SLIV2SL(startSymbolAndLength, &startSymbolIndex, &nrOfSymbols);
const uint16_t symb = SL_to_bitmap(startSymbolIndex, nrOfSymbols);
@@ -1981,12 +1983,12 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
LOG_D(NR_MAC, "Current slot %d is NOT DL slot, cannot schedule DCI0 for UL data\n", slot);
return;
}
- bool do_sched = RC.nrmac[module_id]->pre_processor_ul(module_id, frame, slot);
+ bool do_sched = nr_mac->pre_processor_ul(module_id, frame, slot);
if (!do_sched)
return;
const int CC_id = 0;
- nfapi_nr_ul_dci_request_t *ul_dci_req = &RC.nrmac[module_id]->UL_dci_req[CC_id];
+ nfapi_nr_ul_dci_request_t *ul_dci_req = &nr_mac->UL_dci_req[CC_id];
ul_dci_req->SFN = frame;
ul_dci_req->Slot = slot;
/* a PDCCH PDU groups DCIs per BWP and CORESET. Save a pointer to each
@@ -1995,9 +1997,9 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_coreset[MAX_NUM_CORESET] = {0};
- NR_ServingCellConfigCommon_t *scc = RC.nrmac[module_id]->common_channels[0].ServingCellConfigCommon;
- NR_UEs_t *UE_info = &RC.nrmac[module_id]->UE_info;
- const NR_SIB1_t *sib1 = RC.nrmac[module_id]->common_channels[0].sib1 ? RC.nrmac[module_id]->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
+ NR_ServingCellConfigCommon_t *scc = nr_mac->common_channels[0].ServingCellConfigCommon;
+ NR_UEs_t *UE_info = &nr_mac->UE_info;
+ const NR_SIB1_t *sib1 = nr_mac->common_channels[0].sib1 ? nr_mac->common_channels[0].sib1->message.choice.c1->choice.systemInformationBlockType1 : NULL;
UE_iterator( UE_info->list, UE) {
NR_UE_sched_ctrl_t *sched_ctrl = &UE->UE_sched_ctrl;
if (sched_ctrl->ul_failure == 1 && get_softmodem_params()->phy_test==0) continue;
@@ -2104,7 +2106,8 @@ void nr_schedule_ulsch(module_id_t module_id, frame_t frame, sub_frame_t slot)
sched_ctrl->tpc0);
/* PUSCH in a later slot, but corresponding DCI now! */
- nfapi_nr_ul_tti_request_t *future_ul_tti_req = &RC.nrmac[module_id]->UL_tti_req_ahead[0][sched_pusch->slot];
+ const int index = ul_buffer_index(sched_pusch->frame, sched_pusch->slot, current_BWP->scs, nr_mac->UL_tti_req_ahead_size);
+ nfapi_nr_ul_tti_request_t *future_ul_tti_req = &nr_mac->UL_tti_req_ahead[0][index];
if (future_ul_tti_req->SFN != sched_pusch->frame || future_ul_tti_req->Slot != sched_pusch->slot)
LOG_W(MAC,
"%d.%d future UL_tti_req's frame.slot %d.%d does not match PUSCH %d.%d\n",
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index 7e9a66ca7f..ff74e34c4a 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -277,11 +277,7 @@ void fill_dci_pdu_rel15(const NR_ServingCellConfigCommon_t *scc,
NR_ControlResourceSet_t *coreset,
uint16_t cset0_bwp_size);
-void prepare_dci(const NR_CellGroupConfig_t *CellGroup,
- const NR_UE_DL_BWP_t *dl_bwp,
- const NR_ControlResourceSet_t *coreset,
- dci_pdu_rel15_t *dci_pdu_rel15,
- nr_dci_format_t format);
+void prepare_dci(const NR_CellGroupConfig_t *CellGroup, const NR_UE_DL_BWP_t *current_BWP, const NR_ControlResourceSet_t *coreset, dci_pdu_rel15_t *dci_pdu_rel15, nr_dci_format_t format);
void set_r_pucch_parms(int rsetindex,
int r_pucch,
@@ -307,12 +303,6 @@ long get_K2(NR_PUSCH_TimeDomainResourceAllocationList_t *tdaList,
int time_domain_assignment,
int mu);
-NR_tda_info_t nr_get_pdsch_tda_info(const NR_UE_DL_BWP_t *dl_bwp,
- const int tda);
-
-NR_tda_info_t nr_get_pusch_tda_info(const NR_UE_UL_BWP_t *ul_bwp,
- const int tda);
-
NR_pusch_dmrs_t get_ul_dmrs_params(const NR_ServingCellConfigCommon_t *scc,
const NR_UE_UL_BWP_t *ul_bwp,
const NR_tda_info_t *tda_info,
@@ -482,7 +472,9 @@ int get_mcs_from_bler(const NR_bler_options_t *bler_options,
int max_mcs,
frame_t frame);
-void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid, frame_t frameP);
+int ul_buffer_index(int frame, int slot, int scs, int size);
+
+void UL_tti_req_ahead_initialization(gNB_MAC_INST * gNB, NR_ServingCellConfigCommon_t *scc, int n, int CCid, frame_t frameP, int slotP, int scs);
void nr_sr_reporting(gNB_MAC_INST *nrmac, frame_t frameP, sub_frame_t slotP);
diff --git a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
index 22c1619ea6..b4fa43c40f 100644
--- a/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+++ b/openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
@@ -334,12 +334,6 @@ typedef struct NR_sched_pucch {
int start_symb;
} NR_sched_pucch_t;
-typedef struct NR_tda_info {
- mappingType_t mapping_type;
- int startSymbolIndex;
- int nrOfSymbols;
-} NR_tda_info_t;
-
typedef struct NR_pusch_dmrs {
uint8_t N_PRB_DMRS;
uint8_t num_dmrs_symb;
@@ -739,6 +733,8 @@ typedef struct gNB_MAC_INST_s {
/// NFAPI UL TTI Request Structure for future TTIs, dynamically allocated
/// because length depends on number of slots
nfapi_nr_ul_tti_request_t *UL_tti_req_ahead[NFAPI_CC_MAX];
+ int UL_tti_req_ahead_size;
+ int vrb_map_UL_size;
/// NFAPI HI/DCI0 Config Request Structure
nfapi_nr_ul_dci_request_t UL_dci_req[NFAPI_CC_MAX];
/// NFAPI DL PDU structure
diff --git a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
index eb1de74d20..27adaa39bc 100644
--- a/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
+++ b/openair2/NR_UE_PHY_INTERFACE/NR_IF_Module.c
@@ -667,6 +667,7 @@ static void fill_dci_from_dl_config(nr_downlink_indication_t*dl_ind, fapi_nr_dl_
if (rel15_dci->dci_length_options[j] == dl_ind->dci_ind->dci_list[k].payloadSize) {
dl_ind->dci_ind->dci_list[k].dci_format = rel15_dci->dci_format_options[j];
dl_ind->dci_ind->dci_list[k].ss_type = rel15_dci->dci_type_options[j];
+ dl_ind->dci_ind->dci_list[k].coreset_type = rel15_dci->coreset.CoreSetType;
LOG_D(NR_PHY, "format assigned dl_ind->dci_ind->dci_list[k].dci_format %d\n",
dl_ind->dci_ind->dci_list[k].dci_format);
}
diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c
index c0d3b730be..a38f9c3972 100644
--- a/openair2/RRC/NR/nr_rrc_config.c
+++ b/openair2/RRC/NR/nr_rrc_config.c
@@ -760,15 +760,12 @@ void nr_rrc_config_ul_tda(NR_ServingCellConfigCommon_t *scc, int min_fb_delay){
void set_dl_DataToUL_ACK(NR_PUCCH_Config_t *pucch_Config, int min_feedback_time, NR_SubcarrierSpacing_t subcarrierSpacing)
{
pucch_Config->dl_DataToUL_ACK = calloc(1,sizeof(*pucch_Config->dl_DataToUL_ACK));
- const int n_slots_frame = slotsperframe[subcarrierSpacing];
long *delay[8];
for (int i = 0; i < 8; i++) {
int curr_delay = i + min_feedback_time;
- if (curr_delay <= n_slots_frame) {
- delay[i] = calloc(1,sizeof(*delay[i]));
- *delay[i] = curr_delay;
- asn1cSeqAdd(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
- }
+ delay[i] = calloc(1,sizeof(*delay[i]));
+ *delay[i] = curr_delay;
+ asn1cSeqAdd(&pucch_Config->dl_DataToUL_ACK->list,delay[i]);
}
}
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index 2deeea6e1f..c686bdb81b 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -1673,6 +1673,7 @@ void rrc_gNB_process_RRCReestablishmentComplete(const protocol_ctxt_t *const ctx
ue_context_pP->ue_context.masterCellGroup->spCellConfig = ue_context_pP->ue_context.spCellConfigReestablishment;
ue_context_pP->ue_context.spCellConfigReestablishment = NULL;
cellGroupConfig->spCellConfig = ue_context_pP->ue_context.masterCellGroup->spCellConfig;
+ cellGroupConfig->physicalCellGroupConfig = ue_context_pP->ue_context.masterCellGroup->physicalCellGroupConfig;
fill_mastercellGroupConfig(cellGroupConfig, ue_context_pP->ue_context.masterCellGroup, rrc->um_on_default_drb, (drb_id_to_setup_start < 2) ? 1 : 0, drb_id_to_setup_start, nb_drb_to_setup, drb_priority);
diff --git a/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf
new file mode 100644
index 0000000000..fdf159d5d9
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band41.fr1.52PRB.usrpb210.conf
@@ -0,0 +1,288 @@
+# This file is derived from ./phy-demo/oai/targets/PROJECTS/GENERIC-NR-5GC/CONF/gnb.sa.band78.fr1.24PRB.usrpb210.conf
+# ./nr-uesoftmodem -r 24 --numerology 1 --band 41 -C 2593320000 --ssb 24 --rfsim --sa
+
+Active_gNBs = ( "gNB-OAI");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+gNBs =
+(
+ {
+ ////////// Identification parameters:
+ gNB_ID = 0xe00;
+ gNB_name = "gNB-OAI";
+
+ // Tracking area code, 0x0000 and 0xfffe are reserved values
+ tracking_area_code = 1;
+ plmn_list = ({ mcc = 208; mnc = 99; mnc_length = 2; snssaiList = ({ sst = 1 }) });
+
+ nr_cellid = 12345678L;
+
+ ////////// Physical parameters:
+
+ do_CSIRS = 1;
+ do_SRS = 1;
+ sib1_tda = 15;
+ min_rxtxtime = 6;
+
+ pdcch_ConfigSIB1 = (
+ {
+ controlResourceSetZero = 6;
+ searchSpaceZero = 0;
+ }
+ );
+
+ servingCellConfigCommon = (
+ {
+ #spCellConfigCommon
+
+ physCellId = 0;
+
+# downlinkConfigCommon
+ #frequencyInfoDL
+ # this is 2574.270 MHz + 53 PRBs@30kHz SCS (same as initial BWP)
+ absoluteFrequencySSB = 518670;
+ dl_frequencyBand = 41;
+ # this is 3600 MHz
+ dl_absoluteFrequencyPointA = 517734;
+ #scs-SpecificCarrierList
+ dl_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ dl_subcarrierSpacing = 0;
+ dl_carrierBandwidth = 52;
+ #initialDownlinkBWP
+ #genericParameters
+ # this is RBstart=0,L=106 (275*(L-1))+RBstart
+ initialDLBWPlocationAndBandwidth = 14025; # 6366 12925 12956 28875 12952
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialDLBWPsubcarrierSpacing = 0;
+ #pdcch-ConfigCommon
+ initialDLBWPcontrolResourceSetZero = 6;
+ initialDLBWPsearchSpaceZero = 0;
+
+ #uplinkConfigCommon
+ #frequencyInfoUL
+ ul_frequencyBand = 41;
+ #scs-SpecificCarrierList
+ ul_offstToCarrier = 0;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ ul_subcarrierSpacing = 0;
+ ul_carrierBandwidth = 52;
+ pMax = 20;
+ #initialUplinkBWP
+ #genericParameters
+ initialULBWPlocationAndBandwidth = 14025;
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ initialULBWPsubcarrierSpacing = 0;
+ #rach-ConfigCommon
+ #rach-ConfigGeneric
+ prach_ConfigurationIndex = 98;
+#prach_msg1_FDM
+#0 = one, 1=two, 2=four, 3=eight
+ prach_msg1_FDM = 0;
+ prach_msg1_FrequencyStart = 0;
+ zeroCorrelationZoneConfig = 13;
+ preambleReceivedTargetPower = -96;
+#preamblTransMax (0...10) = (3,4,5,6,7,8,10,20,50,100,200)
+ preambleTransMax = 6;
+#powerRampingStep
+# 0=dB0,1=dB2,2=dB4,3=dB6
+ powerRampingStep = 1;
+#ra_ReponseWindow
+#1,2,4,8,10,20,40,80
+ ra_ResponseWindow = 4;
+#ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR
+#1=oneeighth,2=onefourth,3=half,4=one,5=two,6=four,7=eight,8=sixteen
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB_PR = 4;
+#oneHalf (0..15) 4,8,12,16,...60,64
+ ssb_perRACH_OccasionAndCB_PreamblesPerSSB = 15;
+#ra_ContentionResolutionTimer
+#(0..7) 8,16,24,32,40,48,56,64
+ ra_ContentionResolutionTimer = 7;
+ rsrp_ThresholdSSB = 19;
+#prach-RootSequenceIndex_PR
+#1 = 839, 2 = 139
+ prach_RootSequenceIndex_PR = 2;
+ prach_RootSequenceIndex = 1;
+ # SCS for msg1, can only be 15 for 30 kHz < 6 GHz, takes precendence over the one derived from prach-ConfigIndex
+ #
+ msg1_SubcarrierSpacing = 0,
+# restrictedSetConfig
+# 0=unrestricted, 1=restricted type A, 2=restricted type B
+ restrictedSetConfig = 0,
+
+ msg3_DeltaPreamble = 1;
+ p0_NominalWithGrant =-90;
+
+# pucch-ConfigCommon setup :
+# pucchGroupHopping
+# 0 = neither, 1= group hopping, 2=sequence hopping
+ pucchGroupHopping = 0;
+ hoppingId = 40;
+ p0_nominal = -90;
+# ssb_PositionsInBurs_BitmapPR
+# 1=short, 2=medium, 3=long
+ ssb_PositionsInBurst_PR = 2;
+ ssb_PositionsInBurst_Bitmap = 1;
+
+# ssb_periodicityServingCell
+# 0 = ms5, 1=ms10, 2=ms20, 3=ms40, 4=ms80, 5=ms160, 6=spare2, 7=spare1
+ ssb_periodicityServingCell = 2;
+
+# dmrs_TypeA_position
+# 0 = pos2, 1 = pos3
+ dmrs_TypeA_Position = 0;
+
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ subcarrierSpacing = 0;
+
+
+ #tdd-UL-DL-ConfigurationCommon
+# subcarrierSpacing
+# 0=kHz15, 1=kHz30, 2=kHz60, 3=kHz120
+ referenceSubcarrierSpacing = 0;
+ # pattern1
+ # dl_UL_TransmissionPeriodicity
+ # 0=ms0p5, 1=ms0p625, 2=ms1, 3=ms1p25, 4=ms2, 5=ms2p5, 6=ms5, 7=ms10
+ dl_UL_TransmissionPeriodicity = 7;
+ nrofDownlinkSlots = 7;
+ nrofDownlinkSymbols = 6;
+ nrofUplinkSlots = 2;
+ nrofUplinkSymbols = 4;
+
+ ssPBCH_BlockPower = -25;
+ }
+
+ );
+
+
+ # ------- SCTP definitions
+ SCTP :
+ {
+ # Number of streams to use in input/output
+ SCTP_INSTREAMS = 2;
+ SCTP_OUTSTREAMS = 2;
+ };
+
+
+ ////////// AMF parameters:
+ amf_ip_address = ( { ipv4 = "192.168.70.132";
+ ipv6 = "192:168:30::17";
+ active = "yes";
+ preference = "ipv4";
+ }
+ );
+
+
+ NETWORK_INTERFACES :
+ {
+ GNB_INTERFACE_NAME_FOR_NG_AMF = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NG_AMF = "192.168.70.129/24";
+ GNB_INTERFACE_NAME_FOR_NGU = "demo-oai";
+ GNB_IPV4_ADDRESS_FOR_NGU = "192.168.70.129/24";
+ GNB_PORT_FOR_S1U = 2152; # Spec 2152
+ };
+
+ }
+);
+
+MACRLCs = (
+{
+ num_cc = 1;
+ tr_s_preference = "local_L1";
+ tr_n_preference = "local_RRC";
+ pusch_TargetSNRx10 = 150;
+ pucch_TargetSNRx10 = 200;
+ ulsch_max_frame_inactivity = 1;
+}
+);
+
+L1s = (
+{
+ num_cc = 1;
+ tr_n_preference = "local_mac";
+ pusch_proc_threads = 8;
+ prach_dtx_threshold = 120;
+ pucch0_dtx_threshold = 150;
+ ofdm_offset_divisor = 8; #set this to UINT_MAX for offset 0
+}
+);
+
+RUs = (
+{
+ local_rf = "yes"
+ nb_tx = 1
+ nb_rx = 1
+ att_tx = 0
+ att_rx = 0;
+ bands = [41];
+ max_pdschReferenceSignalPower = -27;
+ max_rxgain = 114;
+ sf_extension = 0;
+ eNB_instances = [0];
+ #beamforming 1x4 matrix:
+ bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000];
+ clock_src = "internal";
+}
+);
+
+THREAD_STRUCT = (
+{
+ #three config for level of parallelism "PARALLEL_SINGLE_THREAD", "PARALLEL_RU_L1_SPLIT", or "PARALLEL_RU_L1_TRX_SPLIT"
+ parallel_config = "PARALLEL_SINGLE_THREAD";
+ #two option for worker "WORKER_DISABLE" or "WORKER_ENABLE"
+ worker_config = "WORKER_ENABLE";
+}
+);
+
+rfsimulator :
+{
+ serveraddr = "server";
+ serverport = "4043";
+ options = (); #("saviq"); or/and "chanmod"
+ modelname = "AWGN";
+ IQfile = "/tmp/rfsimulator.iqs";
+};
+
+security = {
+ # preferred ciphering algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nea0, nea1, nea2, nea3
+ ciphering_algorithms = ( "nea0" );
+
+ # preferred integrity algorithms
+ # the first one of the list that an UE supports in chosen
+ # valid values: nia0, nia1, nia2, nia3
+ integrity_algorithms = ( "nia2", "nia0" );
+
+ # setting 'drb_ciphering' to "no" disables ciphering for DRBs, no matter
+ # what 'ciphering_algorithms' configures; same thing for 'drb_integrity'
+ drb_ciphering = "yes";
+ drb_integrity = "no";
+};
+
+log_config :
+{
+ global_log_level ="info";
+ global_log_verbosity ="medium";
+ hw_log_level ="info";
+ hw_log_verbosity ="medium";
+ phy_log_level ="info";
+ phy_log_verbosity ="medium";
+ mac_log_level ="info";
+ mac_log_verbosity ="high";
+ rlc_log_level ="info";
+ rlc_log_verbosity ="medium";
+ pdcp_log_level ="info";
+ pdcp_log_verbosity ="medium";
+ rrc_log_level ="info";
+ rrc_log_verbosity ="medium";
+ ngap_log_level ="debug";
+ ngap_log_verbosity ="medium";
+};
+