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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
OpenXG
OpenXG-RAN
Commits
5e9da7c5
Commit
5e9da7c5
authored
6 years ago
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
temporary commit
parent
785b4799
Changes
22
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
435 additions
and
325 deletions
+435
-325
openair1/PHY/INIT/nr_init.c
openair1/PHY/INIT/nr_init.c
+6
-6
openair1/PHY/INIT/nr_init_ue.c
openair1/PHY/INIT/nr_init_ue.c
+6
-22
openair1/PHY/INIT/nr_parms.c
openair1/PHY/INIT/nr_parms.c
+43
-148
openair1/PHY/INIT/phy_init.h
openair1/PHY/INIT/phy_init.h
+2
-1
openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
+1
-0
openair1/PHY/MODULATION/ofdm_mod.c
openair1/PHY/MODULATION/ofdm_mod.c
+3
-3
openair1/PHY/MODULATION/slot_fep_nr.c
openair1/PHY/MODULATION/slot_fep_nr.c
+9
-1
openair1/PHY/NR_REFSIG/pss_nr.h
openair1/PHY/NR_REFSIG/pss_nr.h
+7
-2
openair1/PHY/NR_TRANSPORT/nr_pss.c
openair1/PHY/NR_TRANSPORT/nr_pss.c
+7
-1
openair1/PHY/NR_TRANSPORT/nr_sss.c
openair1/PHY/NR_TRANSPORT/nr_sss.c
+1
-2
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
+23
-44
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+1
-0
openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
+93
-45
openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
+47
-28
openair1/PHY/TOOLS/cdot_prod.c
openair1/PHY/TOOLS/cdot_prod.c
+122
-0
openair1/PHY/TOOLS/dB_routines.c
openair1/PHY/TOOLS/dB_routines.c
+8
-0
openair1/PHY/TOOLS/lte_dfts.c
openair1/PHY/TOOLS/lte_dfts.c
+2
-2
openair1/PHY/TOOLS/tools_defs.h
openair1/PHY/TOOLS/tools_defs.h
+5
-0
openair1/PHY/defs_nr_UE.h
openair1/PHY/defs_nr_UE.h
+2
-0
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+2
-2
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+2
-1
openair1/SIMULATION/NR_PHY/pbchsim.c
openair1/SIMULATION/NR_PHY/pbchsim.c
+43
-17
No files found.
openair1/PHY/INIT/nr_init.c
View file @
5e9da7c5
...
...
@@ -365,7 +365,7 @@ void install_schedule_handlers(IF_Module_t *if_inst)
/// this function is a temporary addition for NR configuration
void
nr_phy_config_request_sim
(
PHY_VARS_gNB
*
gNB
)
void
nr_phy_config_request_sim
(
PHY_VARS_gNB
*
gNB
,
int
N_RB_DL
,
int
N_RB_UL
,
int
mu
)
{
NR_DL_FRAME_PARMS
*
fp
=
&
gNB
->
frame_parms
;
nfapi_nr_config_request_t
*
gNB_config
=
&
gNB
->
gNB_config
;
...
...
@@ -373,14 +373,14 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB)
//overwrite for new NR parameters
gNB_config
->
nfapi_config
.
rf_bands
.
rf_band
[
0
]
=
22
;
gNB_config
->
nfapi_config
.
earfcn
.
value
=
6600
;
gNB_config
->
subframe_config
.
numerology_index_mu
.
value
=
1
;
gNB_config
->
subframe_config
.
duplex_mode
.
value
=
F
DD
;
gNB_config
->
subframe_config
.
numerology_index_mu
.
value
=
mu
;
gNB_config
->
subframe_config
.
duplex_mode
.
value
=
T
DD
;
gNB_config
->
rf_config
.
tx_antenna_ports
.
value
=
1
;
gNB_config
->
rf_config
.
dl_carrier_bandwidth
.
value
=
106
;
gNB_config
->
rf_config
.
ul_carrier_bandwidth
.
value
=
106
;
gNB_config
->
rf_config
.
dl_carrier_bandwidth
.
value
=
N_RB_DL
;
gNB_config
->
rf_config
.
ul_carrier_bandwidth
.
value
=
N_RB_UL
;
gNB_config
->
sch_config
.
half_frame_index
.
value
=
0
;
gNB_config
->
sch_config
.
ssb_subcarrier_offset
.
value
=
0
;
gNB_config
->
sch_config
.
n_ssb_crb
.
value
=
86
;
gNB_config
->
sch_config
.
n_ssb_crb
.
value
=
N_RB_DL
-
20
;
gNB_config
->
sch_config
.
ssb_subcarrier_offset
.
value
=
0
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/INIT/nr_init_ue.c
View file @
5e9da7c5
...
...
@@ -660,12 +660,11 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue,
fp
->
nb_antennas_tx
=
1
;
fp
->
nb_antennas_rx
=
1
;
init_dfts
();
printf
(
"Initializing UE vars (abstraction %"
PRIu8
") for eNB TXant %"
PRIu8
", UE RXant %"
PRIu8
"
\n
"
,
abstraction_flag
,
fp
->
nb_antennas_tx
,
fp
->
nb_antennas_rx
);
//LOG_D(PHY,"[MSC_NEW][FRAME 00000][PHY_UE][MOD %02u][]\n", ue->Mod_id+NB_eNB_INST);
nr_init_frame_parms_ue
(
&
ue
->
frame_parms
);
nr_init_frame_parms_ue
(
&
ue
->
frame_parms
,
NR_MU_1
,
NORMAL
);
phy_init_nr_top
(
ue
);
// many memory allocation sizes are hard coded
...
...
@@ -943,28 +942,13 @@ void init_nr_ue_transport(PHY_VARS_NR_UE *ue,int abstraction_flag) {
void
phy_init_nr_top
(
PHY_VARS_NR_UE
*
ue
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
NR_UE_DLSCH_t
*
dlsch0
=
ue
->
dlsch
[
0
][
0
][
0
];
dlsch0
=
(
NR_UE_DLSCH_t
*
)
malloc16
(
sizeof
(
NR_UE_DLSCH_t
));
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
NR_UE_DLSCH_t
*
dlsch0
=
ue
->
dlsch
[
0
][
0
][
0
];
dlsch0
=
(
NR_UE_DLSCH_t
*
)
malloc16
(
sizeof
(
NR_UE_DLSCH_t
));
crcTableInit
();
ccodedot11_init
();
ccodedot11_init_inv
();
ccodelte_init
();
ccodelte_init_inv
();
//treillis_table_init();
phy_generate_viterbi_tables
();
phy_generate_viterbi_tables_lte
();
//init_td8();
//init_td16();
#ifdef __AVX2__
//init_td16avx2();
#endif
init_dfts
();
init_context_synchro_nr
(
frame_parms
);
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/INIT/nr_parms.c
View file @
5e9da7c5
...
...
@@ -26,18 +26,20 @@
uint32_t
nr_subcarrier_spacing
[
MAX_NUM_SUBCARRIER_SPACING
]
=
{
15e3
,
30e3
,
60e3
,
120e3
,
240e3
};
uint16_t
nr_slots_per_subframe
[
MAX_NUM_SUBCARRIER_SPACING
]
=
{
1
,
2
,
4
,
16
,
32
};
int
nr_init_frame_parms
(
nfapi_nr_config_request_t
*
config
,
NR_DL_FRAME_PARMS
*
frame_parms
)
int
nr_init_frame_parms0
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
mu
,
int
Ncp
)
{
int
N_RB
=
config
->
rf_config
.
dl_carrier_bandwidth
.
value
;
int
Ncp
=
config
->
subframe_config
.
dl_cyclic_prefix_type
.
value
;
int
mu
=
config
->
subframe_config
.
numerology_index_mu
.
value
;
#if DISABLE_LOG_X
printf
(
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
N_RB
,
Ncp
);
printf
(
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
frame_parms
->
N_RB_DL
,
Ncp
);
#else
LOG_I
(
PHY
,
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
N_RB
,
Ncp
);
LOG_I
(
PHY
,
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
frame_parms
->
N_RB_DL
,
Ncp
);
#endif
if
(
Ncp
==
NFAPI_CP_EXTENDED
)
...
...
@@ -54,7 +56,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_1
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_1
];
switch
(
N_RB
){
switch
(
frame_parms
->
N_RB_DL
){
case
11
:
case
24
:
case
38
:
...
...
@@ -88,18 +90,30 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
frame_parms
->
nb_prefix_samples0
=
264
;
frame_parms
->
nb_prefix_samples
=
216
;
}
else
{
frame_parms
->
ofdm_symbol_size
=
4096
;
frame_parms
->
first_carrier_offset
=
2794
;
//4096 - 1302
frame_parms
->
nb_prefix_samples0
=
352
;
frame_parms
->
nb_prefix_samples
=
288
;
}
else
{
frame_parms
->
ofdm_symbol_size
=
4096
;
frame_parms
->
first_carrier_offset
=
2794
;
//4096 - 1302
frame_parms
->
nb_prefix_samples0
=
352
;
frame_parms
->
nb_prefix_samples
=
288
;
}
break
;
case
245
:
AssertFatal
(
frame_parms
->
threequarter_fs
==
0
,
"3/4 sampling impossible for N_RB %d and MU %d
\n
"
,
frame_parms
->
N_RB_DL
,
mu
);
frame_parms
->
ofdm_symbol_size
=
4096
;
frame_parms
->
first_carrier_offset
=
2626
;
//4096 - 1478
frame_parms
->
nb_prefix_samples0
=
352
;
frame_parms
->
nb_prefix_samples
=
288
;
break
;
case
273
:
AssertFatal
(
frame_parms
->
threequarter_fs
==
0
,
"3/4 sampling impossible for N_RB %d and MU %d
\n
"
,
frame_parms
->
N_RB_DL
,
mu
);
frame_parms
->
ofdm_symbol_size
=
4096
;
frame_parms
->
first_carrier_offset
=
2458
;
//4096 - 1638
frame_parms
->
nb_prefix_samples0
=
352
;
frame_parms
->
nb_prefix_samples
=
288
;
break
;
default:
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
N_RB
,
mu
,
frame_parms
);
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
frame_parms
->
N_RB_DL
,
mu
,
frame_parms
);
}
break
;
...
...
@@ -107,7 +121,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_2
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_2
];
switch
(
N_RB
){
//FR1 bands only
switch
(
frame_parms
->
N_RB_DL
){
//FR1 bands only
case
11
:
case
18
:
case
38
:
...
...
@@ -121,7 +135,7 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
case
121
:
case
135
:
default:
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
N_RB
,
mu
,
frame_parms
);
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
frame_parms
->
N_RB_DL
,
mu
,
frame_parms
);
}
break
;
...
...
@@ -152,146 +166,27 @@ int nr_init_frame_parms(nfapi_nr_config_request_t* config,
frame_parms
->
initial_bwp_dl
.
bwp_id
=
0
;
frame_parms
->
initial_bwp_dl
.
scs
=
frame_parms
->
subcarrier_spacing
;
frame_parms
->
initial_bwp_dl
.
location
=
0
;
frame_parms
->
initial_bwp_dl
.
N_RB
=
N_RB
;
frame_parms
->
initial_bwp_dl
.
N_RB
=
frame_parms
->
N_RB_DL
;
frame_parms
->
initial_bwp_dl
.
cyclic_prefix
=
Ncp
;
frame_parms
->
initial_bwp_dl
.
ofdm_symbol_size
=
frame_parms
->
ofdm_symbol_size
;
return
0
;
}
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
frame_parms
)
{
int
N_RB
=
106
;
int
Ncp
=
0
;
int
mu
=
1
;
#if DISABLE_LOG_X
printf
(
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
N_RB
,
Ncp
);
#else
LOG_I
(
PHY
,
"Initializing frame parms for mu %d, N_RB %d, Ncp %d
\n
"
,
mu
,
N_RB
,
Ncp
);
#endif
if
(
Ncp
==
EXTENDED
)
AssertFatal
(
mu
==
NR_MU_2
,
"Invalid cyclic prefix %d for numerology index %d
\n
"
,
Ncp
,
mu
);
switch
(
mu
)
{
case
NR_MU_0
:
//15kHz scs
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_0
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_0
];
break
;
case
NR_MU_1
:
//30kHz scs
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_1
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_1
];
switch
(
N_RB
){
case
11
:
case
24
:
case
38
:
case
78
:
case
51
:
case
65
:
case
106
:
//40 MHz
if
(
frame_parms
->
threequarter_fs
)
{
frame_parms
->
ofdm_symbol_size
=
1536
;
frame_parms
->
first_carrier_offset
=
900
;
//1536 - 636
frame_parms
->
nb_prefix_samples0
=
132
;
frame_parms
->
nb_prefix_samples
=
108
;
}
else
{
frame_parms
->
ofdm_symbol_size
=
2048
;
frame_parms
->
first_carrier_offset
=
1412
;
//2048 - 636
frame_parms
->
nb_prefix_samples0
=
176
;
frame_parms
->
nb_prefix_samples
=
144
;
}
break
;
case
133
:
case
162
:
case
189
:
case
217
:
//80 MHz
if
(
frame_parms
->
threequarter_fs
)
{
frame_parms
->
ofdm_symbol_size
=
3072
;
frame_parms
->
first_carrier_offset
=
1770
;
//3072 - 1302
frame_parms
->
nb_prefix_samples0
=
264
;
frame_parms
->
nb_prefix_samples
=
216
;
}
else
{
frame_parms
->
ofdm_symbol_size
=
4096
;
frame_parms
->
first_carrier_offset
=
2794
;
//4096 - 1302
frame_parms
->
nb_prefix_samples0
=
352
;
frame_parms
->
nb_prefix_samples
=
288
;
}
break
;
case
245
:
case
273
:
default:
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
N_RB
,
mu
,
frame_parms
);
}
break
;
case
NR_MU_2
:
//60kHz scs
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_2
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_2
];
switch
(
N_RB
){
//FR1 bands only
case
11
:
case
18
:
case
38
:
case
24
:
case
31
:
case
51
:
case
65
:
case
79
:
case
93
:
case
107
:
case
121
:
case
135
:
default:
AssertFatal
(
1
==
0
,
"Number of resource blocks %d undefined for mu %d, frame parms = %p
\n
"
,
N_RB
,
mu
,
frame_parms
);
}
break
;
case
NR_MU_3
:
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_3
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_3
];
break
;
case
NR_MU_4
:
frame_parms
->
subcarrier_spacing
=
nr_subcarrier_spacing
[
NR_MU_4
];
frame_parms
->
slots_per_subframe
=
nr_slots_per_subframe
[
NR_MU_4
];
break
;
default:
AssertFatal
(
1
==
0
,
"Invalid numerology index %d"
,
mu
);
}
int
nr_init_frame_parms
(
nfapi_nr_config_request_t
*
config
,
NR_DL_FRAME_PARMS
*
frame_parms
)
{
frame_parms
->
nb_prefix_samples0
=
160
;
frame_parms
->
nb_prefix_samples
=
144
;
frame_parms
->
symbols_per_tti
=
14
;
frame_parms
->
numerology_index
=
0
;
frame_parms
->
ttis_per_subframe
=
1
;
frame_parms
->
slots_per_tti
=
2
;
//only slot config 1 is supported
nr_init_frame_parms0
(
frame_parms
,
config
->
subframe_config
.
numerology_index_mu
.
value
,
config
->
subframe_config
.
dl_cyclic_prefix_type
.
value
);
}
frame_parms
->
ofdm_symbol_size
=
2048
;
frame_parms
->
samples_per_tti
=
30720
;
frame_parms
->
samples_per_subframe
=
30720
*
frame_parms
->
ttis_per_subframe
;
//frame_parms->first_carrier_offset = 2048-600;
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
mu
,
int
Ncp
)
{
frame_parms
->
slots_per_frame
=
10
*
frame_parms
->
slots_per_subframe
;
frame_parms
->
symbols_per_slot
=
((
Ncp
==
NORMAL
)
?
14
:
12
);
// to redefine for different slot formats
frame_parms
->
samples_per_subframe_wCP
=
frame_parms
->
ofdm_symbol_size
*
frame_parms
->
symbols_per_slot
*
frame_parms
->
slots_per_subframe
;
frame_parms
->
samples_per_frame_wCP
=
10
*
frame_parms
->
samples_per_subframe_wCP
;
//frame_parms->samples_per_subframe = (frame_parms->samples_per_subframe_wCP + (frame_parms->nb_prefix_samples0 * frame_parms->slots_per_subframe) +
// (frame_parms->nb_prefix_samples * frame_parms->slots_per_subframe * (frame_parms->symbols_per_slot - 1)));
frame_parms
->
samples_per_frame
=
10
*
frame_parms
->
samples_per_subframe
;
frame_parms
->
freq_range
=
(
frame_parms
->
dl_CarrierFreq
<
6e9
)
?
nr_FR1
:
nr_FR2
;
nr_init_frame_parms0
(
frame_parms
,
mu
,
Ncp
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/INIT/phy_init.h
View file @
5e9da7c5
...
...
@@ -377,11 +377,12 @@ void phy_config_request(PHY_Config_t *phy_config);
int
init_frame_parms
(
LTE_DL_FRAME_PARMS
*
frame_parms
,
uint8_t
osf
);
void
dump_frame_parms
(
LTE_DL_FRAME_PARMS
*
frame_parms
);
int
nr_init_frame_parms
(
nfapi_nr_config_request_t
*
config
,
NR_DL_FRAME_PARMS
*
frame_parms
);
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
frame_parms
);
int
nr_init_frame_parms_ue
(
NR_DL_FRAME_PARMS
*
frame_parms
,
int
mu
,
int
Ncp
);
int
init_nr_ue_signal
(
PHY_VARS_NR_UE
*
ue
,
int
nb_connected_eNB
,
uint8_t
abstraction_flag
);
void
nr_dump_frame_parms
(
NR_DL_FRAME_PARMS
*
frame_parms
);
int
phy_init_nr_gNB
(
PHY_VARS_gNB
*
gNB
,
unsigned
char
is_secondary_gNB
,
unsigned
char
abstraction_flag
);
void
nr_phy_config_request
(
NR_PHY_Config_t
*
gNB
);
void
nr_phy_config_request_sim
(
PHY_VARS_gNB
*
gNB
,
int
N_RB_DL
,
int
N_RB_UL
,
int
mu
);
void
phy_free_nr_gNB
(
PHY_VARS_gNB
*
gNB
);
int
l1_north_init_gNB
(
void
);
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/LTE_UE_TRANSPORT/initial_sync.c
View file @
5e9da7c5
...
...
@@ -285,6 +285,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
init_frame_parms
(
frame_parms
,
1
);
/*
LOG_M("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
exit(-1);
*/
sync_pos
=
lte_sync_time
(
ue
->
common_vars
.
rxdata
,
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/MODULATION/ofdm_mod.c
View file @
5e9da7c5
...
...
@@ -36,7 +36,7 @@ This section deals with basic functions for OFDM Modulation.
#include "common/utils/LOG/vcd_signal_dumper.h"
#include "modulation_common.h"
#include "PHY/LTE_TRANSPORT/transport_common_proto.h"
//
#define DEBUG_OFDM_MOD
#define DEBUG_OFDM_MOD
void
normal_prefix_mod
(
int32_t
*
txdataF
,
int32_t
*
txdata
,
uint8_t
nsymb
,
LTE_DL_FRAME_PARMS
*
frame_parms
)
...
...
@@ -122,10 +122,10 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
case
3072
:
idft
=
idft3072
;
break
;
case
4096
:
idft
=
idft4096
;
break
;
default:
idft
=
idft512
;
break
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/MODULATION/slot_fep_nr.c
View file @
5e9da7c5
...
...
@@ -61,7 +61,7 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
int uespec_pilot[9][1200];*/
void
(
*
dft
)(
int16_t
*
,
int16_t
*
,
int
);
int
tmp_dft_in
[
2048
]
__attribute__
((
aligned
(
32
)));
// This is for misalignment issues for 6 and 15 PRBs
int
tmp_dft_in
[
8192
]
__attribute__
((
aligned
(
32
)));
// This is for misalignment issues for 6 and 15 PRBs
switch
(
frame_parms
->
ofdm_symbol_size
)
{
case
128
:
...
...
@@ -88,6 +88,14 @@ int nr_slot_fep(PHY_VARS_NR_UE *ue,
dft
=
dft2048
;
break
;
case
4096
:
dft
=
dft4096
;
break
;
case
8192
:
dft
=
dft8192
;
break
;
default:
dft
=
dft512
;
break
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_REFSIG/pss_nr.h
View file @
5e9da7c5
...
...
@@ -63,7 +63,7 @@
/* PSS configuration */
#define SYNCHRO_FFT_SIZE_MAX (
2048
)
/* maximum size of fft for synchronisation */
#define SYNCHRO_FFT_SIZE_MAX (
8192
)
/* maximum size of fft for synchronisation */
#define NO_RATE_CHANGE (1)
...
...
@@ -102,13 +102,18 @@ EXTERN int16_t *primary_synchro_nr[NUMBER_PSS_SEQUENCE]
=
{
NULL
,
NULL
,
NULL
}
#endif
;
EXTERN
int16_t
*
primary_synchro_nr2
[
NUMBER_PSS_SEQUENCE
]
#ifdef INIT_VARIABLES_PSS_NR_H
=
{
NULL
,
NULL
,
NULL
}
#endif
;
EXTERN
int16_t
*
primary_synchro_time_nr
[
NUMBER_PSS_SEQUENCE
]
#ifdef INIT_VARIABLES_PSS_NR_H
=
{
NULL
,
NULL
,
NULL
}
#endif
;
EXTERN
int
*
pss_corr_ue
[
NUMBER_PSS_SEQUENCE
]
EXTERN
int
64_t
*
pss_corr_ue
[
NUMBER_PSS_SEQUENCE
]
#ifdef INIT_VARIABLES_PSS_NR_H
=
{
NULL
,
NULL
,
NULL
}
#endif
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_TRANSPORT/nr_pss.c
View file @
5e9da7c5
...
...
@@ -53,6 +53,7 @@ int nr_generate_pss( int16_t *d_pss,
#ifdef NR_PSS_DEBUG
write_output
(
"d_pss.m"
,
"d_pss"
,
(
void
*
)
d_pss
,
NR_PSS_LENGTH
,
1
,
0
);
printf
(
"PSS: ofdm_symbol_size %d, first_carrier_offset %d
\n
"
,
frame_parms
->
ofdm_symbol_size
,
frame_parms
->
first_carrier_offset
);
#endif
/// Resource mapping
...
...
@@ -63,9 +64,12 @@ int nr_generate_pss( int16_t *d_pss,
// PSS occupies a predefined position (subcarriers 56-182, symbol 0) within the SSB block starting from
k
=
frame_parms
->
first_carrier_offset
+
frame_parms
->
ssb_start_subcarrier
+
56
;
//and
if
(
k
>=
frame_parms
->
ofdm_symbol_size
)
k
-=
frame_parms
->
ofdm_symbol_size
;
l
=
ssb_start_symbol
;
for
(
m
=
0
;
m
<
NR_PSS_LENGTH
;
m
++
)
{
printf
(
"pss: writing position k %d / %d
\n
"
,
k
,
frame_parms
->
ofdm_symbol_size
);
((
int16_t
*
)
txdataF
[
aa
])[
2
*
(
l
*
frame_parms
->
ofdm_symbol_size
+
k
)]
=
(
a
*
d_pss
[
m
])
>>
15
;
k
++
;
...
...
@@ -75,7 +79,9 @@ int nr_generate_pss( int16_t *d_pss,
}
#ifdef NR_PSS_DEBUG
write_output
(
"pss_0.m"
,
"pss_0"
,
(
void
*
)
&
txdataF
[
0
][
2
*
l
*
frame_parms
->
ofdm_symbol_size
],
frame_parms
->
ofdm_symbol_size
,
1
,
1
);
LOG_M
(
"pss_0.m"
,
"pss_0"
,
(
void
*
)
&
txdataF
[
0
][
ssb_start_symbol
*
frame_parms
->
ofdm_symbol_size
],
frame_parms
->
ofdm_symbol_size
,
1
,
1
);
#endif
return
0
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_TRANSPORT/nr_sss.c
View file @
5e9da7c5
...
...
@@ -21,7 +21,7 @@
#include "PHY/NR_TRANSPORT/nr_transport.h"
#define NR_SSS_DEBUG
//
#define NR_SSS_DEBUG
int
nr_generate_sss
(
int16_t
*
d_sss
,
int32_t
**
txdataF
,
...
...
@@ -76,7 +76,6 @@ int nr_generate_sss( int16_t *d_sss,
for
(
int
m
=
0
;
m
<
NR_SSS_LENGTH
;
m
++
)
{
((
int16_t
*
)
txdataF
[
aa
])[
2
*
(
l
*
frame_parms
->
ofdm_symbol_size
+
k
)]
=
(
a
*
d_sss
[
m
])
>>
15
;
printf
(
"sss %d: %d
\n
"
,
m
,((
int16_t
*
)
txdataF
[
aa
])[
2
*
(
l
*
frame_parms
->
ofdm_symbol_size
+
k
)]);
k
++
;
if
(
k
>=
frame_parms
->
ofdm_symbol_size
)
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/nr_initial_sync.c
View file @
5e9da7c5
...
...
@@ -145,26 +145,19 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
{
int32_t
sync_pos
,
sync_pos2
,
sync_pos_slot
;
// k_ssb, N_ssb_crb,
int32_t
metric_
f
dd_ncp
=
0
;
uint8_t
phase_
f
dd_ncp
;
int32_t
metric_
t
dd_ncp
=
0
;
uint8_t
phase_
t
dd_ncp
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
int
ret
=-
1
;
int
rx_power
=
0
;
//aarx,
//nfapi_nr_config_request_t* config;
/*offset parameters to be updated from higher layer */
//k_ssb =0;
//N_ssb_crb = 0;
/*#ifdef OAI_USRP
__m128i *rxdata128;
#endif*/
// LOG_I(PHY,"**************************************************************\n");
// First try FDD normal prefix
// First try TDD normal prefix, mu 1
frame_parms
->
Ncp
=
NORMAL
;
frame_parms
->
frame_type
=
TDD
;
nr_init_frame_parms_ue
(
frame_parms
);
nr_init_frame_parms_ue
(
frame_parms
,
NR_MU_1
,
NORMAL
);
LOG_D
(
PHY
,
"nr_initial sync ue RB_DL %d
\n
"
,
ue
->
frame_parms
.
N_RB_DL
);
/*
write_output("rxdata0.m","rxd0",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
...
...
@@ -183,6 +176,8 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
* --------------------------
* sync_pos SS/PBCH block
*/
cnt
++
;
if
(
1
){
// (cnt>100)
cnt
=
0
;
...
...
@@ -190,22 +185,13 @@ 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
=
(
frame_parms
->
samples_per_tti
>>
1
)
-
3
*
(
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples
);
sync_pos
=
sync_pos_slot
+
frame_parms
->
nb_prefix_samples
;
if
(
sync_pos
>=
frame_parms
->
nb_prefix_samples
)
sync_pos2
=
sync_pos
-
frame_parms
->
nb_prefix_samples
;
else
sync_pos2
=
sync_pos
+
FRAME_LENGTH_COMPLEX_SAMPLES
-
frame_parms
->
nb_prefix_samples
;
/* offset is used by sss serach as it is returned from pss search */
if
(
sync_pos2
>=
sync_pos_slot
)
ue
->
rx_offset
=
sync_pos2
-
sync_pos_slot
;
else
ue
->
rx_offset
=
FRAME_LENGTH_COMPLEX_SAMPLES
+
sync_pos2
-
sync_pos_slot
;
LOG_D
(
PHY
,
"sync_pos %d sync_pos_slot %d rx_offset %d
\n
"
,
sync_pos
,
sync_pos_slot
,
ue
->
rx_offset
);
ue
->
ssb_offset
=
sync_pos
-
frame_parms
->
nb_prefix_samples
;
else
ue
->
ssb_offset
=
sync_pos
+
FRAME_LENGTH_COMPLEX_SAMPLES
-
frame_parms
->
nb_prefix_samples
;
LOG_D
(
PHY
,
"sync_pos %d ssb_offset %d
\n
"
,
sync_pos
,
ue
->
ssb_offset
);
// write_output("rxdata1.m","rxd1",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
...
...
@@ -221,19 +207,20 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
LOG_I
(
PHY
,
"Calling sss detection (normal CP)
\n
"
);
#endif
rx_sss_nr
(
ue
,
&
metric_
fdd_ncp
,
&
phase_f
dd_ncp
);
rx_sss_nr
(
ue
,
&
metric_
tdd_ncp
,
&
phase_t
dd_ncp
);
nr_init_frame_parms_ue
(
&
ue
->
frame_parms
);
nr_init_frame_parms_ue
(
&
ue
->
frame_parms
,
NR_MU_1
,
NORMAL
);
nr_gold_pbch
(
ue
);
ret
=
nr_pbch_detection
(
ue
,
mode
);
nr_gold_pdcch
(
ue
,
0
,
2
);
/*
int nb_prefix_samples0 = frame_parms->nb_prefix_samples0;
frame_parms
->
nb_prefix_samples0
=
0
;
nr_slot_fep
(
ue
,
0
,
0
,
ue
->
rx
_offset
,
0
,
1
,
NR_PDCCH_EST
);
nr_slot_fep
(
ue
,
1
,
0
,
ue
->
rx
_offset
,
0
,
1
,
NR_PDCCH_EST
);
frame_parms->nb_prefix_samples0 = frame_parms->nb_prefix_samples.
nr_slot_fep(ue,0, 0, ue->
ssb
_offset, 0, 1, NR_PDCCH_EST);
nr_slot_fep(ue,1, 0, ue->
ssb
_offset, 0, 1, NR_PDCCH_EST);
frame_parms->nb_prefix_samples0 = nb_prefix_samples0;
LOG_I(PHY,"[UE %d] AUTOTEST Cell Sync : frame = %d, rx_offset %d, freq_offset %d \n",
...
...
@@ -241,18 +228,16 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
ue->proc.proc_rxtx[0].frame_rx,
ue->rx_offset,
ue->common_vars.freq_offset );
//ret = -1; //to be deleted
// write_output("rxdata2.m","rxd2",ue->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
*/
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"
F
DD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d
\n
"
,
frame_parms
->
Nid_cell
,
metric_
fdd_ncp
,
phase_fdd_ncp
,
flip_f
dd_ncp
,
ret
);
LOG_I
(
PHY
,
"
T
DD Normal prefix: CellId %d metric %d, phase %d, flip %d, pbch %d
\n
"
,
frame_parms
->
Nid_cell
,
metric_
tdd_ncp
,
phase_tdd_ncp
,
flip_t
dd_ncp
,
ret
);
#endif
}
else
{
#ifdef DEBUG_INITIAL_SYNCH
LOG_I
(
PHY
,
"
F
DD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d
\n
"
,
sync_pos
,
sync_pos_slot
);
LOG_I
(
PHY
,
"
T
DD Normal prefix: SSS error condition: sync_pos %d, sync_pos_slot %d
\n
"
,
sync_pos
,
sync_pos_slot
);
#endif
}
}
...
...
@@ -370,12 +355,6 @@ int nr_initial_sync(PHY_VARS_NR_UE *ue, runmode_t mode)
#ifdef DEBUG_INITIAL_SYNC
LOG_I
(
PHY
,
"[UE%d] Initial sync : PBCH not ok
\n
"
,
ue
->
Mod_id
);
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,"[UE%d] Initial sync: (metric fdd_ncp %d (%d), metric fdd_ecp %d (%d), metric_tdd_ncp %d (%d), metric_tdd_ecp %d (%d))\n",
ue->Mod_id,
metric_fdd_ncp,Nid_cell_fdd_ncp,
metric_fdd_ecp,Nid_cell_fdd_ecp,
metric_tdd_ncp,Nid_cell_tdd_ncp,
metric_tdd_ecp,Nid_cell_tdd_ecp);*/
LOG_I
(
PHY
,
"[UE%d] Initial sync : Estimated Nid_cell %d, Frame_type %d
\n
"
,
ue
->
Mod_id
,
frame_parms
->
Nid_cell
,
frame_parms
->
frame_type
);
#endif
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
5e9da7c5
...
...
@@ -1362,6 +1362,7 @@ void generate_RIV_tables(void);
N_RB_DL, PHICH_CONFIG and Nid_cell) and the UE can begin decoding PDCCH and DLSCH SI to retrieve the rest. Once these
parameters are know, the routine calls some basic initialization routines (cell-specific reference signals, etc.)
@param phy_vars_ue Pointer to UE variables
@param mode current running mode
*/
int
nr_initial_sync
(
PHY_VARS_NR_UE
*
phy_vars_ue
,
runmode_t
mode
);
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/pss_nr.c
View file @
5e9da7c5
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/sss_nr.c
View file @
5e9da7c5
...
...
@@ -213,10 +213,14 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
uint8_t
aarx
,
i
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
pss
=
primary_synchro_nr
[
ue
->
common_vars
.
eNb_id
];
pss
=
primary_synchro_nr
2
[
ue
->
common_vars
.
eNb_id
];
sss_ext3
=
(
int16_t
*
)
&
sss_ext
[
0
][
0
];
#if 0
int16_t chest[2*LENGTH_PSS_NR];
#endif
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
sss_ext2
=
(
int16_t
*
)
&
sss_ext
[
aarx
][
0
];
...
...
@@ -243,18 +247,28 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
#endif
int32_t
amp
;
int
shift
;
for
(
i
=
0
;
i
<
LENGTH_PSS_NR
;
i
++
)
{
// This is H*(PSS) = R* \cdot PSS
tmp_re
=
(
int16_t
)(((
pss_ext2
[
i
*
2
]
*
(
int32_t
)
pss
[
i
*
2
])
>>
SCALING_CE_PSS_NR
)
+
((
pss_ext2
[
i
*
2
+
1
]
*
(
int32_t
)
pss
[
i
*
2
+
1
])
>>
SCALING_CE_PSS_NR
));
tmp_im
=
(
int16_t
)(((
pss_ext2
[
i
*
2
]
*
(
int32_t
)
pss
[
i
*
2
+
1
])
>>
SCALING_CE_PSS_NR
)
-
((
pss_ext2
[
i
*
2
+
1
]
*
(
int32_t
)
pss
[
i
*
2
])
>>
SCALING_CE_PSS_NR
));
//printf("H*(%d,%d) : (%d,%d)\n",aarx,i,tmp_re,tmp_im);
//printf("pss(%d,%d) : (%d,%d)\n",aarx,i,pss[2*i],pss[2*i+1]);
//printf("pss_ext(%d,%d) : (%d,%d)\n",aarx,i,pss_ext2[2*i],pss_ext2[2*i+1]);
tmp_re
=
pss_ext2
[
i
*
2
]
*
pss
[
i
];
tmp_im
=
-
pss_ext2
[
i
*
2
+
1
]
*
pss
[
i
];
amp
=
(((
int32_t
)
tmp_re
)
*
tmp_re
)
+
((
int32_t
)
tmp_im
)
*
tmp_im
;
shift
=
log2_approx
(
amp
)
/
2
;
#if 0
printf("H*(%d,%d) : (%d,%d)\n",aarx,i,tmp_re,tmp_im);
printf("pss(%d,%d) : (%d,%d)\n",aarx,i,pss[2*i],pss[2*i+1]);
printf("pss_ext(%d,%d) : (%d,%d)\n",aarx,i,pss_ext2[2*i],pss_ext2[2*i+1]);
if (aarx==0) {
chest[i<<1]=tmp_re;
chest[1+(i<<1)]=tmp_im;
}
#endif
// This is R(SSS) \cdot H*(PSS)
tmp_re2
=
(
int16_t
)(((
tmp_re
*
(
int32_t
)
sss_ext2
[
i
*
2
])
>>
SCALING_CE_PSS_NR
)
-
((
tmp_im
*
(
int32_t
)
sss_ext2
[
i
*
2
+
1
]
>>
SCALING_CE_PSS_NR
)));
tmp_im2
=
(
int16_t
)(((
tmp_re
*
(
int32_t
)
sss_ext2
[
i
*
2
+
1
])
>>
SCALING_CE_PSS_NR
)
+
((
tmp_im
*
(
int32_t
)
sss_ext2
[
i
*
2
]
>>
SCALING_CE_PSS_NR
)));
tmp_re2
=
(
int16_t
)(((
tmp_re
*
(
int32_t
)
sss_ext2
[
i
*
2
])
>>
shift
)
-
((
tmp_im
*
(
int32_t
)
sss_ext2
[
i
*
2
+
1
]
>>
shift
)));
tmp_im2
=
(
int16_t
)(((
tmp_re
*
(
int32_t
)
sss_ext2
[
i
*
2
+
1
])
>>
shift
)
+
((
tmp_im
*
(
int32_t
)
sss_ext2
[
i
*
2
]
>>
shift
)));
// printf("SSSi(%d,%d) : (%d,%d)\n",aarx,i,sss_ext2[i<<1],sss_ext2[1+(i<<1)]);
// printf("SSSo(%d,%d) : (%d,%d)\n",aarx,i,tmp_re2,tmp_im2);
...
...
@@ -268,7 +282,11 @@ int pss_ch_est_nr(PHY_VARS_NR_UE *ue,
}
}
}
#if 0
LOG_M("pssrx.m","pssrx",pss,LENGTH_PSS_NR,1,1);
LOG_M("pss_ext.m","pssext",pss_ext2,LENGTH_PSS_NR,1,1);
LOG_M("psschest.m","pssch",chest,LENGTH_PSS_NR,1,1);
#endif
#if 0
for (int i = 0; i < LENGTH_PSS_NR; i++) {
...
...
@@ -336,10 +354,8 @@ int do_pss_sss_extract_nr(PHY_VARS_NR_UE *ue,
k
++
;
if
(
k
>=
ofdm_symbol_size
)
{
k
++
;
k
-=
ofdm_symbol_size
;
}
if
(
k
==
ofdm_symbol_size
)
k
=
0
;
}
}
...
...
@@ -423,23 +439,24 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
/* rxdataF stores SS/PBCH from beginning of buffers in the same symbol order as in time domain */
int
nb_prefix_samples0
=
frame_parms
->
nb_prefix_samples0
;
frame_parms
->
nb_prefix_samples0
=
0
;
// For now, symbol 0 = PSS/PBCH and it is never in symbol 0 or 7*2^mu (i.e. always shorter prefix)
frame_parms
->
nb_prefix_samples0
=
frame_parms
->
nb_prefix_samples
;
// Do FFTs for SSS/PSS
// SSS
nr_slot_fep
(
ue
,
SSS_SYMBOL_NB
,
// symbol number
SSS_SYMBOL_NB
-
PSS_SYMBOL_NB
,
// symbol number w.r.t. PSS
0
,
// Ns slot number
ue
->
rx
_offset
,
// sample_offset of int16_t
ue
->
ssb
_offset
,
// sample_offset of int16_t
0
,
// no_prefix
1
,
// reset frequency estimation
NR_SSS_EST
);
// PSS
nr_slot_fep
(
ue
,
PSS_SYMBOL_NB
,
0
,
ue
->
rx_offset
,
0
,
ue
->
ssb_offset
,
0
,
1
,
NR_SSS_EST
);
...
...
@@ -455,7 +472,7 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
#ifdef DEBUG_PLOT_SSS
write_output
(
"rxsig0.m"
,
"rxs0"
,
&
ue
->
common_vars
.
rxdata
[
0
][
0
],
ue
->
frame_parms
.
samples_per_tti
,
1
,
1
);
write_output
(
"rxdataF0.m"
,
"rxF0"
,
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
0
]].
rxdataF
[
0
][
frame_parms
->
ofdm_symbol_size
*
S
SS_SYMBOL_NB
],
frame_parms
->
ofdm_symbol_size
,
2
,
1
);
write_output
(
"rxdataF0.m"
,
"rxF0"
,
&
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
0
]].
rxdataF
[
0
][
frame_parms
->
ofdm_symbol_size
*
P
SS_SYMBOL_NB
],
frame_parms
->
ofdm_symbol_size
,
2
,
1
);
write_output
(
"pss_ext.m"
,
"pss_ext"
,
pss_ext
,
LENGTH_PSS_NR
,
1
,
1
);
#endif
...
...
@@ -469,7 +486,7 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
printf("sss ref [%i] : %d %d \n", i, d_sss[0][0][i], d_sss[0][0][i]);
printf("sss ext [%i] : %d %d \n", i, p[2*i], p[2*i+1]);
printf("pss ref [%i] : %d %d \n", i, primary_synchro_nr
[0][2*i], primary_synchro_nr
[0][2*i+1]);
printf("pss ref [%i] : %d %d \n", i, primary_synchro_nr
2[0][2*i], primary_synchro_nr2
[0][2*i+1]);
printf("pss ext [%i] : %d %d \n", i, p2[2*i], p2[2*i+1]);
}
#endif
...
...
@@ -504,14 +521,14 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
#endif
#if
1
#if
0
int16_t *ps = (int16_t *)pss_ext;
for (int i = 0; i < LENGTH_SSS_NR; i++) {
printf("sss ref [%i] : %d \n", i, d_sss[0][0][i]);
printf("sss ext [%i] : %d %d \n", i, sss[2*i], sss[2*i+1]);
printf
(
"pss ref [%i] : %d %d
\n
"
,
i
,
primary_synchro_nr
[
0
][
2
*
i
],
primary_synchro_nr
[
0
][
2
*
i
+
1
]);
printf("pss ref [%i] : %d %d \n", i, primary_synchro_nr
2[0][2*i], primary_synchro_nr2
[0][2*i+1]);
printf("pss ext [%i] : %d %d \n", i, ps[2*i], ps[2*i+1]);
}
#endif
...
...
@@ -522,8 +539,9 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
/* cosinus cos(x + y) = cos(x)cos(y) - sin(x)sin(y) */
/* sinus sin(x + y) = sin(x)cos(y) + cos(x)sin(y) */
for
(
phase
=
0
;
phase
<
PHASE_HYPOTHESIS_NUMBER
;
phase
++
)
{
// phase offset between PSS and SSS
for
(
Nid1
=
0
;
Nid1
<
N_ID_1_NUMBER
;
Nid1
++
)
{
// all possible Nid1 values
for
(
Nid1
=
0
;
Nid1
<
N_ID_1_NUMBER
;
Nid1
++
)
{
// all possible Nid1 values
for
(
phase
=
0
;
phase
<
PHASE_HYPOTHESIS_NUMBER
;
phase
++
)
{
// phase offset between PSS and SSS
metric
=
0
;
metric_re
=
0
;
...
...
@@ -534,10 +552,11 @@ int rx_sss_nr(PHY_VARS_NR_UE *ue, int32_t *tot_metric,uint8_t *phase_max)
for
(
i
=
0
;
i
<
LENGTH_SSS_NR
;
i
++
)
{
metric_re
+=
d
[
i
]
*
(((
phase_re_nr
[
phase
]
*
sss
[
2
*
i
])
>>
SCALING_METRIC_SSS_NR
)
-
((
phase_im_nr
[
phase
]
*
sss
[
2
*
i
+
1
])
>>
SCALING_METRIC_SSS_NR
))
+
d
[
i
]
*
(((
phase_im_nr
[
phase
]
*
sss
[
2
*
i
])
>>
SCALING_METRIC_SSS_NR
)
+
((
phase_re_nr
[
phase
]
*
sss
[
2
*
i
+
1
])
>>
SCALING_METRIC_SSS_NR
));
if
(
Nid1
==
0
&&
phase
==
3
)
metric_re
+=
d
[
i
]
*
(((
phase_re_nr
[
phase
]
*
sss
[
2
*
i
])
>>
SCALING_METRIC_SSS_NR
)
-
((
phase_im_nr
[
phase
]
*
sss
[
2
*
i
+
1
])
>>
SCALING_METRIC_SSS_NR
))
;
#if 0
printf("i %d, phase %d/%d: metric %d, phase (%d,%d) sss (%d,%d) d %d\n",i,phase,PHASE_HYPOTHESIS_NUMBER,metric_re,phase_re_nr[phase],phase_im_nr[phase],sss[2*i],sss[1+(2*i)],d[i]);
#endif
}
metric
=
metric_re
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/cdot_prod.c
View file @
5e9da7c5
...
...
@@ -158,6 +158,128 @@ int32_t dot_product(int16_t *x,
#endif
}
int64_t
dot_product64
(
int16_t
*
x
,
int16_t
*
y
,
uint32_t
N
,
//must be a multiple of 8
uint8_t
output_shift
)
{
uint32_t
n
;
#if defined(__x86_64__) || defined(__i386__)
__m128i
*
x128
,
*
y128
,
mmtmp1
,
mmtmp2
,
mmtmp3
,
mmcumul
,
mmcumul_re
,
mmcumul_im
;
__m128i
minus_i
=
_mm_set_epi16
(
-
1
,
1
,
-
1
,
1
,
-
1
,
1
,
-
1
,
1
);
int32_t
result
;
x128
=
(
__m128i
*
)
x
;
y128
=
(
__m128i
*
)
y
;
mmcumul_re
=
_mm_setzero_si128
();
mmcumul_im
=
_mm_setzero_si128
();
for
(
n
=
0
;
n
<
(
N
>>
2
);
n
++
)
{
// printf("n=%d, x128=%p, y128=%p\n",n,x128,y128);
// print_shorts("x",&x128[0]);
// print_shorts("y",&y128[0]);
// this computes Re(z) = Re(x)*Re(y) + Im(x)*Im(y)
mmtmp1
=
_mm_madd_epi16
(
x128
[
0
],
y128
[
0
]);
// print_ints("retmp",&mmtmp1);
// mmtmp1 contains real part of 4 consecutive outputs (32-bit)
// shift and accumulate results
mmtmp1
=
_mm_srai_epi32
(
mmtmp1
,
output_shift
);
mmcumul_re
=
_mm_add_epi32
(
mmcumul_re
,
mmtmp1
);
//print_ints("re",&mmcumul_re);
// this computes Im(z) = Re(x)*Im(y) - Re(y)*Im(x)
mmtmp2
=
_mm_shufflelo_epi16
(
y128
[
0
],
_MM_SHUFFLE
(
2
,
3
,
0
,
1
));
//print_shorts("y",&mmtmp2);
mmtmp2
=
_mm_shufflehi_epi16
(
mmtmp2
,
_MM_SHUFFLE
(
2
,
3
,
0
,
1
));
//print_shorts("y",&mmtmp2);
mmtmp2
=
_mm_sign_epi16
(
mmtmp2
,
minus_i
);
// print_shorts("y",&mmtmp2);
mmtmp3
=
_mm_madd_epi16
(
x128
[
0
],
mmtmp2
);
//print_ints("imtmp",&mmtmp3);
// mmtmp3 contains imag part of 4 consecutive outputs (32-bit)
// shift and accumulate results
mmtmp3
=
_mm_srai_epi32
(
mmtmp3
,
output_shift
);
mmcumul_im
=
_mm_add_epi32
(
mmcumul_im
,
mmtmp3
);
//print_ints("im",&mmcumul_im);
x128
++
;
y128
++
;
}
// this gives Re Re Im Im
mmcumul
=
_mm_hadd_epi32
(
mmcumul_re
,
mmcumul_im
);
//print_ints("cumul1",&mmcumul);
// this gives Re Im Re Im
mmcumul
=
_mm_hadd_epi32
(
mmcumul
,
mmcumul
);
//print_ints("cumul2",&mmcumul);
//mmcumul = _mm_srai_epi32(mmcumul,output_shift);
// extract the lower half
result
=
_mm_extract_epi64
(
mmcumul
,
0
);
//printf("result: (%d,%d)\n",((int32_t*)&result)[0],((int32_t*)&result)[1]);
_mm_empty
();
_m_empty
();
return
(
result
);
#elif defined(__arm__)
int16x4_t
*
x_128
=
(
int16x4_t
*
)
x
;
int16x4_t
*
y_128
=
(
int16x4_t
*
)
y
;
int32x4_t
tmp_re
,
tmp_im
;
int32x4_t
tmp_re1
,
tmp_im1
;
int32x4_t
re_cumul
,
im_cumul
;
int32x2_t
re_cumul2
,
im_cumul2
;
int32x4_t
shift
=
vdupq_n_s32
(
-
output_shift
);
int32x2x2_t
result2
;
int16_t
conjug
[
4
]
__attribute__
((
aligned
(
16
)))
=
{
-
1
,
1
,
-
1
,
1
}
;
re_cumul
=
vdupq_n_s32
(
0
);
im_cumul
=
vdupq_n_s32
(
0
);
for
(
n
=
0
;
n
<
(
N
>>
2
);
n
++
)
{
tmp_re
=
vmull_s16
(
*
x_128
++
,
*
y_128
++
);
//tmp_re = [Re(x[0])Re(y[0]) Im(x[0])Im(y[0]) Re(x[1])Re(y[1]) Im(x[1])Im(y[1])]
tmp_re1
=
vmull_s16
(
*
x_128
++
,
*
y_128
++
);
//tmp_re1 = [Re(x1[1])Re(x2[1]) Im(x1[1])Im(x2[1]) Re(x1[1])Re(x2[2]) Im(x1[1])Im(x2[2])]
tmp_re
=
vcombine_s32
(
vpadd_s32
(
vget_low_s32
(
tmp_re
),
vget_high_s32
(
tmp_re
)),
vpadd_s32
(
vget_low_s32
(
tmp_re1
),
vget_high_s32
(
tmp_re1
)));
//tmp_re = [Re(ch[0])Re(rx[0])+Im(ch[0])Im(ch[0]) Re(ch[1])Re(rx[1])+Im(ch[1])Im(ch[1]) Re(ch[2])Re(rx[2])+Im(ch[2]) Im(ch[2]) Re(ch[3])Re(rx[3])+Im(ch[3])Im(ch[3])]
tmp_im
=
vmull_s16
(
vrev32_s16
(
vmul_s16
(
*
x_128
++
,
*
(
int16x4_t
*
)
conjug
)),
*
y_128
++
);
//tmp_im = [-Im(ch[0])Re(rx[0]) Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1]) Re(ch[1])Im(rx[1])]
tmp_im1
=
vmull_s16
(
vrev32_s16
(
vmul_s16
(
*
x_128
++
,
*
(
int16x4_t
*
)
conjug
)),
*
y_128
++
);
//tmp_im1 = [-Im(ch[2])Re(rx[2]) Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3]) Re(ch[3])Im(rx[3])]
tmp_im
=
vcombine_s32
(
vpadd_s32
(
vget_low_s32
(
tmp_im
),
vget_high_s32
(
tmp_im
)),
vpadd_s32
(
vget_low_s32
(
tmp_im1
),
vget_high_s32
(
tmp_im1
)));
//tmp_im = [-Im(ch[0])Re(rx[0])+Re(ch[0])Im(rx[0]) -Im(ch[1])Re(rx[1])+Re(ch[1])Im(rx[1]) -Im(ch[2])Re(rx[2])+Re(ch[2])Im(rx[2]) -Im(ch[3])Re(rx[3])+Re(ch[3])Im(rx[3])]
re_cumul
=
vqaddq_s32
(
re_cumul
,
vqshlq_s32
(
tmp_re
,
shift
));
im_cumul
=
vqaddq_s32
(
im_cumul
,
vqshlq_s32
(
tmp_im
,
shift
));
}
re_cumul2
=
vpadd_s32
(
vget_low_s32
(
re_cumul
),
vget_high_s32
(
re_cumul
));
im_cumul2
=
vpadd_s32
(
vget_low_s32
(
im_cumul
),
vget_high_s32
(
im_cumul
));
re_cumul2
=
vpadd_s32
(
re_cumul2
,
re_cumul2
);
im_cumul2
=
vpadd_s32
(
im_cumul2
,
im_cumul2
);
result2
=
vzip_s32
(
re_cumul2
,
im_cumul2
);
return
(
vget_lane_s32
(
result2
.
val
[
0
],
0
));
#endif
}
#ifdef MAIN
void
print_bytes
(
char
*
s
,
__m128i
*
x
)
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/dB_routines.c
View file @
5e9da7c5
...
...
@@ -624,6 +624,14 @@ int8_t dB_fixed(uint32_t x)
return
dB_power
;
}
uint8_t
dB_fixed64
(
uint64_t
x
)
{
if
(
x
<
(((
uint64_t
)
1
)
<<
32
))
return
(
dB_fixed
((
uint32_t
)
x
));
else
return
(
4
*
dB_table
[
255
]
+
dB_fixed
(
x
>>
32
));
}
int8_t
dB_fixed2
(
uint32_t
x
,
uint32_t
y
)
{
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/lte_dfts.c
View file @
5e9da7c5
...
...
@@ -4803,7 +4803,7 @@ void dft4096(int16_t *x,int16_t *y,int scale)
}
void
idft4096
(
int16_t
*
x
,
int16_t
*
y
,
int
scale
)
{
...
...
@@ -4853,7 +4853,7 @@ void idft4096(int16_t *x,int16_t *y,int scale)
y128
+=
16
;
}
}
_mm_empty
();
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/TOOLS/tools_defs.h
View file @
5e9da7c5
...
...
@@ -350,6 +350,11 @@ int32_t dot_product(int16_t *x,
uint32_t
N
,
//must be a multiple of 8
uint8_t
output_shift
);
int64_t
dot_product64
(
int16_t
*
x
,
int16_t
*
y
,
uint32_t
N
,
//must be a multiple of 8
uint8_t
output_shift
);
void
dft12
(
int16_t
*
x
,
int16_t
*
y
);
void
dft24
(
int16_t
*
x
,
int16_t
*
y
,
uint8_t
scale_flag
);
void
dft36
(
int16_t
*
x
,
int16_t
*
y
,
uint8_t
scale_flag
);
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/defs_nr_UE.h
View file @
5e9da7c5
...
...
@@ -1129,6 +1129,8 @@ typedef struct {
// uint8_t prach_timer;
uint8_t
decode_SIB
;
uint8_t
decode_MIB
;
/// temporary offset during cell search prior to MIB decoding
int
ssb_offset
;
int
rx_offset
;
/// Timing offset
int
rx_offset_diff
;
/// Timing adjustment for ofdm symbol0 on HW USRP
int
time_sync_cell
;
...
...
This diff is collapsed.
Click to expand it.
openair1/PHY/defs_nr_common.h
View file @
5e9da7c5
...
...
@@ -138,9 +138,9 @@ typedef struct NR_DL_FRAME_PARMS {
/// frequency range
nr_frequency_range_e
freq_range
;
/// Number of resource blocks (RB) in DL
uint8_
t
N_RB_DL
;
in
t
N_RB_DL
;
/// Number of resource blocks (RB) in UL
uint8_
t
N_RB_UL
;
in
t
N_RB_UL
;
/// total Number of Resource Block Groups: this is ceil(N_PRB/P)
uint8_t
N_RBG
;
/// Total Number of Resource Block Groups SubSets: this is P
...
...
This diff is collapsed.
Click to expand it.
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
5e9da7c5
...
...
@@ -113,7 +113,7 @@ void nr_set_ssb_first_subcarrier(nfapi_nr_config_request_t *cfg, NR_DL_FRAME_PAR
{
int
start_rb
=
cfg
->
sch_config
.
n_ssb_crb
.
value
/
pow
(
2
,
cfg
->
subframe_config
.
numerology_index_mu
.
value
);
fp
->
ssb_start_subcarrier
=
12
*
start_rb
+
cfg
->
sch_config
.
ssb_subcarrier_offset
.
value
;
LOG_
D
(
PHY
,
"SSB first subcarrier %d
\n
"
,
fp
->
ssb_start_subcarrier
);
LOG_
I
(
PHY
,
"SSB first subcarrier %d (%d,%d)
\n
"
,
fp
->
ssb_start_subcarrier
,
start_rb
,
cfg
->
sch_config
.
ssb_subcarrier_offset
.
value
);
}
void
nr_common_signal_procedures
(
PHY_VARS_gNB
*
gNB
,
int
frame
,
int
subframe
)
{
...
...
@@ -141,6 +141,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) {
nr_generate_sss
(
gNB
->
d_sss
,
txdataF
,
AMP_OVER_2
,
ssb_start_symbol
,
cfg
,
fp
);
if
(
!
(
frame
&
7
)){
LOG_I
(
PHY
,
"%d.%d : pbch_configured %d
\n
"
,
frame
,
subframe
,
gNB
->
pbch_configured
);
if
(
gNB
->
pbch_configured
!=
1
)
return
;
gNB
->
pbch_configured
=
0
;
}
...
...
This diff is collapsed.
Click to expand it.
openair1/SIMULATION/NR_PHY/pbchsim.c
View file @
5e9da7c5
...
...
@@ -101,13 +101,12 @@ int main(int argc, char **argv)
char
input_val_str
[
50
],
input_val_str2
[
50
];
uint8_t
frame_mod4
,
num_pdcch_symbols
=
0
;
uint16_t
NB_RB
=
25
;
SCM_t
channel_model
=
AWGN
;
//Rayleigh1_anticorr;
double
pbch_sinr
;
int
pbch_tx_ant
;
uint8_t
N_RB_DL
=
106
,
mu
=
1
;
int
N_RB_DL
=
273
,
mu
=
1
;
unsigned
char
frame_type
=
0
;
unsigned
char
pbch_phase
=
0
;
...
...
@@ -314,19 +313,8 @@ int main(int argc, char **argv)
if
(
snr1set
==
0
)
snr1
=
snr0
+
10
;
gNB2UE
=
new_channel_desc_scm
(
n_tx
,
n_rx
,
channel_model
,
61.44e6
,
//N_RB2sampling_rate(N_RB_DL),
40e6
,
//N_RB2channel_bandwidth(N_RB_DL),
0
,
0
,
0
);
if
(
gNB2UE
==
NULL
)
{
msg
(
"Problem generating channel model. Exiting.
\n
"
);
exit
(
-
1
);
}
printf
(
"Initializing gNodeB for mu %d, N_RB_DL %d
\n
"
,
mu
,
N_RB_DL
);
RC
.
gNB
=
(
PHY_VARS_gNB
***
)
malloc
(
sizeof
(
PHY_VARS_gNB
**
));
RC
.
gNB
[
0
]
=
(
PHY_VARS_gNB
**
)
malloc
(
sizeof
(
PHY_VARS_gNB
*
));
...
...
@@ -337,10 +325,45 @@ int main(int argc, char **argv)
frame_parms
->
nb_antennas_tx
=
n_tx
;
frame_parms
->
nb_antennas_rx
=
n_rx
;
frame_parms
->
N_RB_DL
=
N_RB_DL
;
frame_parms
->
N_RB_UL
=
N_RB_DL
;
nr_phy_config_request_sim
(
gNB
);
nr_phy_config_request_sim
(
gNB
,
N_RB_DL
,
N_RB_DL
,
mu
);
phy_init_nr_gNB
(
gNB
,
0
,
0
);
double
fs
,
bw
;
if
(
mu
==
1
&&
N_RB_DL
==
217
)
{
fs
=
122.88e6
;
bw
=
80e6
;
}
else
if
(
mu
==
1
&&
N_RB_DL
==
245
)
{
fs
=
122.88e6
;
bw
=
90e6
;
}
else
if
(
mu
==
1
&&
N_RB_DL
==
273
)
{
fs
=
122.88e6
;
bw
=
100e6
;
}
else
if
(
mu
==
1
&&
N_RB_DL
==
106
)
{
fs
=
61.44e6
;
bw
=
40e6
;
}
else
AssertFatal
(
1
==
0
,
"Unsupported numerology for mu %d, N_RB %d
\n
"
,
mu
,
N_RB_DL
);
gNB2UE
=
new_channel_desc_scm
(
n_tx
,
n_rx
,
channel_model
,
fs
,
bw
,
0
,
0
,
0
);
if
(
gNB2UE
==
NULL
)
{
msg
(
"Problem generating channel model. Exiting.
\n
"
);
exit
(
-
1
);
}
frame_length_complex_samples
=
frame_parms
->
samples_per_subframe
;
frame_length_complex_samples_no_prefix
=
frame_parms
->
samples_per_subframe_wCP
;
...
...
@@ -362,6 +385,7 @@ int main(int argc, char **argv)
r_im
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_im
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
printf
(
"Allocating %d samples for txdata
\n
"
,
frame_length_complex_samples
);
txdata
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
int
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
int
));
...
...
@@ -375,7 +399,7 @@ int main(int argc, char **argv)
//configure UE
UE
=
malloc
(
sizeof
(
PHY_VARS_NR_UE
));
memcpy
(
&
UE
->
frame_parms
,
frame_parms
,
sizeof
(
NR_DL_FRAME_PARMS
));
phy_init_nr_top
(
frame_parms
);
phy_init_nr_top
(
UE
);
if
(
init_nr_ue_signal
(
UE
,
1
,
0
)
!=
0
)
{
printf
(
"Error at UE NR initialisation
\n
"
);
...
...
@@ -385,9 +409,11 @@ int main(int argc, char **argv)
// generate signal
if
(
input_fd
==
NULL
)
{
gNB
->
pbch_configured
=
1
;
nr_common_signal_procedures
(
gNB
,
frame
,
subframe
);
}
LOG_M
(
"txsigF0.m"
,
"txsF0"
,
gNB
->
common_vars
.
txdataF
[
0
],
frame_length_complex_samples_no_prefix
,
1
,
1
);
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"txsigF1.m"
,
"txsF1"
,
gNB
->
common_vars
.
txdataF
[
1
],
frame_length_complex_samples_no_prefix
,
1
,
1
);
...
...
@@ -418,8 +444,8 @@ int main(int argc, char **argv)
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antennas_tx
;
aa
++
)
{
r_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)]);
r_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)
+
1
]);
}
}
}
for
(
SNR
=
snr0
;
SNR
<
snr1
;
SNR
+=
.
2
)
{
...
...
This diff is collapsed.
Click to expand it.
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