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
93e745b8
Commit
93e745b8
authored
Apr 23, 2020
by
Sakthivel Velumani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
updated dlsim to test harq
parent
6b307e81
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
140 additions
and
118 deletions
+140
-118
openair1/SIMULATION/NR_PHY/dlsim.c
openair1/SIMULATION/NR_PHY/dlsim.c
+131
-115
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+3
-3
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
+6
-0
No files found.
openair1/SIMULATION/NR_PHY/dlsim.c
View file @
93e745b8
...
...
@@ -154,6 +154,8 @@ int main(int argc, char **argv)
int
trial
,
n_trials
=
1
,
n_errors
=
0
,
n_false_positive
=
0
;
//int n_errors2, n_alamouti;
uint8_t
transmission_mode
=
1
,
n_tx
=
1
,
n_rx
=
1
;
uint8_t
round
;
uint8_t
num_rounds
=
4
;
channel_desc_t
*
gNB2UE
;
//uint32_t nsymb,tx_lev,tx_lev1 = 0,tx_lev2 = 0;
...
...
@@ -678,6 +680,8 @@ int main(int argc, char **argv)
nr_ue_phy_config_request
(
&
UE_mac
->
phy_config
);
NR_UE_list_t
*
UE_list
=
&
RC
.
nrmac
[
0
]
->
UE_list
;
NR_COMMON_channels_t
*
cc
=
RC
.
nrmac
[
0
]
->
common_channels
;
for
(
SNR
=
snr0
;
SNR
<
snr1
;
SNR
+=
.
2
)
{
...
...
@@ -704,95 +708,6 @@ int main(int argc, char **argv)
errors_bit
=
0
;
//multipath channel
//multipath_channel(gNB2UE,s_re,s_im,r_re,r_im,frame_length_complex_samples,0);
memset
(
RC
.
nrmac
[
0
]
->
cce_list
[
1
][
0
],
0
,
MAX_NUM_CCE
*
sizeof
(
int
));
clear_nr_nfapi_information
(
RC
.
nrmac
[
0
],
0
,
frame
,
slot
);
if
(
css_flag
==
0
)
nr_schedule_uss_dlsch_phytest
(
0
,
frame
,
slot
,
&
pucch_sched
,
&
dlsch_config
);
else
nr_schedule_css_dlsch_phytest
(
0
,
frame
,
slot
);
Sched_INFO
.
module_id
=
0
;
Sched_INFO
.
CC_id
=
0
;
Sched_INFO
.
frame
=
frame
;
Sched_INFO
.
slot
=
slot
;
Sched_INFO
.
DL_req
=
&
gNB_mac
->
DL_req
[
0
];
Sched_INFO
.
UL_tti_req
=
&
gNB_mac
->
UL_tti_req
[
0
];
Sched_INFO
.
UL_dci_req
=
NULL
;
Sched_INFO
.
TX_req
=
&
gNB_mac
->
TX_req
[
0
];
nr_schedule_response
(
&
Sched_INFO
);
if
(
run_initial_sync
)
nr_common_signal_procedures
(
gNB
,
frame
,
slot
);
else
phy_procedures_gNB_TX
(
gNB
,
frame
,
slot
,
0
);
int
txdataF_offset
=
(
slot
%
2
)
*
frame_parms
->
samples_per_slot_wCP
;
if
(
n_trials
==
1
)
{
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
);
}
int
tx_offset
=
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
);
if
(
n_trials
==
1
)
printf
(
"samples_per_slot_wCP = %d
\n
"
,
frame_parms
->
samples_per_slot_wCP
);
//TODO: loop over slots
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
if
(
cyclic_prefix_type
==
1
)
{
PHY_ofdm_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
txdataF_offset
],
&
txdata
[
aa
][
tx_offset
],
frame_parms
->
ofdm_symbol_size
,
12
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
}
else
{
nr_normal_prefix_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
txdataF_offset
],
&
txdata
[
aa
][
tx_offset
],
14
,
frame_parms
);
}
}
if
(
n_trials
==
1
)
{
LOG_M
(
"txsig0.m"
,
"txs0"
,
txdata
[
0
],
frame_length_complex_samples
,
1
,
1
);
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"txsig1.m"
,
"txs1"
,
txdata
[
1
],
frame_length_complex_samples
,
1
,
1
);
}
if
(
output_fd
)
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
);
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
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_tx
;
aa
++
)
{
r_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)]);
r_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)
+
1
]);
}
}
NR_gNB_DLSCH_t
*
gNB_dlsch
=
gNB
->
dlsch
[
0
][
0
];
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
rel15
=
gNB_dlsch
->
harq_processes
[
0
]
->
pdsch_pdu
.
pdsch_pdu_rel15
;
//AWGN
sigma2_dB
=
10
*
log10
((
double
)
txlev
*
((
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
));
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
)));
}
}
UE
->
rx_offset
=
0
;
UE_proc
.
frame_rx
=
frame
;
UE_proc
.
nr_tti_rx
=
slot
;
...
...
@@ -800,43 +715,144 @@ int main(int argc, char **argv)
dcireq
.
frame
=
frame
;
dcireq
.
slot
=
slot
;
nr_ue_dcireq
(
&
dcireq
);
//to be replaced with function pointer later
nr_ue_scheduled_response
(
&
scheduled_response
);
phy_procedures_nrUE_RX
(
UE
,
&
UE_proc
,
0
,
do_pdcch_flag
,
normal_txrx
);
if
(
UE
->
dlsch
[
UE
->
current_thread_id
[
slot
]][
0
][
0
]
->
last_iteration_cnt
>=
UE
->
dlsch
[
UE
->
current_thread_id
[
slot
]][
0
][
0
]
->
max_ldpc_iterations
+
1
)
n_errors
++
;
NR_UE_DLSCH_t
*
dlsch0
=
UE
->
dlsch
[
UE
->
current_thread_id
[
UE_proc
.
nr_tti_rx
]][
0
][
0
];
int
harq_pid
=
dlsch0
->
current_harq_pid
;
NR_DL_UE_HARQ_t
*
UE_harq_process
=
dlsch0
->
harq_processes
[
harq_pid
];
NR_gNB_DLSCH_t
*
gNB_dlsch
=
gNB
->
dlsch
[
0
][
0
];
nfapi_nr_dl_tti_pdsch_pdu_rel15_t
*
rel15
=
&
gNB_dlsch
->
harq_processes
[
0
]
->
pdsch_pdu
.
pdsch_pdu_rel15
;
UE_harq_process
->
harq_ack
.
ack
=
0
;
round
=
0
;
while
((
round
<
num_rounds
)
&&
(
UE_harq_process
->
harq_ack
.
ack
==
0
))
{
memset
(
RC
.
nrmac
[
0
]
->
cce_list
[
1
][
0
],
0
,
MAX_NUM_CCE
*
sizeof
(
int
));
memset
(
RC
.
nrmac
[
0
]
->
cce_list
[
1
][
1
],
0
,
MAX_NUM_CCE
*
sizeof
(
int
));
clear_nr_nfapi_information
(
RC
.
nrmac
[
0
],
0
,
frame
,
slot
);
UE_list
->
UE_sched_ctrl
[
0
].
harq_processes
[
0
].
ndi
=
(
round
==
0
)
?
1
:
0
;
UE_list
->
UE_sched_ctrl
[
0
].
harq_processes
[
0
].
round
=
round
;
gNB
->
dlsch
[
0
][
0
]
->
harq_processes
[
0
]
->
round
=
round
;
if
(
css_flag
==
0
)
nr_schedule_uss_dlsch_phytest
(
0
,
frame
,
slot
,
&
pucch_sched
,
&
dlsch_config
);
else
nr_schedule_css_dlsch_phytest
(
0
,
frame
,
slot
);
Sched_INFO
.
module_id
=
0
;
Sched_INFO
.
CC_id
=
0
;
Sched_INFO
.
frame
=
frame
;
Sched_INFO
.
slot
=
slot
;
Sched_INFO
.
DL_req
=
&
gNB_mac
->
DL_req
[
0
];
Sched_INFO
.
UL_tti_req
=
&
gNB_mac
->
UL_tti_req
[
0
];
Sched_INFO
.
UL_dci_req
=
NULL
;
Sched_INFO
.
TX_req
=
&
gNB_mac
->
TX_req
[
0
];
nr_schedule_response
(
&
Sched_INFO
);
if
(
run_initial_sync
)
nr_common_signal_procedures
(
gNB
,
frame
,
slot
);
else
phy_procedures_gNB_TX
(
gNB
,
frame
,
slot
,
0
);
int
txdataF_offset
=
(
slot
%
2
)
*
frame_parms
->
samples_per_slot_wCP
;
if
(
n_trials
==
1
)
{
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
);
}
int
tx_offset
=
frame_parms
->
get_samples_slot_timestamp
(
slot
,
frame_parms
,
0
);
if
(
n_trials
==
1
)
printf
(
"samples_per_slot_wCP = %d
\n
"
,
frame_parms
->
samples_per_slot_wCP
);
//TODO: loop over slots
for
(
aa
=
0
;
aa
<
gNB
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
if
(
cyclic_prefix_type
==
1
)
{
PHY_ofdm_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
txdataF_offset
],
&
txdata
[
aa
][
tx_offset
],
frame_parms
->
ofdm_symbol_size
,
12
,
frame_parms
->
nb_prefix_samples
,
CYCLIC_PREFIX
);
}
else
{
nr_normal_prefix_mod
(
&
gNB
->
common_vars
.
txdataF
[
aa
][
txdataF_offset
],
&
txdata
[
aa
][
tx_offset
],
14
,
frame_parms
);
}
}
if
(
n_trials
==
1
)
{
LOG_M
(
"txsig0.m"
,
"txs0"
,
txdata
[
0
],
frame_length_complex_samples
,
1
,
1
);
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
)
LOG_M
(
"txsig1.m"
,
"txs1"
,
txdata
[
1
],
frame_length_complex_samples
,
1
,
1
);
}
if
(
output_fd
)
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
);
// if (n_trials==1) printf("txlev %d (%f)\n",txlev,10*log10((double)txlev));
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_tx
;
aa
++
)
{
r_re
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)]);
r_im
[
aa
][
i
]
=
((
double
)(((
short
*
)
txdata
[
aa
]))[(
i
<<
1
)
+
1
]);
}
}
//AWGN
sigma2_dB
=
10
*
log10
((
double
)
txlev
*
((
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
));
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
)));
}
}
nr_ue_dcireq
(
&
dcireq
);
//to be replaced with function pointer later
nr_ue_scheduled_response
(
&
scheduled_response
);
phy_procedures_nrUE_RX
(
UE
,
&
UE_proc
,
0
,
do_pdcch_flag
,
normal_txrx
);
if
(
UE
->
dlsch
[
UE
->
current_thread_id
[
slot
]][
0
][
0
]
->
last_iteration_cnt
>=
UE
->
dlsch
[
UE
->
current_thread_id
[
slot
]][
0
][
0
]
->
max_ldpc_iterations
+
1
)
n_errors
++
;
printf
(
"dlsim round %d ends
\n
"
,
round
);
round
++
;
}
// round
//----------------------------------------------------------
//---------------------- count errors ----------------------
//----------------------------------------------------------
NR_UE_DLSCH_t
*
dlsch0
=
UE
->
dlsch
[
UE
->
current_thread_id
[
UE_proc
.
nr_tti_rx
]][
0
][
0
];
int
harq_pid
=
dlsch0
->
current_harq_pid
;
NR_DL_UE_HARQ_t
*
UE_harq_process
=
dlsch0
->
harq_processes
[
harq_pid
];
NR_UE_PDSCH
**
pdsch_vars
=
UE
->
pdsch_vars
[
UE
->
current_thread_id
[
UE_proc
.
nr_tti_rx
]];
int16_t
*
UE_llr
=
pdsch_vars
[
0
]
->
llr
[
0
];
uint32_t
TBS
=
rel15
.
TBSize
[
0
];
uint32_t
TBS
=
rel15
->
TBSize
[
0
];
uint16_t
length_dmrs
=
1
;
uint16_t
nb_rb
=
rel15
.
rbSize
;
uint8_t
nb_re_dmrs
=
rel15
.
dmrsConfigType
==
NFAPI_NR_DMRS_TYPE1
?
6
:
4
;
uint8_t
mod_order
=
rel15
.
qamModOrder
[
0
];
uint8_t
nb_symb_sch
=
rel15
.
NrOfSymbols
;
uint16_t
nb_rb
=
rel15
->
rbSize
;
uint8_t
nb_re_dmrs
=
rel15
->
dmrsConfigType
==
NFAPI_NR_DMRS_TYPE1
?
6
:
4
;
uint8_t
mod_order
=
rel15
->
qamModOrder
[
0
];
uint8_t
nb_symb_sch
=
rel15
->
NrOfSymbols
;
available_bits
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
mod_order
,
rel15
.
nrOfLayers
);
available_bits
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
mod_order
,
rel15
->
nrOfLayers
);
for
(
i
=
0
;
i
<
available_bits
;
i
++
)
{
...
...
openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
View file @
93e745b8
...
...
@@ -311,7 +311,7 @@ int configure_fapi_dl_pdu(int Mod_idP,
pdsch_pdu_rel15
->
qamModOrder
[
0
]
=
2
;
pdsch_pdu_rel15
->
mcsIndex
[
0
]
=
mcs
;
pdsch_pdu_rel15
->
mcsTable
[
0
]
=
0
;
pdsch_pdu_rel15
->
rvIndex
[
0
]
=
0
;
pdsch_pdu_rel15
->
rvIndex
[
0
]
=
UE_list
->
UE_sched_ctrl
[
UE_id
].
harq_processes
[
0
].
round
;
pdsch_pdu_rel15
->
dataScramblingId
=
*
scc
->
physCellId
;
pdsch_pdu_rel15
->
nrOfLayers
=
1
;
pdsch_pdu_rel15
->
transmissionScheme
=
0
;
...
...
@@ -361,10 +361,10 @@ int configure_fapi_dl_pdu(int Mod_idP,
dci_pdu_rel15
[
0
].
time_domain_assignment
.
val
=
time_domain_assignment
;
// row index used here instead of SLIV;
// mcs ndi and rv
dci_pdu_rel15
[
0
].
mcs
=
pdsch_pdu_rel15
->
mcsIndex
[
0
];
dci_pdu_rel15
[
0
].
ndi
=
1
;
dci_pdu_rel15
[
0
].
rv
=
0
;
dci_pdu_rel15
[
0
].
rv
=
pdsch_pdu_rel15
->
rvIndex
[
0
];
// harq pid
dci_pdu_rel15
[
0
].
harq_pid
=
0
;
dci_pdu_rel15
[
0
].
ndi
=
UE_list
->
UE_sched_ctrl
[
UE_id
].
harq_processes
[
0
].
ndi
;
// DAI
dci_pdu_rel15
[
0
].
dai
[
0
].
val
=
(
pucch_sched
->
dai_c
-
1
)
&
3
;
// TPC for PUCCH
...
...
openair2/LAYER2/NR_MAC_gNB/nr_mac_gNB.h
View file @
93e745b8
...
...
@@ -111,6 +111,11 @@ typedef struct NR_sched_pucch {
struct
NR_sched_pucch
*
next_sched_pucch
;
}
NR_sched_pucch
;
typedef
struct
NR_UE_harq
{
uint8_t
ndi
;
uint8_t
round
;
}
NR_UE_harq_t
;
/*! \brief scheduling control information set through an API */
typedef
struct
{
uint64_t
dlsch_in_slot_bitmap
;
// static bitmap signaling which slot in a tdd period contains dlsch
...
...
@@ -118,6 +123,7 @@ typedef struct {
NR_sched_pucch
*
sched_pucch
;
uint16_t
ta_timer
;
int16_t
ta_update
;
NR_UE_harq_t
harq_processes
[
NR_MAX_NB_HARQ_PROCESSES
];
}
NR_UE_sched_ctrl_t
;
/*! \brief UE list used by eNB to order UEs/CC for scheduling*/
...
...
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