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
eccecde2
Commit
eccecde2
authored
Oct 14, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/fix-SNR-based-on-SRS' into integration_2024_w41
parents
e4cb68a7
be6dcccd
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
90 additions
and
98 deletions
+90
-98
cmake_targets/autotests/test_case_list.xml
cmake_targets/autotests/test_case_list.xml
+5
-3
openair1/PHY/INIT/nr_init.c
openair1/PHY/INIT/nr_init.c
+1
-1
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+53
-79
openair1/PHY/TOOLS/signal_energy.c
openair1/PHY/TOOLS/signal_energy.c
+2
-2
openair1/PHY/TOOLS/tests/test_signal_energy.cpp
openair1/PHY/TOOLS/tests/test_signal_energy.cpp
+1
-1
openair1/PHY/TOOLS/tools_defs.h
openair1/PHY/TOOLS/tools_defs.h
+2
-2
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+2
-0
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+4
-5
openair1/SIMULATION/NR_PHY/ulsim.c
openair1/SIMULATION/NR_PHY/ulsim.c
+19
-4
openair2/GNB_APP/L1_nr_paramdef.h
openair2/GNB_APP/L1_nr_paramdef.h
+1
-1
No files found.
cmake_targets/autotests/test_case_list.xml
View file @
eccecde2
...
...
@@ -387,7 +387,8 @@
(Test10: PUSCH Type B, 3 DMRS, 2 PTRS, 3 Interpolated Symbols),
(Test11: 25 PRBs, 15 kHz SCS),
(Test12: MCS 0, low SNR performance)
(Test13: MCS 28, 106 PRBs, Time shift 8)
</desc>
(Test13: MCS 28, 106 PRBs, Time shift 8)
(Test14: SRS, SNR 40 dB)
</desc>
<main_exec>
nr_ulsim
</main_exec>
<main_exec_args>
-n100 -m9 -r106 -s5
-n100 -m16 -s10
...
...
@@ -401,8 +402,9 @@
-n100 -s5 -a4 -b8 -T 1,2 -U 1,3,1,1
-n100 -u0 -m0 -R25 -r25 -i 1,0
-n100 -m0 -S -0.6 -i 1,0
-n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8
</main_exec_args>
<tags>
test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13
</tags>
-n100 -m 28 -R106 -r106 -t90 -s24 -S24 -d 8
-n100 -s40 -E 1
</main_exec_args>
<tags>
test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14
</tags>
<search_expr_true>
PUSCH test OK
</search_expr_true>
<search_expr_false>
segmentation fault|assertion|exiting|fatal
</search_expr_false>
<nruns>
3
</nruns>
...
...
openair1/PHY/INIT/nr_init.c
View file @
eccecde2
...
...
@@ -504,7 +504,7 @@ void init_nr_transport(PHY_VARS_gNB *gNB)
gNB
->
max_nb_pucch
=
buffer_ul_slots
?
MAX_MOBILES_PER_GNB
*
buffer_ul_slots
:
1
;
gNB
->
max_nb_pusch
=
buffer_ul_slots
?
MAX_MOBILES_PER_GNB
*
buffer_ul_slots
:
1
;
gNB
->
max_nb_srs
=
buffer_ul_slots
<<
1
;
// assuming at most 2 SRS per slot
gNB
->
max_nb_srs
=
buffer_ul_slots
?
buffer_ul_slots
<<
1
:
1
;
// assuming at most 2 SRS per slot
gNB
->
pucch
=
(
NR_gNB_PUCCH_t
*
)
malloc16
(
gNB
->
max_nb_pucch
*
sizeof
(
NR_gNB_PUCCH_t
));
for
(
int
i
=
0
;
i
<
gNB
->
max_nb_pucch
;
i
++
)
{
...
...
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
eccecde2
...
...
@@ -597,17 +597,6 @@ void nr_pusch_ptrs_processing(PHY_VARS_gNB *gNB,
}
// Antenna loop
}
uint32_t
calc_power
(
const
int16_t
*
x
,
const
uint32_t
size
)
{
int64_t
sum_x
=
0
;
int64_t
sum_x2
=
0
;
for
(
int
k
=
0
;
k
<
size
;
k
++
)
{
sum_x
=
sum_x
+
x
[
k
];
sum_x2
=
sum_x2
+
x
[
k
]
*
x
[
k
];
}
return
sum_x2
/
size
-
(
sum_x
/
size
)
*
(
sum_x
/
size
);
}
int
nr_srs_channel_estimation
(
const
PHY_VARS_gNB
*
gNB
,
const
int
frame
,
...
...
@@ -644,27 +633,20 @@ int nr_srs_channel_estimation(
const
uint32_t
arr_len
=
frame_parms
->
nb_antennas_rx
*
N_ap
*
M_sc_b_SRS
;
int16_t
ch_real
[
arr_len
];
memset
(
ch_real
,
0
,
arr_len
*
sizeof
(
int16_t
));
int16_t
ch_imag
[
arr_len
];
memset
(
ch_imag
,
0
,
arr_len
*
sizeof
(
int16_t
));
int16_t
noise_real
[
arr_len
];
memset
(
noise_real
,
0
,
arr_len
*
sizeof
(
int16_t
));
int16_t
noise_imag
[
arr_len
];
memset
(
noise_imag
,
0
,
arr_len
*
sizeof
(
int16_t
));
c16_t
ch
[
arr_len
];
memset
(
ch
,
0
,
arr_len
*
sizeof
(
c16_t
));
int16_t
ls_estimated
[
2
];
c16_t
noise
[
arr_len
];
memset
(
noise
,
0
,
arr_len
*
sizeof
(
c16_t
));
uint8_t
mem_offset
=
((
16
-
((
long
)
&
srs_estimated_channel_freq
[
0
][
0
][
subcarrier_offset
+
nr_srs_info
->
k_0_p
[
0
][
0
]]))
&
0xF
)
>>
2
;
// >> 2 <=> /sizeof(int32_t)
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
// The End of OFDM symbol corresponds to the position of last 16384 in the filter
// The
multadd_real_vector_complex_scalar
applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow,
// The
c16multaddVectRealComplex
applies the remaining 8 zeros of filter, therefore, to avoid a buffer overflow,
// we added 8 in the array size
int32_t
srs_est
[
frame_parms
->
ofdm_symbol_size
*
(
1
<<
srs_pdu
->
num_symbols
)
+
mem_offset
+
8
]
__attribute__
((
aligned
(
32
)));
int32_t
srs_est
[
frame_parms
->
ofdm_symbol_size
*
(
1
<<
srs_pdu
->
num_symbols
)
+
mem_offset
+
8
]
__attribute__
((
aligned
(
32
)));
c16_t
ls_estimated
=
{
0
};
for
(
int
ant
=
0
;
ant
<
frame_parms
->
nb_antennas_rx
;
ant
++
)
{
...
...
@@ -682,14 +664,12 @@ int nr_srs_channel_estimation(
subcarrier
-=
frame_parms
->
ofdm_symbol_size
;
}
int16_t
*
srs_estimated_channel16
=
(
int
16_t
*
)
&
srs_est
[
subcarrier
+
mem_offset
];
c16_t
*
srs_estimated_channel16
=
(
c
16_t
*
)
&
srs_est
[
subcarrier
+
mem_offset
];
for
(
int
k
=
0
;
k
<
M_sc_b_SRS
;
k
++
)
{
if
(
k
%
fd_cdm
==
0
)
{
ls_estimated
[
0
]
=
0
;
ls_estimated
[
1
]
=
0
;
ls_estimated
=
(
c16_t
){
0
,
0
};
uint16_t
subcarrier_cdm
=
subcarrier
;
for
(
int
cdm_idx
=
0
;
cdm_idx
<
fd_cdm
;
cdm_idx
++
)
{
...
...
@@ -701,8 +681,8 @@ int nr_srs_channel_estimation(
// We know that nr_srs_info->srs_generated_signal_bits bits are enough to represent the generated_real and generated_imag.
// So we only need a nr_srs_info->srs_generated_signal_bits shift to ensure that the result fits into 16 bits.
ls_estimated
[
0
]
+=
(
int16_t
)(((
int32_t
)
generated_real
*
received_real
+
(
int32_t
)
generated_imag
*
received_imag
)
>>
nr_srs_info
->
srs_generated_signal_bits
);
ls_estimated
[
1
]
+=
(
int16_t
)(((
int32_t
)
generated_real
*
received_imag
-
(
int32_t
)
generated_imag
*
received_real
)
>>
nr_srs_info
->
srs_generated_signal_bits
);
ls_estimated
.
r
+=
(
int16_t
)(((
int32_t
)
generated_real
*
received_real
+
(
int32_t
)
generated_imag
*
received_imag
)
>>
nr_srs_info
->
srs_generated_signal_bits
);
ls_estimated
.
i
+=
(
int16_t
)(((
int32_t
)
generated_real
*
received_imag
-
(
int32_t
)
generated_imag
*
received_real
)
>>
nr_srs_info
->
srs_generated_signal_bits
);
// Subcarrier increment
subcarrier_cdm
+=
K_TC
;
...
...
@@ -712,8 +692,7 @@ int nr_srs_channel_estimation(
}
}
srs_ls_estimated_channel
[
subcarrier
].
r
=
ls_estimated
[
0
];
srs_ls_estimated_channel
[
subcarrier
].
i
=
ls_estimated
[
1
];
srs_ls_estimated_channel
[
subcarrier
]
=
ls_estimated
;
#ifdef SRS_DEBUG
int
subcarrier_log
=
subcarrier
-
subcarrier_offset
;
...
...
@@ -728,48 +707,48 @@ int nr_srs_channel_estimation(
subcarrier_log
,
((
c16_t
*
)
srs_generated_signal
[
p_index
])[
subcarrier
].
r
,
((
c16_t
*
)
srs_generated_signal
[
p_index
])[
subcarrier
].
i
,
((
c16_t
*
)
srs_received_signal
[
ant
])[
subcarrier
].
r
,
((
c16_t
*
)
srs_received_signal
[
ant
])[
subcarrier
].
i
,
ls_estimated
[
0
],
ls_estimated
[
1
]
);
ls_estimated
.
r
,
ls_estimated
.
i
);
#endif
const
uint16_t
sc_offset
=
subcarrier
+
mem_offset
;
// Channel interpolation
if
(
srs_pdu
->
comb_size
==
0
)
{
if
(
k
==
0
)
{
// First subcarrier case
if
(
srs_pdu
->
comb_size
==
0
)
{
if
(
k
==
0
)
{
// First subcarrier case
// filt8_start is {12288,8192,4096,0,0,0,0,0}
multadd_real_vector_complex_scalar
(
filt8_start
,
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
subcarrier
<
K_TC
)
{
// Start of OFDM symbol case
c16multaddVectRealComplex
(
filt8_start
,
&
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
subcarrier
<
K_TC
)
{
// Start of OFDM symbol case
// filt8_start is {12288,8192,4096,0,0,0,0,0}
srs_estimated_channel16
=
(
int
16_t
*
)
&
srs_est
[
subcarrier
];
srs_estimated_channel16
=
(
c
16_t
*
)
&
srs_est
[
subcarrier
];
const
short
*
filter
=
mem_offset
==
0
?
filt8_start
:
filt8_start_shift2
;
multadd_real_vector_complex_scalar
(
filter
,
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
((
subcarrier
+
K_TC
)
>=
frame_parms
->
ofdm_symbol_size
||
k
==
(
M_sc_b_SRS
-
1
))
{
// End of OFDM symbol or last subcarrier cases
c16multaddVectRealComplex
(
filter
,
&
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
((
subcarrier
+
K_TC
)
>=
frame_parms
->
ofdm_symbol_size
||
k
==
(
M_sc_b_SRS
-
1
))
{
// End of OFDM symbol or last subcarrier cases
// filt8_end is {4096,8192,12288,16384,0,0,0,0}
const
short
*
filter
=
mem_offset
==
0
||
k
==
(
M_sc_b_SRS
-
1
)
?
filt8_end
:
filt8_end_shift2
;
multadd_real_vector_complex_scalar
(
filter
,
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
k
%
2
==
1
)
{
// 1st middle case
c16multaddVectRealComplex
(
filter
,
&
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
k
%
2
==
1
)
{
// 1st middle case
// filt8_middle2 is {4096,8192,8192,8192,4096,0,0,0}
multadd_real_vector_complex_scalar
(
filt8_middle2
,
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
k
%
2
==
0
)
{
// 2nd middle case
c16multaddVectRealComplex
(
filt8_middle2
,
&
ls_estimated
,
srs_estimated_channel16
,
8
);
}
else
if
(
k
%
2
==
0
)
{
// 2nd middle case
// filt8_middle4 is {0,0,4096,8192,8192,8192,4096,0}
multadd_real_vector_complex_scalar
(
filt8_middle4
,
ls_estimated
,
srs_estimated_channel16
,
8
);
srs_estimated_channel16
=
(
int
16_t
*
)
&
srs_est
[
sc_offset
];
c16multaddVectRealComplex
(
filt8_middle4
,
&
ls_estimated
,
srs_estimated_channel16
,
8
);
srs_estimated_channel16
=
(
c
16_t
*
)
&
srs_est
[
sc_offset
];
}
}
else
{
if
(
k
==
0
)
{
// First subcarrier case
if
(
k
==
0
)
{
// First subcarrier case
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
multadd_real_vector_complex_scalar
(
filt16_start
,
ls_estimated
,
srs_estimated_channel16
,
16
);
}
else
if
(
subcarrier
<
K_TC
)
{
// Start of OFDM symbol case
srs_estimated_channel16
=
(
int
16_t
*
)
&
srs_est
[
sc_offset
];
c16multaddVectRealComplex
(
filt16_start
,
&
ls_estimated
,
srs_estimated_channel16
,
16
);
}
else
if
(
subcarrier
<
K_TC
)
{
// Start of OFDM symbol case
srs_estimated_channel16
=
(
c
16_t
*
)
&
srs_est
[
sc_offset
];
// filt16_start is {12288,8192,8192,8192,4096,0,0,0,0,0,0,0,0,0,0,0}
multadd_real_vector_complex_scalar
(
filt16_start
,
ls_estimated
,
srs_estimated_channel16
,
16
);
}
else
if
((
subcarrier
+
K_TC
)
>=
frame_parms
->
ofdm_symbol_size
||
k
==
(
M_sc_b_SRS
-
1
))
{
// End of OFDM symbol or last subcarrier cases
c16multaddVectRealComplex
(
filt16_start
,
&
ls_estimated
,
srs_estimated_channel16
,
16
);
}
else
if
((
subcarrier
+
K_TC
)
>=
frame_parms
->
ofdm_symbol_size
||
k
==
(
M_sc_b_SRS
-
1
))
{
// End of OFDM symbol or last subcarrier cases
// filt16_end is {4096,8192,8192,8192,12288,16384,16384,16384,0,0,0,0,0,0,0,0}
multadd_real_vector_complex_scalar
(
filt16_end
,
ls_estimated
,
srs_estimated_channel16
,
16
);
c16multaddVectRealComplex
(
filt16_end
,
&
ls_estimated
,
srs_estimated_channel16
,
16
);
}
else
{
// Middle case
// filt16_middle4 is {4096,8192,8192,8192,8192,8192,8192,8192,4096,0,0,0,0,0,0,0}
multadd_real_vector_complex_scalar
(
filt16_middle4
,
ls_estimated
,
srs_estimated_channel16
,
16
);
srs_estimated_channel16
=
(
int
16_t
*
)
&
srs_est
[
sc_offset
];
c16multaddVectRealComplex
(
filt16_middle4
,
&
ls_estimated
,
srs_estimated_channel16
,
16
);
srs_estimated_channel16
=
(
c
16_t
*
)
&
srs_est
[
sc_offset
];
}
}
...
...
@@ -790,15 +769,14 @@ int nr_srs_channel_estimation(
if
(
subcarrier
>
frame_parms
->
ofdm_symbol_size
)
{
subcarrier
-=
frame_parms
->
ofdm_symbol_size
;
}
uint16_t
base_idx
=
ant
*
N_ap
*
M_sc_b_SRS
+
p_index
*
M_sc_b_SRS
;
uint16_t
base_idx
=
ant
*
N_ap
*
M_sc_b_SRS
+
p_index
*
M_sc_b_SRS
;
for
(
int
k
=
0
;
k
<
M_sc_b_SRS
;
k
++
)
{
ch_real
[
base_idx
+
k
]
=
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
r
;
ch_imag
[
base_idx
+
k
]
=
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
i
;
noise_real
[
base_idx
+
k
]
=
abs
(
srs_ls_estimated_channel
[
subcarrier
].
r
-
ch_real
[
base_idx
+
k
]);
noise_imag
[
base_idx
+
k
]
=
abs
(
srs_ls_estimated_channel
[
subcarrier
].
i
-
ch_imag
[
base_idx
+
k
]);
ch
[
base_idx
+
k
]
=
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
];
noise
[
base_idx
+
k
].
r
=
abs
(
srs_ls_estimated_channel
[
subcarrier
].
r
-
ch
[
base_idx
+
k
].
r
);
noise
[
base_idx
+
k
].
i
=
abs
(
srs_ls_estimated_channel
[
subcarrier
].
i
-
ch
[
base_idx
+
k
].
i
);
subcarrier
+=
K_TC
;
if
(
subcarrier
>=
frame_parms
->
ofdm_symbol_size
)
{
subcarrier
=
subcarrier
-
frame_parms
->
ofdm_symbol_size
;
subcarrier
=
subcarrier
-
frame_parms
->
ofdm_symbol_size
;
}
}
...
...
@@ -824,9 +802,10 @@ int nr_srs_channel_estimation(
subcarrier_log
,
srs_ls_estimated_channel
[
subcarrier
].
r
,
srs_ls_estimated_channel
[
subcarrier
].
i
,
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
r
,
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
i
,
noise_real
[
base_idx
+
(
k
/
K_TC
)],
noise_imag
[
base_idx
+
(
k
/
K_TC
)]);
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
r
,
((
c16_t
*
)
srs_estimated_channel_freq
[
ant
][
p_index
])[
subcarrier
].
i
,
noise
[
base_idx
+
(
k
/
K_TC
)].
r
,
noise
[
base_idx
+
(
k
/
K_TC
)].
i
);
// Subcarrier increment
subcarrier
++
;
...
...
@@ -853,7 +832,7 @@ int nr_srs_channel_estimation(
}
// for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
// Compute signal power
uint32_t
signal_power
=
calc_power
(
ch_real
,
arr_len
)
+
calc_power
(
ch_imag
,
arr_len
);
uint32_t
signal_power
=
max
(
signal_energy_nodc
(
ch
,
arr_len
),
1
);
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"signal_power = %u
\n
"
,
signal_power
);
...
...
@@ -865,11 +844,6 @@ int nr_srs_channel_estimation(
}
// Compute noise power
const
uint8_t
signal_power_bits
=
log2_approx
(
signal_power
);
const
uint8_t
factor_bits
=
signal_power_bits
<
32
?
32
-
signal_power_bits
:
0
;
// 32 due to input of dB_fixed(uint32_t x)
const
int32_t
factor_dB
=
dB_fixed
(
1
<<
factor_bits
);
const
uint8_t
srs_symbols_per_rb
=
srs_pdu
->
comb_size
==
0
?
6
:
3
;
const
uint8_t
n_noise_est
=
frame_parms
->
nb_antennas_rx
*
N_ap
*
srs_symbols_per_rb
;
uint64_t
sum_re
=
0
;
...
...
@@ -886,19 +860,19 @@ int nr_srs_channel_estimation(
for
(
int
ant
=
0
;
ant
<
frame_parms
->
nb_antennas_rx
;
ant
++
)
{
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p_index
++
)
{
uint16_t
base_idx
=
ant
*
N_ap
*
M_sc_b_SRS
+
p_index
*
M_sc_b_SRS
+
rb
*
srs_symbols_per_rb
;
uint16_t
base_idx
=
ant
*
N_ap
*
M_sc_b_SRS
+
p_index
*
M_sc_b_SRS
+
rb
*
srs_symbols_per_rb
;
for
(
int
srs_symb
=
0
;
srs_symb
<
srs_symbols_per_rb
;
srs_symb
++
)
{
sum_re
=
sum_re
+
noise
_real
[
base_idx
+
srs_symb
]
;
sum_re2
=
sum_re2
+
noise
_real
[
base_idx
+
srs_symb
]
*
noise_real
[
base_idx
+
srs_symb
]
;
sum_im
=
sum_im
+
noise
_imag
[
base_idx
+
srs_symb
]
;
sum_im2
=
sum_im2
+
noise
_imag
[
base_idx
+
srs_symb
]
*
noise_imag
[
base_idx
+
srs_symb
]
;
sum_re
=
sum_re
+
noise
[
base_idx
+
srs_symb
].
r
;
sum_re2
=
sum_re2
+
noise
[
base_idx
+
srs_symb
].
r
*
noise
[
base_idx
+
srs_symb
].
r
;
sum_im
=
sum_im
+
noise
[
base_idx
+
srs_symb
].
i
;
sum_im2
=
sum_im2
+
noise
[
base_idx
+
srs_symb
].
i
*
noise
[
base_idx
+
srs_symb
].
i
;
}
// for (int srs_symb = 0; srs_symb < srs_symbols_per_rb; srs_symb++)
}
// for (int p_index = 0; p_index < N_ap; p_index++)
}
// for (int ant = 0; ant < frame_parms->nb_antennas_rx; ant++)
noise_power_per_rb
[
rb
]
=
max
(
sum_re2
/
n_noise_est
-
(
sum_re
/
n_noise_est
)
*
(
sum_re
/
n_noise_est
)
+
sum_im2
/
n_noise_est
-
(
sum_im
/
n_noise_est
)
*
(
sum_im
/
n_noise_est
),
1
);
snr_per_rb
[
rb
]
=
dB_fixed
(
(
int32_t
)((
signal_power
<<
factor_bits
)
/
noise_power_per_rb
[
rb
]))
-
factor_dB
;
snr_per_rb
[
rb
]
=
dB_fixed
(
signal_power
)
-
dB_fixed
(
noise_power_per_rb
[
rb
])
;
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"noise_power_per_rb[%i] = %i, snr_per_rb[%i] = %i dB
\n
"
,
rb
,
noise_power_per_rb
[
rb
],
rb
,
snr_per_rb
[
rb
]);
...
...
@@ -906,9 +880,9 @@ int nr_srs_channel_estimation(
}
// for (int rb = 0; rb < m_SRS_b; rb++)
const
uint32_t
noise_power
=
max
(
calc_power
(
noise_real
,
arr_len
)
+
calc_power
(
noise_imag
,
arr_len
),
1
);
const
uint32_t
noise_power
=
max
(
signal_energy_nodc
(
noise
,
arr_len
),
1
);
*
snr
=
dB_fixed
(
(
int32_t
)((
signal_power
<<
factor_bits
)
/
(
noise_power
)))
-
factor_dB
;
*
snr
=
dB_fixed
(
signal_power
)
-
dB_fixed
(
noise_power
)
;
#ifdef SRS_DEBUG
LOG_I
(
NR_PHY
,
"noise_power = %u, SNR = %i dB
\n
"
,
noise_power
,
*
snr
);
...
...
openair1/PHY/TOOLS/signal_energy.c
View file @
eccecde2
...
...
@@ -111,7 +111,7 @@ int32_t signal_energy_amp_shift(int32_t *input,uint32_t length)
return
((
temp
>
0
)
?
temp
:
1
);
}
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
)
u
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
)
{
// init
simde__m128
mm0
=
simde_mm_setzero_ps
();
...
...
@@ -134,7 +134,7 @@ int32_t signal_energy_nodc(const c16_t *input, uint32_t length)
// Ave
float
sums
[
4
];
simde_mm_store_ps
(
sums
,
mm0
);
return
(
in
t
)((
sums
[
0
]
+
sums
[
1
]
+
sums
[
2
]
+
sums
[
3
]
+
leftover_sum
)
/
(
float
)
length
);
return
(
uint32_
t
)((
sums
[
0
]
+
sums
[
1
]
+
sums
[
2
]
+
sums
[
3
]
+
leftover_sum
)
/
(
float
)
length
);
}
double
signal_energy_fp
(
double
*
s_re
[
2
],
double
*
s_im
[
2
],
uint32_t
nb_antennas
,
uint32_t
length
,
uint32_t
offset
)
...
...
openair1/PHY/TOOLS/tests/test_signal_energy.cpp
View file @
eccecde2
#include <gtest/gtest.h>
extern
"C"
{
#include "openair1/PHY/TOOLS/tools_defs.h"
extern
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
);
extern
u
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
);
}
#include <vector>
#include <algorithm>
...
...
openair1/PHY/TOOLS/tools_defs.h
View file @
eccecde2
...
...
@@ -758,10 +758,10 @@ int32_t signal_energy_amp_shift(int32_t *input, uint32_t length);
int32_t
subcarrier_energy
(
int32_t
*
,
uint32_t
,
int32_t
*
subcarrier_energy
,
uint16_t
rx_power_correction
);
#endif
/*!\fn
int32_t signal_energy_nodc(int32
_t *,uint32_t);
/*!\fn
uint32_t signal_energy_nodc(c16
_t *,uint32_t);
\brief Computes the signal energy per subcarrier, without DC removal
*/
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
);
u
int32_t
signal_energy_nodc
(
const
c16_t
*
input
,
uint32_t
length
);
int32_t
signal_power
(
int32_t
*
,
uint32_t
);
int32_t
interference_power
(
int32_t
*
,
uint32_t
);
...
...
openair1/PHY/defs_gNB.h
View file @
eccecde2
...
...
@@ -264,6 +264,8 @@ typedef struct {
uint32_t
frame
;
/// Slot where current SRS pdu was received
uint32_t
slot
;
/// Measured SNR
int8_t
snr
;
/// ULSCH PDU
nfapi_nr_srs_pdu_t
srs_pdu
;
}
NR_gNB_SRS_t
;
...
...
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
eccecde2
...
...
@@ -786,7 +786,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
nfapi_nr_uci_pucch_pdu_format_0_1_t
*
uci_pdu_format0
=
&
gNB
->
uci_pdu_list
[
num_ucis
].
pucch_pdu_format_0_1
;
int
offset
=
pucch_pdu
->
start_symbol_index
*
gNB
->
frame_parms
.
ofdm_symbol_size
+
(
gNB
->
frame_parms
.
first_carrier_offset
+
pucch_pdu
->
prb_start
*
12
);
LOG_D
(
PHY
,
LOG_D
(
NR_
PHY
,
"frame %d, slot %d: PUCCH signal energy %d
\n
"
,
frame_rx
,
slot_rx
,
...
...
@@ -953,7 +953,6 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
int32_t
srs_estimated_channel_time
[
frame_parms
->
nb_antennas_rx
][
1
<<
srs_pdu
->
num_ant_ports
][
frame_parms
->
ofdm_symbol_size
]
__attribute__
((
aligned
(
32
)));
int32_t
srs_estimated_channel_time_shifted
[
frame_parms
->
nb_antennas_rx
][
1
<<
srs_pdu
->
num_ant_ports
][
frame_parms
->
ofdm_symbol_size
];
int8_t
snr_per_rb
[
srs_pdu
->
bwp_size
];
int8_t
snr
=
0
;
start_meas
(
&
gNB
->
generate_srs_stats
);
if
(
check_srs_pdu
(
srs_pdu
,
&
gNB
->
nr_srs_info
[
i
]
->
srs_pdu
)
==
0
)
{
...
...
@@ -978,11 +977,11 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_estimated_channel_time
,
srs_estimated_channel_time_shifted
,
snr_per_rb
,
&
snr
);
&
gNB
->
srs
->
snr
);
stop_meas
(
&
gNB
->
srs_channel_estimation_stats
);
}
if
((
snr
*
10
)
<
gNB
->
srs_thres
)
{
if
((
gNB
->
srs
->
snr
*
10
)
<
gNB
->
srs_thres
)
{
srs_est
=
-
1
;
}
...
...
@@ -1055,7 +1054,7 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
nfapi_nr_srs_beamforming_report_t
nr_srs_bf_report
;
nr_srs_bf_report
.
prg_size
=
srs_pdu
->
beamforming
.
prg_size
;
nr_srs_bf_report
.
num_symbols
=
1
<<
srs_pdu
->
num_symbols
;
nr_srs_bf_report
.
wide_band_snr
=
srs_est
>=
0
?
(
snr
+
64
)
<<
1
:
0xFF
;
// 0xFF will be set if this field is invalid
nr_srs_bf_report
.
wide_band_snr
=
srs_est
>=
0
?
(
gNB
->
srs
->
snr
+
64
)
<<
1
:
0xFF
;
// 0xFF will be set if this field is invalid
nr_srs_bf_report
.
num_reported_symbols
=
1
<<
srs_pdu
->
num_symbols
;
fill_srs_reported_symbol_list
(
&
nr_srs_bf_report
.
prgs
,
srs_pdu
,
frame_parms
->
N_RB_UL
,
snr_per_rb
,
srs_est
);
...
...
openair1/SIMULATION/NR_PHY/ulsim.c
View file @
eccecde2
...
...
@@ -724,7 +724,7 @@ int main(int argc, char *argv[])
NR_gNB_ULSCH_t
*
ulsch_gNB
=
&
gNB
->
ulsch
[
UE_id
];
NR_Sched_Rsp_t
*
Sched_INFO
=
malloc
(
sizeof
(
*
Sched_INFO
));
NR_Sched_Rsp_t
*
Sched_INFO
=
malloc
16_clear
(
sizeof
(
*
Sched_INFO
));
memset
((
void
*
)
Sched_INFO
,
0
,
sizeof
(
*
Sched_INFO
));
nfapi_nr_ul_tti_request_t
*
UL_tti_req
=
&
Sched_INFO
->
UL_tti_req
;
Sched_INFO
->
sched_response_id
=
-
1
;
...
...
@@ -937,6 +937,7 @@ int main(int argc, char *argv[])
}
//---------------
int
ret
=
1
;
int
srs_ret
=
do_SRS
;
for
(
SNR
=
snr0
;
SNR
<=
snr1
;
SNR
+=
snr_step
)
{
varArray_t
*
table_rx
=
initVarArray
(
1000
,
sizeof
(
double
));
...
...
@@ -972,6 +973,9 @@ int main(int argc, char *argv[])
int
max_pusch_delay
=
INT_MIN
;
int
delay_pusch_est_count
=
0
;
int64_t
sum_srs_snr
=
0
;
int
srs_snr_count
=
0
;
for
(
trial
=
0
;
trial
<
n_trials
;
trial
++
)
{
uint8_t
round
=
0
;
...
...
@@ -1071,6 +1075,7 @@ int main(int argc, char *argv[])
srs_pdu
->
subcarrier_spacing
=
frame_parms
->
subcarrier_spacing
;
srs_pdu
->
num_ant_ports
=
n_tx
==
4
?
2
:
n_tx
==
2
?
1
:
0
;
srs_pdu
->
sequence_id
=
40
;
srs_pdu
->
time_start_position
=
frame_parms
->
symbols_per_slot
-
1
;
srs_pdu
->
config_index
=
rrc_get_max_nr_csrs
(
srs_pdu
->
bwp_size
,
srs_pdu
->
bandwidth_index
);
srs_pdu
->
resource_type
=
NR_SRS_Resource__resourceType_PR_periodic
;
srs_pdu
->
t_srs
=
1
;
...
...
@@ -1436,6 +1441,10 @@ int main(int argc, char *argv[])
max_pusch_delay
=
max
(
ulsch_gNB
->
delay
.
est_delay
,
max_pusch_delay
);
delay_pusch_est_count
++
;
if
(
do_SRS
==
1
)
{
sum_srs_snr
+=
gNB
->
srs
->
snr
;
srs_snr_count
++
;
}
}
// trial loop
roundStats
/=
((
float
)
n_trials
);
...
...
@@ -1471,8 +1480,14 @@ int main(int argc, char *argv[])
printf
(
") Avg round %.2f, Eff Rate %.4f bits/slot, Eff Throughput %.2f, TBS %u bits/slot
\n
"
,
roundStats
,
effRate
,
effTP
,
TBS
);
printf
(
"DMRS-PUSCH delay estimation: min %i, max %i, average %f
\n
"
,
min_pusch_delay
>>
1
,
max_pusch_delay
>>
1
,
(
double
)
sum_pusch_delay
/
(
2
*
delay_pusch_est_count
));
double
av_delay
=
(
double
)
sum_pusch_delay
/
(
2
*
delay_pusch_est_count
);
printf
(
"DMRS-PUSCH delay estimation: min %i, max %i, average %2.1f
\n
"
,
min_pusch_delay
>>
1
,
max_pusch_delay
>>
1
,
av_delay
);
if
(
do_SRS
==
1
)
{
float
srs_snr_av
=
(
float
)
sum_srs_snr
/
srs_snr_count
;
srs_ret
=
srs_snr_av
>=
0
.
7
*
SNR
||
srs_snr_av
>
30
?
0
:
1
;
printf
(
"SNR based on SRS: %2.1f dB
\n
"
,
srs_snr_av
);
}
printf
(
"*****************************************
\n
"
);
printf
(
"
\n
"
);
...
...
@@ -1519,7 +1534,7 @@ int main(int argc, char *argv[])
if
(
n_trials
==
1
)
break
;
if
((
float
)
effTP
>=
eff_tp_check
)
{
if
(
srs_ret
==
0
&&
(
float
)
effTP
>=
eff_tp_check
)
{
printf
(
"*************
\n
"
);
printf
(
"PUSCH test OK
\n
"
);
printf
(
"*************
\n
"
);
...
...
openair2/GNB_APP/L1_nr_paramdef.h
View file @
eccecde2
...
...
@@ -78,7 +78,7 @@
{CONFIG_STRING_L1_PUCCH0_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=100, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_PRACH_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=150, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_PUSCH_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=50, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=
5
0, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_SRS_DTX_THRESHOLD, NULL, 0, .uptr=NULL, .defintval=
3
0, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_MAX_LDPC_ITERATIONS, NULL, 0, .uptr=NULL, .defintval=8, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_RX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 0}, \
{CONFIG_STRING_L1_TX_THREAD_CORE, NULL, 0, .uptr=NULL, .defintval=-1, TYPE_UINT, 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