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
spbro
OpenXG-RAN
Commits
c87b3905
Commit
c87b3905
authored
Aug 15, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
code formatting
parent
2039a4f2
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
64 additions
and
74 deletions
+64
-74
openair1/PHY/NR_REFSIG/dmrs_nr.c
openair1/PHY/NR_REFSIG/dmrs_nr.c
+6
-6
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+58
-68
No files found.
openair1/PHY/NR_REFSIG/dmrs_nr.c
View file @
c87b3905
...
...
@@ -299,7 +299,7 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
int8_t
get_next_dmrs_symbol_in_slot
(
uint16_t
ul_dmrs_symb_pos
,
uint8_t
counter
,
uint8_t
end_symbol
)
{
for
(
uint8_t
symbol
=
counter
;
symbol
<
end_symbol
;
symbol
++
)
{
if
((
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
)
{
if
((
ul_dmrs_symb_pos
>>
symbol
)
&
0x01
)
{
return
symbol
;
}
}
...
...
@@ -318,23 +318,23 @@ uint8_t get_dmrs_symbols_in_slot(uint16_t l_prime_mask, uint16_t nb_symb, uint8
}
/* return the position of valid dmrs symbol in a slot for channel compensation */
int8_t
get_valid_dmrs_idx_for_channel_est
(
uint16_t
dmrs_symb_pos
,
uint8_t
counter
)
int8_t
get_valid_dmrs_idx_for_channel_est
(
uint16_t
dmrs_symb_pos
,
uint8_t
counter
)
{
int8_t
symbIdx
=
-
1
;
/* if current symbol is DMRS then return this index */
if
(
is_dmrs_symbol
(
counter
,
dmrs_symb_pos
)
==
1
)
{
if
(
is_dmrs_symbol
(
counter
,
dmrs_symb_pos
)
==
1
)
{
return
counter
;
}
/* find previous DMRS symbol */
for
(
int8_t
symbol
=
counter
;
symbol
>=
0
;
symbol
--
)
{
if
((
1
<<
symbol
&
dmrs_symb_pos
)
>
0
)
{
for
(
int8_t
symbol
=
counter
;
symbol
>=
0
;
symbol
--
)
{
if
((
1
<<
symbol
&
dmrs_symb_pos
)
>
0
)
{
symbIdx
=
symbol
;
break
;
}
}
/* if there is no previous dmrs available then find the next possible*/
if
(
symbIdx
==
-
1
)
{
symbIdx
=
get_next_dmrs_symbol_in_slot
(
dmrs_symb_pos
,
counter
,
15
);
symbIdx
=
get_next_dmrs_symbol_in_slot
(
dmrs_symb_pos
,
counter
,
15
);
}
return
symbIdx
;
}
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
c87b3905
...
...
@@ -276,16 +276,16 @@ void nr_idft(int32_t *z, uint32_t Msc_PUSCH)
}
static
void
nr_ulsch_extract_rbs
(
c16_t
*
const
rxdataF
,
c16_t
*
const
chF
,
c16_t
*
rxFext
,
c16_t
*
chFext
,
int
rxoffset
,
int
choffset
,
int
aarx
,
int
is_dmrs_symbol
,
nfapi_nr_pusch_pdu_t
*
pusch_pdu
,
NR_DL_FRAME_PARMS
*
frame_parms
)
static
void
nr_ulsch_extract_rbs
(
c16_t
*
const
rxdataF
,
c16_t
*
const
chF
,
c16_t
*
rxFext
,
c16_t
*
chFext
,
int
rxoffset
,
int
choffset
,
int
aarx
,
int
is_dmrs_symbol
,
nfapi_nr_pusch_pdu_t
*
pusch_pdu
,
NR_DL_FRAME_PARMS
*
frame_parms
)
{
uint8_t
delta
=
0
;
...
...
@@ -301,8 +301,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
if
(
is_dmrs_symbol
==
0
)
{
if
(
start_re
+
nb_re_pusch
<=
frame_parms
->
ofdm_symbol_size
)
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
pos_length
=
nb_re_pusch
-
neg_length
;
memcpy
(
rxF_ext
,
&
rxF
[
start_re
],
neg_length
*
sizeof
(
c16_t
));
...
...
@@ -310,57 +309,47 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
}
memcpy
(
ul_ch0_ext
,
ul_ch0
,
nb_re_pusch
*
sizeof
(
c16_t
));
}
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type1
)
// 6 REs / PRB
{
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type1
)
{
// 6 REs / PRB
AssertFatal
(
delta
==
0
||
delta
==
1
,
"Illegal delta %d
\n
"
,
delta
);
c16_t
*
rxF32
=
&
rxF
[
start_re
];
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
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
}
}
else
// handle the two pieces around DC
{
else
{
// handle the two pieces around DC
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
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
];
*
ul_ch0_ext
++=
ul_ch0
[
idx
];
}
rxF32
=
rxF
;
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
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx2
];
}
}
}
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
);
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
{
for
(
int
idx
=
0
;
idx
<
nb_re_pusch
;
idx
++
)
{
if
(
start_re
+
nb_re_pusch
<
frame_parms
->
ofdm_symbol_size
)
{
for
(
int
idx
=
0
;
idx
<
nb_re_pusch
;
idx
++
)
{
if
(
idx
%
6
==
2
*
delta
||
idx
%
6
==
2
*
delta
+
1
)
continue
;
*
rxF_ext
++
=
rxF
[
idx
];
*
ul_ch0_ext
++
=
ul_ch0
[
idx
];
}
}
else
{
else
{
int
neg_length
=
frame_parms
->
ofdm_symbol_size
-
start_re
;
int
pos_length
=
nb_re_pusch
-
neg_length
;
c16_t
*
rxF64
=
&
rxF
[
start_re
];
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
)
continue
;
*
rxF_ext
++
=
rxF64
[
idx
];
...
...
@@ -368,8 +357,7 @@ static void nr_ulsch_extract_rbs (c16_t* const rxdataF,
}
rxF64
=
rxF
;
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
)
continue
;
*
rxF_ext
++
=
rxF64
[
idx
];
...
...
@@ -1293,15 +1281,15 @@ static void inner_rx(PHY_VARS_gNB *gNB,
for
(
int
aarx
=
0
;
aarx
<
nb_rx_ant
;
aarx
++
)
{
for
(
int
aatx
=
0
;
aatx
<
nb_layer
;
aatx
++
)
{
nr_ulsch_extract_rbs
(
rxF
[
aarx
],
(
c16_t
*
)
pusch_vars
->
ul_ch_estimates
[
aatx
*
nb_rx_ant
+
aarx
],
rxFext
[
aarx
],
chFext
[
aatx
][
aarx
],
soffset
+
(
symbol
*
frame_parms
->
ofdm_symbol_size
),
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
dmrs_symbol_flag
,
rel15_ul
,
frame_parms
);
(
c16_t
*
)
pusch_vars
->
ul_ch_estimates
[
aatx
*
nb_rx_ant
+
aarx
],
rxFext
[
aarx
],
chFext
[
aatx
][
aarx
],
soffset
+
(
symbol
*
frame_parms
->
ofdm_symbol_size
),
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
dmrs_symbol_flag
,
rel15_ul
,
frame_parms
);
}
}
c16_t
rho
[
nb_layer
][
nb_layer
][
buffer_length
]
__attribute__
((
aligned
(
32
)));
...
...
@@ -1369,10 +1357,10 @@ static void inner_rx(PHY_VARS_gNB *gNB,
else
{
nr_ulsch_mmse_2layers
(
frame_parms
,
(
int32_t
**
)
pusch_vars
->
rxdataF_comp
,
(
int
**
)
rxF_ch_maga
,
(
int
**
)
rxF_ch_magb
,
(
int
**
)
rxF_ch_magc
,
(
int
**
)
chFext
,
(
int
**
)
rxF_ch_maga
,
(
int
**
)
rxF_ch_magb
,
(
int
**
)
rxF_ch_magc
,
(
int
**
)
chFext
,
rel15_ul
->
rb_size
,
frame_parms
->
nb_antennas_rx
,
rel15_ul
->
qam_mod_order
,
...
...
@@ -1427,14 +1415,14 @@ static void nr_pusch_symbol_processing(void *arg)
ulsch_id
,
slot
,
frame_parms
,
pusch_vars
,
pusch_vars
,
rel15_ul
,
gNB
->
common_vars
.
rxdataF
,
(
c16_t
**
)
gNB
->
pusch_vars
[
ulsch_id
].
ul_ch_estimates
,
gNB
->
common_vars
.
rxdataF
,
(
c16_t
**
)
gNB
->
pusch_vars
[
ulsch_id
].
ul_ch_estimates
,
rdata
->
llr_layers
,
soffset
,
gNB
->
pusch_vars
[
ulsch_id
].
ul_valid_re_per_slot
[
symbol
],
symbol
,
symbol
,
gNB
->
pusch_vars
[
ulsch_id
].
log2_maxh
,
rdata
->
nvar
);
...
...
@@ -1502,9 +1490,9 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
}
// measure the SNR from the channel estimation
nr_gnb_measurements
(
gNB
,
&
gNB
->
ulsch
[
ulsch_id
],
pusch_vars
,
symbol
,
&
gNB
->
ulsch
[
ulsch_id
],
pusch_vars
,
symbol
,
rel15_ul
->
nrOfLayers
);
allocCast2D
(
n0_subband_power
,
unsigned
int
,
...
...
@@ -1586,10 +1574,13 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
int
nb_re_pusch
=
0
,
meas_symbol
=
-
1
;
for
(
meas_symbol
=
rel15_ul
->
start_symbol_index
;
meas_symbol
<
end_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
;
AssertFatal
(
nb_re_pusch
>
0
&&
meas_symbol
>=
0
,
"nb_re_pusch %d cannot be 0 or meas_symbol %d cannot be negative here
\n
"
,
nb_re_pusch
,
meas_symbol
);
AssertFatal
(
nb_re_pusch
>
0
&&
meas_symbol
>=
0
,
"nb_re_pusch %d cannot be 0 or meas_symbol %d cannot be negative here
\n
"
,
nb_re_pusch
,
meas_symbol
);
// extract the first dmrs for the channel level computation
// extract the data in the OFDM frame, to the start of the array
...
...
@@ -1605,15 +1596,15 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
for
(
int
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
for
(
int
aatx
=
0
;
aatx
<
rel15_ul
->
nrOfLayers
;
aatx
++
)
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
->
rxdataF_ext
[
aarx
][
meas_symbol
*
nb_re_pusch
],
(
c16_t
*
)
&
pusch_vars
->
ul_ch_estimates_ext
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
][
meas_symbol
*
nb_re_pusch
],
soffset
+
meas_symbol
*
frame_parms
->
ofdm_symbol_size
,
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
(
rel15_ul
->
ul_dmrs_symb_pos
>>
meas_symbol
)
&
0x01
,
rel15_ul
,
frame_parms
);
(
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
->
ul_ch_estimates_ext
[
aatx
*
frame_parms
->
nb_antennas_rx
+
aarx
][
meas_symbol
*
nb_re_pusch
],
soffset
+
meas_symbol
*
frame_parms
->
ofdm_symbol_size
,
dmrs_symbol
*
frame_parms
->
ofdm_symbol_size
,
aarx
,
(
rel15_ul
->
ul_dmrs_symb_pos
>>
meas_symbol
)
&
0x01
,
rel15_ul
,
frame_parms
);
int
avgs
=
0
;
int
avg
[
frame_parms
->
nb_antennas_rx
*
rel15_ul
->
nrOfLayers
];
...
...
@@ -1657,10 +1648,9 @@ int nr_rx_pusch_tp(PHY_VARS_gNB *gNB,
start_meas
(
&
gNB
->
rx_pusch_symbol_processing_stats
);
int
numSymbols
=
gNB
->
num_pusch_symbols_per_thread
;
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
end_symbol
;
symbol
+=
numSymbols
)
{
for
(
uint8_t
symbol
=
rel15_ul
->
start_symbol_index
;
symbol
<
end_symbol
;
symbol
+=
numSymbols
)
{
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
->
llr_offset
[
symbol
+
s
]
=
((
symbol
+
s
)
==
rel15_ul
->
start_symbol_index
)
?
0
:
...
...
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