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
e5e4dead
Commit
e5e4dead
authored
Jun 10, 2024
by
Florian Kaltenberger
Committed by
Florian Kaltenberger
Jun 11, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixing a bug in nr_est_timing_advance_srs
parent
ae21d9a9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
39 additions
and
31 deletions
+39
-31
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+19
-16
openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
+2
-1
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+18
-14
No files found.
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
e5e4dead
...
...
@@ -46,8 +46,9 @@
/* Generic function to find the peak of channel estimation buffer */
int32_t
nr_est_toa_ns_srs
(
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
N_arx
,
uint8_t
N_ap
,
int32_t
srs_estimated_channel_freq
[
N_ap
][
frame_parms
->
ofdm_symbol_size
],
int32_t
srs_estimated_channel_freq
[
N_a
rx
][
N_a
p
][
frame_parms
->
ofdm_symbol_size
],
int16_t
*
srs_toa_ns
)
{
...
...
@@ -59,24 +60,26 @@ int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
int32_t
max_val
=
0
,
max_idx
=
0
,
abs_val
=
0
,
mean_val
=
0
;
int16_t
start_offset
=
(
NR_SRS_IDFT_OVERSAMP_FACTOR
*
frame_parms
->
ofdm_symbol_size
)
-
(
frame_parms
->
ofdm_symbol_size
>>
1
);
for
(
int
arx_index
=
0
;
arx_index
<
N_arx
;
arx_index
++
)
{
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p_index
++
)
{
// Place SRS channel estimates in FFT shifted format for oversampling
memcpy
((
int16_t
*
)
&
chF_interpol
[
p_index
][
0
],
&
srs_estimated_channel_freq
[
p_index
][
0
],
(
frame_parms
->
ofdm_symbol_size
>>
1
)
*
sizeof
(
int32_t
));
memcpy
((
int16_t
*
)
&
chF_interpol
[
p_index
][
start_offset
],
&
srs_estimated_channel_freq
[
p_index
][
frame_parms
->
ofdm_symbol_size
>>
1
],
(
frame_parms
->
ofdm_symbol_size
>>
1
)
*
sizeof
(
int32_t
));
for
(
int
ap_index
=
0
;
ap_index
<
N_ap
;
ap_index
++
)
{
// Convert to time domain oversampled
freq2time
(
frame_parms
->
ofdm_symbol_size
*
NR_SRS_IDFT_OVERSAMP_FACTOR
,
(
int16_t
*
)
chF_interpol
[
p_index
],
(
int16_t
*
)
chT_interpol
[
p_index
]);
}
// Place SRS channel estimates in FFT shifted format for oversampling
memcpy
((
int16_t
*
)
&
chF_interpol
[
ap_index
][
0
],
&
srs_estimated_channel_freq
[
arx_index
][
ap_index
][
0
],
(
frame_parms
->
ofdm_symbol_size
>>
1
)
*
sizeof
(
int32_t
));
memcpy
((
int16_t
*
)
&
chF_interpol
[
ap_index
][
start_offset
],
&
srs_estimated_channel_freq
[
arx_index
][
ap_index
][
frame_parms
->
ofdm_symbol_size
>>
1
],
(
frame_parms
->
ofdm_symbol_size
>>
1
)
*
sizeof
(
int32_t
));
// Convert to time domain oversampled
freq2time
(
frame_parms
->
ofdm_symbol_size
*
NR_SRS_IDFT_OVERSAMP_FACTOR
,
(
int16_t
*
)
chF_interpol
[
ap_index
],
(
int16_t
*
)
chT_interpol
[
ap_index
]);
}
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p_index
++
)
{
for
(
int
k
=
0
;
k
<
NR_SRS_IDFT_OVERSAMP_FACTOR
*
frame_parms
->
ofdm_symbol_size
;
k
++
)
{
abs_val
=
0
;
abs_val
+=
squaredMod
(((
c16_t
*
)
chT_interpol
[
p_index
])[
k
]);
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p_index
++
)
abs_val
+=
squaredMod
(((
c16_t
*
)
chT_interpol
[
p_index
])[
k
]);
mean_val
+=
(
abs_val
-
mean_val
)
/
(
k
+
1
);
if
(
abs_val
>
max_val
)
{
max_val
=
abs_val
;
...
...
@@ -88,11 +91,11 @@ int32_t nr_est_toa_ns_srs(NR_DL_FRAME_PARMS *frame_parms,
max_idx
=
max_idx
-
NR_SRS_IDFT_OVERSAMP_FACTOR
*
frame_parms
->
ofdm_symbol_size
;
// Check for detection threshold
LOG_D
(
PHY
,
"SRS ToA estimator (
ant %d): max_val %d, mean_val %d, max_idx %d
\n
"
,
p
_index
,
max_val
,
mean_val
,
max_idx
);
LOG_D
(
PHY
,
"SRS ToA estimator (
RX ant %d): max_val %d, mean_val %d, max_idx %d
\n
"
,
arx
_index
,
max_val
,
mean_val
,
max_idx
);
if
((
mean_val
!=
0
)
&&
(
max_val
/
mean_val
>
10
))
{
srs_toa_ns
[
p
_index
]
=
(
max_idx
*
1e9
)
/
(
NR_SRS_IDFT_OVERSAMP_FACTOR
*
frame_parms
->
samples_per_frame
*
100
);
srs_toa_ns
[
arx
_index
]
=
(
max_idx
*
1e9
)
/
(
NR_SRS_IDFT_OVERSAMP_FACTOR
*
frame_parms
->
samples_per_frame
*
100
);
}
else
{
srs_toa_ns
[
p
_index
]
=
0xFFFF
;
srs_toa_ns
[
arx
_index
]
=
0xFFFF
;
}
}
...
...
openair1/PHY/NR_ESTIMATION/nr_ul_estimation.h
View file @
e5e4dead
...
...
@@ -67,8 +67,9 @@ int nr_est_timing_advance_srs(const NR_DL_FRAME_PARMS *frame_parms,
const
int32_t
srs_estimated_channel_time
[
N_ap
][
frame_parms
->
ofdm_symbol_size
]);
int32_t
nr_est_toa_ns_srs
(
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
N_arx
,
uint8_t
N_ap
,
int32_t
srs_estimated_channel_freq
[
N_ap
][
frame_parms
->
ofdm_symbol_size
],
int32_t
srs_estimated_channel_freq
[
N_a
rx
][
N_a
p
][
frame_parms
->
ofdm_symbol_size
],
int16_t
*
srs_toa_ns
);
void
nr_pusch_ptrs_processing
(
PHY_VARS_gNB
*
gNB
,
...
...
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
e5e4dead
...
...
@@ -976,22 +976,25 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_est
=
-
1
;
}
for
(
int
ant_rx
=
0
;
ant_rx
<
gNB
->
frame_parms
.
nb_antennas_rx
;
ant_rx
++
)
{
T
(
T_GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE
,
T_INT
(
0
),
T_INT
(
gNB
->
Mod_id
),
T_INT
(
srs_pdu
->
rnti
),
T_INT
(
frame_rx
),
T_INT
(
0
),
T_INT
(
0
),
T_BUFFER
(
srs_estimated_channel_freq
[
0
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int32_t
)));
T_INT
(
slot_rx
),
T_INT
(
ant_rx
),
T_BUFFER
(
srs_estimated_channel_freq
[
ant_rx
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int32_t
)));
T
(
T_GNB_PHY_UL_TIME_CHANNEL_ESTIMATE
,
T_INT
(
0
),
T_INT
(
gNB
->
Mod_id
),
T_INT
(
srs_pdu
->
rnti
),
T_INT
(
frame_rx
),
T_INT
(
0
),
T_INT
(
0
),
T_BUFFER
(
srs_estimated_channel_time_shifted
[
0
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int32_t
)));
T_INT
(
slot_rx
),
T_INT
(
ant_rx
),
T_BUFFER
(
srs_estimated_channel_time_shifted
[
ant_rx
][
0
],
frame_parms
->
ofdm_symbol_size
*
sizeof
(
int32_t
)));
}
gNB
->
UL_INFO
.
srs_ind
.
pdu_list
=
&
gNB
->
srs_pdu_list
[
0
];
gNB
->
UL_INFO
.
srs_ind
.
sfn
=
frame_rx
;
gNB
->
UL_INFO
.
srs_ind
.
slot
=
slot_rx
;
...
...
@@ -1001,12 +1004,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
srs_indication
->
rnti
=
srs_pdu
->
rnti
;
uint8_t
N_ap
=
1
<<
srs_pdu
->
num_ant_ports
;
int16_t
srs_toa_ns
[
N_ap
];
uint8_t
N_ant_rx
=
gNB
->
frame_parms
.
nb_antennas_rx
;
int16_t
srs_toa_ns
[
N_ant_rx
];
start_meas
(
&
gNB
->
srs_timing_advance_stats
);
srs_indication
->
timing_advance_offset
=
srs_est
>=
0
?
nr_est_timing_advance_srs
(
frame_parms
,
N_ap
,
srs_estimated_channel_time
[
0
])
:
0xFFFF
;
stop_meas
(
&
gNB
->
srs_timing_advance_stats
);
srs_indication
->
timing_advance_offset_nsec
=
srs_est
>=
0
?
nr_est_toa_ns_srs
(
frame_parms
,
N_a
p
,
srs_estimated_channel_freq
[
0
]
,
srs_toa_ns
)
:
0xFFFF
;
srs_indication
->
timing_advance_offset_nsec
=
srs_est
>=
0
?
nr_est_toa_ns_srs
(
frame_parms
,
N_a
nt_rx
,
N_ap
,
srs_estimated_channel_freq
,
srs_toa_ns
)
:
0xFFFF
;
//(int16_t)((((int32_t)srs_indication->timing_advance_offset - 31) * ((int32_t)TC_NSEC_x32768)) >> 15) : 0xFFFF;
switch
(
srs_pdu
->
srs_parameters_v4
.
usage
)
{
...
...
@@ -1134,13 +1138,13 @@ int phy_procedures_gNB_uespec_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx)
case
NFAPI_NR_SRS_LOCALIZATION
:
{
// this is a custom usage not in the standard
// we send Timing advance offset in nanoseconds for each TRP (= antenna)
// we send Timing advance offset in nanoseconds for each TRP (=
RX
antenna)
uint8_t
*
pWritePackedMessage
=
(
uint8_t
*
)
report_tlv
->
value
;
uint8_t
*
end
=
(
uint8_t
*
)
report_tlv
->
value
+
sizeof
(
report_tlv
->
value
);
for
(
int
p_index
=
0
;
p_index
<
N_ap
;
p
_index
++
)
{
report_tlv
->
length
+=
push16
(
srs_toa_ns
[
p
_index
],
&
pWritePackedMessage
,
end
);
for
(
int
arx_index
=
0
;
arx_index
<
N_ant_rx
;
arx
_index
++
)
{
report_tlv
->
length
+=
push16
(
srs_toa_ns
[
arx
_index
],
&
pWritePackedMessage
,
end
);
}
break
;
}
...
...
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