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
wangjie
OpenXG-RAN
Commits
e72d0483
Commit
e72d0483
authored
Dec 07, 2020
by
Khodr Saaifan
Committed by
Thomas Schlichter
Feb 01, 2021
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add PDSCH precoder functions, fix pusch_rx for 2 rx antennas, fix nr_dlsim for 2x1 MIMO simulation
parent
3b2d5037
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
287 additions
and
77 deletions
+287
-77
executables/nr-gnb.c
executables/nr-gnb.c
+8
-7
openair1/PHY/INIT/nr_parms.c
openair1/PHY/INIT/nr_parms.c
+2
-2
openair1/PHY/MODULATION/nr_modulation.c
openair1/PHY/MODULATION/nr_modulation.c
+137
-0
openair1/PHY/MODULATION/nr_modulation.h
openair1/PHY/MODULATION/nr_modulation.h
+17
-1
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+2
-1
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+48
-23
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+1
-0
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+1
-1
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
+12
-8
openair1/PHY/defs_gNB.h
openair1/PHY/defs_gNB.h
+3
-1
openair1/SCHED_NR/nr_ru_procedures.c
openair1/SCHED_NR/nr_ru_procedures.c
+1
-1
openair1/SCHED_NR/phy_procedures_nr_gNB.c
openair1/SCHED_NR/phy_procedures_nr_gNB.c
+3
-1
openair1/SIMULATION/NR_PHY/dlsim.c
openair1/SIMULATION/NR_PHY/dlsim.c
+48
-27
targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
.../GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+4
-4
No files found.
executables/nr-gnb.c
View file @
e72d0483
...
...
@@ -261,13 +261,14 @@ static inline int rxtx(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int frame_t
L1_nr_prach_procedures
(
gNB
,
frame_rx
,
slot_rx
);
//apply the rx signal rotation here
for
(
int
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
apply_nr_rotation_ul
(
&
gNB
->
frame_parms
,
gNB
->
common_vars
.
rxdataF
[
0
],
gNB
->
common_vars
.
rxdataF
[
aa
],
slot_rx
,
0
,
gNB
->
frame_parms
.
Ncp
==
EXTENDED
?
12
:
14
,
gNB
->
frame_parms
.
ofdm_symbol_size
);
}
phy_procedures_gNB_uespec_RX
(
gNB
,
frame_rx
,
slot_rx
);
}
...
...
openair1/PHY/INIT/nr_parms.c
View file @
e72d0483
...
...
@@ -284,9 +284,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp
->
slots_per_frame
=
10
*
fp
->
slots_per_subframe
;
fp
->
nb_antenna_ports_gNB
=
cfg
->
carrier_config
.
num_tx_ant
.
value
;
// It corresponds to pdsch_AntennaP
orts
fp
->
nb_antenna_ports_gNB
=
1
;
// It corresponds to the number of common antenna p
orts
fp
->
nb_antennas_rx
=
cfg
->
carrier_config
.
num_rx_ant
.
value
;
// It denotes the number of rx antennas at gNB
fp
->
nb_antennas_tx
=
1
;
// It corresponds to the number of UE Tx antenna
s
fp
->
nb_antennas_tx
=
cfg
->
carrier_config
.
num_tx_ant
.
value
;
// It corresponds to pdsch_AntennaPort
s
fp
->
symbols_per_slot
=
((
Ncp
==
NORMAL
)
?
14
:
12
);
// to redefine for different slot formats
fp
->
samples_per_subframe_wCP
=
fp
->
ofdm_symbol_size
*
fp
->
symbols_per_slot
*
fp
->
slots_per_subframe
;
...
...
openair1/PHY/MODULATION/nr_modulation.c
View file @
e72d0483
...
...
@@ -22,6 +22,102 @@
#include "nr_modulation.h"
#include "PHY/NR_REFSIG/nr_mod_table.h"
//Table 6.3.1.5-1 Precoding Matrix W 1 layer 2 antenna ports 'n' = -1 and 'o' = -j
char
nr_W_1l_2p
[
6
][
2
][
1
]
=
{
{{
'1'
},
{
'0'
}},
//pmi 0
{{
'0'
},
{
'1'
}},
{{
'1'
},
{
'1'
}},
{{
'1'
},
{
'n'
}},
{{
'1'
},
{
'j'
}},
{{
'1'
},
{
'o'
}}
//pmi 5
};
//Table 6.3.1.5-3 Precoding Matrix W 1 layer 4 antenna ports 'n' = -1 and 'o' = -j
char
nr_W_1l_4p
[
28
][
4
][
1
]
=
{
{{
'1'
},
{
'0'
},
{
'0'
},
{
'0'
}},
//pmi 0
{{
'0'
},
{
'1'
},
{
'0'
},
{
'0'
}},
{{
'0'
},
{
'0'
},
{
'1'
},
{
'0'
}},
{{
'0'
},
{
'0'
},
{
'0'
},
{
'1'
}},
{{
'1'
},
{
'0'
},
{
'1'
},
{
'0'
}},
{{
'1'
},
{
'0'
},
{
'n'
},
{
'0'
}},
{{
'1'
},
{
'0'
},
{
'j'
},
{
'0'
}},
{{
'1'
},
{
'0'
},
{
'o'
},
{
'0'
}},
//pmi 7
{{
'0'
},
{
'1'
},
{
'0'
},
{
'1'
}},
//pmi 8
{{
'0'
},
{
'1'
},
{
'0'
},
{
'n'
}},
{{
'0'
},
{
'1'
},
{
'0'
},
{
'j'
}},
{{
'0'
},
{
'1'
},
{
'0'
},
{
'o'
}},
{{
'1'
},
{
'1'
},
{
'1'
},
{
'1'
}},
{{
'1'
},
{
'1'
},
{
'j'
},
{
'j'
}},
{{
'1'
},
{
'1'
},
{
'n'
},
{
'n'
}},
{{
'1'
},
{
'1'
},
{
'o'
},
{
'o'
}},
{{
'1'
},
{
'j'
},
{
'1'
},
{
'j'
}},
//pmi 16
{{
'1'
},
{
'j'
},
{
'j'
},
{
'n'
}},
{{
'1'
},
{
'j'
},
{
'n'
},
{
'o'
}},
{{
'1'
},
{
'j'
},
{
'o'
},
{
'1'
}},
{{
'1'
},
{
'n'
},
{
'1'
},
{
'n'
}},
{{
'1'
},
{
'n'
},
{
'j'
},
{
'o'
}},
{{
'1'
},
{
'n'
},
{
'n'
},
{
'1'
}},
{{
'1'
},
{
'n'
},
{
'o'
},
{
'j'
}},
//pmi 23
{{
'1'
},
{
'o'
},
{
'1'
},
{
'o'
}},
//pmi 24
{{
'1'
},
{
'o'
},
{
'j'
},
{
'1'
}},
{{
'1'
},
{
'o'
},
{
'n'
},
{
'j'
}},
{{
'1'
},
{
'o'
},
{
'o'
},
{
'n'
}}
//pmi 27
};
//Table 6.3.1.5-4 Precoding Matrix W 2 antenna ports layers 2 'n' = -1 and 'o' = -j
char
nr_W_2l_2p
[
3
][
2
][
2
]
=
{
{{
'1'
,
'0'
},
{
'0'
,
'1'
}},
//pmi 0
{{
'1'
,
'1'
},
{
'1'
,
'n'
}},
{{
'1'
,
'1'
},
{
'j'
,
'o'
}}
//pmi 2
};
//Table 6.3.1.5-5 Precoding Matrix W 2 layers 4 antenna ports 'n' = -1 and 'o' = -j
char
nr_W_2l_4p
[
22
][
4
][
2
]
=
{
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'0'
,
'0'
},
{
'0'
,
'0'
}},
//pmi 0
{{
'1'
,
'0'
},
{
'0'
,
'0'
},
{
'0'
,
'1'
},
{
'0'
,
'0'
}},
{{
'1'
,
'0'
},
{
'0'
,
'0'
},
{
'0'
,
'0'
},
{
'0'
,
'1'
}},
{{
'0'
,
'0'
},
{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'0'
,
'0'
}},
//pmi 3
{{
'0'
,
'0'
},
{
'1'
,
'0'
},
{
'0'
,
'0'
},
{
'0'
,
'1'
}},
//pmi 4
{{
'0'
,
'0'
},
{
'0'
,
'0'
},
{
'1'
,
'0'
},
{
'0'
,
'1'
}},
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'1'
,
'0'
},
{
'0'
,
'o'
}},
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'1'
,
'0'
},
{
'0'
,
'j'
}},
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'o'
,
'0'
},
{
'0'
,
'1'
}},
//pmi 8
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'o'
,
'0'
},
{
'0'
,
'n'
}},
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'n'
,
'0'
},
{
'0'
,
'o'
}},
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'n'
,
'0'
},
{
'0'
,
'j'
}},
//pmi 11
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'j'
,
'0'
},
{
'0'
,
'1'
}},
//pmi 12
{{
'1'
,
'0'
},
{
'0'
,
'1'
},
{
'j'
,
'0'
},
{
'0'
,
'n'
}},
{{
'1'
,
'1'
},
{
'1'
,
'1'
},
{
'1'
,
'n'
},
{
'1'
,
'n'
}},
{{
'1'
,
'1'
},
{
'1'
,
'1'
},
{
'j'
,
'o'
},
{
'j'
,
'o'
}},
//pmi 15
{{
'1'
,
'1'
},
{
'j'
,
'j'
},
{
'1'
,
'n'
},
{
'j'
,
'o'
}},
//pmi 16
{{
'1'
,
'1'
},
{
'j'
,
'j'
},
{
'j'
,
'o'
},
{
'n'
,
'1'
}},
{{
'1'
,
'1'
},
{
'n'
,
'n'
},
{
'1'
,
'n'
},
{
'n'
,
'1'
}},
{{
'1'
,
'1'
},
{
'n'
,
'n'
},
{
'j'
,
'o'
},
{
'o'
,
'j'
}},
//pmi 19
{{
'1'
,
'1'
},
{
'o'
,
'o'
},
{
'1'
,
'n'
},
{
'o'
,
'j'
}},
{{
'1'
,
'1'
},
{
'o'
,
'o'
},
{
'j'
,
'o'
},
{
'1'
,
'n'
}}
//pmi 21
};
//Table 6.3.1.5-6 Precoding Matrix W 3 layers 4 antenna ports 'n' = -1 and 'o' = -j
char
nr_W_3l_4p
[
7
][
4
][
3
]
=
{
{{
'1'
,
'0'
,
'0'
},
{
'0'
,
'1'
,
'0'
},
{
'0'
,
'0'
,
'1'
},{
'0'
,
'0'
,
'0'
}},
//pmi 0
{{
'1'
,
'0'
,
'0'
},
{
'0'
,
'1'
,
'0'
},
{
'1'
,
'0'
,
'0'
},{
'0'
,
'0'
,
'1'
}},
{{
'1'
,
'0'
,
'0'
},
{
'0'
,
'1'
,
'0'
},
{
'n'
,
'0'
,
'0'
},{
'0'
,
'0'
,
'1'
}},
{{
'1'
,
'1'
,
'1'
},
{
'1'
,
'n'
,
'1'
},
{
'1'
,
'1'
,
'n'
},{
'1'
,
'n'
,
'n'
}},
//pmi 3
{{
'1'
,
'1'
,
'1'
},
{
'1'
,
'n'
,
'1'
},
{
'j'
,
'j'
,
'o'
},{
'j'
,
'o'
,
'o'
}},
//pmi 4
{{
'1'
,
'1'
,
'1'
},
{
'n'
,
'1'
,
'n'
},
{
'1'
,
'1'
,
'n'
},{
'n'
,
'1'
,
'1'
}},
{{
'1'
,
'1'
,
'1'
},
{
'n'
,
'1'
,
'n'
},
{
'j'
,
'j'
,
'o'
},{
'o'
,
'j'
,
'j'
}}
};
//Table 6.3.1.5-7 Precoding Matrix W 4 layers 4 antenna ports 'n' = -1 and 'o' = -j
char
nr_W_4l_4p
[
5
][
4
][
4
]
=
{
{{
'1'
,
'0'
,
'0'
,
'0'
},
{
'0'
,
'1'
,
'0'
,
'0'
},
{
'0'
,
'0'
,
'1'
,
'0'
},
{
'0'
,
'0'
,
'0'
,
'1'
}},
//pmi 0
{{
'1'
,
'1'
,
'0'
,
'0'
},
{
'0'
,
'0'
,
'1'
,
'1'
},
{
'1'
,
'n'
,
'0'
,
'0'
},
{
'0'
,
'0'
,
'1'
,
'n'
}},
{{
'1'
,
'1'
,
'0'
,
'0'
},
{
'0'
,
'0'
,
'1'
,
'1'
},
{
'j'
,
'o'
,
'0'
,
'0'
},
{
'0'
,
'0'
,
'j'
,
'o'
}},
{{
'1'
,
'1'
,
'1'
,
'1'
},
{
'1'
,
'n'
,
'1'
,
'n'
},
{
'1'
,
'1'
,
'n'
,
'n'
},
{
'1'
,
'n'
,
'n'
,
'1'
}},
//pmi 3
{{
'1'
,
'1'
,
'1'
,
'1'
},
{
'1'
,
'n'
,
'1'
,
'n'
},
{
'j'
,
'j'
,
'o'
,
'o'
},
{
'j'
,
'o'
,
'o'
,
'j'
}}
//pmi 4
};
void
nr_modulation
(
uint32_t
*
in
,
uint32_t
length
,
uint16_t
mod_order
,
...
...
@@ -534,3 +630,44 @@ void init_symbol_rotation(NR_DL_FRAME_PARMS *fp,uint64_t CarrierFreq) {
Ncpm1
=
Ncp
;
}
}
int
nr_layer_precoder
(
int16_t
**
datatx_F_precoding
,
char
*
prec_matrix
,
uint8_t
n_layers
,
int32_t
re_offset
)
{
int32_t
precodatatx_F
=
0
;
for
(
int
al
=
0
;
al
<
n_layers
;
al
++
){
int16_t
antenna_re
=
datatx_F_precoding
[
al
][
re_offset
<<
1
];
int16_t
antenna_im
=
datatx_F_precoding
[
al
][(
re_offset
<<
1
)
+
1
];
switch
(
prec_matrix
[
al
])
{
case
'0'
:
//multiply by zero
break
;
case
'1'
:
//multiply by 1
((
int16_t
*
)
&
precodatatx_F
)[
0
]
+=
antenna_re
;
((
int16_t
*
)
&
precodatatx_F
)[
1
]
+=
antenna_im
;
break
;
case
'n'
:
// multiply by -1
((
int16_t
*
)
&
precodatatx_F
)[
0
]
-=
antenna_re
;
((
int16_t
*
)
&
precodatatx_F
)[
1
]
-=
antenna_im
;
break
;
case
'j'
:
//
((
int16_t
*
)
&
precodatatx_F
)[
0
]
-=
antenna_im
;
((
int16_t
*
)
&
precodatatx_F
)[
1
]
+=
antenna_re
;
break
;
case
'o'
:
// -j
((
int16_t
*
)
&
precodatatx_F
)[
0
]
+=
antenna_im
;
((
int16_t
*
)
&
precodatatx_F
)[
1
]
-=
antenna_re
;
break
;
}
}
return
precodatatx_F
;
// normalize
/* ((int16_t *)precodatatx_F)[0] = (int16_t)((((int16_t *)precodatatx_F)[0]*ONE_OVER_SQRT2_Q15)>>15);
((int16_t *)precodatatx_F)[1] = (int16_t)((((int16_t *)precodatatx_F)[1]*ONE_OVER_SQRT2_Q15)>>15);*/
}
openair1/PHY/MODULATION/nr_modulation.h
View file @
e72d0483
...
...
@@ -28,7 +28,13 @@
#include "PHY/NR_UE_TRANSPORT/nr_transport_ue.h"
#define DMRS_MOD_ORDER 2
/*Precoding matices: W[pmi][antenna_port][layer]*/
extern
char
nr_W_1l_2p
[
6
][
2
][
1
];
extern
char
nr_W_2l_2p
[
3
][
2
][
2
];
extern
char
nr_W_1l_4p
[
28
][
4
][
1
];
extern
char
nr_W_2l_4p
[
22
][
4
][
2
];
extern
char
nr_W_3l_4p
[
7
][
4
][
3
];
extern
char
nr_W_4l_4p
[
5
][
4
][
4
];
/*! \brief Perform NR modulation. TS 38.211 V15.4.0 subclause 5.1
@param[in] in, Pointer to input bits
@param[in] length, size of input bits
...
...
@@ -118,4 +124,14 @@ void apply_nr_rotation_ul(NR_DL_FRAME_PARMS *frame_parms,
int
first_symbol
,
int
nsymb
,
int
length
);
/*! \brief Perform NR precoding. TS 38.211 V15.4.0 subclause 6.3.1.5
@param[in] datatx_F_precoding, Pointer to n_layers*re data array
@param[in] prec_matrix, Pointer to precoding matrix
@param[in] n_layers, number of DLSCH layers
*/
int
nr_layer_precoder
(
int16_t
**
datatx_F_precoding
,
char
*
prec_matrix
,
uint8_t
n_layers
,
int32_t
re_offset
);
#endif
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
e72d0483
...
...
@@ -75,7 +75,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
symbol_offset
=
gNB
->
frame_parms
.
ofdm_symbol_size
*
symbol
;
k
=
bwp_start_subcarrier
;
int
re_offset
=
k
;
int
re_offset
;
uint16_t
nb_rb_pusch
=
pusch_pdu
->
rb_size
;
...
...
@@ -161,6 +161,7 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
pil
=
(
int16_t
*
)
&
pilot
[
0
];
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
k
+
nushift
)];
ul_ch
=
(
int16_t
*
)
&
ul_ch_estimates
[
aarx
][
ch_offset
];
re_offset
=
k
;
memset
(
ul_ch
,
0
,
4
*
(
gNB
->
frame_parms
.
ofdm_symbol_size
));
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
e72d0483
...
...
@@ -142,6 +142,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t
scrambled_output
[
NR_MAX_NB_CODEWORDS
][
NR_MAX_PDSCH_ENCODED_LENGTH
>>
5
];
int16_t
**
mod_symbs
=
(
int16_t
**
)
dlsch
->
mod_symbs
;
int16_t
**
tx_layers
=
(
int16_t
**
)
dlsch
->
txdataF
;
int16_t
**
txdataF_precoding
=
(
int16_t
**
)
dlsch
->
txdataF_precoding
;
int8_t
Wf
[
2
],
Wt
[
2
],
l0
,
l_prime
,
l_overline
,
delta
;
uint8_t
dmrs_Type
=
rel15
->
dmrsConfigType
;
int
nb_re_dmrs
;
...
...
@@ -266,9 +267,6 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
#endif
/// Antenna port mapping
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
/// DMRS QPSK modulation
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
if
(
rel15
->
dlDmrsSymbPos
&
(
1
<<
l
))
{
...
...
@@ -293,6 +291,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
if
(
start_sc
>=
frame_parms
->
ofdm_symbol_size
)
start_sc
-=
frame_parms
->
ofdm_symbol_size
;
int
txdataF_offset
=
(
slot
%
2
)
*
frame_parms
->
samples_per_slot_wCP
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"PDSCH resource mapping started (start SC %d
\t
start symbol %d
\t
N_PRB %d
\t
nb_re %d,nb_layers %d)
\n
"
,
start_sc
,
rel15
->
StartSymbolIndex
,
rel15
->
rbSize
,
nb_re
,
rel15
->
nrOfLayers
);
...
...
@@ -313,9 +313,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
1
+
dmrs_Type
,
ap
,
Wt
[
0
],
Wt
[
1
],
Wf
[
0
],
Wf
[
1
],
delta
,
l_prime
,
l0
,
dmrs_symbol
);
#endif
uint16_t
m
=
0
,
dmrs_idx
=
0
,
k
=
0
;
int
txdataF_offset
=
(
slot
%
2
)
*
frame_parms
->
samples_per_slot_wCP
;
uint16_t
m
=
0
,
dmrs_idx
=
0
;
// Loop Over OFDM symbols:
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
...
...
@@ -349,7 +347,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
nr_modulation
(
pdsch_dmrs
[
l
][
0
],
(
n_ptrs
<<
1
),
DMRS_MOD_ORDER
,
mod_ptrs
);
}
}
k
=
start_sc
;
uint16_t
k
=
start_sc
;
// Loop Over SCs:
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
/* check if cuurent RE is PTRS RE*/
...
...
@@ -369,12 +367,12 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
/* Map DMRS Symbol */
if
(
(
dmrs_symbol_map
&
(
1
<<
l
)
)
&&
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
n
,
k_prime
,
delta
,
dmrs_Type
))
%
(
frame_parms
->
ofdm_symbol_size
))))
{
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][
dmrs_idx
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][(
dmrs_idx
<<
1
)
+
1
])
>>
15
;
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][
dmrs_idx
<<
1
])
>>
15
;
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][(
dmrs_idx
<<
1
)
+
1
])
>>
15
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"dmrs_idx %d
\t
l %d
\t
k %d
\t
k_prime %d
\t
n %d
\t
txdataF: %d %d
\n
"
,
dmrs_idx
,
l
,
k
,
k_prime
,
n
,
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
dmrs_idx
,
l
,
k
,
k_prime
,
n
,
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
#endif
dmrs_idx
++
;
k_prime
++
;
...
...
@@ -383,8 +381,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
/* Map PTRS Symbol */
else
if
(
is_ptrs_re
){
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
beta_ptrs
*
amp
*
mod_ptrs
[
ptrs_idx
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
beta_ptrs
*
amp
*
mod_ptrs
[(
ptrs_idx
<<
1
)
+
1
])
>>
15
;
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
beta_ptrs
*
amp
*
mod_ptrs
[
ptrs_idx
<<
1
])
>>
15
;
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
beta_ptrs
*
amp
*
mod_ptrs
[(
ptrs_idx
<<
1
)
+
1
])
>>
15
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"ptrs_idx %d
\t
l %d
\t
k %d
\t
k_prime %d
\t
n %d
\t
txdataF: %d %d
\n
"
,
ptrs_idx
,
l
,
k
,
k_prime
,
n
,
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
...
...
@@ -393,17 +391,20 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
ptrs_idx
++
;
}
/* Map DATA Symbol */
else
{
if
(
(
!
(
dmrs_symbol_map
&
(
1
<<
l
)))
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
frame_parms
->
ofdm_symbol_size
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][
m
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][(
m
<<
1
)
+
1
])
>>
15
;
else
if
(
(
!
(
dmrs_symbol_map
&
(
1
<<
l
)))
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
frame_parms
->
ofdm_symbol_size
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][
m
<<
1
])
>>
15
;
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][(
m
<<
1
)
+
1
])
>>
15
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"m %d
\t
l %d
\t
k %d
\t
txdataF: %d %d
\n
"
,
m
,
l
,
k
,
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
m
,
l
,
k
,
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
txdataF_precoding
[
ap
]
[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
#endif
m
++
;
}
/* mute RE */
else
{
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
0
;
txdataF_precoding
[
ap
][((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
0
;
}
if
(
++
k
>=
frame_parms
->
ofdm_symbol_size
)
k
-=
frame_parms
->
ofdm_symbol_size
;
...
...
@@ -411,6 +412,30 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
// symbol loop
}
// layer loop
///Layer Precoding and Antenna port mapping
// tx_layers 1-8 are mapped on antenna ports 1000-1007
uint8_t
pmi
=
2
;
for
(
int
ap
=
0
;
ap
<
frame_parms
->
nb_antennas_tx
;
ap
++
)
{
char
*
W_prec
=
nr_W_1l_2p
[
pmi
][
ap
];
//nr_W_1l_4p, nr_W_2l_2p, nr_W_2l_4p, nr_W_3l_4p, and nr_W_4l_4p
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
uint16_t
k
=
start_sc
;
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
int32_t
re_offset
=
l
*
frame_parms
->
ofdm_symbol_size
+
k
;
int32_t
precodatatx_F
=
nr_layer_precoder
(
txdataF_precoding
,
W_prec
,
rel15
->
nrOfLayers
,
re_offset
+
txdataF_offset
);
((
int16_t
*
)
txdataF
[
ap
])[(
re_offset
<<
1
)
+
(
2
*
txdataF_offset
)]
=
((
int16_t
*
)
&
precodatatx_F
)[
0
];
((
int16_t
*
)
txdataF
[
ap
])[(
re_offset
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
((
int16_t
*
)
&
precodatatx_F
)[
1
];
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"antenna %d
\t
l %d
\t
k %d
\t
txdataF: %d %d
\n
"
,
ap
,
l
,
k
,
((
int16_t
*
)
txdataF
[
ap
])[(
re_offset
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])[(
re_offset
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
#endif
if
(
++
k
>=
frame_parms
->
ofdm_symbol_size
)
k
-=
frame_parms
->
ofdm_symbol_size
;
}
//RE loop
}
// symbol loop
}
// port loop
dlsch
->
slot_tx
[
slot
]
=
0
;
}
// dlsch loop
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
View file @
e72d0483
...
...
@@ -176,6 +176,7 @@ NR_gNB_DLSCH_t *new_gNB_dlsch(NR_DL_FRAME_PARMS *frame_parms,
}
dlsch
->
txdataF
[
layer
]
=
(
int32_t
*
)
malloc16
((
NR_MAX_PDSCH_ENCODED_LENGTH
/
NR_MAX_NB_LAYERS
)
*
sizeof
(
int32_t
));
// NR_MAX_NB_LAYERS is already included in NR_MAX_PDSCH_ENCODED_LENGTH
dlsch
->
txdataF_precoding
[
layer
]
=
(
int32_t
*
)
malloc16
((
14
*
frame_parms
->
ofdm_symbol_size
)
*
sizeof
(
int32_t
));
}
for
(
int
q
=
0
;
q
<
NR_MAX_NB_CODEWORDS
;
q
++
)
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
View file @
e72d0483
...
...
@@ -50,7 +50,7 @@
//#define gNB_DEBUG_TRACE
#define OAI_UL_LDPC_MAX_NUM_LLR 27000//26112 // NR_LDPC_NCOL_BG1*NR_LDPC_ZMAX = 68*384
//
#define PRINT_CRC_CHECK
#define PRINT_CRC_CHECK
//extern double cpuf;
...
...
openair1/PHY/NR_TRANSPORT/nr_ulsch_demodulation.c
View file @
e72d0483
...
...
@@ -268,6 +268,9 @@ void nr_ulsch_extract_rbs_single(int32_t **rxdataF,
n
=
0
;
k_prime
=
0
;
rxF_ext_index
=
0
;
ul_ch0_ext_index
=
0
;
ul_ch0_index
=
0
;
if
(
is_dmrs_symbol
==
0
)
{
//
...
...
@@ -329,7 +332,7 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
#if defined(__x86_64__)||defined(__i386__)
short
rb
,
ch_amp
;
unsigned
char
aa
tx
,
aa
rx
;
unsigned
char
aarx
;
__m128i
*
ul_ch128
,
ch_amp128
;
// Determine scaling amplitude based the symbol
...
...
@@ -347,7 +350,6 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
int
off
=
0
;
#endif
for
(
aatx
=
0
;
aatx
<
frame_parms
->
nb_antenna_ports_gNB
;
aatx
++
)
{
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
ul_ch128
=
(
__m128i
*
)
&
ul_ch_estimates_ext
[
aarx
][
symbol
*
(
off
+
(
nb_rb
*
NR_NB_SC_PER_RB
))];
...
...
@@ -377,7 +379,6 @@ void nr_ulsch_scale_channel(int **ul_ch_estimates_ext,
}
}
}
}
#endif
}
...
...
@@ -394,6 +395,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
short
rb
;
unsigned
char
aatx
,
aarx
;
char
nb_antennas_ue_tx
=
1
;
__m128i
*
ul_ch128
,
avg128U
;
int16_t
x
=
factor2
(
len
);
...
...
@@ -405,7 +407,7 @@ void nr_ulsch_channel_level(int **ul_ch_estimates_ext,
int
off
=
0
;
#endif
for
(
aatx
=
0
;
aatx
<
frame_parms
->
nb_antennas
_tx
;
aatx
++
)
for
(
aatx
=
0
;
aatx
<
nb_antennas_ue
_tx
;
aatx
++
)
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
//clear average level
avg128U
=
_mm_setzero_si128
();
...
...
@@ -546,11 +548,12 @@ void nr_ulsch_channel_compensation(int **rxdataF_ext,
unsigned
short
rb
;
unsigned
char
aatx
,
aarx
;
char
nb_antennas_ue_tx
=
1
;
__m128i
*
ul_ch128
,
*
ul_ch128_2
,
*
ul_ch_mag128
,
*
ul_ch_mag128b
,
*
rxdataF128
,
*
rxdataF_comp128
,
*
rho128
;
__m128i
mmtmpD0
,
mmtmpD1
,
mmtmpD2
,
mmtmpD3
,
QAM_amp128
,
QAM_amp128b
;
QAM_amp128b
=
_mm_setzero_si128
();
for
(
aatx
=
0
;
aatx
<
frame_parms
->
nb_antennas
_tx
;
aatx
++
)
{
for
(
aatx
=
0
;
aatx
<
nb_antennas_ue
_tx
;
aatx
++
)
{
if
(
mod_order
==
4
)
{
QAM_amp128
=
_mm_set1_epi16
(
QAM16_n1
);
// 2/sqrt(10)
...
...
@@ -1086,6 +1089,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
uint32_t
nb_re_pusch
,
bwp_start_subcarrier
;
int
avgs
;
int
avg
[
4
];
char
nb_antennas_ue_tx
=
1
;
NR_DL_FRAME_PARMS
*
frame_parms
=
&
gNB
->
frame_parms
;
nfapi_nr_pusch_pdu_t
*
rel15_ul
=
&
gNB
->
ulsch
[
ulsch_id
][
0
]
->
harq_processes
[
harq_pid
]
->
ulsch_pdu
;
...
...
@@ -1185,7 +1189,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
avgs
=
0
;
for
(
aatx
=
0
;
aatx
<
frame_parms
->
nb_antennas
_tx
;
aatx
++
)
for
(
aatx
=
0
;
aatx
<
nb_antennas_ue
_tx
;
aatx
++
)
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
avgs
=
cmax
(
avgs
,
avg
[(
aatx
<<
1
)
+
aarx
]);
...
...
@@ -1203,7 +1207,7 @@ int nr_rx_pusch(PHY_VARS_gNB *gNB,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_mag0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
ul_ch_magb0
,
gNB
->
pusch_vars
[
ulsch_id
]
->
rxdataF_comp
,
(
frame_parms
->
nb_antennas
_tx
>
1
)
?
gNB
->
pusch_vars
[
ulsch_id
]
->
rho
:
NULL
,
(
nb_antennas_ue
_tx
>
1
)
?
gNB
->
pusch_vars
[
ulsch_id
]
->
rho
:
NULL
,
frame_parms
,
symbol
,
dmrs_symbol_flag
,
...
...
openair1/PHY/defs_gNB.h
View file @
e72d0483
...
...
@@ -140,8 +140,10 @@ typedef struct {
typedef
struct
{
/// Pointers to 16 HARQ processes for the DLSCH
NR_DL_gNB_HARQ_t
*
harq_processes
[
NR_MAX_NB_HARQ_PROCESSES
];
/// TX buffers for UE-spec transmission (antenna
ports 5 or 7..14, prio
r to precoding)
/// TX buffers for UE-spec transmission (antenna
layers 1,...,4 afte
r to precoding)
int32_t
*
txdataF
[
NR_MAX_NB_LAYERS
];
/// TX buffers for UE-spec transmission (antenna ports 1000 or 1001,...,1007, before precoding)
int32_t
*
txdataF_precoding
[
NR_MAX_NB_LAYERS
];
/// Modulated symbols buffer
int32_t
*
mod_symbs
[
NR_MAX_NB_CODEWORDS
];
/// beamforming weights for UE-spec transmission (antenna ports 5 or 7..14), for each codeword, maximum 4 layers?
...
...
openair1/SCHED_NR/nr_ru_procedures.c
View file @
e72d0483
...
...
@@ -323,7 +323,7 @@ static void *nr_feptx_thread(void *param) {
slot
,
l
+
i
,
aa
,
nb_antenna_port
s
);
ru
->
nb_log_antenna
s
);
}
}
stop_meas
(
&
ru
->
precoding_stats
);
...
...
openair1/SCHED_NR/phy_procedures_nr_gNB.c
View file @
e72d0483
...
...
@@ -207,7 +207,9 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
//apply the OFDM symbol rotation here
apply_nr_rotation
(
fp
,(
int16_t
*
)
&
gNB
->
common_vars
.
txdataF
[
0
][
txdataF_offset
],
slot
,
0
,
fp
->
Ncp
==
EXTENDED
?
12
:
14
,
fp
->
ofdm_symbol_size
);
for
(
aa
=
0
;
aa
<
cfg
->
carrier_config
.
num_tx_ant
.
value
;
aa
++
)
{
apply_nr_rotation
(
fp
,(
int16_t
*
)
&
gNB
->
common_vars
.
txdataF
[
aa
][
txdataF_offset
],
slot
,
0
,
fp
->
Ncp
==
EXTENDED
?
12
:
14
,
fp
->
ofdm_symbol_size
);
}
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_gNB_TX
+
offset
,
0
);
}
...
...
openair1/SIMULATION/NR_PHY/dlsim.c
View file @
e72d0483
...
...
@@ -615,7 +615,7 @@ int main(int argc, char **argv)
prepare_scc
(
rrc
.
carrier
.
servingcellconfigcommon
);
uint64_t
ssb_bitmap
;
fill_scc
(
rrc
.
carrier
.
servingcellconfigcommon
,
&
ssb_bitmap
,
N_RB_DL
,
N_RB_DL
,
mu
,
mu
);
ssb_bitmap
=
1
;
// Enable only first SSB with index ssb_indx=0
fix_scc
(
scc
,
ssb_bitmap
);
fill_default_secondaryCellGroup
(
scc
,
...
...
@@ -640,9 +640,9 @@ int main(int argc, char **argv)
AssertFatal
((
gNB
->
if_inst
=
NR_IF_Module_init
(
0
))
!=
NULL
,
"Cannot register interface"
);
gNB
->
if_inst
->
NR_PHY_config_req
=
nr_phy_config_request
;
// common configuration
rrc_mac_config_req_gNB
(
0
,
0
,
1
,
pusch_tgt_snrx10
,
pucch_tgt_snrx10
,
scc
,
0
,
0
,
NULL
);
rrc_mac_config_req_gNB
(
0
,
0
,
n_tx
,
pusch_tgt_snrx10
,
pucch_tgt_snrx10
,
scc
,
0
,
0
,
NULL
);
// UE dedicated configuration
rrc_mac_config_req_gNB
(
0
,
0
,
1
,
pusch_tgt_snrx10
,
pucch_tgt_snrx10
,
NULL
,
1
,
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
newUE_Identity
,
secondaryCellGroup
);
rrc_mac_config_req_gNB
(
0
,
0
,
n_tx
,
pusch_tgt_snrx10
,
pucch_tgt_snrx10
,
NULL
,
1
,
secondaryCellGroup
->
spCellConfig
->
reconfigurationWithSync
->
newUE_Identity
,
secondaryCellGroup
);
phy_init_nr_gNB
(
gNB
,
0
,
0
);
N_RB_DL
=
gNB
->
frame_parms
.
N_RB_DL
;
// stub to configure frame_parms
...
...
@@ -702,28 +702,28 @@ int main(int argc, char **argv)
frame_length_complex_samples
=
frame_parms
->
samples_per_subframe
*
NR_NUMBER_OF_SUBFRAMES_PER_FRAME
;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP*NR_NUMBER_OF_SUBFRAMES_PER_FRAME;
s_re
=
malloc
(
2
*
sizeof
(
double
*
));
s_im
=
malloc
(
2
*
sizeof
(
double
*
));
r_re
=
malloc
(
2
*
sizeof
(
double
*
));
r_im
=
malloc
(
2
*
sizeof
(
double
*
));
txdata
=
malloc
(
2
*
sizeof
(
int
*
));
for
(
i
=
0
;
i
<
2
;
i
++
)
{
s_re
=
malloc
(
n_tx
*
sizeof
(
double
*
));
s_im
=
malloc
(
n_tx
*
sizeof
(
double
*
));
r_re
=
malloc
(
n_rx
*
sizeof
(
double
*
));
r_im
=
malloc
(
n_rx
*
sizeof
(
double
*
));
txdata
=
malloc
(
n_tx
*
sizeof
(
int
*
));
for
(
i
=
0
;
i
<
n_tx
;
i
++
)
{
s_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
s_re
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
s_im
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
s_im
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
r_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
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
(
txdata
[
i
],
frame_length_complex_samples
*
sizeof
(
int
));
}
for
(
i
=
0
;
i
<
n_rx
;
i
++
)
{
r_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
r_im
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_im
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
}
if
(
pbch_file_fd
!=
NULL
)
{
...
...
@@ -738,6 +738,7 @@ int main(int argc, char **argv)
PHY_vars_UE_g
[
0
]
=
malloc
(
sizeof
(
PHY_VARS_NR_UE
*
));
PHY_vars_UE_g
[
0
][
0
]
=
UE
;
memcpy
(
&
UE
->
frame_parms
,
frame_parms
,
sizeof
(
NR_DL_FRAME_PARMS
));
UE
->
frame_parms
.
nb_antennas_rx
=
n_rx
;
if
(
run_initial_sync
==
1
)
UE
->
is_synchronized
=
0
;
else
{
UE
->
is_synchronized
=
1
;
UE
->
UE_mode
[
0
]
=
PUSCH
;}
...
...
@@ -955,7 +956,15 @@ int main(int argc, char **argv)
fwrite
(
txdata
[
0
],
sizeof
(
int32_t
),
frame_length_complex_samples
,
output_fd
);
}
int
txlev
=
signal_energy
(
&
txdata
[
0
][
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
)
+
5
*
frame_parms
->
ofdm_symbol_size
+
4
*
frame_parms
->
nb_prefix_samples
+
frame_parms
->
nb_prefix_samples0
],
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples
);
int
txlev
[
n_tx
];
int
txlev_sum
=
0
;
int
l_ofdm
=
6
;
for
(
aa
=
0
;
aa
<
n_tx
;
aa
++
)
{
txlev
[
aa
]
=
signal_energy
(
&
txdata
[
aa
][
tx_offset
+
l_ofdm
*
frame_parms
->
ofdm_symbol_size
+
(
l_ofdm
-
1
)
*
frame_parms
->
nb_prefix_samples
+
frame_parms
->
nb_prefix_samples0
],
frame_parms
->
ofdm_symbol_size
+
frame_parms
->
nb_prefix_samples
);
txlev_sum
+=
txlev
[
aa
];
if
(
n_trials
==
1
)
printf
(
"txlev[%d] = %d (%f dB) txlev_sum %d
\n
"
,
aa
,
txlev
[
aa
],
10
*
log10
((
double
)
txlev
[
aa
]),
txlev_sum
);
}
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
...
...
@@ -964,27 +973,37 @@ int main(int argc, char **argv)
i
++
)
{
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
]);
s
_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)]);
s
_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)
+
1
]);
}
}
double
ts
=
1
.
0
/
(
frame_parms
->
subcarrier_spacing
*
frame_parms
->
ofdm_symbol_size
);
//AWGN
sigma2_dB
=
10
*
log10
((
double
)
txlev
*
((
double
)
UE
->
frame_parms
.
ofdm_symbol_size
/
(
12
*
rel15
->
rbSize
)))
-
SNR
;
sigma2_dB
=
10
*
log10
((
double
)
txlev
_sum
*
((
double
)
UE
->
frame_parms
.
ofdm_symbol_size
/
(
12
*
rel15
->
rbSize
)))
-
SNR
;
sigma2
=
pow
(
10
,
sigma2_dB
/
10
);
if
(
n_trials
==
1
)
printf
(
"sigma2 %f (%f dB), txlev %f (factor %f)
\n
"
,
sigma2
,
sigma2_dB
,
10
*
log10
((
double
)
txlev
),(
double
)(
double
)
UE
->
frame_parms
.
ofdm_symbol_size
/
(
12
*
rel15
->
rbSize
));
if
(
n_trials
==
1
)
printf
(
"sigma2 %f (%f dB), txlev_sum %f (factor %f)
\n
"
,
sigma2
,
sigma2_dB
,
10
*
log10
((
double
)
txlev_sum
),(
double
)(
double
)
UE
->
frame_parms
.
ofdm_symbol_size
/
(
12
*
rel15
->
rbSize
));
for
(
aa
=
0
;
aa
<
n_rx
;
aa
++
)
{
bzero
(
r_re
[
aa
],
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_im
[
aa
],
frame_length_complex_samples
*
sizeof
(
double
));
}
for
(
i
=
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
);
i
<
frame_parms
->
get_samples_slot_timestamp
(
slot
+
1
,
frame_parms
,
0
);
i
++
)
{
for
(
aa
=
0
;
aa
<
frame_parms
->
nb_antennas_rx
;
aa
++
)
{
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[
2
*
i
]
=
(
short
)
((
r_re
[
aa
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
)));
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[
2
*
i
+
1
]
=
(
short
)
((
r_im
[
aa
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
)));
for
(
int
aa_rx
=
0
;
aa_rx
<
n_rx
;
aa_rx
++
)
{
// Apply MIMO Channel and then add noise
// sum up signals from different Tx antennas
for
(
aa
=
0
;
aa
<
n_tx
;
aa
++
)
{
r_re
[
aa_rx
][
i
]
+=
s_re
[
aa
][
i
];
r_im
[
aa_rx
][
i
]
+=
s_im
[
aa
][
i
];
}
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa_rx
])[
2
*
i
]
=
(
short
)
((
r_re
[
aa_rx
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
)));
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa_rx
])[
2
*
i
+
1
]
=
(
short
)
((
r_im
[
aa_rx
][
i
]
+
sqrt
(
sigma2
/
2
)
*
gaussdouble
(
0
.
0
,
1
.
0
)));
/* Add phase noise if enabled */
if
(
pdu_bit_map
&
0x1
)
{
phase_noise
(
ts
,
&
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[
2
*
i
],
&
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
])[
2
*
i
+
1
]);
phase_noise
(
ts
,
&
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
_rx
])[
2
*
i
],
&
((
short
*
)
UE
->
common_vars
.
rxdata
[
aa
_rx
])[
2
*
i
+
1
]);
}
}
}
...
...
@@ -1159,12 +1178,14 @@ int main(int argc, char **argv)
}
}*/
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
n_tx
;
i
++
)
{
free
(
s_re
[
i
]);
free
(
s_im
[
i
]);
free
(
txdata
[
i
]);
}
for
(
i
=
0
;
i
<
n_rx
;
i
++
)
{
free
(
r_re
[
i
]);
free
(
r_im
[
i
]);
free
(
txdata
[
i
]);
}
free
(
s_re
);
...
...
targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
View file @
e72d0483
...
...
@@ -23,7 +23,7 @@ gNBs =
//////////
Physical
parameters
:
ssb_SubcarrierOffset
=
0
;
pdsch_AntennaPorts
=
1
;
pdsch_AntennaPorts
=
2
;
servingCellConfigCommon
= (
{
...
...
@@ -240,8 +240,8 @@ L1s = (
RUs
= (
{
local_rf
=
"yes"
nb_tx
=
1
nb_rx
=
1
nb_tx
=
2
nb_rx
=
2
att_tx
=
0
att_rx
=
0
;
bands
= [
7
];
...
...
@@ -249,7 +249,7 @@ RUs = (
max_rxgain
=
75
;
eNB_instances
= [
0
];
##beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights
= [
0
x00007fff
,
0
x0000
];
bf_weights
= [
0
x00007fff
,
0
x0000
7fff
];
##beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
...
...
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