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
ZhouShuya
OpenXG-RAN
Commits
f2839eaf
Commit
f2839eaf
authored
Nov 22, 2018
by
Florian Kaltenberger
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
some fixes in dlschsim + nr_dlsch_decoding
parent
d7b80ffb
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
331 additions
and
349 deletions
+331
-349
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
+12
-13
openair1/SIMULATION/NR_PHY/dlschsim.c
openair1/SIMULATION/NR_PHY/dlschsim.c
+319
-336
No files found.
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
View file @
f2839eaf
...
@@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -292,7 +292,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process
->
G
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
harq_process
->
Qm
,
harq_process
->
Nl
);
harq_process
->
G
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
harq_process
->
Qm
,
harq_process
->
Nl
);
G
=
harq_process
->
G
;
G
=
harq_process
->
G
;
printf
(
"DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d
\n
"
,
harq_pid
,
A
,
G
,
harq_process
->
mcs
,
harq_process
->
Nl
,
nb_symb_sch
);
//
printf("DLSCH Decoding, harq_pid %d TBS %d G %d mcs %d Nl %d nb_symb_sch %d \n",harq_pid,A,G, harq_process->mcs, harq_process->Nl, nb_symb_sch);
if
(
harq_process
->
round
==
0
)
{
if
(
harq_process
->
round
==
0
)
{
// This is a new packet, so compute quantities regarding segmentation
// This is a new packet, so compute quantities regarding segmentation
...
@@ -325,7 +325,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -325,7 +325,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
kc
=
52
;
kc
=
52
;
}
}
p_decParams
->
numMaxIter
=
2
;
p_decParams
->
numMaxIter
=
dlsch
->
max_ldpc_iterations
;
Kr
=
p_decParams
->
Z
*
kb
;
Kr
=
p_decParams
->
Z
*
kb
;
p_decParams
->
outMode
=
0
;
p_decParams
->
outMode
=
0
;
...
@@ -365,7 +365,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -365,7 +365,7 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
for
(
r
=
0
;
r
<
harq_process
->
C
;
r
++
)
{
for
(
r
=
0
;
r
<
harq_process
->
C
;
r
++
)
{
printf
(
"start rx segment %d
\n
"
,
r
);
//
printf("start rx segment %d\n",r);
#if UE_TIMING_TRACE
#if UE_TIMING_TRACE
start_meas
(
dlsch_rate_unmatching_stats
);
start_meas
(
dlsch_rate_unmatching_stats
);
...
@@ -519,13 +519,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -519,13 +519,12 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
*/
*/
nb_total_decod
++
;
nb_total_decod
++
;
if
(
no_iteration_ldpc
>
10
){
if
(
no_iteration_ldpc
>
dlsch
->
max_ldpc_iterations
){
nb_error_decod
++
;
nb_error_decod
++
;
ret
=
1
+
dlsch
->
max_ldpc_iterations
;
}
else
{
ret
=
2
;
}
}
ret
=
no_iteration_ldpc
;
//if (!nb_total_decod%10000){
//if (!nb_total_decod%10000){
printf
(
"Error number of iteration LPDC %d %ld/%ld
\n
"
,
no_iteration_ldpc
,
nb_error_decod
,
nb_total_decod
);
fflush
(
stdout
);
printf
(
"Error number of iteration LPDC %d %ld/%ld
\n
"
,
no_iteration_ldpc
,
nb_error_decod
,
nb_total_decod
);
fflush
(
stdout
);
//}
//}
...
@@ -538,13 +537,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
...
@@ -538,13 +537,13 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
harq_process
->
c
[
r
][
m
]
=
(
uint8_t
)
llrProcBuf
[
m
];
harq_process
->
c
[
r
][
m
]
=
(
uint8_t
)
llrProcBuf
[
m
];
}
}
//
#ifdef DEBUG_DLSCH_DECODING
#ifdef DEBUG_DLSCH_DECODING
//printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
//printf("output decoder %d %d %d %d %d \n", harq_process->c[r][0], harq_process->c[r][1], harq_process->c[r][2],harq_process->c[r][3], harq_process->c[r][4]);
for
(
int
k
=
0
;
k
<
32
;
k
++
)
for
(
int
k
=
0
;
k
<
32
;
k
++
)
printf
(
"output decoder [%d] = 0x%02x
\n
"
,
k
,
harq_process
->
c
[
r
][
k
]);
printf
(
"output decoder [%d] = 0x%02x
\n
"
,
k
,
harq_process
->
c
[
r
][
k
]);
printf
(
"no_iterations_ldpc %d (ret %d)
\n
"
,
no_iteration_ldpc
,
ret
);
printf
(
"no_iterations_ldpc %d (ret %d)
\n
"
,
no_iteration_ldpc
,
ret
);
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
//write_output("dec_output.m","dec0",harq_process->c[0],Kr_bytes,1,4);
//
#endif
#endif
#if UE_TIMING_TRACE
#if UE_TIMING_TRACE
...
@@ -1233,8 +1232,8 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment
...
@@ -1233,8 +1232,8 @@ if (harq_process->C>1) { // wakeup worker if more than 1 segment
llrProcBuf
,
llrProcBuf
,
p_procTime
);
p_procTime
);
if
(
no_iteration_ldpc
>
2
)
//
if (no_iteration_ldpc > 2)
printf
(
"Error number of iteration LPDC %d
\n
"
,
no_iteration_ldpc
);
//
printf("Error number of iteration LPDC %d\n", no_iteration_ldpc);
//else
//else
//printf("OK number of iteration LPDC %d\n", no_iteration_ldpc);
//printf("OK number of iteration LPDC %d\n", no_iteration_ldpc);
...
...
openair1/SIMULATION/NR_PHY/dlschsim.c
View file @
f2839eaf
...
@@ -61,36 +61,50 @@ double cpuf;
...
@@ -61,36 +61,50 @@ double cpuf;
// dummy functions
// dummy functions
int
nfapi_mode
=
0
;
int
nfapi_mode
=
0
;
int
oai_nfapi_hi_dci0_req
(
nfapi_hi_dci0_request_t
*
hi_dci0_req
)
{
return
(
0
);}
int
oai_nfapi_hi_dci0_req
(
nfapi_hi_dci0_request_t
*
hi_dci0_req
)
{
int
oai_nfapi_tx_req
(
nfapi_tx_request_t
*
tx_req
)
{
return
(
0
);
}
return
(
0
);
}
int
oai_nfapi_tx_req
(
nfapi_tx_request_t
*
tx_req
)
{
return
(
0
);
}
int
oai_nfapi_dl_config_req
(
nfapi_dl_config_request_t
*
dl_config_req
)
{
return
(
0
);
}
int
oai_nfapi_dl_config_req
(
nfapi_dl_config_request_t
*
dl_config_req
)
{
return
(
0
);
}
int
oai_nfapi_ul_config_req
(
nfapi_ul_config_request_t
*
ul_config_req
)
{
return
(
0
);
}
int
oai_nfapi_ul_config_req
(
nfapi_ul_config_request_t
*
ul_config_req
)
{
return
(
0
);
}
int
oai_nfapi_nr_dl_config_req
(
nfapi_nr_dl_config_request_t
*
dl_config_req
)
{
return
(
0
);}
int
oai_nfapi_nr_dl_config_req
(
nfapi_nr_dl_config_request_t
*
dl_config_req
)
{
return
(
0
);
}
uint32_t
from_earfcn
(
int
eutra_bandP
,
uint32_t
dl_earfcn
)
{
return
(
0
);}
uint32_t
from_earfcn
(
int
eutra_bandP
,
uint32_t
dl_earfcn
)
{
int32_t
get_uldl_offset
(
int
eutra_bandP
)
{
return
(
0
);}
return
(
0
);
}
int32_t
get_uldl_offset
(
int
eutra_bandP
)
{
return
(
0
);
}
NR_IF_Module_t
*
NR_IF_Module_init
(
int
Mod_id
){
return
(
NULL
);}
NR_IF_Module_t
*
NR_IF_Module_init
(
int
Mod_id
)
{
return
(
NULL
);
}
void
exit_function
(
const
char
*
file
,
const
char
*
function
,
const
int
line
,
const
char
*
s
)
{
void
exit_function
(
const
char
*
file
,
const
char
*
function
,
const
int
line
,
const
char
*
s
)
{
const
char
*
msg
=
s
==
NULL
?
"no comment"
:
s
;
const
char
*
msg
=
s
==
NULL
?
"no comment"
:
s
;
printf
(
"Exiting at: %s:%d %s(), %s
\n
"
,
file
,
line
,
function
,
msg
);
printf
(
"Exiting at: %s:%d %s(), %s
\n
"
,
file
,
line
,
function
,
msg
);
exit
(
-
1
);
exit
(
-
1
);
}
}
// needed for some functions
// needed for some functions
PHY_VARS_NR_UE
*
PHY_vars_UE_g
[
1
][
1
]
=
{{
NULL
}};
PHY_VARS_NR_UE
*
PHY_vars_UE_g
[
1
][
1
]
=
{{
NULL
}};
uint16_t
n_rnti
=
0x1234
;
uint16_t
n_rnti
=
0x1234
;
char
quantize
(
double
D
,
double
x
,
unsigned
char
B
)
char
quantize
(
double
D
,
double
x
,
unsigned
char
B
)
{
{
double
qxd
;
double
qxd
;
short
maxlev
;
short
maxlev
;
qxd
=
floor
(
x
/
D
);
qxd
=
floor
(
x
/
D
);
maxlev
=
1
<<
(
B
-
1
);
//(char)(pow(2,B-1));
maxlev
=
1
<<
(
B
-
1
);
//(char)(pow(2,B-1));
//printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev);
//printf("x=%f,qxd=%f,maxlev=%d\n",x,qxd, maxlev);
...
@@ -103,11 +117,8 @@ char quantize(double D,double x,unsigned char B)
...
@@ -103,11 +117,8 @@ char quantize(double D,double x,unsigned char B)
return
((
char
)
qxd
);
return
((
char
)
qxd
);
}
}
int
main
(
int
argc
,
char
**
argv
)
int
main
(
int
argc
,
char
**
argv
)
{
{
char
c
;
char
c
;
int
i
;
//,j,l,aa;
int
i
;
//,j,l,aa;
double
SNR
,
SNR_lin
,
snr0
=-
2
.
0
,
snr1
=
2
.
0
;
double
SNR
,
SNR_lin
,
snr0
=-
2
.
0
,
snr1
=
2
.
0
;
double
snr_step
=
0
.
1
;
double
snr_step
=
0
.
1
;
...
@@ -120,42 +131,37 @@ int main(int argc, char **argv)
...
@@ -120,42 +131,37 @@ int main(int argc, char **argv)
uint8_t
write_output_file
=
0
;
uint8_t
write_output_file
=
0
;
// int subframe_offset;
// int subframe_offset;
// char fname[40], vname[40];
// char fname[40], vname[40];
int
trial
,
n_trials
=
1
,
n_errors
;
int
trial
,
n_trials
=
1
,
n_errors
=
0
,
n_false_positive
=
0
;
uint8_t
transmission_mode
=
1
,
n_tx
=
1
,
n_rx
=
1
;
uint8_t
transmission_mode
=
1
,
n_tx
=
1
,
n_rx
=
1
;
uint16_t
Nid_cell
=
0
;
uint16_t
Nid_cell
=
0
;
channel_desc_t
*
gNB2UE
;
channel_desc_t
*
gNB2UE
;
uint8_t
extended_prefix_flag
=
0
;
uint8_t
extended_prefix_flag
=
0
;
int8_t
interf1
=-
21
,
interf2
=-
21
;
int8_t
interf1
=-
21
,
interf2
=-
21
;
FILE
*
input_fd
=
NULL
,
*
pbch_file_fd
=
NULL
;
FILE
*
input_fd
=
NULL
,
*
pbch_file_fd
=
NULL
;
char
input_val_str
[
50
],
input_val_str2
[
50
];
char
input_val_str
[
50
],
input_val_str2
[
50
];
//uint16_t NB_RB=25;
//uint16_t NB_RB=25;
SCM_t
channel_model
=
AWGN
;
//Rayleigh1_anticorr;
SCM_t
channel_model
=
AWGN
;
//Rayleigh1_anticorr;
uint8_t
N_RB_DL
=
106
,
mu
=
1
;
uint8_t
N_RB_DL
=
106
,
mu
=
1
;
unsigned
char
frame_type
=
0
;
unsigned
char
frame_type
=
0
;
unsigned
char
pbch_phase
=
0
;
unsigned
char
pbch_phase
=
0
;
int
frame
=
0
,
subframe
=
0
;
int
frame
=
0
,
subframe
=
0
;
int
frame_length_complex_samples
;
int
frame_length_complex_samples
;
//int frame_length_complex_samples_no_prefix;
//int frame_length_complex_samples_no_prefix;
NR_DL_FRAME_PARMS
*
frame_parms
;
NR_DL_FRAME_PARMS
*
frame_parms
;
//nfapi_nr_config_request_t *gNB_config;
//nfapi_nr_config_request_t *gNB_config;
uint8_t
Kmimo
;
uint8_t
Kmimo
;
uint32_t
Nsoft
;
uint32_t
Nsoft
;
double
sigma
;
double
sigma
;
unsigned
char
qbits
=
8
;
unsigned
char
qbits
=
8
;
int
ret
;
int
ret
;
int
run_initial_sync
=
0
;
int
run_initial_sync
=
0
;
int
loglvl
=
OAILOG_WARNING
;
int
loglvl
=
OAILOG_WARNING
;
float
target_error_rate
=
0
.
01
;
float
target_error_rate
=
0
.
01
;
uint16_t
nb_symb_sch
=
12
;
uint16_t
nb_rb
=
50
;
uint8_t
Imcs
=
9
;
cpuf
=
get_cpu_freq_GHz
();
cpuf
=
get_cpu_freq_GHz
();
if
(
load_configmodule
(
argc
,
argv
)
==
0
)
{
if
(
load_configmodule
(
argc
,
argv
)
==
0
)
{
...
@@ -165,7 +171,7 @@ int main(int argc, char **argv)
...
@@ -165,7 +171,7 @@ int main(int argc, char **argv)
//logInit();
//logInit();
randominit
(
0
);
randominit
(
0
);
while
((
c
=
getopt
(
argc
,
argv
,
"
f:hA:pf:g:i:j:n:s:S:t:x:y:z:N:F:GR:d
P:"
))
!=
-
1
)
{
while
((
c
=
getopt
(
argc
,
argv
,
"
df:hpg:i:j:n:l:m:r:s:S:y:z:N:F:R:
P:"
))
!=
-
1
)
{
switch
(
c
)
{
switch
(
c
)
{
case
'f'
:
case
'f'
:
write_output_file
=
1
;
write_output_file
=
1
;
...
@@ -242,11 +248,6 @@ int main(int argc, char **argv)
...
@@ -242,11 +248,6 @@ int main(int argc, char **argv)
msg
(
"Setting SNR1 to %f
\n
"
,
snr1
);
msg
(
"Setting SNR1 to %f
\n
"
,
snr1
);
break
;
break
;
/*
case 't':
Td= atof(optarg);
break;
*/
case
'p'
:
case
'p'
:
extended_prefix_flag
=
1
;
extended_prefix_flag
=
1
;
break
;
break
;
...
@@ -260,17 +261,6 @@ int main(int argc, char **argv)
...
@@ -260,17 +261,6 @@ int main(int argc, char **argv)
}
}
break;
break;
*/
*/
case
'x'
:
transmission_mode
=
atoi
(
optarg
);
if
((
transmission_mode
!=
1
)
&&
(
transmission_mode
!=
2
)
&&
(
transmission_mode
!=
6
))
{
msg
(
"Unsupported transmission mode %d
\n
"
,
transmission_mode
);
exit
(
-
1
);
}
break
;
case
'y'
:
case
'y'
:
n_tx
=
atoi
(
optarg
);
n_tx
=
atoi
(
optarg
);
...
@@ -318,6 +308,18 @@ int main(int argc, char **argv)
...
@@ -318,6 +308,18 @@ int main(int argc, char **argv)
break
;
break
;
case
'm'
:
Imcs
=
atoi
(
optarg
);
break
;
case
'l'
:
nb_symb_sch
=
atoi
(
optarg
);
break
;
case
'r'
:
nb_rb
=
atoi
(
optarg
);
break
;
default:
default:
case
'h'
:
case
'h'
:
printf
(
"%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId
\n
"
,
printf
(
"%s -h(elp) -p(extended_prefix) -N cell_id -f output_filename -F input_filename -g channel_model -n n_frames -t Delayspread -s snr0 -S snr1 -x transmission_mode -y TXant -z RXant -i Intefrence0 -j Interference1 -A interpolation_file -C(alibration offset dB) -N CellId
\n
"
,
...
@@ -368,8 +370,8 @@ int main(int argc, char **argv)
...
@@ -368,8 +370,8 @@ int main(int argc, char **argv)
exit
(
-
1
);
exit
(
-
1
);
}
}
RC
.
gNB
=
(
PHY_VARS_gNB
**
*
)
malloc
(
sizeof
(
PHY_VARS_gNB
**
));
RC
.
gNB
=
(
PHY_VARS_gNB
**
*
)
malloc
(
sizeof
(
PHY_VARS_gNB
**
));
RC
.
gNB
[
0
]
=
(
PHY_VARS_gNB
**
)
malloc
(
sizeof
(
PHY_VARS_gNB
*
));
RC
.
gNB
[
0
]
=
(
PHY_VARS_gNB
**
)
malloc
(
sizeof
(
PHY_VARS_gNB
*
));
RC
.
gNB
[
0
][
0
]
=
malloc
(
sizeof
(
PHY_VARS_gNB
));
RC
.
gNB
[
0
][
0
]
=
malloc
(
sizeof
(
PHY_VARS_gNB
));
gNB
=
RC
.
gNB
[
0
][
0
];
gNB
=
RC
.
gNB
[
0
][
0
];
//gNB_config = &gNB->gNB_config;
//gNB_config = &gNB->gNB_config;
...
@@ -377,43 +379,36 @@ int main(int argc, char **argv)
...
@@ -377,43 +379,36 @@ int main(int argc, char **argv)
frame_parms
->
nb_antennas_tx
=
n_tx
;
frame_parms
->
nb_antennas_tx
=
n_tx
;
frame_parms
->
nb_antennas_rx
=
n_rx
;
frame_parms
->
nb_antennas_rx
=
n_rx
;
frame_parms
->
N_RB_DL
=
N_RB_DL
;
frame_parms
->
N_RB_DL
=
N_RB_DL
;
crcTableInit
();
crcTableInit
();
nr_phy_config_request_sim
(
gNB
,
N_RB_DL
,
N_RB_DL
,
mu
);
nr_phy_config_request_sim
(
gNB
,
N_RB_DL
,
N_RB_DL
,
mu
);
phy_init_nr_gNB
(
gNB
,
0
,
0
);
phy_init_nr_gNB
(
gNB
,
0
,
0
);
//init_eNB_afterRU();
//init_eNB_afterRU();
frame_length_complex_samples
=
frame_parms
->
samples_per_subframe
;
frame_length_complex_samples
=
frame_parms
->
samples_per_subframe
;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
//frame_length_complex_samples_no_prefix = frame_parms->samples_per_subframe_wCP;
s_re
=
malloc
(
2
*
sizeof
(
double
*
));
s_re
=
malloc
(
2
*
sizeof
(
double
*
));
s_im
=
malloc
(
2
*
sizeof
(
double
*
));
s_im
=
malloc
(
2
*
sizeof
(
double
*
));
r_re
=
malloc
(
2
*
sizeof
(
double
*
));
r_re
=
malloc
(
2
*
sizeof
(
double
*
));
r_im
=
malloc
(
2
*
sizeof
(
double
*
));
r_im
=
malloc
(
2
*
sizeof
(
double
*
));
txdata
=
malloc
(
2
*
sizeof
(
int
*
));
txdata
=
malloc
(
2
*
sizeof
(
int
*
));
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
s_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
s_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
s_re
[
i
],
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
));
s_im
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
s_im
[
i
],
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
));
r_re
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_re
[
i
],
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
));
r_im
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_im
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
bzero
(
r_im
[
i
],
frame_length_complex_samples
*
sizeof
(
double
));
txdata
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
int
));
txdata
[
i
]
=
malloc
(
frame_length_complex_samples
*
sizeof
(
int
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
int
));
bzero
(
r_re
[
i
],
frame_length_complex_samples
*
sizeof
(
int
));
}
}
if
(
pbch_file_fd
!=
NULL
)
{
if
(
pbch_file_fd
!=
NULL
)
{
load_pbch_desc
(
pbch_file_fd
);
load_pbch_desc
(
pbch_file_fd
);
}
}
/* for (int k=0; k<2; k++) {
/* for (int k=0; k<2; k++) {
// Create transport channel structures for 2 transport blocks (MIMO)
// Create transport channel structures for 2 transport blocks (MIMO)
for (i=0; i<2; i++) {
for (i=0; i<2; i++) {
gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config);
gNB->dlsch[k][i] = new_gNB_dlsch(Kmimo,8,Nsoft,0,frame_parms,gNB_config);
...
@@ -422,21 +417,20 @@ int main(int argc, char **argv)
...
@@ -422,21 +417,20 @@ int main(int argc, char **argv)
printf("Can't get eNB dlsch structures\n");
printf("Can't get eNB dlsch structures\n");
exit(-1);
exit(-1);
}
}
gNB->dlsch[k][i]->Nsoft = 10;
gNB->dlsch[k][i]->Nsoft = 10;
gNB->dlsch[k][i]->rnti = n_rnti+k;
gNB->dlsch[k][i]->rnti = n_rnti+k;
}
}
}*/
}*/
//configure UE
//configure UE
UE
=
malloc
(
sizeof
(
PHY_VARS_NR_UE
));
UE
=
malloc
(
sizeof
(
PHY_VARS_NR_UE
));
memcpy
(
&
UE
->
frame_parms
,
frame_parms
,
sizeof
(
NR_DL_FRAME_PARMS
));
memcpy
(
&
UE
->
frame_parms
,
frame_parms
,
sizeof
(
NR_DL_FRAME_PARMS
));
//phy_init_nr_top(frame_parms);
//phy_init_nr_top(frame_parms);
if
(
init_nr_ue_signal
(
UE
,
1
,
0
)
!=
0
)
if
(
init_nr_ue_signal
(
UE
,
1
,
0
)
!=
0
)
{
{
printf
(
"Error at UE NR initialisation
\n
"
);
printf
(
"Error at UE NR initialisation
\n
"
);
exit
(
-
1
);
exit
(
-
1
);
}
}
//nr_init_frame_parms_ue(&UE->frame_parms);
//nr_init_frame_parms_ue(&UE->frame_parms);
//init_nr_ue_transport(UE, 0);
//init_nr_ue_transport(UE, 0);
for
(
int
sf
=
0
;
sf
<
2
;
sf
++
)
{
for
(
int
sf
=
0
;
sf
<
2
;
sf
++
)
{
...
@@ -454,49 +448,37 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -454,49 +448,37 @@ gNB->dlsch[k][i]->Nsoft = 10;
UE
->
dlsch_SI
[
0
]
=
new_nr_ue_dlsch
(
1
,
1
,
Nsoft
,
5
,
N_RB_DL
,
0
);
UE
->
dlsch_SI
[
0
]
=
new_nr_ue_dlsch
(
1
,
1
,
Nsoft
,
5
,
N_RB_DL
,
0
);
UE
->
dlsch_ra
[
0
]
=
new_nr_ue_dlsch
(
1
,
1
,
Nsoft
,
5
,
N_RB_DL
,
0
);
UE
->
dlsch_ra
[
0
]
=
new_nr_ue_dlsch
(
1
,
1
,
Nsoft
,
5
,
N_RB_DL
,
0
);
unsigned
char
harq_pid
=
0
;
//dlsch->harq_ids[subframe];
unsigned
char
harq_pid
=
0
;
//dlsch->harq_ids[subframe];
NR_gNB_DLSCH_t
*
dlsch
=
gNB
->
dlsch
[
0
][
0
];
NR_gNB_DLSCH_t
*
dlsch
=
gNB
->
dlsch
[
0
][
0
];
nfapi_nr_dl_config_dlsch_pdu_rel15_t
rel15
=
dlsch
->
harq_processes
[
harq_pid
]
->
dlsch_pdu
.
dlsch_pdu_rel15
;
nfapi_nr_dl_config_dlsch_pdu_rel15_t
*
rel15
=
&
dlsch
->
harq_processes
[
harq_pid
]
->
dlsch_pdu
.
dlsch_pdu_rel15
;
// dlsch->harq_processes[0]->b = (unsigned char*)malloc16(800);
// dlsch->harq_processes[i]->pdu = (uint8_t*)malloc16(MAX_NR_DLSCH_PAYLOAD_BYTES/bw_scaling);
time_stats_t
*
rm_stats
;
time_stats_t
*
rm_stats
;
time_stats_t
*
te_stats
;
time_stats_t
*
te_stats
;
time_stats_t
*
i_stats
;
time_stats_t
*
i_stats
;
uint8_t
is_crnti
;
uint8_t
is_crnti
;
uint8_t
llr8_flag
;
uint8_t
llr8_flag
;
unsigned
int
TBS
=
8424
;
unsigned
int
TBS
=
8424
;
unsigned
int
available_bits
;
unsigned
int
available_bits
;
uint16_t
nb_symb_sch
=
8
;
uint8_t
nb_re_dmrs
=
6
;
uint8_t
nb_re_dmrs
=
6
;
uint16_t
length_dmrs
=
1
;
uint16_t
length_dmrs
=
1
;
unsigned
char
mod_order
;
unsigned
char
mod_order
;
uint16_t
nb_rb
=
50
;
uint8_t
Imcs
=
9
;
uint8_t
Nl
=
1
;
uint8_t
Nl
=
1
;
uint8_t
rvidx
=
0
;
uint8_t
rvidx
=
0
;
dlsch
->
rnti
=
1
;
dlsch
->
rnti
=
1
;
/*dlsch->harq_processes[0]->mcs = Imcs;
/*dlsch->harq_processes[0]->mcs = Imcs;
dlsch->harq_processes[0]->rvidx = rvidx;*/
dlsch->harq_processes[0]->rvidx = rvidx;*/
//printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe],
//printf("dlschsim harqid %d nb_rb %d, mscs %d\n",dlsch->harq_ids[subframe],
// dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl);
// dlsch->harq_processes[0]->nb_rb,dlsch->harq_processes[0]->mcs,dlsch->harq_processes[0]->Nl);
mod_order
=
nr_get_Qm
(
Imcs
,
1
);
mod_order
=
nr_get_Qm
(
Imcs
,
1
);
available_bits
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
mod_order
,
1
);
available_bits
=
nr_get_G
(
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
mod_order
,
1
);
TBS
=
nr_compute_tbs
(
Imcs
,
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
Nl
);
TBS
=
nr_compute_tbs
(
Imcs
,
nb_rb
,
nb_symb_sch
,
nb_re_dmrs
,
length_dmrs
,
Nl
);
printf
(
"available bits %d TBS %d mod_order %d
\n
"
,
available_bits
,
TBS
,
mod_order
);
printf
(
"available bits %d TBS %d mod_order %d
\n
"
,
available_bits
,
TBS
,
mod_order
);
//dlsch->harq_ids[subframe]= 0;
//dlsch->harq_ids[subframe]= 0;
rel15
.
n_prb
=
nb_rb
;
rel15
->
n_prb
=
nb_rb
;
rel15
.
nb_symbols
=
nb_symb_sch
;
rel15
->
nb_symbols
=
nb_symb_sch
;
rel15
.
modulation_order
=
mod_order
;
rel15
->
modulation_order
=
mod_order
;
rel15
.
nb_layers
=
Nl
;
rel15
->
nb_layers
=
Nl
;
rel15
.
nb_re_dmrs
=
nb_re_dmrs
;
rel15
->
nb_re_dmrs
=
nb_re_dmrs
;
rel15
->
transport_block_size
=
TBS
;
double
*
modulated_input
=
malloc16
(
sizeof
(
double
)
*
16
*
68
*
384
);
double
*
modulated_input
=
malloc16
(
sizeof
(
double
)
*
16
*
68
*
384
);
short
*
channel_output_fixed
=
malloc16
(
sizeof
(
short
)
*
16
*
68
*
384
);
short
*
channel_output_fixed
=
malloc16
(
sizeof
(
short
)
*
16
*
68
*
384
);
short
*
channel_output_uncoded
=
malloc16
(
sizeof
(
unsigned
short
)
*
16
*
68
*
384
);
short
*
channel_output_uncoded
=
malloc16
(
sizeof
(
unsigned
short
)
*
16
*
68
*
384
);
...
@@ -505,11 +487,9 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -505,11 +487,9 @@ gNB->dlsch[k][i]->Nsoft = 10;
unsigned
char
*
estimated_output_bit
;
unsigned
char
*
estimated_output_bit
;
unsigned
char
*
test_input_bit
;
unsigned
char
*
test_input_bit
;
unsigned
int
errors_bit
=
0
;
unsigned
int
errors_bit
=
0
;
test_input_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
test_input_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
estimated_output_bit
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
16
*
68
*
384
);
NR_UE_DLSCH_t
*
dlsch0_ue
=
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
];
NR_UE_DLSCH_t
*
dlsch0_ue
=
UE
->
dlsch
[
UE
->
current_thread_id
[
subframe
]][
0
][
0
];
NR_DL_UE_HARQ_t
*
harq_process
=
dlsch0_ue
->
harq_processes
[
harq_pid
];
NR_DL_UE_HARQ_t
*
harq_process
=
dlsch0_ue
->
harq_processes
[
harq_pid
];
harq_process
->
mcs
=
Imcs
;
harq_process
->
mcs
=
Imcs
;
...
@@ -518,11 +498,11 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -518,11 +498,11 @@ gNB->dlsch[k][i]->Nsoft = 10;
harq_process
->
Qm
=
mod_order
;
harq_process
->
Qm
=
mod_order
;
harq_process
->
rvidx
=
rvidx
;
harq_process
->
rvidx
=
rvidx
;
printf
(
"harq process ue mcs = %d Qm = %d
\n
"
,
harq_process
->
mcs
,
harq_process
->
Qm
);
printf
(
"harq process ue mcs = %d Qm = %d
\n
"
,
harq_process
->
mcs
,
harq_process
->
Qm
);
unsigned
char
*
test_input
;
unsigned
char
*
test_input
;
test_input
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
TBS
/
8
);
test_input
=
(
unsigned
char
*
)
malloc16
(
sizeof
(
unsigned
char
)
*
TBS
/
8
);
for
(
i
=
0
;
i
<
TBS
/
8
;
i
++
)
{
test_input
[
i
]
=
(
unsigned
char
)
rand
();}
for
(
i
=
0
;
i
<
TBS
/
8
;
i
++
)
test_input
[
i
]
=
(
unsigned
char
)
rand
();
estimated_output
=
harq_process
->
b
;
estimated_output
=
harq_process
->
b
;
...
@@ -537,20 +517,20 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -537,20 +517,20 @@ gNB->dlsch[k][i]->Nsoft = 10;
subframe
,
subframe
,
dlsch
,
dlsch
,
frame_parms
);
frame_parms
);
}
}
for
(
SNR
=
snr0
;
SNR
<
snr1
;
SNR
+=
snr_step
)
for
(
SNR
=
snr0
;
SNR
<
snr1
;
SNR
+=
snr_step
)
{
{
n_errors
=
0
;
for
(
trial
=
0
;
trial
<
n_trials
;
trial
++
)
n_false_positive
=
0
;
{
for
(
trial
=
0
;
trial
<
n_trials
;
trial
++
)
{
for
(
i
=
0
;
i
<
available_bits
;
i
++
)
{
for
(
i
=
0
;
i
<
available_bits
;
i
++
)
{
#ifdef DEBUG_CODER
#ifdef DEBUG_CODER
if
((
i
&
0xf
)
==
0
)
if
((
i
&
0xf
)
==
0
)
printf
(
"
\n
e %d..%d: "
,
i
,
i
+
15
);
printf
(
"
\n
e %d..%d: "
,
i
,
i
+
15
);
#endif
#endif
//if (i<16)
//if (i<16)
// printf("encoder output f[%d] = %d\n",i,dlsch->harq_processes[0]->f[i]);
// printf("encoder output f[%d] = %d\n",i,dlsch->harq_processes[0]->f[i]);
...
@@ -560,7 +540,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -560,7 +540,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
modulated_input
[
i
]
=-
1
.
0
;
///sqrt(2);
modulated_input
[
i
]
=-
1
.
0
;
///sqrt(2);
//if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]);
//if (i<16) printf("modulated_input[%d] = %d\n",i,modulated_input[i]);
//SNR =10;
//SNR =10;
SNR_lin
=
pow
(
10
,
SNR
/
10
.
0
);
SNR_lin
=
pow
(
10
,
SNR
/
10
.
0
);
sigma
=
1
.
0
/
sqrt
(
2
*
SNR_lin
);
sigma
=
1
.
0
/
sqrt
(
2
*
SNR_lin
);
...
@@ -569,7 +548,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -569,7 +548,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
//printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
//printf("llr[%d]=%d\n",i,channel_output_fixed[i]);
//printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]);
//printf("channel_output_fixed[%d]: %d\n",i,channel_output_fixed[i]);
//channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits);
//channel_output_fixed[i] = (char)quantize(1,channel_output_fixed[i],qbits);
//if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]);
//if (i<16) printf("channel_output_fixed[%d] = %d\n",i,channel_output_fixed[i]);
...
@@ -582,19 +560,15 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -582,19 +560,15 @@ gNB->dlsch[k][i]->Nsoft = 10;
if
(
channel_output_uncoded
[
i
]
!=
dlsch
->
harq_processes
[
harq_pid
]
->
f
[
i
])
if
(
channel_output_uncoded
[
i
]
!=
dlsch
->
harq_processes
[
harq_pid
]
->
f
[
i
])
errors_bit_uncoded
=
errors_bit_uncoded
+
1
;
errors_bit_uncoded
=
errors_bit_uncoded
+
1
;
}
}
//if (errors_bit_uncoded>10)
//if (errors_bit_uncoded>10)
printf
(
"errors bits uncoded %f
\n
"
,
errors_bit_uncoded
);
printf
(
"errors bits uncoded %f
\n
"
,
errors_bit_uncoded
);
#ifdef DEBUG_CODER
#ifdef DEBUG_CODER
printf
(
"
\n
"
);
printf
(
"
\n
"
);
exit
(
-
1
);
exit
(
-
1
);
#endif
#endif
ret
=
nr_dlsch_decoding
(
UE
,
nr_dlsch_decoding
(
UE
,
channel_output_fixed
,
channel_output_fixed
,
&
UE
->
frame_parms
,
&
UE
->
frame_parms
,
dlsch0_ue
,
dlsch0_ue
,
...
@@ -606,24 +580,35 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -606,24 +580,35 @@ gNB->dlsch[k][i]->Nsoft = 10;
is_crnti
,
is_crnti
,
llr8_flag
);
llr8_flag
);
if
(
ret
>
dlsch0_ue
->
max_ldpc_iterations
)
n_errors
++
;
//count errors
//count errors
for
(
i
=
0
;
i
<
TBS
;
i
++
)
errors_bit
=
0
;
{
for
(
i
=
0
;
i
<
TBS
;
i
++
)
{
estimated_output_bit
[
i
]
=
(
estimated_output
[
i
/
8
]
&
(
1
<<
(
i
&
7
)))
>>
(
i
&
7
);
estimated_output_bit
[
i
]
=
(
estimated_output
[
i
/
8
]
&
(
1
<<
(
i
&
7
)))
>>
(
i
&
7
);
test_input_bit
[
i
]
=
(
test_input
[
i
/
8
]
&
(
1
<<
(
i
&
7
)))
>>
(
i
&
7
);
// Further correct for multiple segments
test_input_bit
[
i
]
=
(
test_input
[
i
/
8
]
&
(
1
<<
(
i
&
7
)))
>>
(
i
&
7
);
// Further correct for multiple segments
if
(
estimated_output_bit
[
i
]
!=
test_input_bit
[
i
])
{
if
(
estimated_output_bit
[
i
]
!=
test_input_bit
[
i
])
{
errors_bit
=
(
errors_bit
)
+
1
;
errors_bit
++
;
//printf("estimated bits error occurs @%d ",i);
//printf("estimated bits error occurs @%d ",i);
}
}
}
}
//if (errors_bit>10)
if
(
errors_bit
>
0
)
{
n_false_positive
++
;
if
(
n_trials
==
1
)
printf
(
"
\n
errors_bit %d (trial %d)
\n
"
,
errors_bit
,
trial
);
printf
(
"
\n
errors_bit %d (trial %d)
\n
"
,
errors_bit
,
trial
);
}
}
}
printf
(
"SNR %f, BER %f
\n
"
,
SNR
,(
float
)
errors_bit
/
(
float
)
n_trials
/
(
float
)
TBS
);
printf
(
"SNR %f, BLER %f (false positive %f)
\n
"
,
SNR
,(
float
)
n_errors
/
(
float
)
n_trials
,(
float
)
n_false_positive
/
(
float
)
n_trials
);
if
((
float
)
n_errors
/
(
float
)
n_trials
<
target_error_rate
)
break
;
}
}
/*LOG_M("txsigF0.m","txsF0", gNB->common_vars.txdataF[0],frame_length_complex_samples_no_prefix,1,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)
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);*/
LOG_M("txsigF1.m","txsF1", gNB->common_vars.txdataF[1],frame_length_complex_samples_no_prefix,1,1);*/
...
@@ -657,7 +642,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -657,7 +642,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
}
}
}*/
}*/
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
i
=
0
;
i
<
2
;
i
++
)
{
printf
(
"gNB %d
\n
"
,
i
);
printf
(
"gNB %d
\n
"
,
i
);
free_gNB_dlsch
(
gNB
->
dlsch
[
0
][
i
]);
free_gNB_dlsch
(
gNB
->
dlsch
[
0
][
i
]);
...
@@ -686,7 +670,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
...
@@ -686,7 +670,6 @@ gNB->dlsch[k][i]->Nsoft = 10;
fclose
(
input_fd
);
fclose
(
input_fd
);
return
(
n_errors
);
return
(
n_errors
);
}
}
...
...
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