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
lizhongxiao
OpenXG-RAN
Commits
3cc61718
Commit
3cc61718
authored
2 years ago
by
rmagueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ULSCH power computation in a different way
parent
0be397b2
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
109 additions
and
71 deletions
+109
-71
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
+25
-1
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+82
-70
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+2
-0
No files found.
openair1/PHY/NR_ESTIMATION/nr_measurements_gNB.c
View file @
3cc61718
...
@@ -123,6 +123,14 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
...
@@ -123,6 +123,14 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
PHY_MEASUREMENTS_gNB
*
measurements
=
&
gNB
->
measurements
;
PHY_MEASUREMENTS_gNB
*
measurements
=
&
gNB
->
measurements
;
int
rb
,
nb_symb
[
275
]
=
{
0
};
int
rb
,
nb_symb
[
275
]
=
{
0
};
allocCast2D
(
ulsch_power
,
unsigned
int
,
gNB
->
measurements
.
ulsch_power
,
frame_parms
->
nb_antennas_rx
,
frame_parms
->
N_RB_UL
,
false
);
clearArray
(
gNB
->
measurements
.
ulsch_power
,
unsigned
int
);
allocCast2D
(
n0_subband_power
,
allocCast2D
(
n0_subband_power
,
unsigned
int
,
unsigned
int
,
gNB
->
measurements
.
n0_subband_power
,
gNB
->
measurements
.
n0_subband_power
,
...
@@ -140,9 +148,24 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
...
@@ -140,9 +148,24 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
for
(
int
s
=
first_symb
;
s
<
(
first_symb
+
num_symb
);
s
++
)
{
for
(
int
s
=
first_symb
;
s
<
(
first_symb
+
num_symb
);
s
++
)
{
int
offset0
=
((
slot
&
3
)
*
frame_parms
->
symbols_per_slot
+
s
)
*
frame_parms
->
ofdm_symbol_size
;
int
offset0
=
((
slot
&
3
)
*
frame_parms
->
symbols_per_slot
+
s
)
*
frame_parms
->
ofdm_symbol_size
;
for
(
rb
=
0
;
rb
<
frame_parms
->
N_RB_UL
;
rb
++
)
{
for
(
rb
=
0
;
rb
<
frame_parms
->
N_RB_UL
;
rb
++
)
{
int
offset
=
offset0
+
(
frame_parms
->
first_carrier_offset
+
(
rb
*
12
))
%
frame_parms
->
ofdm_symbol_size
;
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
int32_t
*
ul_ch
=
(
int32_t
*
)
&
common_vars
->
rxdataF
[
aarx
][
offset
];
int32_t
signal_energy
;
if
(((
frame_parms
->
N_RB_UL
&
1
)
==
1
)
&&
(
rb
==
(
frame_parms
->
N_RB_UL
>>
1
)))
{
signal_energy
=
signal_energy_nodc
(
ul_ch
,
6
);
ul_ch
=
(
int32_t
*
)
&
common_vars
->
rxdataF
[
aarx
][
offset0
];
signal_energy
+=
signal_energy_nodc
(
ul_ch
,
6
);
}
else
{
signal_energy
=
signal_energy_nodc
(
ul_ch
,
12
);
}
ulsch_power
[
aarx
][
rb
]
+=
signal_energy
;
LOG_D
(
NR_PHY
,
"slot %d symbol %d RB %d aarx %d n0_subband_power %d
\n
"
,
slot
,
s
,
rb
,
aarx
,
signal_energy
);
}
if
((
gNB
->
rb_mask_ul
[
s
][
rb
>>
5
]
&
(
1U
<<
(
rb
&
31
)))
==
0
&&
// check that rb was not used in this subframe
if
((
gNB
->
rb_mask_ul
[
s
][
rb
>>
5
]
&
(
1U
<<
(
rb
&
31
)))
==
0
&&
// check that rb was not used in this subframe
!
(
I0_SKIP_DC
&&
rb
==
frame_parms
->
N_RB_UL
>>
1
))
{
// skip middle PRB because of artificial noise possibly created by FFT
!
(
I0_SKIP_DC
&&
rb
==
frame_parms
->
N_RB_UL
>>
1
))
{
// skip middle PRB because of artificial noise possibly created by FFT
int
offset
=
offset0
+
(
frame_parms
->
first_carrier_offset
+
(
rb
*
12
))
%
frame_parms
->
ofdm_symbol_size
;
nb_symb
[
rb
]
++
;
nb_symb
[
rb
]
++
;
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
int32_t
*
ul_ch
=
(
int32_t
*
)
&
common_vars
->
rxdataF
[
aarx
][
offset
];
int32_t
*
ul_ch
=
(
int32_t
*
)
&
common_vars
->
rxdataF
[
aarx
][
offset
];
...
@@ -172,6 +195,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
...
@@ -172,6 +195,7 @@ void gNB_I0_measurements(PHY_VARS_gNB *gNB,int slot, int first_symb,int num_symb
if
(
nb_symb
[
rb
]
>
0
)
{
if
(
nb_symb
[
rb
]
>
0
)
{
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
n0_subband_power
[
aarx
][
rb
]
/=
nb_symb
[
rb
];
n0_subband_power
[
aarx
][
rb
]
/=
nb_symb
[
rb
];
ulsch_power
[
aarx
][
rb
]
/=
num_symb
;
n0_subband_power_dB
[
aarx
][
rb
]
=
dB_fixed
(
n0_subband_power
[
aarx
][
rb
]);
n0_subband_power_dB
[
aarx
][
rb
]
=
dB_fixed
(
n0_subband_power
[
aarx
][
rb
]);
n0_subband_tot_perPRB
+=
n0_subband_power
[
aarx
][
rb
];
n0_subband_tot_perPRB
+=
n0_subband_power
[
aarx
][
rb
];
n0_subband_tot_perANT
[
aarx
]
+=
n0_subband_power
[
aarx
][
rb
];
n0_subband_tot_perANT
[
aarx
]
+=
n0_subband_power
[
aarx
][
rb
];
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
3cc61718
...
@@ -295,13 +295,13 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -295,13 +295,13 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
c16_t
*
rxF
=
&
rxdataF
[
rxoffset
];
c16_t
*
rxF
=
&
rxdataF
[
rxoffset
];
c16_t
*
rxF_ext
=
&
rxFext
[
0
];
c16_t
*
rxF_ext
=
&
rxFext
[
0
];
c16_t
*
ul_ch0
=
&
chF
[
choffset
];
c16_t
*
ul_ch0
=
&
chF
[
choffset
];
c16_t
*
ul_ch0_ext
=
&
chFext
[
0
];
c16_t
*
ul_ch0_ext
=
&
chFext
[
0
];
if
(
is_dmrs_symbol
==
0
)
{
if
(
is_dmrs_symbol
==
0
)
{
if
(
start_re
+
nb_re_pusch
<=
frame_parms
->
ofdm_symbol_size
)
if
(
start_re
+
nb_re_pusch
<=
frame_parms
->
ofdm_symbol_size
)
memcpy
(
rxF_ext
,
&
rxF
[
start_re
],
nb_re_pusch
*
sizeof
(
c16_t
));
memcpy
(
rxF_ext
,
&
rxF
[
start_re
],
nb_re_pusch
*
sizeof
(
c16_t
));
else
else
{
{
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
...
@@ -315,7 +315,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -315,7 +315,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
AssertFatal
(
delta
==
0
||
delta
==
1
,
"Illegal delta %d
\n
"
,
delta
);
AssertFatal
(
delta
==
0
||
delta
==
1
,
"Illegal delta %d
\n
"
,
delta
);
c16_t
*
rxF32
=
&
rxF
[
start_re
];
c16_t
*
rxF32
=
&
rxF
[
start_re
];
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
{
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
{
for
(
int
idx
=
1
-
delta
;
idx
<
nb_re_pusch
;
idx
+=
2
)
for
(
int
idx
=
1
-
delta
;
idx
<
nb_re_pusch
;
idx
+=
2
)
{
{
*
rxF_ext
++
=
rxF32
[
idx
];
*
rxF_ext
++
=
rxF32
[
idx
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
...
@@ -326,14 +326,14 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -326,14 +326,14 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
int
idx
,
idx2
;
int
idx
,
idx2
;
for
(
idx
=
1
-
delta
;
idx
<
neg_length
;
idx
+=
2
)
for
(
idx
=
1
-
delta
;
idx
<
neg_length
;
idx
+=
2
)
{
{
*
rxF_ext
++
=
rxF32
[
idx
];
*
rxF_ext
++
=
rxF32
[
idx
];
*
ul_ch0_ext
++=
ul_ch0
[
idx
];
*
ul_ch0_ext
++=
ul_ch0
[
idx
];
}
}
rxF32
=
rxF
;
rxF32
=
rxF
;
idx2
=
idx
;
idx2
=
idx
;
for
(
idx
=
1
-
delta
;
idx
<
pos_length
;
idx
+=
2
,
idx2
+=
2
)
for
(
idx
=
1
-
delta
;
idx
<
pos_length
;
idx
+=
2
,
idx2
+=
2
)
{
{
*
rxF_ext
++
=
rxF32
[
idx
];
*
rxF_ext
++
=
rxF32
[
idx
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx2
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx2
];
...
@@ -343,9 +343,9 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -343,9 +343,9 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type2
)
// 8 REs / PRB
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type2
)
// 8 REs / PRB
{
{
AssertFatal
(
delta
==
0
||
delta
==
2
||
delta
==
4
,
"Illegal delta %d
\n
"
,
delta
);
AssertFatal
(
delta
==
0
||
delta
==
2
||
delta
==
4
,
"Illegal delta %d
\n
"
,
delta
);
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
{
{
for
(
int
idx
=
0
;
idx
<
nb_re_pusch
;
idx
++
)
for
(
int
idx
=
0
;
idx
<
nb_re_pusch
;
idx
++
)
{
{
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
continue
;
continue
;
...
@@ -353,13 +353,13 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -353,13 +353,13 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
}
}
}
}
else
else
{
{
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
c16_t
*
rxF64
=
&
rxF
[
start_re
];
c16_t
*
rxF64
=
&
rxF
[
start_re
];
int
idx
,
idx2
;
int
idx
,
idx2
;
for
(
idx
=
0
;
idx
<
neg_length
;
idx
++
)
for
(
idx
=
0
;
idx
<
neg_length
;
idx
++
)
{
{
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
continue
;
continue
;
...
@@ -368,7 +368,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
...
@@ -368,7 +368,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
}
}
rxF64
=
rxF
;
rxF64
=
rxF
;
idx2
=
idx
;
idx2
=
idx
;
for
(
idx
=
0
;
idx
<
pos_length
;
idx
++
,
idx2
++
)
for
(
idx
=
0
;
idx
<
pos_length
;
idx
++
,
idx2
++
)
{
{
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
continue
;
continue
;
...
@@ -414,7 +414,7 @@ static void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
...
@@ -414,7 +414,7 @@ static void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
}
}
}
}
static
int
get_nb_re_pusch
(
NR_DL_FRAME_PARMS
*
frame_parms
,
nfapi_nr_pusch_pdu_t
*
rel15_ul
,
int
symbol
)
static
int
get_nb_re_pusch
(
NR_DL_FRAME_PARMS
*
frame_parms
,
nfapi_nr_pusch_pdu_t
*
rel15_ul
,
int
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
;
if
(
dmrs_symbol_flag
==
1
)
{
if
(
dmrs_symbol_flag
==
1
)
{
...
@@ -515,7 +515,7 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
...
@@ -515,7 +515,7 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
simde__m256i
*
rxF_256
=
(
simde__m256i
*
)
&
rxFext
[
aarx
*
buffer_length
];
simde__m256i
*
rxF_256
=
(
simde__m256i
*
)
&
rxFext
[
aarx
*
buffer_length
];
simde__m256i
*
chF_256
=
(
simde__m256i
*
)
&
chFext
[(
aatx
*
nb_rx_ant
+
aarx
)
*
buffer_length
];
simde__m256i
*
chF_256
=
(
simde__m256i
*
)
&
chFext
[(
aatx
*
nb_rx_ant
+
aarx
)
*
buffer_length
];
for
(
int
i
=
0
;
i
<
buffer_length
>>
3
;
i
++
)
for
(
int
i
=
0
;
i
<
buffer_length
>>
3
;
i
++
)
{
{
xmmp0
=
simde_mm256_madd_epi16
(
chF_256
[
i
],
rxF_256
[
i
]);
xmmp0
=
simde_mm256_madd_epi16
(
chF_256
[
i
],
rxF_256
[
i
]);
// xmmp0 contains real part of 4 consecutive outputs (32-bit) of conj(H_m[i])*R_m[i]
// xmmp0 contains real part of 4 consecutive outputs (32-bit) of conj(H_m[i])*R_m[i]
...
@@ -530,7 +530,7 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
...
@@ -530,7 +530,7 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
xmmp4
=
simde_mm256_packs_epi32
(
xmmp2
,
xmmp3
);
xmmp4
=
simde_mm256_packs_epi32
(
xmmp2
,
xmmp3
);
xmmp0
=
simde_mm256_madd_epi16
(
chF_256
[
i
],
chF_256
[
i
]);
// |h|^2
xmmp0
=
simde_mm256_madd_epi16
(
chF_256
[
i
],
chF_256
[
i
]);
// |h|^2
xmmp0
=
simde_mm256_srai_epi32
(
xmmp0
,
output_shift
);
xmmp0
=
simde_mm256_srai_epi32
(
xmmp0
,
output_shift
);
xmmp0
=
simde_mm256_packs_epi32
(
xmmp0
,
xmmp0
);
xmmp0
=
simde_mm256_packs_epi32
(
xmmp0
,
xmmp0
);
xmmp1
=
simde_mm256_unpacklo_epi16
(
xmmp0
,
xmmp0
);
xmmp1
=
simde_mm256_unpacklo_epi16
(
xmmp0
,
xmmp0
);
...
@@ -539,13 +539,13 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
...
@@ -539,13 +539,13 @@ static void nr_ulsch_channel_compensation(c16_t *rxFext,
xmmp1
=
simde_mm256_mulhrs_epi16
(
xmmp1
,
QAM_ampc_256
);
xmmp1
=
simde_mm256_mulhrs_epi16
(
xmmp1
,
QAM_ampc_256
);
// MRC
// MRC
rxComp_256
[
i
]
=
simde_mm256_add_epi16
(
rxComp_256
[
i
],
xmmp4
);
rxComp_256
[
i
]
=
simde_mm256_add_epi16
(
rxComp_256
[
i
],
xmmp4
);
if
(
mod_order
>
2
)
if
(
mod_order
>
2
)
rxF_ch_maga_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_maga_256
[
i
],
xmmp2
);
rxF_ch_maga_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_maga_256
[
i
],
xmmp2
);
if
(
mod_order
>
4
)
if
(
mod_order
>
4
)
rxF_ch_magb_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_magb_256
[
i
],
xmmp3
);
rxF_ch_magb_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_magb_256
[
i
],
xmmp3
);
if
(
mod_order
>
6
)
if
(
mod_order
>
6
)
rxF_ch_magc_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_magc_256
[
i
],
xmmp1
);
rxF_ch_magc_256
[
i
]
=
simde_mm256_add_epi16
(
rxF_ch_magc_256
[
i
],
xmmp1
);
}
}
if
(
rho
!=
NULL
)
{
if
(
rho
!=
NULL
)
{
for
(
int
atx
=
0
;
atx
<
nrOfLayers
;
atx
++
)
{
for
(
int
atx
=
0
;
atx
<
nrOfLayers
;
atx
++
)
{
...
@@ -1145,7 +1145,7 @@ static uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms,
...
@@ -1145,7 +1145,7 @@ static uint8_t nr_ulsch_mmse_2layers(NR_DL_FRAME_PARMS *frame_parms,
simde__m128i
*
after_mf_b_128
=
(
simde__m128i
*
)
af_mf_01
;
simde__m128i
*
after_mf_b_128
=
(
simde__m128i
*
)
af_mf_01
;
simde__m128i
*
after_mf_c_128
=
(
simde__m128i
*
)
af_mf_10
;
simde__m128i
*
after_mf_c_128
=
(
simde__m128i
*
)
af_mf_10
;
simde__m128i
*
after_mf_d_128
=
(
simde__m128i
*
)
af_mf_11
;
simde__m128i
*
after_mf_d_128
=
(
simde__m128i
*
)
af_mf_11
;
int
rxComp_aligned
=
((
nb_rb
*
12
)
%
8
)
?
(
8
-
(
nb_rb
*
12
)
%
8
)
:
0
;
int
rxComp_aligned
=
((
nb_rb
*
12
)
%
8
)
?
(
8
-
(
nb_rb
*
12
)
%
8
)
:
0
;
simde__m128i
*
rxdataF_comp128_0
=
(
simde__m128i
*
)
&
rxdataF_comp
[
0
][
symbol
*
(
nb_rb
*
12
+
rxComp_aligned
)];
simde__m128i
*
rxdataF_comp128_0
=
(
simde__m128i
*
)
&
rxdataF_comp
[
0
][
symbol
*
(
nb_rb
*
12
+
rxComp_aligned
)];
simde__m128i
*
rxdataF_comp128_1
=
(
simde__m128i
*
)
&
rxdataF_comp
[
n_rx
][
symbol
*
(
nb_rb
*
12
+
rxComp_aligned
)];
simde__m128i
*
rxdataF_comp128_1
=
(
simde__m128i
*
)
&
rxdataF_comp
[
n_rx
][
symbol
*
(
nb_rb
*
12
+
rxComp_aligned
)];
...
@@ -1263,13 +1263,13 @@ static void inner_rx (PHY_VARS_gNB *gNB,
...
@@ -1263,13 +1263,13 @@ static void inner_rx (PHY_VARS_gNB *gNB,
int
ulsch_id
,
int
ulsch_id
,
int
slot
,
int
slot
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_gNB_PUSCH
*
pusch_vars
,
NR_gNB_PUSCH
*
pusch_vars
,
nfapi_nr_pusch_pdu_t
*
rel15_ul
,
nfapi_nr_pusch_pdu_t
*
rel15_ul
,
c16_t
**
rxF
,
c16_t
**
rxF
,
c16_t
**
ul_ch
,
c16_t
**
ul_ch
,
int16_t
**
llr
,
int16_t
**
llr
,
int
soffset
,
int
soffset
,
int
length
,
int
length
,
int
symbol
,
int
symbol
,
int
output_shift
,
int
output_shift
,
uint32_t
nvar
)
uint32_t
nvar
)
...
@@ -1293,7 +1293,7 @@ static void inner_rx (PHY_VARS_gNB *gNB,
...
@@ -1293,7 +1293,7 @@ static void inner_rx (PHY_VARS_gNB *gNB,
soffset
+
(
symbol
*
frame_parms
->
ofdm_symbol_size
),
soffset
+
(
symbol
*
frame_parms
->
ofdm_symbol_size
),
pusch_vars
->
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
pusch_vars
->
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
aarx
,
dmrs_symbol_flag
,
dmrs_symbol_flag
,
rel15_ul
,
rel15_ul
,
frame_parms
);
frame_parms
);
}
}
...
@@ -1363,10 +1363,10 @@ static void inner_rx (PHY_VARS_gNB *gNB,
...
@@ -1363,10 +1363,10 @@ static void inner_rx (PHY_VARS_gNB *gNB,
else
{
else
{
nr_ulsch_mmse_2layers
(
frame_parms
,
nr_ulsch_mmse_2layers
(
frame_parms
,
(
int32_t
**
)
pusch_vars
->
rxdataF_comp
,
(
int32_t
**
)
pusch_vars
->
rxdataF_comp
,
(
int
**
)
rxF_ch_maga
,
(
int
**
)
rxF_ch_maga
,
(
int
**
)
rxF_ch_magb
,
(
int
**
)
rxF_ch_magb
,
(
int
**
)
rxF_ch_magc
,
(
int
**
)
rxF_ch_magc
,
(
int
**
)
chFext
,
(
int
**
)
chFext
,
rel15_ul
->
rb_size
,
rel15_ul
->
rb_size
,
frame_parms
->
nb_antennas_rx
,
frame_parms
->
nb_antennas_rx
,
rel15_ul
->
qam_mod_order
,
rel15_ul
->
qam_mod_order
,
...
@@ -1378,7 +1378,7 @@ static void inner_rx (PHY_VARS_gNB *gNB,
...
@@ -1378,7 +1378,7 @@ static void inner_rx (PHY_VARS_gNB *gNB,
}
}
}
}
if
(
nb_layer
!=
2
||
rel15_ul
->
qam_mod_order
>=
6
)
if
(
nb_layer
!=
2
||
rel15_ul
->
qam_mod_order
>=
6
)
for
(
int
aatx
=
0
;
aatx
<
nb_layer
;
aatx
++
)
for
(
int
aatx
=
0
;
aatx
<
nb_layer
;
aatx
++
)
nr_ulsch_compute_llr
((
int32_t
*
)
&
pusch_vars
->
rxdataF_comp
[
aatx
*
nb_rx_ant
][
symbol
*
buffer_length
],
nr_ulsch_compute_llr
((
int32_t
*
)
&
pusch_vars
->
rxdataF_comp
[
aatx
*
nb_rx_ant
][
symbol
*
buffer_length
],
(
int32_t
*
)
rxF_ch_maga
[
aatx
],
(
int32_t
*
)
rxF_ch_maga
[
aatx
],
(
int32_t
*
)
rxF_ch_magb
[
aatx
],
(
int32_t
*
)
rxF_ch_magb
[
aatx
],
...
@@ -1401,28 +1401,28 @@ static void nr_pusch_symbol_processing(void *arg)
...
@@ -1401,28 +1401,28 @@ static void nr_pusch_symbol_processing(void *arg)
NR_gNB_PUSCH
*
pusch_vars
=
&
gNB
->
pusch_vars
[
ulsch_id
];
NR_gNB_PUSCH
*
pusch_vars
=
&
gNB
->
pusch_vars
[
ulsch_id
];
for
(
int
symbol
=
rdata
->
startSymbol
;
symbol
<
rdata
->
startSymbol
+
rdata
->
numSymbols
;
symbol
++
)
{
for
(
int
symbol
=
rdata
->
startSymbol
;
symbol
<
rdata
->
startSymbol
+
rdata
->
numSymbols
;
symbol
++
)
{
int
dmrs_symbol_flag
=
(
rel15_ul
->
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
;
int
dmrs_symbol_flag
=
(
rel15_ul
->
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
;
if
(
dmrs_symbol_flag
==
1
)
if
(
dmrs_symbol_flag
==
1
)
{
{
if
((
rel15_ul
->
ul_dmrs_symb_pos
>>
((
symbol
+
1
)
%
frame_parms
->
symbols_per_slot
))
&
0x01
)
if
((
rel15_ul
->
ul_dmrs_symb_pos
>>
((
symbol
+
1
)
%
frame_parms
->
symbols_per_slot
))
&
0x01
)
AssertFatal
(
1
==
0
,
"Double DMRS configuration is not yet supported
\n
"
);
AssertFatal
(
1
==
0
,
"Double DMRS configuration is not yet supported
\n
"
);
gNB
->
pusch_vars
[
ulsch_id
].
dmrs_symbol
=
symbol
;
gNB
->
pusch_vars
[
ulsch_id
].
dmrs_symbol
=
symbol
;
}
}
if
(
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
]
==
0
)
if
(
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
]
==
0
)
continue
;
continue
;
int
soffset
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
int
soffset
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
ofdm_symbol_size
;
inner_rx
(
gNB
,
inner_rx
(
gNB
,
ulsch_id
,
ulsch_id
,
slot
,
slot
,
frame_parms
,
frame_parms
,
pusch_vars
,
pusch_vars
,
rel15_ul
,
rel15_ul
,
gNB
->
common_vars
.
rxdataF
,
gNB
->
common_vars
.
rxdataF
,
(
c16_t
**
)
gNB
->
pusch_vars
[
ulsch_id
].
ul_ch_estimates
,
(
c16_t
**
)
gNB
->
pusch_vars
[
ulsch_id
].
ul_ch_estimates
,
rdata
->
llr_layers
,
rdata
->
llr_layers
,
soffset
,
soffset
,
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
],
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
],
symbol
,
symbol
,
gNB
->
pusch_vars
[
ulsch_id
].
log2_maxh
,
gNB
->
pusch_vars
[
ulsch_id
].
log2_maxh
,
rdata
->
nvar
);
rdata
->
nvar
);
...
@@ -1431,14 +1431,14 @@ static void nr_pusch_symbol_processing(void *arg)
...
@@ -1431,14 +1431,14 @@ static void nr_pusch_symbol_processing(void *arg)
int16_t
*
llr_ptr
=
&
rdata
->
llr_layers
[
0
][
pusch_vars
->
llr_offset
[
symbol
]];
int16_t
*
llr_ptr
=
&
rdata
->
llr_layers
[
0
][
pusch_vars
->
llr_offset
[
symbol
]];
if
(
rel15_ul
->
nrOfLayers
!=
1
)
{
if
(
rel15_ul
->
nrOfLayers
!=
1
)
{
llr_ptr
=
&
rdata
->
llr
[
pusch_vars
->
llr_offset
[
symbol
]
*
rel15_ul
->
nrOfLayers
];
llr_ptr
=
&
rdata
->
llr
[
pusch_vars
->
llr_offset
[
symbol
]
*
rel15_ul
->
nrOfLayers
];
for
(
int
i
=
0
;
i
<
(
nb_re_pusch
);
i
++
)
for
(
int
i
=
0
;
i
<
(
nb_re_pusch
);
i
++
)
for
(
int
l
=
0
;
l
<
rel15_ul
->
nrOfLayers
;
l
++
)
for
(
int
l
=
0
;
l
<
rel15_ul
->
nrOfLayers
;
l
++
)
for
(
int
m
=
0
;
m
<
rel15_ul
->
qam_mod_order
;
m
++
)
for
(
int
m
=
0
;
m
<
rel15_ul
->
qam_mod_order
;
m
++
)
llr_ptr
[
i
*
rel15_ul
->
nrOfLayers
*
rel15_ul
->
qam_mod_order
+
l
*
rel15_ul
->
qam_mod_order
+
m
]
=
rdata
->
llr_layers
[
l
][
pusch_vars
->
llr_offset
[
symbol
]
+
i
*
rel15_ul
->
qam_mod_order
+
m
];
llr_ptr
[
i
*
rel15_ul
->
nrOfLayers
*
rel15_ul
->
qam_mod_order
+
l
*
rel15_ul
->
qam_mod_order
+
m
]
=
rdata
->
llr_layers
[
l
][
pusch_vars
->
llr_offset
[
symbol
]
+
i
*
rel15_ul
->
qam_mod_order
+
m
];
}
}
// unscrambling
// unscrambling
int16_t
*
llr16
=
(
int16_t
*
)
&
rdata
->
llr
[
pusch_vars
->
llr_offset
[
symbol
]
*
rel15_ul
->
nrOfLayers
];
int16_t
*
llr16
=
(
int16_t
*
)
&
rdata
->
llr
[
pusch_vars
->
llr_offset
[
symbol
]
*
rel15_ul
->
nrOfLayers
];
for
(
int
i
=
0
;
i
<
(
nb_re_pusch
*
rel15_ul
->
qam_mod_order
*
rel15_ul
->
nrOfLayers
);
i
++
)
for
(
int
i
=
0
;
i
<
(
nb_re_pusch
*
rel15_ul
->
qam_mod_order
*
rel15_ul
->
nrOfLayers
);
i
++
)
llr16
[
i
]
=
llr_ptr
[
i
]
*
rdata
->
s
[
i
];
llr16
[
i
]
=
llr_ptr
[
i
]
*
rdata
->
s
[
i
];
}
}
}
}
...
@@ -1491,32 +1491,44 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1491,32 +1491,44 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
nvar
+=
nvar_tmp
;
nvar
+=
nvar_tmp
;
}
}
// measure the SNR from the channel estimation
// measure the SNR from the channel estimation
nr_gnb_measurements
(
gNB
,
nr_gnb_measurements
(
gNB
,
&
gNB
->
ulsch
[
ulsch_id
],
&
gNB
->
ulsch
[
ulsch_id
],
pusch_vars
,
pusch_vars
,
symbol
,
symbol
,
rel15_ul
->
nrOfLayers
);
rel15_ul
->
nrOfLayers
);
allocCast2D
(
ulsch_power
,
unsigned
int
,
gNB
->
measurements
.
ulsch_power
,
frame_parms
->
nb_antennas_rx
,
frame_parms
->
N_RB_UL
,
false
);
allocCast2D
(
n0_subband_power
,
allocCast2D
(
n0_subband_power
,
unsigned
int
,
unsigned
int
,
gNB
->
measurements
.
n0_subband_power
,
gNB
->
measurements
.
n0_subband_power
,
frame_parms
->
nb_antennas_rx
,
frame_parms
->
nb_antennas_rx
,
frame_parms
->
N_RB_UL
,
frame_parms
->
N_RB_UL
,
false
);
false
);
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
{
if
(
symbol
==
rel15_ul
->
start_symbol_index
)
if
(
symbol
==
rel15_ul
->
start_symbol_index
)
{
{
pusch_vars
->
ulsch_power
[
aarx
]
=
0
;
pusch_vars
->
ulsch_power
[
aarx
]
=
0
;
pusch_vars
->
ulsch_noise_power
[
aarx
]
=
0
;
pusch_vars
->
ulsch_noise_power
[
aarx
]
=
0
;
}
}
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
{
for
(
int
rb
=
0
;
rb
<
rel15_ul
->
rb_size
;
rb
++
)
{
pusch_vars
->
ulsch_power
[
aarx
]
+=
signal_energy_nodc
(
pusch_vars
->
ulsch_power
[
aarx
]
+=
&
pusch_vars
->
ul_ch_estimates
[
aatx
*
gNB
->
frame_parms
.
nb_antennas_rx
+
aarx
][
symbol
*
frame_parms
->
ofdm_symbol_size
],
ulsch_power
[
aarx
][
rel15_ul
->
bwp_start
+
rel15_ul
->
rb_start
+
rb
]
/
rel15_ul
->
rb_size
;
rel15_ul
->
rb_size
*
12
);
pusch_vars
->
ulsch_noise_power
[
aarx
]
+=
n0_subband_power
[
aarx
][
rel15_ul
->
bwp_start
+
rel15_ul
->
rb_start
+
rb
]
/
rel15_ul
->
rb_size
;
}
}
for
(
int
rb
=
0
;
rb
<
rel15_ul
->
rb_size
;
rb
++
)
LOG_D
(
PHY
,
pusch_vars
->
ulsch_noise_power
[
aarx
]
+=
"aa %d, bwp_start%d, rb_start %d, rb_size %d: ulsch_power %d, ulsch_noise_power %d
\n
"
,
n0_subband_power
[
aarx
][
rel15_ul
->
bwp_start
+
rel15_ul
->
rb_start
+
rb
]
/
rel15_ul
->
rb_size
;
aarx
,
rel15_ul
->
bwp_start
,
rel15_ul
->
rb_start
,
rel15_ul
->
rb_size
,
pusch_vars
->
ulsch_power
[
aarx
],
pusch_vars
->
ulsch_noise_power
[
aarx
]);
}
}
}
}
}
}
...
@@ -1524,7 +1536,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1524,7 +1536,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
nvar
/=
(
rel15_ul
->
nr_of_symbols
*
rel15_ul
->
nrOfLayers
*
frame_parms
->
nb_antennas_rx
);
nvar
/=
(
rel15_ul
->
nr_of_symbols
*
rel15_ul
->
nrOfLayers
*
frame_parms
->
nb_antennas_rx
);
// averaging time domain channel estimates
// averaging time domain channel estimates
if
(
gNB
->
chest_time
==
1
)
if
(
gNB
->
chest_time
==
1
)
{
{
nr_chest_time_domain_avg
(
frame_parms
,
nr_chest_time_domain_avg
(
frame_parms
,
pusch_vars
->
ul_ch_estimates
,
pusch_vars
->
ul_ch_estimates
,
...
@@ -1532,8 +1544,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1532,8 +1544,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
rel15_ul
->
start_symbol_index
,
rel15_ul
->
start_symbol_index
,
rel15_ul
->
ul_dmrs_symb_pos
,
rel15_ul
->
ul_dmrs_symb_pos
,
rel15_ul
->
rb_size
);
rel15_ul
->
rb_size
);
pusch_vars
->
dmrs_symbol
=
get_next_dmrs_symbol_in_slot
(
rel15_ul
->
ul_dmrs_symb_pos
,
pusch_vars
->
dmrs_symbol
=
get_next_dmrs_symbol_in_slot
(
rel15_ul
->
ul_dmrs_symb_pos
,
rel15_ul
->
start_symbol_index
,
rel15_ul
->
start_symbol_index
,
rel15_ul
->
nr_of_symbols
);
rel15_ul
->
nr_of_symbols
);
}
}
...
@@ -1561,14 +1573,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1561,14 +1573,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
// initialize scrambling sequence //
// initialize scrambling sequence //
int16_t
s
[
G
+
96
]
__attribute__
((
aligned
(
32
)));
int16_t
s
[
G
+
96
]
__attribute__
((
aligned
(
32
)));
nr_codeword_unscrambling_init
(
s
,
G
,
0
,
rel15_ul
->
data_scrambling_id
,
rel15_ul
->
rnti
);
nr_codeword_unscrambling_init
(
s
,
G
,
0
,
rel15_ul
->
data_scrambling_id
,
rel15_ul
->
rnti
);
// first the computation of channel levels
// first the computation of channel levels
int
nb_re_pusch
=
0
,
meas_symbol
=
-
1
;
int
nb_re_pusch
=
0
,
meas_symbol
=
-
1
;
for
(
meas_symbol
=
rel15_ul
->
start_symbol_index
;
for
(
meas_symbol
=
rel15_ul
->
start_symbol_index
;
meas_symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
meas_symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
meas_symbol
++
)
meas_symbol
++
)
if
((
nb_re_pusch
=
get_nb_re_pusch
(
frame_parms
,
rel15_ul
,
meas_symbol
))
>
0
)
if
((
nb_re_pusch
=
get_nb_re_pusch
(
frame_parms
,
rel15_ul
,
meas_symbol
))
>
0
)
break
;
break
;
...
@@ -1581,8 +1593,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1581,8 +1593,8 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
if
(
nb_re_pusch
&
7
)
if
(
nb_re_pusch
&
7
)
nb_re_pusch
+=
8
-
(
nb_re_pusch
&
7
);
nb_re_pusch
+=
8
-
(
nb_re_pusch
&
7
);
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
nr_ulsch_extract_rbs
(
gNB
->
common_vars
.
rxdataF
[
aarx
],
nr_ulsch_extract_rbs
(
gNB
->
common_vars
.
rxdataF
[
aarx
],
(
c16_t
*
)
pusch_vars
->
ul_ch_estimates
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
],
(
c16_t
*
)
pusch_vars
->
ul_ch_estimates
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
],
(
c16_t
*
)
&
pusch_vars
->
rxdataF_ext
[
aarx
][
meas_symbol
*
nb_re_pusch
],
(
c16_t
*
)
&
pusch_vars
->
rxdataF_ext
[
aarx
][
meas_symbol
*
nb_re_pusch
],
...
@@ -1590,7 +1602,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1590,7 +1602,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
soffset
+
meas_symbol
*
frame_parms
->
ofdm_symbol_size
,
soffset
+
meas_symbol
*
frame_parms
->
ofdm_symbol_size
,
pusch_vars
->
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
pusch_vars
->
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
aarx
,
(
rel15_ul
->
ul_dmrs_symb_pos
>>
meas_symbol
)
&
0x01
,
(
rel15_ul
->
ul_dmrs_symb_pos
>>
meas_symbol
)
&
0x01
,
rel15_ul
,
rel15_ul
,
frame_parms
);
frame_parms
);
...
@@ -1609,7 +1621,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1609,7 +1621,7 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
rel15_ul
->
nrOfLayers
,
rel15_ul
->
nrOfLayers
,
rel15_ul
->
rb_size
,
rel15_ul
->
rb_size
,
shift_ch_ext
);
shift_ch_ext
);
nr_ulsch_channel_level
(
pusch_vars
->
ul_ch_estimates_ext
,
nr_ulsch_channel_level
(
pusch_vars
->
ul_ch_estimates_ext
,
frame_parms
,
frame_parms
,
avg
,
avg
,
...
@@ -1620,14 +1632,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1620,14 +1632,14 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
int
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
]);
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
);
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
);
if
(
rel15_ul
->
nrOfLayers
==
2
&&
rel15_ul
->
qam_mod_order
>=
6
)
if
(
rel15_ul
->
nrOfLayers
==
2
&&
rel15_ul
->
qam_mod_order
>=
6
)
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
)
-
3
;
// for MMSE
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
)
-
3
;
// for MMSE
else
if
(
rel15_ul
->
nrOfLayers
==
1
)
else
if
(
rel15_ul
->
nrOfLayers
==
1
)
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
)
+
1
+
log2_approx
(
frame_parms
->
nb_antennas_rx
>>
2
);
pusch_vars
->
log2_maxh
=
(
log2_approx
(
avgs
)
>>
1
)
+
1
+
log2_approx
(
frame_parms
->
nb_antennas_rx
>>
2
);
if
(
pusch_vars
->
log2_maxh
<
0
)
if
(
pusch_vars
->
log2_maxh
<
0
)
pusch_vars
->
log2_maxh
=
0
;
pusch_vars
->
log2_maxh
=
0
;
...
@@ -1636,15 +1648,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
...
@@ -1636,15 +1648,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
start_meas
(
&
gNB
->
rx_pusch_symbol_processing_stats
);
start_meas
(
&
gNB
->
rx_pusch_symbol_processing_stats
);
int
numSymbols
=
gNB
->
num_pusch_symbols_per_thread
;
int
numSymbols
=
gNB
->
num_pusch_symbols_per_thread
;
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
symbol
<
(
rel15_ul
->
start_symbol_index
+
rel15_ul
->
nr_of_symbols
);
symbol
+=
numSymbols
)
symbol
+=
numSymbols
)
{
{
int
total_res
=
0
;
int
total_res
=
0
;
for
(
int
s
=
0
;
s
<
numSymbols
;
s
++
)
{
for
(
int
s
=
0
;
s
<
numSymbols
;
s
++
)
{
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
]
=
get_nb_re_pusch
(
frame_parms
,
rel15_ul
,
symbol
+
s
);
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
]
=
get_nb_re_pusch
(
frame_parms
,
rel15_ul
,
symbol
+
s
);
pusch_vars
->
llr_offset
[
symbol
+
s
]
=
((
symbol
+
s
)
==
rel15_ul
->
start_symbol_index
)
?
pusch_vars
->
llr_offset
[
symbol
+
s
]
=
((
symbol
+
s
)
==
rel15_ul
->
start_symbol_index
)
?
0
:
0
:
pusch_vars
->
llr_offset
[
symbol
+
s
-
1
]
+
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
-
1
]
*
rel15_ul
->
qam_mod_order
;
pusch_vars
->
llr_offset
[
symbol
+
s
-
1
]
+
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
-
1
]
*
rel15_ul
->
qam_mod_order
;
total_res
+=
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
];
total_res
+=
pusch_vars
->
ul_valid_re_per_slot
[
symbol
+
s
];
}
}
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/defs_gNB.h
View file @
3cc61718
...
@@ -561,6 +561,8 @@ typedef struct {
...
@@ -561,6 +561,8 @@ typedef struct {
fourDimArray_t
*
n0_subband_power
;
fourDimArray_t
*
n0_subband_power
;
//! estimated avg noise power per RB per RX ant (dB)
//! estimated avg noise power per RB per RX ant (dB)
fourDimArray_t
*
n0_subband_power_dB
;
fourDimArray_t
*
n0_subband_power_dB
;
//! estimated avg power per RB per RX ant (lin)
fourDimArray_t
*
ulsch_power
;
//! estimated avg subband noise power (dB)
//! estimated avg subband noise power (dB)
unsigned
int
n0_subband_power_avg_dB
;
unsigned
int
n0_subband_power_avg_dB
;
//! estimated avg subband noise power per antenna (dB)
//! estimated avg subband noise power per antenna (dB)
...
...
This diff is collapsed.
Click to expand it.
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