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
997d52b7
Commit
997d52b7
authored
May 16, 2022
by
Roberto Louro Magueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improvements in nr_get_srs_signal to consider multi-ports and multi-symbols
parent
52bc76d9
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
72 additions
and
28 deletions
+72
-28
openair1/PHY/INIT/nr_init.c
openair1/PHY/INIT/nr_init.c
+4
-4
openair1/PHY/INIT/nr_init_ue.c
openair1/PHY/INIT/nr_init_ue.c
+2
-0
openair1/PHY/NR_TRANSPORT/srs_rx.c
openair1/PHY/NR_TRANSPORT/srs_rx.c
+56
-20
openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
+9
-4
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+1
-0
No files found.
openair1/PHY/INIT/nr_init.c
View file @
997d52b7
...
...
@@ -617,7 +617,8 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
for
(
int
id
=
0
;
id
<
NUMBER_OF_NR_SRS_MAX
;
id
++
)
{
gNB
->
nr_srs_info
[
id
]
=
(
nr_srs_info_t
*
)
malloc16_clear
(
sizeof
(
nr_srs_info_t
));
gNB
->
nr_srs_info
[
id
]
->
sc_list
=
(
uint16_t
*
)
malloc16_clear
(
6
*
fp
->
N_RB_UL
*
sizeof
(
uint16_t
));
gNB
->
nr_srs_info
[
id
]
->
srs_generated_signal
=
(
int32_t
**
)
malloc16_clear
(
MAX_NUM_NR_SRS_AP
*
sizeof
(
int32_t
*
));
gNB
->
nr_srs_info
[
id
]
->
k_0_p
=
(
uint8_t
**
)
malloc16_clear
(
Prx
*
sizeof
(
uint8_t
*
));
gNB
->
nr_srs_info
[
id
]
->
srs_generated_signal
=
(
int32_t
**
)
malloc16_clear
(
Prx
*
sizeof
(
int32_t
*
));
gNB
->
nr_srs_info
[
id
]
->
signal_power
=
(
uint32_t
*
)
malloc16_clear
(
sizeof
(
uint32_t
));
gNB
->
nr_srs_info
[
id
]
->
noise_power_per_rb
=
(
uint32_t
*
)
malloc16_clear
(
fp
->
N_RB_UL
*
sizeof
(
uint32_t
));
gNB
->
nr_srs_info
[
id
]
->
noise_power
=
(
uint32_t
*
)
malloc16_clear
(
sizeof
(
uint32_t
));
...
...
@@ -628,10 +629,9 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
gNB
->
nr_srs_info
[
id
]
->
srs_estimated_channel_freq
=
(
int32_t
**
)
malloc16
(
Prx
*
sizeof
(
int32_t
*
));
gNB
->
nr_srs_info
[
id
]
->
srs_estimated_channel_time
=
(
int32_t
**
)
malloc16
(
Prx
*
sizeof
(
int32_t
*
));
gNB
->
nr_srs_info
[
id
]
->
srs_estimated_channel_time_shifted
=
(
int32_t
**
)
malloc16
(
Prx
*
sizeof
(
int32_t
*
));
for
(
i
=
0
;
i
<
MAX_NUM_NR_SRS_AP
;
i
++
)
{
gNB
->
nr_srs_info
[
id
]
->
srs_generated_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
}
for
(
i
=
0
;
i
<
Prx
;
i
++
){
gNB
->
nr_srs_info
[
id
]
->
k_0_p
[
i
]
=
(
uint8_t
*
)
malloc16_clear
(
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
uint8_t
));
gNB
->
nr_srs_info
[
id
]
->
srs_generated_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
gNB
->
nr_srs_info
[
id
]
->
srs_received_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
gNB
->
nr_srs_info
[
id
]
->
srs_ls_estimated_channel
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
gNB
->
nr_srs_info
[
id
]
->
srs_estimated_channel_freq
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
...
...
openair1/PHY/INIT/nr_init_ue.c
View file @
997d52b7
...
...
@@ -344,6 +344,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
srs_vars
[
gNB_id
]
->
active
=
false
;
ue
->
nr_srs_info
=
(
nr_srs_info_t
*
)
malloc16_clear
(
sizeof
(
nr_srs_info_t
));
ue
->
nr_srs_info
->
sc_list
=
(
uint16_t
*
)
malloc16_clear
(
6
*
fp
->
N_RB_UL
*
sizeof
(
uint16_t
));
ue
->
nr_srs_info
->
k_0_p
=
(
uint8_t
**
)
malloc16_clear
(
fp
->
nb_antennas_rx
*
sizeof
(
uint8_t
*
));
ue
->
nr_srs_info
->
noise_power
=
(
uint32_t
*
)
malloc16_clear
(
sizeof
(
uint32_t
));
ue
->
nr_srs_info
->
srs_received_signal
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_srs_info
->
srs_ls_estimated_channel
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
...
...
@@ -351,6 +352,7 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
ue
->
nr_srs_info
->
srs_estimated_channel_time
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_srs_info
->
srs_estimated_channel_time_shifted
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
ue
->
nr_srs_info
->
k_0_p
[
i
]
=
(
uint8_t
*
)
malloc16_clear
(
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
uint8_t
));
ue
->
nr_srs_info
->
srs_received_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
ue
->
nr_srs_info
->
srs_ls_estimated_channel
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
ue
->
nr_srs_info
->
srs_estimated_channel_freq
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
ofdm_symbol_size
*
MAX_NUM_NR_SRS_SYMBOLS
*
sizeof
(
int32_t
));
...
...
openair1/PHY/NR_TRANSPORT/srs_rx.c
View file @
997d52b7
...
...
@@ -30,10 +30,12 @@
#include <unistd.h>
#include <fcntl.h>
#include "PHY/INIT/phy_init.h"
#include "PHY/impl_defs_nr.h"
#include "PHY/defs_nr_common.h"
#include "PHY/defs_gNB.h"
#include <openair1/PHY/CODING/nrSmallBlock/nr_small_block_defs.h>
#include "PHY/CODING/nrSmallBlock/nr_small_block_defs.h"
#include "PHY/NR_UE_TRANSPORT/srs_modulation_nr.h"
#include "common/utils/LOG/log.h"
#include "nfapi/oai_integration/vendor_ext.h"
...
...
@@ -100,6 +102,10 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
nr_srs_info_t
*
nr_srs_info
,
int32_t
**
srs_received_signal
)
{
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"Calling %s function
\n
"
,
__FUNCTION__
);
#endif
if
(
nr_srs_info
->
sc_list_length
==
0
)
{
LOG_E
(
NR_PHY
,
"(%d.%d) nr_srs_info was not generated yet!
\n
"
,
frame
,
slot
);
return
-
1
;
...
...
@@ -111,6 +117,12 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
uint16_t
n_symbols
=
(
slot
&
3
)
*
frame_parms
->
symbols_per_slot
;
// number of symbols until this slot
uint8_t
l0
=
frame_parms
->
symbols_per_slot
-
1
-
srs_pdu
->
time_start_position
;
// starting symbol in this slot
uint64_t
symbol_offset
=
(
n_symbols
+
l0
)
*
frame_parms
->
ofdm_symbol_size
;
uint64_t
subcarrier_offset
=
frame_parms
->
first_carrier_offset
+
srs_pdu
->
bwp_start
*
NR_NB_SC_PER_RB
;
uint8_t
N_ap
=
1
<<
srs_pdu
->
num_ant_ports
;
uint8_t
N_symb_SRS
=
1
<<
srs_pdu
->
num_symbols
;
uint8_t
K_TC
=
2
<<
srs_pdu
->
comb_size
;
uint16_t
M_sc_b_SRS
=
srs_bandwidth_config
[
srs_pdu
->
config_index
][
srs_pdu
->
bandwidth_index
][
0
]
*
NR_NB_SC_PER_RB
/
K_TC
;
int32_t
*
rx_signal
;
for
(
int
ant
=
0
;
ant
<
frame_parms
->
nb_antennas_rx
;
ant
++
)
{
...
...
@@ -118,27 +130,51 @@ int nr_get_srs_signal(PHY_VARS_gNB *gNB,
memset
(
srs_received_signal
[
ant
],
0
,
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int32_t
));
rx_signal
=
&
rxdataF
[
ant
][
symbol_offset
];
for
(
int
sc_idx
=
0
;
sc_idx
<
nr_srs_info
->
sc_list_length
;
sc_idx
++
)
{
srs_received_signal
[
ant
][
nr_srs_info
->
sc_list
[
sc_idx
]]
=
rx_signal
[
nr_srs_info
->
sc_list
[
sc_idx
]];
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p_index
++
)
{
#ifdef SRS_DEBUG
uint64_t
subcarrier_offset
=
frame_parms
->
first_carrier_offset
+
srs_pdu
->
bwp_start
*
12
;
int
subcarrier_log
=
nr_srs_info
->
sc_list
[
sc_idx
]
-
subcarrier_offset
;
if
(
subcarrier_log
<
0
)
{
subcarrier_log
=
subcarrier_log
+
frame_parms
->
ofdm_symbol_size
;
}
if
(
sc_idx
==
0
)
{
LOG_I
(
NR_PHY
,
"________ Rx antenna %i ________
\n
"
,
ant
);
}
if
(
subcarrier_log
%
12
==
0
)
{
LOG_I
(
NR_PHY
,
"::::::::::::: %i :::::::::::::
\n
"
,
subcarrier_log
/
12
);
}
LOG_I
(
NR_PHY
,
"(%i)
\t
%i
\t
%i
\n
"
,
subcarrier_log
,
(
int16_t
)(
srs_received_signal
[
ant
][
nr_srs_info
->
sc_list
[
sc_idx
]]
&
0xFFFF
),
(
int16_t
)((
srs_received_signal
[
ant
][
nr_srs_info
->
sc_list
[
sc_idx
]]
>>
16
)
&
0xFFFF
));
LOG_I
(
NR_PHY
,
"===== UE port %d --> gNB Rx antenna %i =====
\n
"
,
p_index
,
ant
);
#endif
}
}
for
(
int
l_line
=
0
;
l_line
<
N_symb_SRS
;
l_line
++
)
{
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
":::::::: OFDM symbol %d ::::::::
\n
"
,
l0
+
l_line
);
#endif
uint16_t
subcarrier
=
subcarrier_offset
+
nr_srs_info
->
k_0_p
[
p_index
][
l_line
];
if
(
subcarrier
>
frame_parms
->
ofdm_symbol_size
)
{
subcarrier
-=
frame_parms
->
ofdm_symbol_size
;
}
uint16_t
l_line_offset
=
l_line
*
frame_parms
->
ofdm_symbol_size
;
for
(
int
k
=
0
;
k
<
M_sc_b_SRS
;
k
++
)
{
srs_received_signal
[
ant
][
l_line_offset
+
subcarrier
]
=
rx_signal
[
l_line_offset
+
subcarrier
];
#ifdef SRS_DEBUG
int
subcarrier_log
=
subcarrier
-
subcarrier_offset
;
if
(
subcarrier_log
<
0
)
{
subcarrier_log
=
subcarrier_log
+
frame_parms
->
ofdm_symbol_size
;
}
if
(
subcarrier_log
%
12
==
0
)
{
LOG_I
(
NR_PHY
,
"------------ %d ------------
\n
"
,
subcarrier_log
/
12
);
}
LOG_I
(
NR_PHY
,
"(%i)
\t
%i
\t
%i
\n
"
,
subcarrier_log
,
(
int16_t
)(
srs_received_signal
[
ant
][
l_line_offset
+
subcarrier
]
&
0xFFFF
),
(
int16_t
)((
srs_received_signal
[
ant
][
l_line_offset
+
subcarrier
]
>>
16
)
&
0xFFFF
));
#endif
// Subcarrier increment
subcarrier
+=
K_TC
;
if
(
subcarrier
>=
frame_parms
->
ofdm_symbol_size
)
{
subcarrier
=
subcarrier
-
frame_parms
->
ofdm_symbol_size
;
}
}
// for (int k = 0; k < M_sc_b_SRS; k++)
}
// for (int l_line = 0; l_line < N_symb_SRS; l_line++)
}
// for (int p_index = 0; p_index < N_ap; p_index++)
}
// for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
return
0
;
}
\ No newline at end of file
openair1/PHY/NR_UE_TRANSPORT/srs_modulation_nr.c
View file @
997d52b7
...
...
@@ -78,7 +78,7 @@ uint16_t sequence_number_hopping(int slot_number,
uint8_t
l0
,
uint8_t
l_line
)
{
uint16_t
v
=
0
;
if
(
M_sc_b_SRS
>
6
*
N
_SC
_RB
)
{
if
(
M_sc_b_SRS
>
6
*
N
R_NB_SC_PER
_RB
)
{
// Pseudo-random sequence c(i) defined by TS 38.211 - Section 5.2.1
uint32_t
cinit
=
n_ID_SRS
;
uint8_t
c_last_index
=
(
slot_number
*
N_SYMB_SLOT
+
l0
+
l_line
);
...
...
@@ -192,6 +192,10 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu,
int
frame_number
,
int
slot_number
)
{
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"Calling %s function
\n
"
,
__FUNCTION__
);
#endif
// SRS config parameters
uint8_t
B_SRS
=
srs_config_pdu
->
bandwidth_index
;
uint8_t
C_SRS
=
srs_config_pdu
->
config_index
;
...
...
@@ -212,7 +216,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu,
uint8_t
l0
=
frame_parms
->
symbols_per_slot
-
1
-
l_offset
;
// Starting symbol position in the time domain
uint8_t
n_SRS_cs_max
=
srs_max_number_cs
[
srs_config_pdu
->
comb_size
];
uint16_t
m_SRS_b
=
srs_bandwidth_config
[
C_SRS
][
B_SRS
][
0
];
// Number of resource blocks
uint16_t
M_sc_b_SRS
=
m_SRS_b
*
N
_SC
_RB
/
K_TC
;
// Length of the SRS sequence
uint16_t
M_sc_b_SRS
=
m_SRS_b
*
N
R_NB_SC_PER
_RB
/
K_TC
;
// Length of the SRS sequence
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"Frame = %i, slot = %i
\n
"
,
frame_number
,
slot_number
);
...
...
@@ -272,7 +276,7 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu,
nr_srs_info
->
sc_list_length
=
0
;
nr_srs_info
->
srs_generated_signal_bits
=
log2_approx
(
amp
);
}
uint64_t
subcarrier_offset
=
frame_parms
->
first_carrier_offset
+
srs_config_pdu
->
bwp_start
*
N
_SC
_RB
;
uint64_t
subcarrier_offset
=
frame_parms
->
first_carrier_offset
+
srs_config_pdu
->
bwp_start
*
N
R_NB_SC_PER
_RB
;
double
sqrt_N_ap
=
sqrt
(
N_ap
);
uint16_t
n_b
[
B_SRS_NUMBER
];
...
...
@@ -356,8 +360,9 @@ int generate_srs_nr(nfapi_nr_srs_pdu_t *srs_config_pdu,
}
uint8_t
k_l_offset
=
0
;
// If the SRS is configured by the IE SRS-PosResource-r16, the quantity k_l_offset is
// given by TS 38.211 - Table 6.4.1.4.3-2, otherwise k_l_offset = 0.
uint8_t
k_0_overbar_p
=
(
n_shift
*
N
_SC
_RB
+
(
K_TC_p
+
k_l_offset
))
%
K_TC
;
uint8_t
k_0_overbar_p
=
(
n_shift
*
N
R_NB_SC_PER
_RB
+
(
K_TC_p
+
k_l_offset
))
%
K_TC
;
uint8_t
k_0_p
=
k_0_overbar_p
+
K_TC
*
M_sc_b_SRS
*
sum_n_b
;
nr_srs_info
->
k_0_p
[
p_index
][
l_line
]
=
k_0_p
;
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"K_TC_p = %i
\n
"
,
K_TC_p
);
...
...
openair1/PHY/defs_nr_common.h
View file @
997d52b7
...
...
@@ -242,6 +242,7 @@ typedef struct {
typedef
struct
{
uint16_t
sc_list_length
;
uint16_t
*
sc_list
;
uint8_t
**
k_0_p
;
uint8_t
srs_generated_signal_bits
;
int32_t
**
srs_generated_signal
;
int32_t
**
srs_received_signal
;
...
...
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