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
2aa32eff
Commit
2aa32eff
authored
Mar 04, 2019
by
Francesco Mani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
brute force multiple ssb detection works in pbchsim
parent
62e56f21
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
53 additions
and
33 deletions
+53
-33
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+3
-3
openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
+3
-1
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+17
-14
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
+16
-6
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+1
-0
openair1/PHY/defs_nr_UE.h
openair1/PHY/defs_nr_UE.h
+1
-2
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+8
-3
openair1/SIMULATION/NR_PHY/pbchsim.c
openair1/SIMULATION/NR_PHY/pbchsim.c
+4
-4
No files found.
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
View file @
2aa32eff
...
...
@@ -37,7 +37,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
uint8_t
eNB_offset
,
unsigned
char
Ns
,
unsigned
char
symbol
,
int
dmrss
)
int
dmrss
,
uint8_t
ssb_index
,
uint8_t
n_hf
)
{
int
pilot
[
200
]
__attribute__
((
aligned
(
16
)));
unsigned
char
aarx
;
...
...
@@ -49,8 +51,6 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
uint8_t
nushift
;
uint8_t
ssb_index
=
ue
->
i_ssb
;
uint8_t
n_hf
=
ue
->
n_hf
;
int
**
dl_ch_estimates
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
>>
1
]].
dl_ch_estimates
[
eNB_offset
];
int
**
rxdataF
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
>>
1
]].
rxdataF
;
...
...
openair1/PHY/NR_UE_ESTIMATION/nr_estimation.h
View file @
2aa32eff
...
...
@@ -54,7 +54,9 @@ int nr_pbch_channel_estimation(PHY_VARS_NR_UE *ue,
uint8_t
eNB_offset
,
unsigned
char
Ns
,
unsigned
char
symbol
,
int
dmrss
);
int
dmrss
,
uint8_t
ssb_index
,
uint8_t
n_hf
);
int
nr_pdsch_channel_estimation
(
PHY_VARS_NR_UE
*
ue
,
uint8_t
eNB_offset
,
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
View file @
2aa32eff
...
...
@@ -71,14 +71,12 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod
for
(
int
hf
=
0
;
hf
<
N_hf
;
hf
++
)
{
for
(
int
l
=
0
;
l
<
N_L
;
l
++
)
{
if
(
ret
!=
0
)
{
ue
->
i_ssb
=
l
;
ue
->
n_hf
=
hf
;
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
for
(
int
i
=
pbch_initial_symbol
;
i
<
pbch_initial_symbol
+
3
;
i
++
)
nr_pbch_channel_estimation
(
ue
,
0
,
0
,
i
,
i
-
pbch_initial_symbol
);
nr_pbch_channel_estimation
(
ue
,
0
,
0
,
i
,
i
-
pbch_initial_symbol
,
l
,
hf
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
...
...
@@ -88,6 +86,7 @@ int nr_pbch_detection(PHY_VARS_NR_UE *ue, int pbch_initial_symbol, runmode_t mod
ue
->
pbch_vars
[
0
],
frame_parms
,
0
,
l
,
SISO
,
ue
->
high_speed_flag
);
...
...
@@ -130,7 +129,7 @@ char prefix_string[2][9] = {"NORMAL","EXTENDED"};
int
nr_initial_sync
(
PHY_VARS_NR_UE
*
ue
,
runmode_t
mode
)
{
int32_t
sync_pos
,
sync_pos_
slot
;
// k_ssb, N_ssb_crb, sync_pos2,
int32_t
sync_pos
,
sync_pos_
frame
;
// k_ssb, N_ssb_crb, sync_pos2,
int32_t
metric_tdd_ncp
=
0
;
uint8_t
phase_tdd_ncp
;
double
im
,
re
;
...
...
@@ -173,20 +172,17 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
/* process pss search on received buffer */
sync_pos
=
pss_synchro_nr
(
ue
,
NO_RATE_CHANGE
);
sync_pos_slot
=
(
fp
->
samples_per_subframe
/
fp
->
slots_per_subframe
)
-
10
*
(
fp
->
ofdm_symbol_size
+
fp
->
nb_prefix_samples
);
if
(
sync_pos
>=
fp
->
nb_prefix_samples
)
ue
->
ssb_offset
=
sync_pos
-
fp
->
nb_prefix_samples
;
else
ue
->
ssb_offset
=
sync_pos
+
(
fp
->
samples_per_subframe
*
10
)
-
fp
->
nb_prefix_samples
;
if
(
sync_pos
>=
fp
->
nb_prefix_samples
){
ue
->
ssb_offset
=
sync_pos
-
fp
->
nb_prefix_samples
;}
else
{
ue
->
ssb_offset
=
sync_pos
+
(
fp
->
samples_per_subframe
*
10
)
-
fp
->
nb_prefix_samples
;}
ue
->
rx_offset
=
ue
->
ssb_offset
-
sync_pos_slot
;
//write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*fp->samples_per_subframe,1,1);
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"[UE%d] Initial sync : Estimated PSS position %d, Nid2 %d
\n
"
,
ue
->
Mod_id
,
sync_pos
,
ue
->
common_vars
.
eNb_id
);
LOG_I
(
PHY
,
"sync_pos %d ssb_offset %d
sync_pos_slot %d
\n
"
,
sync_pos
,
ue
->
ssb_offset
,
sync_pos_slo
t
);
LOG_I
(
PHY
,
"sync_pos %d ssb_offset %d
\n
"
,
sync_pos
,
ue
->
ssb_offse
t
);
#endif
// digital compensation of FFO for SSB symbols
...
...
@@ -239,7 +235,14 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
nr_gold_pbch
(
ue
);
ret
=
nr_pbch_detection
(
ue
,
1
,
mode
);
// start pbch detection at first symbol after pss
if
(
ret
==
0
)
{
// sync at symbol ue->symbol_offset
// computing the offset wrt the beginning of the frame
sync_pos_frame
=
(
fp
->
ofdm_symbol_size
+
fp
->
nb_prefix_samples0
)
+
((
ue
->
symbol_offset
)
-
1
)
*
(
fp
->
ofdm_symbol_size
+
fp
->
nb_prefix_samples
);
ue
->
rx_offset
=
ue
->
ssb_offset
-
sync_pos_frame
;
}
nr_gold_pdcch
(
ue
,
0
,
2
);
/*
int nb_prefix_samples0 = fp->nb_prefix_samples0;
...
...
@@ -263,7 +266,7 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
}
else
{
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"TDD Normal prefix: SSS error condition: sync_pos %d
, sync_pos_slot %d
\n
"
,
sync_pos
,
sync_pos_slot
);
LOG_I
(
PHY
,
"TDD Normal prefix: SSS error condition: sync_pos %d
\n
"
,
sync_pos
);
#endif
}
}
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_pbch.c
View file @
2aa32eff
...
...
@@ -414,6 +414,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
eNB_id
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
uint32_t
high_speed_flag
)
{
NR_UE_COMMON
*
nr_ue_common_vars
=
&
ue
->
common_vars
;
...
...
@@ -424,10 +425,9 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
//uint32_t pbch_a_prime;
int16_t
*
pbch_e_rx
;
uint8_t
*
decoded_output
=
nr_ue_pbch_vars
->
decoded_output
;
uint8_t
nushift
;
uint8_t
nushift
,
n_hf
,
ssb_index
;
uint16_t
M
;
uint8_t
Lmax
=
frame_parms
->
Lmax
;
uint8_t
ssb_index
=
ue
->
i_ssb
;
//uint16_t crc;
//unsigned short idx_demod =0;
uint32_t
decoderState
=
0
;
...
...
@@ -443,7 +443,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
int
symbol_offset
=
1
;
if
(
ue
->
is_synchronized
>
0
)
symbol_offset
=
2
;
symbol_offset
=
ue
->
symbol_offset
;
else
symbol_offset
=
0
;
...
...
@@ -527,7 +527,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
#endif
//un-scrambling
M
=
NR_POLAR_PBCH_E
;
nushift
=
(
Lmax
==
4
)
?
ssb_index
&
3
:
ssb_index
&
7
;
nushift
=
(
Lmax
==
4
)
?
i_ssb
&
3
:
i_ssb
&
7
;
uint32_t
unscrambling_mask
=
(
Lmax
==
64
)
?
0x100006D
:
0x1000041
;
nr_pbch_unscrambling
(
nr_ue_pbch_vars
,
frame_parms
->
Nid_cell
,
nushift
,
M
,
NR_POLAR_PBCH_E
,
0
,
0
);
//polar decoding de-rate matching
...
...
@@ -571,6 +571,16 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
for
(
int
i
=
0
;
i
<
3
;
i
++
)
decoded_output
[
i
]
=
(
uint8_t
)((
payload
>>
((
3
-
i
)
<<
3
))
&
0xff
);
n_hf
=
((
xtra_byte
>>
4
)
&
0x01
);
// computing the half frame index from the extra byte
ssb_index
=
i_ssb
;
// ssb index corresponds to i_ssb for Lmax = 4,8
if
(
Lmax
==
64
)
{
// for Lmax = 64 ssb index 4th,5th and 6th bits are in extra byte
for
(
int
i
=
0
;
i
<
3
;
i
++
)
ssb_index
+=
(((
xtra_byte
>>
(
7
-
i
))
&
0x01
)
<<
(
3
+
i
));
}
ue
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
,
ssb_index
,
n_hf
);
#ifdef DEBUG_PBCH
printf
(
"xtra_byte %x payload %x
\n
"
,
xtra_byte
,
payload
);
...
...
@@ -578,14 +588,14 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
// printf("unscrambling pbch_a[%d] = %x \n", i,pbch_a[i]);
printf
(
"[PBCH] decoder payload[%d] = %x
\n
"
,
i
,
decoded_output
[
i
]);
}
#endif
ue
->
dl_indication
.
rx_ind
=
&
ue
->
rx_ind
;
// hang on rx_ind instance
//ue->rx_ind.sfn_slot = 0; //should be set by higher-1-layer, i.e. clean_and_set_if_instance()
ue
->
rx_ind
.
rx_indication_body
[
0
].
pdu_type
=
FAPI_NR_RX_PDU_TYPE_MIB
;
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
pdu
=
&
decoded_output
[
0
];
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
additional_bits
=
xtra_byte
;
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
ssb_index
=
ssb_index
;
// confirm with TCL
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
ssb_index
=
i_ssb
;
// confirm with TCL
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
ssb_length
=
Lmax
;
// confirm with TCL
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
cell_id
=
frame_parms
->
Nid_cell
;
// confirm with TCL
ue
->
rx_ind
.
number_pdus
=
1
;
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
2aa32eff
...
...
@@ -1122,6 +1122,7 @@ int nr_rx_pbch( PHY_VARS_NR_UE *ue,
NR_UE_PBCH
*
nr_ue_pbch_vars
,
NR_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
eNB_id
,
uint8_t
i_ssb
,
MIMO_mode_t
mimo_mode
,
uint32_t
high_speed_flag
);
...
...
openair1/PHY/defs_nr_UE.h
View file @
2aa32eff
...
...
@@ -1143,8 +1143,7 @@ typedef struct {
uint8_t
decode_MIB
;
/// temporary offset during cell search prior to MIB decoding
int
ssb_offset
;
uint8_t
i_ssb
;
uint8_t
n_hf
;
uint16_t
symbol_offset
;
// offset in terms of symbols for detected ssb in sync
int
rx_offset
;
/// Timing offset
int
rx_offset_diff
;
/// Timing adjustment for ofdm symbol0 on HW USRP
int
time_sync_cell
;
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
2aa32eff
...
...
@@ -2973,6 +2973,7 @@ void nr_ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *
ue
->
pbch_vars
[
eNB_id
],
&
ue
->
frame_parms
,
eNB_id
,
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
ssb_index
,
SISO
,
ue
->
high_speed_flag
);
...
...
@@ -5098,9 +5099,13 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
if
(
(
nr_tti_rx
==
0
)
&&
(
ue
->
decode_MIB
==
1
))
{
LOG_D
(
PHY
,
" ------ PBCH ChannelComp/LLR: frame.slot %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_tti_rx
);
for
(
int
i
=
0
;
i
<
3
;
i
++
)
{
uint8_t
i_ssb
=
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
ssb_index
;
uint8_t
n_hf
=
(((
ue
->
rx_ind
.
rx_indication_body
[
0
].
mib_pdu
.
additional_bits
)
>>
4
)
&
0x01
);
for
(
int
i
=
1
;
i
<
4
;
i
++
)
{
nr_slot_fep
(
ue
,
(
5
+
i
),
//mu=1 case B
(
ue
->
symbol_offset
+
i
),
//mu=1 case B
nr_tti_rx
,
0
,
0
,
...
...
@@ -5109,7 +5114,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eN
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
nr_pbch_channel_estimation
(
ue
,
0
,
0
,
5
+
i
,
i
);
nr_pbch_channel_estimation
(
ue
,
0
,
0
,
ue
->
symbol_offset
+
i
,
i
-
1
,
i_ssb
,
n_hf
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
...
...
openair1/SIMULATION/NR_PHY/pbchsim.c
View file @
2aa32eff
...
...
@@ -129,7 +129,7 @@ int main(int argc, char **argv)
unsigned
char
frame_type
=
0
;
unsigned
char
pbch_phase
=
0
;
int
frame
=
0
,
subframe
=
0
;
int
frame
=
0
;
int
frame_length_complex_samples
;
int
frame_length_complex_samples_no_prefix
;
NR_DL_FRAME_PARMS
*
frame_parms
;
...
...
@@ -610,8 +610,8 @@ int main(int argc, char **argv)
uint8_t
ssb_index
=
0
;
while
(
!
((
SSB_positions
>>
ssb_index
)
&
0x01
))
ssb_index
++
;
// to select the first transmitted ssb
int
start_symbol
=
nr_get_ssb_start_symbol
(
frame_parms
,
ssb_index
,
n_hf
);
for
(
int
i
=
start_symbol
+
1
;
i
<
start_symbol
+
4
;
i
++
)
{
UE
->
symbol_offset
=
nr_get_ssb_start_symbol
(
frame_parms
,
ssb_index
,
n_hf
);
for
(
int
i
=
UE
->
symbol_offset
+
1
;
i
<
UE
->
symbol_offset
+
4
;
i
++
)
{
nr_slot_fep
(
UE
,
i
,
0
,
...
...
@@ -620,7 +620,7 @@ int main(int argc, char **argv)
NR_PBCH_EST
);
}
ret
=
nr_pbch_detection
(
UE
,
start_symbol
+
1
,
0
);
ret
=
nr_pbch_detection
(
UE
,
UE
->
symbol_offset
+
1
,
0
);
if
(
ret
==
0
)
{
//UE->rx_ind.rx_indication_body->mib_pdu.ssb_index; //not yet detected automatically
...
...
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