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
alex037yang
OpenXG-RAN
Commits
2bd4e043
Commit
2bd4e043
authored
Feb 15, 2021
by
frtabu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix dlsim dlsch parallelisation
parent
d953b253
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
35 additions
and
65 deletions
+35
-65
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+26
-61
openair1/SIMULATION/NR_PHY/dlsim.c
openair1/SIMULATION/NR_PHY/dlsim.c
+9
-4
No files found.
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
2bd4e043
...
...
@@ -264,9 +264,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
LOG_D
(
PHY
,
"****** start TX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_tx
,
slot_tx
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
phy_proc_tx
);
#endif
if
(
ue
->
UE_mode
[
gNB_id
]
<=
PUSCH
){
...
...
@@ -296,9 +295,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
LOG_D
(
PHY
,
"****** end TX-Chain for AbsSubframe %d.%d ******
\n
"
,
frame_tx
,
slot_tx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX
,
VCD_FUNCTION_OUT
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
phy_proc_tx
);
#endif
}
...
...
@@ -741,9 +739,7 @@ int nr_ue_pdcch_procedures(uint8_t gNB_id,
// send to mac
ue
->
if_inst
->
dl_indication
(
&
dl_indication
,
NULL
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_rx_pdcch_stats
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES
,
VCD_FUNCTION_OUT
);
return
(
dci_cnt
);
...
...
@@ -827,12 +823,10 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
else
first_symbol_flag
=
0
;
#if UE_TIMING_TRACE
uint8_t
slot
=
0
;
if
(
m
>=
ue
->
frame_parms
.
symbols_per_slot
>>
1
)
slot
=
1
;
start_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
proc
->
thread_id
][
slot
]);
#endif
// process DLSCH received symbols in the slot
// symbol by symbol processing (if data/DMRS are multiplexed is checked inside the function)
if
(
pdsch
==
PDSCH
||
pdsch
==
SI_PDSCH
||
pdsch
==
RA_PDSCH
)
{
...
...
@@ -851,13 +845,11 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
return
-
1
;
}
else
AssertFatal
(
1
==
0
,
"Not RA_PDSCH, SI_PDSCH or PDSCH
\n
"
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_llr_stats_parallelization
[
proc
->
thread_id
][
slot
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
m
,
ue
->
dlsch_llr_stats_parallelization
[
proc
->
thread_id
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_D
(
PHY
,
"[AbsSFN %d.%d] LLR Computation Symbol %d %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
m
,
ue
->
dlsch_llr_stats_parallelization
[
proc
->
thread_id
][
slot
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
if
(
first_symbol_flag
)
{
...
...
@@ -965,9 +957,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dmrs_len
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch0
->
harq_processes
[
harq_pid
]
->
Nl
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
nr_dlsch_unscrambling
(
pdsch_vars
->
llr
[
0
],
dlsch0
->
harq_processes
[
harq_pid
]
->
G
,
0
,
...
...
@@ -975,9 +965,8 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch0
->
rnti
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
#if 0
LOG_I(PHY," ------ start ldpc decoder for AbsSubframe %d.%d / %d ------ \n", frame_rx, nr_slot_rx, harq_pid);
...
...
@@ -990,9 +979,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_I(PHY,"start ldpc decode for CW 0 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_slot_rx, harq_pid, ue->pdcch_vars[proc->thread_id][eNB_id]->num_pdcch_symbols);
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
]);
#endif
if
(
dlsch_parallel
)
{
...
...
@@ -1030,7 +1019,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
]);
#if DISABLE_LOG_X
printf
(
" --> Unscrambling for CW0 %5.3f
\n
"
,
...
...
@@ -1044,7 +1032,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
frame_rx
%
1024
,
nr_slot_rx
,(
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
].
p_time
)
/
(
cpuf
*
1000
.
0
));
#endif
#endif
if
(
is_cw1_active
)
{
// start ldpc decode for CW 1
...
...
@@ -1054,17 +1041,17 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dmrs_len
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Qm
,
dlsch1
->
harq_processes
[
harq_pid
]
->
Nl
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
nr_dlsch_unscrambling
(
pdsch_vars
->
llr
[
1
],
dlsch1
->
harq_processes
[
harq_pid
]
->
G
,
0
,
ue
->
frame_parms
.
Nid_cell
,
dlsch1
->
rnti
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_unscrambling_stats
);
#endif
#if 0
LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> nb_rb %d \n", frame_rx, nr_slot_rx, harq_pid, dlsch1->harq_processes[harq_pid]->nb_rb);
...
...
@@ -1076,9 +1063,9 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_I(PHY,"start ldpc decode for CW 1 for AbsSubframe %d.%d / %d --> Pdcch Sym %d \n", frame_rx, nr_slot_rx, harq_pid, ue->pdcch_vars[proc->thread_id][eNB_id]->num_pdcch_symbols);
#endif
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
]);
#endif
if
(
dlsch_parallel
)
{
...
...
@@ -1115,7 +1102,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
LOG_T
(
PHY
,
"CWW sequential dlsch decoding, ret1 = %d
\n
"
,
ret1
);
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
]);
#if DISABLE_LOG_X
printf
(
" --> Unscrambling for CW1 %5.3f
\n
"
,
...
...
@@ -1127,8 +1114,6 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
(
ue
->
dlsch_unscrambling_stats
.
p_time
)
/
(
cpuf
*
1000
.
0
));
LOG_D
(
PHY
,
"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f
\n
"
,
frame_rx
%
1024
,
nr_slot_rx
,(
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
].
p_time
)
/
(
cpuf
*
1000
.
0
));
#endif
#endif
LOG_I
(
PHY
,
"AbsSubframe %d.%d --> ldpc Decoding for CW1 %5.3f
\n
"
,
frame_rx
%
1024
,
nr_slot_rx
,(
ue
->
dlsch_decoding_stats
[
proc
->
thread_id
].
p_time
)
/
(
cpuf
*
1000
.
0
));
...
...
@@ -1322,9 +1307,9 @@ void *UE_thread_slot1_dl_processing(void *arg) {
}
/**** Slot1 FE Processing ****/
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ue_front_end_per_slot_stat
[
proc
->
thread_id
][
1
]);
#endif
// I- start dl slot1 processing
// do first symbol of next downlink nr_slot_rx for channel estimation
/*
...
...
@@ -1349,9 +1334,8 @@ void *UE_thread_slot1_dl_processing(void *arg) {
{
//if( (l != pilot0) && (l != pilot1))
{
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_IN
);
//printf("AbsSubframe %d.%d FFT slot %d, symbol %d\n", frame_rx,nr_slot_rx,slot1,l);
front_end_fft
(
ue
,
...
...
@@ -1360,9 +1344,7 @@ void *UE_thread_slot1_dl_processing(void *arg) {
0
,
0
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP
,
VCD_FUNCTION_OUT
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
}
}
// for l=1..l2
...
...
@@ -1415,14 +1397,13 @@ void *UE_thread_slot1_dl_processing(void *arg) {
//printf(" [slot1 dl processing] ==> Start LLR Comuptation slot1 for AbsSubframe %d.%d \n", proc->frame_rx, proc->nr_slot_rx);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
ue_front_end_per_slot_stat
[
proc
->
thread_id
][
1
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
ue
->
ue_front_end_per_slot_stat
[
proc
->
thread_id
][
1
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_D
(
PHY
,
"[AbsSFN %d.%d] Slot1: FFT + Channel Estimate + Pdsch Proc Slot0 %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
ue
->
ue_front_end_per_slot_stat
[
proc
->
thread_id
][
1
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
//wait until pdcch is decoded
...
...
@@ -1440,9 +1421,8 @@ void *UE_thread_slot1_dl_processing(void *arg) {
//printf("AbsSubframe %d.%d Pdsch Procedure (slot1)\n",frame_rx,nr_slot_rx);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
pdsch_procedures_per_slot_stat
[
proc
->
thread_id
][
1
]);
#endif
// start slave thread for Pdsch Procedure (slot1)
// do procedures for C-RNTI
uint8_t
eNB_id
=
0
;
...
...
@@ -1512,13 +1492,11 @@ void *UE_thread_slot1_dl_processing(void *arg) {
proc
->
llr_slot1_available
=
1
;
//printf("Set available LLR slot1 to 1 AbsSubframe %d.%d \n",frame_rx,nr_slot_rx);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
pdsch_procedures_per_slot_stat
[
proc
->
thread_id
][
1
]);
#if DISABLE_LOG_X
printf
(
"[AbsSFN %d.%d] Slot1: LLR Computation %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
ue
->
pdsch_procedures_per_slot_stat
[
proc
->
thread_id
][
1
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_D
(
PHY
,
"[AbsSFN %d.%d] Slot1: LLR Computation %5.2f
\n
"
,
frame_rx
,
nr_slot_rx
,
ue
->
pdsch_procedures_per_slot_stat
[
proc
->
thread_id
][
1
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
if
(
pthread_mutex_lock
(
&
proc
->
mutex_slot1_dl_processing
)
!=
0
)
{
...
...
@@ -1658,13 +1636,11 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
(
ue
->
symbol_offset
+
i
)
%
(
fp
->
symbols_per_slot
),
nr_slot_rx
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
nr_pbch_channel_estimation
(
ue
,
proc
,
0
,
nr_slot_rx
,(
ue
->
symbol_offset
+
i
)
%
(
fp
->
symbols_per_slot
),
i
-
1
,(
fp
->
ssb_index
)
&
7
,
fp
->
half_frame_bit
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_channel_estimation_stats
);
#endif
}
nr_ue_rsrp_measurements
(
ue
,
gNB_id
,
proc
,
nr_slot_rx
,
0
);
...
...
@@ -1703,7 +1679,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP_PDCCH
,
VCD_FUNCTION_IN
);
for
(
uint16_t
l
=
0
;
l
<
nb_symb_pdcch
;
l
++
)
{
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
nr_slot_fep
(
ue
,
...
...
@@ -1727,9 +1702,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
fp
->
first_carrier_offset
+
(
pdcch_vars
->
pdcch_config
[
n_ss
].
BWPStart
+
coreset_start_rb
)
*
12
,
coreset_nb_rb
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
ofdm_demod_stats
);
#endif
dci_cnt
=
dci_cnt
+
nr_ue_pdcch_procedures
(
gNB_id
,
ue
,
proc
);
}
...
...
@@ -1773,9 +1747,8 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
#endif //NR_PDCCH_SCHED
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat
);
#endif
// do procedures for C-RNTI
int
ret_pdsch
=
0
;
if
(
ue
->
dlsch
[
proc
->
thread_id
][
gNB_id
][
0
]
->
active
==
1
)
{
...
...
@@ -1871,9 +1844,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
LOG_D
(
PHY
,
"DLSCH data reception at nr_slot_rx: %d
\n
\n
"
,
nr_slot_rx
);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_IN
);
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
dlsch_procedures_stat
[
proc
->
thread_id
]);
#endif
if
(
ret_pdsch
>=
0
)
nr_ue_dlsch_procedures
(
ue
,
...
...
@@ -1885,8 +1856,6 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
&
ue
->
dlsch_errors
[
gNB_id
],
dlsch_parallel
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
dlsch_procedures_stat
[
proc
->
thread_id
]);
#if DISABLE_LOG_X
printf
(
"[SFN %d] Slot1: Pdsch Proc %5.2f
\n
"
,
nr_slot_rx
,
ue
->
pdsch_procedures_stat
[
proc
->
thread_id
].
p_time
/
(
cpuf
*
1000
.
0
));
...
...
@@ -1896,7 +1865,7 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
LOG_D
(
PHY
,
"[SFN %d] Slot0 Slot1: Dlsch Proc %5.2f
\n
"
,
nr_slot_rx
,
ue
->
dlsch_procedures_stat
[
proc
->
thread_id
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
// deactivate dlsch once dlsch proc is done
ue
->
dlsch
[
proc
->
thread_id
][
gNB_id
][
0
]
->
active
=
0
;
...
...
@@ -1904,9 +1873,9 @@ int phy_procedures_nrUE_RX(PHY_VARS_NR_UE *ue,
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_PROC
,
VCD_FUNCTION_OUT
);
}
#if UE_TIMING_TRACE
start_meas
(
&
ue
->
generic_stat
);
#endif
#if 0
...
...
@@ -1971,10 +1940,8 @@ if (nr_slot_rx==9) {
}
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat
);
printf
(
"after tubo until end of Rx %5.2f
\n
"
,
ue
->
generic_stat
.
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#ifdef EMOS
phy_procedures_emos_UE_RX
(
ue
,
slot
,
gNB_id
);
...
...
@@ -1983,14 +1950,12 @@ phy_procedures_emos_UE_RX(ue,slot,gNB_id);
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME
(
VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX
,
VCD_FUNCTION_OUT
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
phy_proc_rx
[
proc
->
thread_id
]);
#if DISABLE_LOG_X
printf
(
"------FULL RX PROC [SFN %d]: %5.2f ------
\n
"
,
nr_slot_rx
,
ue
->
phy_proc_rx
[
proc
->
thread_id
].
p_time
/
(
cpuf
*
1000
.
0
));
#else
LOG_D
(
PHY
,
"------FULL RX PROC [SFN %d]: %5.2f ------
\n
"
,
nr_slot_rx
,
ue
->
phy_proc_rx
[
proc
->
thread_id
].
p_time
/
(
cpuf
*
1000
.
0
));
#endif
#endif
//#endif //pdsch
...
...
openair1/SIMULATION/NR_PHY/dlsim.c
View file @
2bd4e043
...
...
@@ -381,7 +381,7 @@ int main(int argc, char **argv)
FILE
*
scg_fd
=
NULL
;
while
((
c
=
getopt
(
argc
,
argv
,
"f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:
d
:e:m:w:T:U:q"
))
!=
-
1
)
{
while
((
c
=
getopt
(
argc
,
argv
,
"f:hA:pf:g:i:j:n:s:S:t:x:y:z:M:N:F:GR:dPIL:Ea:b:
D
:e:m:w:T:U:q"
))
!=
-
1
)
{
switch
(
c
)
{
case
'f'
:
scg_fd
=
fopen
(
optarg
,
"r"
);
...
...
@@ -548,7 +548,7 @@ int main(int argc, char **argv)
case
'b'
:
g_rbSize
=
atoi
(
optarg
);
break
;
case
'
d
'
:
case
'
D
'
:
dlsch_threads
=
atoi
(
optarg
);
break
;
case
'e'
:
...
...
@@ -621,7 +621,7 @@ int main(int argc, char **argv)
printf
(
"-U Change DMRS Config, arguments list DMRS TYPE{0=A,1=B} DMRS AddPos{0:2}, e.g. -U 2 0 2
\n
"
);
printf
(
"-P Print DLSCH performances
\n
"
);
printf
(
"-w Write txdata to binary file (one frame)
\n
"
);
printf
(
"-
d
number of dlsch threads, 0: no dlsch parallelization
\n
"
);
printf
(
"-
D
number of dlsch threads, 0: no dlsch parallelization
\n
"
);
exit
(
-
1
);
break
;
}
...
...
@@ -638,7 +638,7 @@ int main(int argc, char **argv)
if
(
snr1set
==
0
)
snr1
=
snr0
+
10
;
init_dlsch_tpool
(
dlsch_threads
);
RC
.
gNB
=
(
PHY_VARS_gNB
**
)
malloc
(
sizeof
(
PHY_VARS_gNB
*
));
...
...
@@ -923,6 +923,11 @@ int main(int argc, char **argv)
//NR_COMMON_channels_t *cc = RC.nrmac[0]->common_channels;
snrRun
=
0
;
if
(
dlsch_threads
)
{
init_dlsch_tpool
(
dlsch_threads
);
pthread_t
dlsch0_threads
;
threadCreate
(
&
dlsch0_threads
,
dlsch_thread
,
(
void
*
)
UE
,
"DLthread"
,
-
1
,
OAI_PRIORITY_RT_MAX
-
1
);
}
for
(
SNR
=
snr0
;
SNR
<
snr1
;
SNR
+=
.
2
)
{
...
...
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