Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zzha zzha
OpenXG-RAN
Commits
b44bb412
Commit
b44bb412
authored
Mar 23, 2023
by
Robert Schmidt
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/develop-UL-Rx' into integration_2023_w12
parents
6475cf21
9e6fe8cf
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
106 additions
and
132 deletions
+106
-132
cmake_targets/autotests/test_case_list.xml
cmake_targets/autotests/test_case_list.xml
+5
-3
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+2
-3
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+2
-0
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+97
-126
No files found.
cmake_targets/autotests/test_case_list.xml
View file @
b44bb412
...
@@ -442,7 +442,8 @@
...
@@ -442,7 +442,8 @@
(Test21: 3GPP G-FR1-A5-13, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test),
(Test21: 3GPP G-FR1-A5-13, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test),
(Test22: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test),
(Test22: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test),
(Test23: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test),
(Test23: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 4 RX Antennas Requirements Test),
(Test24: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test)
</desc>
(Test24: 3GPP G-FR1-A5-14, PUSCH Type B, 100 MHz BW, 30 kHz SCS, 8 RX Antennas Requirements Test),
(Test25: 3GPP G-FR1-A4-27, PUSCH Type B, 40 MHz BW, 30 kHz SCS, 2 RX Antennas Requirements Test, 2 layers)
</desc>
<main_exec>
nr_ulsim
</main_exec>
<main_exec>
nr_ulsim
</main_exec>
<main_exec_args>
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z2 -s12.4 -S12.4
<main_exec_args>
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z2 -s12.4 -S12.4
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z4 -s8.5 -S8.5
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 0,1,1,2 -z4 -s8.5 -S8.5
...
@@ -467,8 +468,9 @@
...
@@ -467,8 +468,9 @@
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 1,1,1,2 -z8 -s5.5 -S5.5
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R106 -r106 -U 1,1,1,2 -z8 -s5.5 -S5.5
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z2 -s13.1 -S13.1
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z2 -s13.1 -S13.1
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z4 -s9.2 -S9.2
-n100 -b14 -I7 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z4 -s9.2 -S9.2
-n100 -b14 -I8 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z8 -s5.9 -S5.9
</main_exec_args>
-n100 -b14 -I8 -i 0,1 -g A,l,10 -t70 -u 1 -m20 -R273 -r273 -U 1,1,1,2 -z8 -s5.9 -S5.9
<tags>
test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24
</tags>
-n100 -b14 -I15 -i 0,1 -g C,l -t70 -u 1 -m16 -R106 -r106 -U 1,1,1,2 -W2 -y2 -z2 -s18.7 -S18.7
</main_exec_args>
<tags>
test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16 test17 test18 test19 test20 test21 test22 test23 test24 test25
</tags>
<search_expr_true>
PUSCH test OK
</search_expr_true>
<search_expr_true>
PUSCH test OK
</search_expr_true>
<search_expr_false>
segmentation fault|assertion|exiting|fatal
</search_expr_false>
<search_expr_false>
segmentation fault|assertion|exiting|fatal
</search_expr_false>
<nruns>
3
</nruns>
<nruns>
3
</nruns>
...
...
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
View file @
b44bb412
...
@@ -45,9 +45,8 @@ void nr_est_timing_advance_pusch(const NR_DL_FRAME_PARMS *frame_parms, const int
...
@@ -45,9 +45,8 @@ void nr_est_timing_advance_pusch(const NR_DL_FRAME_PARMS *frame_parms, const int
const
int
sync_pos
=
0
;
const
int
sync_pos
=
0
;
for
(
int
i
=
0
;
i
<
frame_parms
->
ofdm_symbol_size
;
i
++
)
{
for
(
int
i
=
0
;
i
<
frame_parms
->
ofdm_symbol_size
;
i
++
)
{
int
Re
=
((
int16_t
*
)
ul_ch_estimates_time
)[(
i
<<
1
)];
c16_t
*
sample
=
(
c16_t
*
)
&
ul_ch_estimates_time
[
i
];
int
Im
=
((
int16_t
*
)
ul_ch_estimates_time
)[
1
+
(
i
<<
1
)];
int
temp
=
(
sample
->
r
*
sample
->
r
/
2
)
+
(
sample
->
i
*
sample
->
i
/
2
);
int
temp
=
(
Re
*
Re
/
2
)
+
(
Im
*
Im
/
2
);
if
(
temp
>
max_val
)
{
if
(
temp
>
max_val
)
{
max_pos
=
i
;
max_pos
=
i
;
max_val
=
temp
;
max_val
=
temp
;
...
...
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
b44bb412
...
@@ -102,9 +102,11 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
...
@@ -102,9 +102,11 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
int
get_delay_idx
(
int
delay
)
{
int
get_delay_idx
(
int
delay
)
{
int
delay_idx
=
MAX_UL_DELAY_COMP
+
delay
;
int
delay_idx
=
MAX_UL_DELAY_COMP
+
delay
;
// If the measured delay is less than -MAX_UL_DELAY_COMP, a -MAX_UL_DELAY_COMP delay is compensated.
if
(
delay_idx
<
0
)
{
if
(
delay_idx
<
0
)
{
delay_idx
=
0
;
delay_idx
=
0
;
}
}
// If the measured delay is greater than +MAX_UL_DELAY_COMP, a +MAX_UL_DELAY_COMP delay is compensated.
if
(
delay_idx
>
MAX_UL_DELAY_COMP
<<
1
)
{
if
(
delay_idx
>
MAX_UL_DELAY_COMP
<<
1
)
{
delay_idx
=
MAX_UL_DELAY_COMP
<<
1
;
delay_idx
=
MAX_UL_DELAY_COMP
<<
1
;
}
}
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
b44bb412
...
@@ -547,7 +547,19 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
...
@@ -547,7 +547,19 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
#endif
#endif
}
}
__m128i
a_mult_conjb
(
__m128i
a
,
__m128i
b
,
unsigned
char
output_shift
)
{
__m128i
mmtmpD0
=
_mm_madd_epi16
(
b
,
a
);
__m128i
mmtmpD1
=
_mm_shufflelo_epi16
(
b
,
_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
]);
mmtmpD1
=
_mm_madd_epi16
(
mmtmpD1
,
a
);
mmtmpD0
=
_mm_srai_epi32
(
mmtmpD0
,
output_shift
);
mmtmpD1
=
_mm_srai_epi32
(
mmtmpD1
,
output_shift
);
__m128i
mmtmpD2
=
_mm_unpacklo_epi32
(
mmtmpD0
,
mmtmpD1
);
__m128i
mmtmpD3
=
_mm_unpackhi_epi32
(
mmtmpD0
,
mmtmpD1
);
return
_mm_packs_epi32
(
mmtmpD2
,
mmtmpD3
);
}
//==============================================================================================
//==============================================================================================
// Pre-processing for LLR computation
// Pre-processing for LLR computation
...
@@ -689,71 +701,16 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
...
@@ -689,71 +701,16 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
}
}
// multiply by conjugated channel
// Multiply received data by conjugated channel
mmtmpD0
=
_mm_madd_epi16
(
ul_ch128
[
0
],
rxdataF128
[
0
]);
rxdataF_comp128
[
0
]
=
a_mult_conjb
(
rxdataF128
[
0
],
ul_ch128
[
0
],
output_shift
);
// print_ints("re",&mmtmpD0);
rxdataF_comp128
[
1
]
=
a_mult_conjb
(
rxdataF128
[
1
],
ul_ch128
[
1
],
output_shift
);
rxdataF_comp128
[
2
]
=
a_mult_conjb
(
rxdataF128
[
2
],
ul_ch128
[
2
],
output_shift
);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1
=
_mm_shufflelo_epi16
(
ul_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:",ul_ch128);
// print_shorts("pack:",rxdataF_comp128);
// multiply by conjugated channel
mmtmpD0
=
_mm_madd_epi16
(
ul_ch128
[
1
],
rxdataF128
[
1
]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1
=
_mm_shufflelo_epi16
(
ul_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:",ul_ch128+1);
// print_shorts("pack:",rxdataF_comp128+1);
// multiply by conjugated channel
mmtmpD0
=
_mm_madd_epi16
(
ul_ch128
[
2
],
rxdataF128
[
2
]);
// mmtmpD0 contains real part of 4 consecutive outputs (32-bit)
mmtmpD1
=
_mm_shufflelo_epi16
(
ul_ch128
[
2
],
_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
[
2
]);
// 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
[
2
]
=
_mm_packs_epi32
(
mmtmpD2
,
mmtmpD3
);
//print_shorts("rx:",rxdataF128+2);
//print_shorts("ch:",ul_ch128+2);
//print_shorts("pack:",rxdataF_comp128+2);
ul_ch128
+=
3
;
ul_ch128
+=
3
;
ul_ch_mag128
+=
3
;
ul_ch_mag128
+=
3
;
ul_ch_mag128b
+=
3
;
ul_ch_mag128b
+=
3
;
rxdataF128
+=
3
;
rxdataF128
+=
3
;
rxdataF_comp128
+=
3
;
rxdataF_comp128
+=
3
;
}
}
}
}
}
}
...
@@ -1375,13 +1332,14 @@ __m128i nr_ulsch_comp_muli_sum(__m128i input_x,
...
@@ -1375,13 +1332,14 @@ __m128i nr_ulsch_comp_muli_sum(__m128i input_x,
//printf("det_%d = %d log2 =%d \n",k,(((int *)&det[0])[k]),log2_approx(((int *)&det[0])[k]));
//printf("det_%d = %d log2 =%d \n",k,(((int *)&det[0])[k]),log2_approx(((int *)&det[0])[k]));
}
}
xy_re_128
=
_mm_slli_epi32
(
xy_re_128
,
5
);
int
b
=
log2_approx
(
sum_det
)
-
8
;
xy_re_128
=
_mm_srai_epi32
(
xy_re_128
,
log2_approx
(
sum_det
));
if
(
b
>
0
)
{
xy_re_128
=
_mm_slli_epi32
(
xy_re_128
,
5
);
xy_re_128
=
_mm_srai_epi32
(
xy_re_128
,
b
);
xy_im_128
=
_mm_srai_epi32
(
xy_im_128
,
b
);
xy_im_128
=
_mm_slli_epi32
(
xy_im_128
,
5
);
}
else
{
xy_im_128
=
_mm_srai_epi32
(
xy_im_128
,
log2_approx
(
sum_det
));
xy_re_128
=
_mm_slli_epi32
(
xy_re_128
,
-
b
);
xy_im_128
=
_mm_slli_epi32
(
xy_im_128
,
5
);
xy_im_128
=
_mm_slli_epi32
(
xy_im_128
,
-
b
);
}
tmp_z0
=
_mm_unpacklo_epi32
(
xy_re_128
,
xy_im_128
);
tmp_z0
=
_mm_unpacklo_epi32
(
xy_re_128
,
xy_im_128
);
//print_ints("unpack lo:",&tmp_z0[0]);
//print_ints("unpack lo:",&tmp_z0[0]);
...
@@ -1514,16 +1472,17 @@ void nr_ulsch_construct_HhH_elements(int *conjch00_ch00,
...
@@ -1514,16 +1472,17 @@ void nr_ulsch_construct_HhH_elements(int *conjch00_ch00,
*
*
*
*
* */
* */
uint8_t
nr_ulsch_zero_forcing_rx_2layers
(
int
**
rxdataF_comp
,
uint8_t
nr_ulsch_zero_forcing_rx_2layers
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
**
ul_ch_mag
,
int
**
rxdataF_comp
,
int
**
ul_ch_magb
,
int
**
ul_ch_mag
,
int
**
ul_ch_estimates_ext
,
int
**
ul_ch_magb
,
unsigned
short
nb_rb
,
int
**
ul_ch_estimates_ext
,
unsigned
char
n_rx
,
unsigned
short
nb_rb
,
unsigned
char
mod_order
,
unsigned
char
n_rx
,
int
shift
,
unsigned
char
mod_order
,
unsigned
char
symbol
,
int
shift
,
int
length
)
unsigned
char
symbol
,
int
length
)
{
{
int
*
ch00
,
*
ch01
,
*
ch10
,
*
ch11
;
int
*
ch00
,
*
ch01
,
*
ch10
,
*
ch11
;
int
*
ch20
,
*
ch30
,
*
ch21
,
*
ch31
;
int
*
ch20
,
*
ch30
,
*
ch21
,
*
ch31
;
...
@@ -1765,10 +1724,10 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
...
@@ -1765,10 +1724,10 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
*
*
*
*
**************************************************************************/
**************************************************************************/
__m128i
*
rxdataF_comp128_0
,
*
rxdataF_comp128_1
,
*
ul_ch_mag128_0
=
NULL
,
*
ul_ch_mag128b_0
=
NULL
,
*
determ_fin_128
;
//*dl_ch_mag128_1,*dl_ch_mag128b_1,*dl_ch_mag128r_1
__m128i
*
rxdataF_comp128_0
,
*
rxdataF_comp128_1
,
*
ul_ch_mag128_0
=
NULL
,
*
ul_ch_mag128b_0
=
NULL
,
*
ul_ch_mag128_1
=
NULL
,
*
ul_ch_mag128b_1
=
NULL
,
*
determ_fin_128
;
__m128i
mmtmpD0
,
mmtmpD1
,
mmtmpD2
,
mmtmpD3
;
__m128i
mmtmpD0
,
mmtmpD1
,
mmtmpD2
,
mmtmpD3
;
__m128i
*
after_mf_a_128
,
*
after_mf_b_128
,
*
after_mf_c_128
,
*
after_mf_d_128
;
__m128i
*
after_mf_a_128
,
*
after_mf_b_128
,
*
after_mf_c_128
,
*
after_mf_d_128
;
__m128i
QAM_amp128
=
{
0
},
QAM_amp128b
=
{
0
};
__m128i
QAM_amp128
=
{
0
},
QAM_amp128b
=
{
0
};
determ_fin_128
=
(
__m128i
*
)
&
determ_fin
[
0
];
determ_fin_128
=
(
__m128i
*
)
&
determ_fin
[
0
];
...
@@ -1787,45 +1746,50 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
...
@@ -1787,45 +1746,50 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
}
else
if
(
mod_order
==
6
)
{
}
else
if
(
mod_order
==
6
)
{
QAM_amp128
=
_mm_set1_epi16
(
QAM64_n1
);
//4/sqrt{42}
QAM_amp128
=
_mm_set1_epi16
(
QAM64_n1
);
//4/sqrt{42}
QAM_amp128b
=
_mm_set1_epi16
(
QAM64_n2
);
//2/sqrt{42}
QAM_amp128b
=
_mm_set1_epi16
(
QAM64_n2
);
//2/sqrt{42}
}
}
ul_ch_mag128_0
=
(
__m128i
*
)
&
ul_ch_mag
[
0
][
symbol
*
(
off
+
nb_rb
*
12
)];
ul_ch_mag128_0
=
(
__m128i
*
)
&
ul_ch_mag
[
0
][
symbol
*
(
off
+
nb_rb
*
12
)];
ul_ch_mag128b_0
=
(
__m128i
*
)
&
ul_ch_magb
[
0
][
symbol
*
(
off
+
nb_rb
*
12
)];
ul_ch_mag128b_0
=
(
__m128i
*
)
&
ul_ch_magb
[
0
][
symbol
*
(
off
+
nb_rb
*
12
)];
ul_ch_mag128_1
=
(
__m128i
*
)
&
ul_ch_mag
[
frame_parms
->
nb_antennas_rx
][
symbol
*
(
off
+
nb_rb
*
12
)];
ul_ch_mag128b_1
=
(
__m128i
*
)
&
ul_ch_magb
[
frame_parms
->
nb_antennas_rx
][
symbol
*
(
off
+
nb_rb
*
12
)];
}
}
for
(
int
rb
=
0
;
rb
<
3
*
nb_rb_0
;
rb
++
)
{
for
(
int
rb
=
0
;
rb
<
3
*
nb_rb_0
;
rb
++
)
{
if
(
mod_order
>
2
)
{
int
sum_det
=
0
;
for
(
int
k
=
0
;
k
<
4
;
k
++
)
{
sum_det
+=
((((
int
*
)
&
determ_fin_128
[
0
])[
k
])
>>
2
);
//printf("det_%d = %d\n",k,sum_det);
}
mmtmpD2
=
_mm_slli_epi32
(
determ_fin_128
[
0
],
5
);
mmtmpD2
=
_mm_srai_epi32
(
mmtmpD2
,
log2_approx
(
sum_det
));
mmtmpD2
=
_mm_slli_epi32
(
mmtmpD2
,
5
);
mmtmpD3
=
_mm_unpacklo_epi32
(
mmtmpD2
,
mmtmpD2
);
// Magnitude computation
if
(
mod_order
>
2
)
{
mmtmpD2
=
_mm_unpackhi_epi32
(
mmtmpD2
,
mmtmpD2
);
int
sum_det
=
0
;
for
(
int
k
=
0
;
k
<
4
;
k
++
)
{
sum_det
+=
((((
int
*
)
&
determ_fin_128
[
0
])[
k
])
>>
2
);
}
mmtmpD2
=
_mm_packs_epi32
(
mmtmpD3
,
mmtmpD2
);
int
b
=
log2_approx
(
sum_det
)
-
8
;
if
(
b
>
0
)
{
mmtmpD2
=
_mm_srai_epi32
(
determ_fin_128
[
0
],
b
);
}
else
{
mmtmpD2
=
_mm_slli_epi32
(
determ_fin_128
[
0
],
-
b
);
}
mmtmpD3
=
_mm_unpacklo_epi32
(
mmtmpD2
,
mmtmpD2
);
mmtmpD2
=
_mm_unpackhi_epi32
(
mmtmpD2
,
mmtmpD2
);
mmtmpD2
=
_mm_packs_epi32
(
mmtmpD3
,
mmtmpD2
);
// Layer 0
ul_ch_mag128_0
[
0
]
=
mmtmpD2
;
ul_ch_mag128_0
[
0
]
=
mmtmpD2
;
ul_ch_mag128b_0
[
0
]
=
mmtmpD2
;
ul_ch_mag128b_0
[
0
]
=
mmtmpD2
;
ul_ch_mag128_0
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128_0
[
0
],
QAM_amp128
);
ul_ch_mag128_0
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128_0
[
0
],
QAM_amp128
);
ul_ch_mag128_0
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128_0
[
0
],
1
);
ul_ch_mag128_0
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128_0
[
0
],
1
);
ul_ch_mag128b_0
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128b_0
[
0
],
QAM_amp128b
);
ul_ch_mag128b_0
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128b_0
[
0
],
1
);
ul_ch_mag128b_0
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128b_0
[
0
],
QAM_amp128b
);
ul_ch_mag128b_0
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128b_0
[
0
],
1
);
// Layer 1
ul_ch_mag128_1
[
0
]
=
mmtmpD2
;
//print_shorts("mag layer 1:",(int16_t*)&dl_ch_mag128_0[0]);
ul_ch_mag128b_1
[
0
]
=
mmtmpD2
;
//print_shorts("mag layer 2:",(int16_t*)&dl_ch_mag128_1[0]);
ul_ch_mag128_1
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128_1
[
0
],
QAM_amp128
);
//print_shorts("magb layer 1:",(int16_t*)&dl_ch_mag128b_0[0]);
ul_ch_mag128_1
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128_1
[
0
],
1
);
//print_shorts("magb layer 2:",(int16_t*)&dl_ch_mag128b_1[0]);
ul_ch_mag128b_1
[
0
]
=
_mm_mulhi_epi16
(
ul_ch_mag128b_1
[
0
],
QAM_amp128b
);
//print_shorts("magr layer 1:",(int16_t*)&dl_ch_mag128r_0[0]);
ul_ch_mag128b_1
[
0
]
=
_mm_slli_epi16
(
ul_ch_mag128b_1
[
0
],
1
);
//print_shorts("magr layer 2:",(int16_t*)&dl_ch_mag128r_1[0]);
}
}
// multiply by channel Inv
// multiply by channel Inv
//rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
//rxdataF_zf128_0 = rxdataF_comp128_0*d - b*rxdataF_comp128_1
//rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
//rxdataF_zf128_1 = rxdataF_comp128_1*a - c*rxdataF_comp128_0
...
@@ -1844,12 +1808,7 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
...
@@ -1844,12 +1808,7 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
determ_fin_128
[
0
]);
determ_fin_128
[
0
]);
rxdataF_comp128_0
[
0
]
=
mmtmpD0
;
rxdataF_comp128_0
[
0
]
=
mmtmpD0
;
if
(
mod_order
>
2
)
{
rxdataF_comp128_1
[
0
]
=
mmtmpD1
;
// We need to check why it is a shift of 3
rxdataF_comp128_1
[
0
]
=
simde_mm_srai_epi16
(
mmtmpD1
,
3
);
}
else
{
rxdataF_comp128_1
[
0
]
=
mmtmpD1
;
}
#ifdef DEBUG_DLSCH_DEMOD
#ifdef DEBUG_DLSCH_DEMOD
printf
(
"
\n
Rx signal after ZF l%d rb%d
\n
"
,
symbol
,
rb
);
printf
(
"
\n
Rx signal after ZF l%d rb%d
\n
"
,
symbol
,
rb
);
...
@@ -1858,7 +1817,9 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
...
@@ -1858,7 +1817,9 @@ uint8_t nr_ulsch_zero_forcing_rx_2layers(int **rxdataF_comp,
#endif
#endif
determ_fin_128
+=
1
;
determ_fin_128
+=
1
;
ul_ch_mag128_0
+=
1
;
ul_ch_mag128_0
+=
1
;
ul_ch_mag128b_0
+=
1
;
ul_ch_mag128_1
+=
1
;
ul_ch_mag128b_0
+=
1
;
ul_ch_mag128b_1
+=
1
;
rxdataF_comp128_0
+=
1
;
rxdataF_comp128_0
+=
1
;
rxdataF_comp128_1
+=
1
;
rxdataF_comp128_1
+=
1
;
after_mf_a_128
+=
1
;
after_mf_a_128
+=
1
;
...
@@ -1964,7 +1925,13 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
...
@@ -1964,7 +1925,13 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
int
off
=
((
rel15_ul
->
rb_size
&
1
)
==
1
)
?
4
:
0
;
int
off
=
((
rel15_ul
->
rb_size
&
1
)
==
1
)
?
4
:
0
;
uint32_t
rxdataF_ext_offset
=
0
;
uint32_t
rxdataF_ext_offset
=
0
;
uint8_t
shift_ch_ext
=
rel15_ul
->
nrOfLayers
>
1
?
log2_approx
(
max_ch
>>
11
)
:
0
;
uint8_t
shift_ch_ext
=
rel15_ul
->
nrOfLayers
>
1
?
log2_approx
(
max_ch
>>
11
)
:
0
;
uint8_t
ad_shift
=
1
+
log2_approx
(
frame_parms
->
nb_antennas_rx
>>
2
)
+
(
rel15_ul
->
nrOfLayers
==
2
);
int
ad_shift
=
0
;
if
(
rel15_ul
->
nrOfLayers
==
1
)
{
ad_shift
=
1
+
log2_approx
(
frame_parms
->
nb_antennas_rx
>>
2
);
}
else
{
ad_shift
=
-
3
;
// For 2-layers, we are already doing a bit shift in the nr_ulsch_zero_forcing_rx_2layers() function, so we can use more bits
}
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
symbol
++
)
{
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
symbol
++
)
{
uint8_t
dmrs_symbol_flag
=
(
rel15_ul
->
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
;
uint8_t
dmrs_symbol_flag
=
(
rel15_ul
->
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
;
...
@@ -2033,7 +2000,10 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
...
@@ -2033,7 +2000,10 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
avgs
=
cmax
(
avgs
,
avg
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
]);
avgs
=
cmax
(
avgs
,
avg
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
]);
gNB
->
pusch_vars
[
ulsch_id
]
->
log2_maxh
=
(
log2_approx
(
avgs
)
/
2
)
+
ad_shift
;
gNB
->
pusch_vars
[
ulsch_id
]
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
)
+
ad_shift
;
if
(
gNB
->
pusch_vars
[
ulsch_id
]
->
log2_maxh
<
0
)
{
gNB
->
pusch_vars
[
ulsch_id
]
->
log2_maxh
=
0
;
}
gNB
->
pusch_vars
[
ulsch_id
]
->
cl_done
=
1
;
gNB
->
pusch_vars
[
ulsch_id
]
->
cl_done
=
1
;
}
}
...
@@ -2071,7 +2041,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
...
@@ -2071,7 +2041,8 @@ void nr_rx_pusch(PHY_VARS_gNB *gNB,
//Apply zero forcing for 2 Tx layers
//Apply zero forcing for 2 Tx layers
if
(
rel15_ul
->
nrOfLayers
==
2
)
{
if
(
rel15_ul
->
nrOfLayers
==
2
)
{
nr_ulsch_zero_forcing_rx_2layers
(
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
,
nr_ulsch_zero_forcing_rx_2layers
(
frame_parms
,
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_mag0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_mag0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_magb0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_magb0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_estimates_ext
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_estimates_ext
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment