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
lizhongxiao
OpenXG-RAN
Commits
47658e56
Commit
47658e56
authored
Apr 24, 2018
by
Raymond Knopp
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
addition of SLDCH transmission, SPSS table
parent
219ddeed
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
691 additions
and
154 deletions
+691
-154
openair1/PHY/INIT/lte_init_ue.c
openair1/PHY/INIT/lte_init_ue.c
+51
-37
openair1/PHY/LTE_REFSIG/primary_synch.m
openair1/PHY/LTE_REFSIG/primary_synch.m
+27
-20
openair1/PHY/LTE_REFSIG/primary_synch_SL.h
openair1/PHY/LTE_REFSIG/primary_synch_SL.h
+2
-0
openair1/PHY/LTE_TRANSPORT/defs.h
openair1/PHY/LTE_TRANSPORT/defs.h
+22
-1
openair1/PHY/LTE_TRANSPORT/drs_modulation.c
openair1/PHY/LTE_TRANSPORT/drs_modulation.c
+9
-3
openair1/PHY/LTE_TRANSPORT/sldch.c
openair1/PHY/LTE_TRANSPORT/sldch.c
+481
-36
openair1/PHY/LTE_TRANSPORT/slsch.c
openair1/PHY/LTE_TRANSPORT/slsch.c
+54
-45
openair1/PHY/defs.h
openair1/PHY/defs.h
+13
-4
openair1/PHY/impl_defs_lte.h
openair1/PHY/impl_defs_lte.h
+3
-4
openair1/SIMULATION/LTE_PHY/slschsim.c
openair1/SIMULATION/LTE_PHY/slschsim.c
+29
-4
No files found.
openair1/PHY/INIT/lte_init_ue.c
View file @
47658e56
...
...
@@ -935,45 +935,55 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
init_prach_tables
(
839
);
ue
->
pusch_slsch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_slcch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_slcch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_slcch
->
rxdataF_ext
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
drs_ch_estimates
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
rxdataF_comp
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
ul_ch_mag
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slsch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_slsch
->
rxdataF_ext
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slsch
->
drs_ch_estimates
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slsch
->
rxdataF_comp
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slsch
->
ul_ch_mag
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
slsch_rxdata_7_5kHz
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
slsch_rxdataF
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_sldch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_sldch
->
rxdataF_ext
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_sldch
->
drs_ch_estimates
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_sldch
->
rxdataF_comp
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_sldch
->
ul_ch_mag
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
sl_rxdata_7_5kHz
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
sl_rxdataF
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
for
(
int
aa
=
0
;
aa
<
ue
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
ue
->
sl_rxdataF
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
ofdm_symbol_size
*
14
*
sizeof
(
int32_t
));
ue
->
sl_rxdata_7_5kHz
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
samples_per_tti
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
rxdataF_ext
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
drs_ch_estimates
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
rxdataF_comp
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
ul_ch_mag
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slsch
->
rxdataF_ext
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slsch
->
drs_ch_estimates
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slsch
->
rxdataF_comp
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slsch
->
ul_ch_mag
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
slsch_rxdataF
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
ofdm_symbol_size
*
14
*
sizeof
(
int32_t
));
ue
->
slsch_rxdata_7_5kHz
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
samples_per_tti
*
sizeof
(
int32_t
));
ue
->
pusch_sldch
->
rxdataF_ext
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_sldch
->
drs_ch_estimates
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_sldch
->
rxdataF_comp
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_sldch
->
ul_ch_mag
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
}
ue
->
slsch_dlsch_llr
=
(
int16_t
**
)
malloc
(
2
*
6
*
12
*
1200
*
sizeof
(
int16_t
*
));
ue
->
slsch_ulsch_llr
=
(
int16_t
**
)
malloc
(
2
*
6
*
12
*
1200
*
sizeof
(
int16_t
*
));
ue
->
sldch_dlsch_llr
=
(
int16_t
**
)
malloc
(
2
*
2
*
12
*
1200
*
sizeof
(
int16_t
*
));
ue
->
sldch_ulsch_llr
=
(
int16_t
**
)
malloc
(
2
*
2
*
12
*
1200
*
sizeof
(
int16_t
*
));
ue
->
pusch_slcch
=
(
LTE_eNB_PUSCH
*
)
malloc
(
sizeof
(
LTE_eNB_PUSCH
));
ue
->
pusch_slcch
->
rxdataF_ext
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
drs_ch_estimates
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
rxdataF_comp
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
pusch_slcch
->
ul_ch_mag
=
(
int32_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
slcch_rxdata_7_5kHz
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
ue
->
slcch_rxdataF
=
(
int16_t
**
)
malloc
(
2
*
sizeof
(
int32_t
*
));
for
(
int
aa
=
0
;
aa
<
ue
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
ue
->
pusch_slcch
->
rxdataF_ext
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
drs_ch_estimates
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
rxdataF_comp
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
pusch_slcch
->
ul_ch_mag
[
aa
]
=
(
int32_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
N_RB_DL
*
12
*
14
*
sizeof
(
int32_t
));
ue
->
slcch_rxdataF
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
ofdm_symbol_size
*
14
*
sizeof
(
int32_t
));
ue
->
slcch_rxdata_7_5kHz
[
aa
]
=
(
int16_t
*
)
malloc16_clear
(
ue
->
frame_parms
.
samples_per_tti
*
sizeof
(
int32_t
));
}
return
0
;
}
...
...
@@ -999,6 +1009,7 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
}
ue
->
dlsch_rx_slsch
=
new_ue_dlsch
(
1
,
4
,
NSOFT
,
1
,
MAX_TURBO_ITERATIONS
,
ue
->
frame_parms
.
N_RB_DL
,
abstraction_flag
);
for
(
int
i
=
0
;
i
<
MAX_SLDCH
;
i
++
)
ue
->
dlsch_rx_sldch
[
i
]
=
new_ue_dlsch
(
1
,
4
,
NSOFT
,
1
,
MAX_TURBO_ITERATIONS
,
ue
->
frame_parms
.
N_RB_DL
,
abstraction_flag
);
ue
->
dlsch_slsch
=
new_eNB_dlsch
(
1
,
1
,
NSOFT
,
ue
->
frame_parms
.
N_RB_DL
,
abstraction_flag
,
&
ue
->
frame_parms
);
ue
->
ulsch_slsch
=
new_ue_ulsch
(
ue
->
frame_parms
.
N_RB_DL
,
abstraction_flag
);
for
(
i
=
0
;
i
<
10
;
i
++
)
ue
->
dlsch_slsch
->
harq_ids
[
i
]
=
0
;
...
...
@@ -1015,34 +1026,37 @@ void init_lte_ue_transport(PHY_VARS_UE *ue,int abstraction_flag) {
void
free_ue_resources
(
PHY_VARS_UE
*
ue
)
{
for
(
int
aa
=
0
;
aa
<
ue
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
free
(
ue
->
sl_rxdataF
[
aa
]);
free
(
ue
->
sl_rxdata_7_5kHz
[
aa
]);
free
(
ue
->
pusch_slcch
->
rxdataF_ext
[
aa
]);
free
(
ue
->
pusch_slcch
->
drs_ch_estimates
[
aa
]);
free
(
ue
->
pusch_slcch
->
rxdataF_comp
[
aa
]);
free
(
ue
->
pusch_slcch
->
ul_ch_mag
[
aa
]);
free
(
ue
->
slcch_rxdataF
[
aa
]);
free
(
ue
->
slcch_rxdata_7_5kHz
[
aa
]);
}
free
(
ue
->
pusch_slcch
->
rxdataF_ext
);
free
(
ue
->
pusch_slcch
->
drs_ch_estimates
);
free
(
ue
->
pusch_slcch
->
rxdataF_comp
);
free
(
ue
->
pusch_slcch
->
ul_ch_mag
);
free
(
ue
->
slcch_rxdataF
);
free
(
ue
->
slcch_rxdata_7_5kHz
);
for
(
int
aa
=
0
;
aa
<
ue
->
frame_parms
.
nb_antennas_rx
;
aa
++
)
{
free
(
ue
->
pusch_slsch
->
rxdataF_ext
[
aa
]);
free
(
ue
->
pusch_slsch
->
drs_ch_estimates
[
aa
]);
free
(
ue
->
pusch_slsch
->
rxdataF_comp
[
aa
]);
free
(
ue
->
pusch_slsch
->
ul_ch_mag
[
aa
]);
free
(
ue
->
slsch_rxdataF
[
aa
]);
free
(
ue
->
slsch_rxdata_7_5kHz
[
aa
]);
free
(
ue
->
pusch_sldch
->
rxdataF_ext
[
aa
]);
free
(
ue
->
pusch_sldch
->
drs_ch_estimates
[
aa
]);
free
(
ue
->
pusch_sldch
->
rxdataF_comp
[
aa
]);
free
(
ue
->
pusch_sldch
->
ul_ch_mag
[
aa
]);
}
free
(
ue
->
sl_rxdataF
);
free
(
ue
->
sl_rxdata_7_5kHz
);
free
(
ue
->
pusch_slcch
->
rxdataF_ext
);
free
(
ue
->
pusch_slcch
->
drs_ch_estimates
);
free
(
ue
->
pusch_slcch
->
rxdataF_comp
);
free
(
ue
->
pusch_slcch
->
ul_ch_mag
);
free
(
ue
->
pusch_slsch
->
rxdataF_ext
);
free
(
ue
->
pusch_slsch
->
drs_ch_estimates
);
free
(
ue
->
pusch_slsch
->
rxdataF_comp
);
free
(
ue
->
pusch_slsch
->
ul_ch_mag
);
free
(
ue
->
slsch_rxdataF
);
free
(
ue
->
slsch_rxdata_7_5kHz
);
free
(
ue
->
pusch_sldch
->
rxdataF_ext
);
free
(
ue
->
pusch_sldch
->
drs_ch_estimates
);
free
(
ue
->
pusch_sldch
->
rxdataF_comp
);
free
(
ue
->
pusch_sldch
->
ul_ch_mag
);
free
(
ue
->
slsch_dlsch_llr
);
free
(
ue
->
slsch_ulsch_llr
);
free
(
ue
->
sldch_dlsch_llr
);
free
(
ue
->
sldch_ulsch_llr
);
}
openair1/PHY/LTE_REFSIG/primary_synch.m
View file @
47658e56
...
...
@@ -2,6 +2,7 @@ primary_synch0 = [zeros(1,5) exp(-1j*pi*25*(0:30).*(1:31)/63) exp(-1j*pi*25*(32:
primary_synch1
=
[
zeros
(
1
,
5
)
exp
(
-
1
j
*
pi
*
29
*
(
0
:
30
)
.*
(
1
:
31
)/
63
)
exp
(
-
1
j
*
pi
*
29
*
(
32
:
62
)
.*
(
33
:
63
)/
63
)
zeros
(
1
,
5
)];
primary_synch2
=
[
zeros
(
1
,
5
)
exp
(
-
1
j
*
pi
*
34
*
(
0
:
30
)
.*
(
1
:
31
)/
63
)
exp
(
-
1
j
*
pi
*
34
*
(
32
:
62
)
.*
(
33
:
63
)/
63
)
zeros
(
1
,
5
)];
%psync_table = [0 exp(-j*2*pi*(0:62)/63)];
%psync_table_mod = zeros(1,63*2);
%psync_table_mod(1:2:end) = floor(32767/sqrt(2)*real(psync_table));
...
...
@@ -23,6 +24,14 @@ primary_synch2_mod = zeros(1,72*2);
primary_synch2_mod
(
1
:
2
:
end
)
=
floor
(
32767
*
real
(
primary_synch2
));
primary_synch2_mod
(
2
:
2
:
end
)
=
floor
(
32767
*
imag
(
primary_synch2
));
primary_synch0SL_mod
=
zeros
(
1
,
72
*
2
);
primary_synch0SL_mod
(
1
:
2
:
end
)
=
floor
(
32767
*
real
(
primary_synch0_SL
));
primary_synch0SL_mod
(
2
:
2
:
end
)
=
floor
(
32767
*
imag
(
primary_synch0_SL
));
primary_synch1SL_mod
=
zeros
(
1
,
72
*
2
);
primary_synch1SL_mod
(
1
:
2
:
end
)
=
floor
(
32767
*
real
(
primary_synch1_SL
));
primary_synch1SL_mod
(
2
:
2
:
end
)
=
floor
(
32767
*
imag
(
primary_synch1_SL
));
primary_synch0_mod2
=
zeros
(
1
,
128
);
primary_synch0_mod2
((
128
-
35
):
128
)
=
primary_synch0
(
1
:
36
);
primary_synch0_mod2
(
2
:
37
)
=
primary_synch0
(
37
:
end
);
...
...
@@ -59,24 +68,22 @@ fprintf(fd,'%d,',primary_synch2_tab(1:end-1));
fprintf
(
fd
,
'%d};\n'
,
primary_synch2_tab
(
end
));
fclose
(
fd
);
% for LEON we need to invert the endianess
fd
=
fopen
(
'primary_synch_leon.h'
,
'w'
);
primary_synch0_tab
=
reshape
(
primary_synch0_tab
,
4
,[]);
primary_synch0_tab
=
primary_synch0_tab
([
4
3
2
1
],:);
primary_synch0_tab
=
primary_synch0_tab
(:);
primary_synch1_tab
=
reshape
(
primary_synch0_tab
,
4
,[]);
primary_synch1_tab
=
primary_synch1_tab
([
4
3
2
1
],:);
primary_synch1_tab
=
primary_synch1_tab
(:);
primary_synch2_tab
=
reshape
(
primary_synch0_tab
,
4
,[]);
primary_synch2_tab
=
primary_synch2_tab
([
4
3
2
1
],:);
primary_synch2_tab
=
primary_synch2_tab
(:);
fprintf
(
fd
,
'unsigned char primary_synch0_tab[72] = {'
);
fprintf
(
fd
,
'%d,'
,
primary_synch0_tab
(
1
:
end
-
1
));
fprintf
(
fd
,
'%d};\n'
,
primary_synch0_tab
(
end
));
fprintf
(
fd
,
'unsigned char primary_synch1_tab[72] = {'
);
fprintf
(
fd
,
'%d,'
,
primary_synch1_tab
(
1
:
end
-
1
));
fprintf
(
fd
,
'%d};\n'
,
primary_synch1_tab
(
end
));
fprintf
(
fd
,
'unsigned char primary_synch2_tab[72] = {'
);
fprintf
(
fd
,
'%d,'
,
primary_synch2_tab
(
1
:
end
-
1
));
fprintf
(
fd
,
'%d};\n'
,
primary_synch2_tab
(
end
));
primary_synch0_SL
=
[
zeros
(
1
,
5
)
exp
(
-
1
j
*
pi
*
26
*
(
0
:
30
)
.*
(
1
:
31
)/
63
)
exp
(
-
1
j
*
pi
*
26
*
(
32
:
62
)
.*
(
33
:
63
)/
63
)
zeros
(
1
,
5
)];
primary_synch1_SL
=
[
zeros
(
1
,
5
)
exp
(
-
1
j
*
pi
*
37
*
(
0
:
30
)
.*
(
1
:
31
)/
63
)
exp
(
-
1
j
*
pi
*
37
*
(
32
:
62
)
.*
(
33
:
63
)/
63
)
zeros
(
1
,
5
)];
primary_synch0SL_mod
=
zeros
(
1
,
72
*
2
);
primary_synch0SL_mod
(
1
:
2
:
end
)
=
floor
(
32767
*
real
(
primary_synch0_SL
));
primary_synch0SL_mod
(
2
:
2
:
end
)
=
floor
(
32767
*
imag
(
primary_synch0_SL
));
primary_synch1SL_mod
=
zeros
(
1
,
72
*
2
);
primary_synch1SL_mod
(
1
:
2
:
end
)
=
floor
(
32767
*
real
(
primary_synch1_SL
));
primary_synch1SL_mod
(
2
:
2
:
end
)
=
floor
(
32767
*
imag
(
primary_synch1_SL
));
fd
=
fopen
(
'primary_synch_SL.h'
,
'w'
);
fprintf
(
fd
,
'short primary_synch0SL[144] = {'
);
fprintf
(
fd
,
'%d,'
,
primary_synch0SL_mod
(
1
:
end
-
1
));
fprintf
(
fd
,
'%d};\n'
,
primary_synch0SL_mod
(
end
));
fprintf
(
fd
,
'short primary_synch1SL[144] = {'
);
fprintf
(
fd
,
'%d,'
,
primary_synch1SL_mod
(
1
:
end
-
1
));
fprintf
(
fd
,
'%d};\n'
,
primary_synch1SL_mod
(
end
));
fclose
(
fd
);
openair1/PHY/LTE_REFSIG/primary_synch_SL.h
0 → 100644
View file @
47658e56
short
primary_synch0SL
[
144
]
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
32767
,
0
,
-
27960
,
-
17086
,
2448
,
-
32676
,
-
32402
,
-
4884
,
22879
,
-
23457
,
11971
,
-
30502
,
-
16384
,
28377
,
-
30791
,
11206
,
20429
,
25618
,
-
29523
,
14217
,
-
10436
,
31060
,
2448
,
-
32676
,
11971
,
-
30502
,
-
30791
,
11206
,
-
16384
,
-
28378
,
-
32402
,
4883
,
22879
,
-
23457
,
20429
,
-
25619
,
-
29523
,
14217
,
-
27960
,
-
17086
,
-
16384
,
28377
,
-
16384
,
-
28378
,
-
27960
,
-
17086
,
27073
,
18458
,
11971
,
30501
,
22879
,
-
23457
,
20429
,
25618
,
32767
,
-
1
,
-
30791
,
11206
,
-
32402
,
4883
,
27073
,
18458
,
27073
,
18458
,
-
32402
,
4883
,
-
30791
,
11206
,
32767
,
0
,
20429
,
25618
,
22879
,
-
23457
,
11971
,
30501
,
27073
,
18458
,
-
27960
,
-
17086
,
-
16384
,
-
28378
,
-
16384
,
28377
,
-
27960
,
-
17086
,
-
29523
,
14217
,
20429
,
-
25619
,
22879
,
-
23457
,
-
32402
,
4883
,
-
16384
,
-
28378
,
-
30791
,
11206
,
11971
,
-
30502
,
2448
,
-
32676
,
-
10436
,
31060
,
-
29523
,
14217
,
20429
,
25618
,
-
30791
,
11206
,
-
16384
,
28377
,
11971
,
-
30502
,
22879
,
-
23457
,
-
32402
,
-
4884
,
2448
,
-
32676
,
-
27960
,
-
17086
,
32767
,
-
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
short
primary_synch1SL
[
144
]
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
32767
,
0
,
-
27960
,
17085
,
2448
,
32675
,
-
32402
,
4883
,
22879
,
23456
,
11971
,
30501
,
-
16384
,
-
28378
,
-
30791
,
-
11207
,
20429
,
-
25619
,
-
29523
,
-
14218
,
-
10436
,
-
31061
,
2448
,
32675
,
11971
,
30501
,
-
30791
,
-
11207
,
-
16384
,
28377
,
-
32402
,
-
4884
,
22879
,
23456
,
20429
,
25618
,
-
29523
,
-
14218
,
-
27960
,
17085
,
-
16384
,
-
28378
,
-
16384
,
28377
,
-
27960
,
17085
,
27073
,
-
18459
,
11971
,
-
30502
,
22879
,
23456
,
20429
,
-
25619
,
32767
,
0
,
-
30791
,
-
11207
,
-
32402
,
-
4884
,
27073
,
-
18459
,
27073
,
-
18459
,
-
32402
,
-
4884
,
-
30791
,
-
11207
,
32767
,
0
,
20429
,
-
25619
,
22879
,
23456
,
11971
,
-
30502
,
27073
,
-
18459
,
-
27960
,
17085
,
-
16384
,
28377
,
-
16384
,
-
28378
,
-
27960
,
17085
,
-
29523
,
-
14218
,
20429
,
25618
,
22879
,
23456
,
-
32402
,
-
4884
,
-
16384
,
28377
,
-
30791
,
-
11207
,
11971
,
30501
,
2448
,
32675
,
-
10436
,
-
31061
,
-
29523
,
-
14218
,
20429
,
-
25619
,
-
30791
,
-
11207
,
-
16384
,
-
28378
,
11971
,
30501
,
22879
,
23456
,
-
32402
,
4883
,
2448
,
32675
,
-
27960
,
17085
,
32767
,
-
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
openair1/PHY/LTE_TRANSPORT/defs.h
View file @
47658e56
...
...
@@ -941,8 +941,15 @@ typedef struct {
uint8_t
ljmod10
;
}
SLSCH_t
;
typedef
enum
{
disc_type1
=
0
,
disc_type2B
=
1
}
SLD_t
;
typedef
struct
{
// SL Configuration
// SL Discovery Configuration
/// Discovery Type
SLD_t
type
;
/// Number of SL resource blocks (1-100)
uint32_t
N_SL_RB
;
/// prb-start (0-99)
...
...
@@ -955,12 +962,26 @@ typedef struct {
uint32_t
discPeriod
;
/// Number of Repetitions (N_R)
uint32_t
numRepetitions
;
/// Number of retransmissions (numRetx-r12)
uint32_t
numRetx
;
/// PSDCH subframe bitmap (up to 100 bits, first 64)6
uint64_t
bitmap1
;
/// PSDCH subframe bitmap (up to 100 bits, second 36)
uint64_t
bitmap2
;
/// Bitmap length (N_B) (valid values (4,8,12,16,30,40,42) Rel12, (16,20,100) Rel14
uint32_t
bitmap_length
;
/// N1_PSDCH (a-r12)
uint32_t
N1
;
/// N1_PSDCH (b-r12)
uint32_t
N2
;
/// N1_PSDCH (c-r12)
uint32_t
N3
;
/// a10 (discPRB-Index)
uint32_t
a10
;
/// b10 (discSF-Index)
uint32_t
b10
;
/// transmission index (j)
uint32_t
j
;
// Discovery resource
uint32_t
n_psdch
;
/// payload length
...
...
openair1/PHY/LTE_TRANSPORT/drs_modulation.c
View file @
47658e56
...
...
@@ -109,9 +109,15 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
case
PSSCH_34
:
AssertFatal
(
1
==
0
,
"SL Transmission type 3/4 not supported for now
\n
"
);
break
;
case
PSDCH_ODD
:
case
PSDCH_EVEN
:
AssertFatal
(
1
==
0
,
"PSDCH Transmission not supported for now
\n
"
);
case
PSDCH
:
u0
=
0
;
u1
=
0
;
v0
=
0
;
v1
=
0
;
cyclic_shift0
=
0
;
cyclic_shift1
=
0
;
lstart
=
(
3
-
frame_parms
->
Ncp
);
linc
=
(
7
-
frame_parms
->
Ncp
);
break
;
case
PSBCH
:
AssertFatal
(
1
==
0
,
"PSBCH Transmission not supported for now
\n
"
);
...
...
openair1/PHY/LTE_TRANSPORT/sldch.c
View file @
47658e56
This diff is collapsed.
Click to expand it.
openair1/PHY/LTE_TRANSPORT/slsch.c
View file @
47658e56
...
...
@@ -398,7 +398,7 @@ void pscch_codingmodulation(PHY_VARS_UE *ue,int frame_tx,int subframe_tx,uint32_
uint32_t
amod
=
a
%
(
slsch
->
N_SL_RB
);
if
(
amod
<
(
slsch
->
N_SL_RB
>>
1
))
nprb
=
slsch
->
prb_Start
+
amod
;
else
nprb
=
slsch
->
prb_End
-
slsch
->
N_SL_RB
+
amod
;
else
nprb
=
slsch
->
prb_End
-
(
slsch
->
N_SL_RB
>>
1
)
+
amod
;
// Fill in power control later
...
...
@@ -497,7 +497,7 @@ void slsch_codingmodulation(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_tx,in
AssertFatal
(
slsch
!=
NULL
,
"ue->slsch is null
\n
"
);
AssertFatal
(
ue
->
slsch_sdu_active
>
0
,
"ue->slsch_sdu_active is
G=
\n
"
);
AssertFatal
(
ue
->
slsch_sdu_active
>
0
,
"ue->slsch_sdu_active is
n't active
\n
"
);
LOG_I
(
PHY
,
"Generating SLSCH for rvidx %d, group_id %d, mcs %d, resource first rb %d, L_crbs %d
\n
"
,
slsch
->
rvidx
,
slsch
->
group_destination_id
,
slsch
->
mcs
,
slsch
->
RB_start
,
slsch
->
L_CRBs
);
...
...
@@ -779,8 +779,8 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot)
int16_t
**
drs_ch_estimates
=
ue
->
pusch_slcch
->
drs_ch_estimates
;
int16_t
**
rxdataF_comp
=
ue
->
pusch_slcch
->
rxdataF_comp
;
int16_t
**
ul_ch_mag
=
ue
->
pusch_slcch
->
ul_ch_mag
;
int16_t
**
rxdata_7_5kHz
=
ue
->
sl
cch
_rxdata_7_5kHz
;
int16_t
**
rxdataF
=
ue
->
sl
cch
_rxdataF
;
int16_t
**
rxdata_7_5kHz
=
ue
->
sl_rxdata_7_5kHz
;
int16_t
**
rxdataF
=
ue
->
sl_rxdataF
;
int32_t
avgs
;
uint8_t
log2_maxh
=
0
;
int32_t
avgU
[
2
];
...
...
@@ -791,9 +791,10 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot)
if
(
amod
<
(
slsch
->
N_SL_RB
>>
1
))
nprb
=
slsch
->
prb_Start
+
amod
;
else
nprb
=
slsch
->
prb_End
-
slsch
->
N_SL_RB
+
amod
;
else
nprb
=
slsch
->
prb_End
-
(
slsch
->
N_SL_RB
>>
1
)
+
amod
;
// slot FEP
if
(
ue
->
sl_fep_done
==
0
)
{
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
...
...
@@ -811,9 +812,10 @@ void pscch_decoding(PHY_VARS_UE *ue,int frame_rx,int subframe_rx,int a,int slot)
write_output
(
"rxsig0_input.m"
,
"rxs0_in"
,
&
ue
->
common_vars
.
rxdata
[
0
][((
subframe_rx
<<
1
)
+
slot
)
*
ue
->
frame_parms
.
samples_per_tti
>>
1
],
ue
->
frame_parms
.
samples_per_tti
>>
1
,
1
,
1
);
write_output
(
"rxsig0_7_5kHz.m"
,
"rxs0_7_5kHz"
,
rxdata_7_5kHz
[
0
],
ue
->
frame_parms
.
samples_per_tti
,
1
,
1
);
#endif
for
(
int
l
=
0
;
l
<
Nsymb
;
l
++
)
slot_fep_ul
(
&
ru_tmp
,
l
,(
subframe_rx
<<
1
)
+
slot
,
0
);
}
// extract symbols from slot
for
(
int
l
=
0
;
l
<
Nsymb
;
l
++
)
{
slot_fep_ul
(
&
ru_tmp
,
l
,(
subframe_rx
<<
1
)
+
slot
,
0
);
ulsch_extract_rbs_single
((
int32_t
**
)
rxdataF
,
(
int32_t
**
)
rxdataF_ext
,
nprb
,
...
...
@@ -1116,8 +1118,8 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
int16_t
**
drs_ch_estimates
=
ue
->
pusch_slsch
->
drs_ch_estimates
;
int16_t
**
rxdataF_comp
=
ue
->
pusch_slsch
->
rxdataF_comp
;
int16_t
**
ul_ch_mag
=
ue
->
pusch_slsch
->
ul_ch_mag
;
int16_t
**
rxdata_7_5kHz
=
ue
->
sl
sch
_rxdata_7_5kHz
;
int16_t
**
rxdataF
=
ue
->
sl
sch
_rxdataF
;
int16_t
**
rxdata_7_5kHz
=
ue
->
sl_rxdata_7_5kHz
;
int16_t
**
rxdataF
=
ue
->
sl_rxdataF
;
int32_t
avgs
;
uint8_t
log2_maxh
=
0
;
int32_t
avgU
[
2
];
...
...
@@ -1126,6 +1128,8 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
LOG_I
(
PHY
,
"slsch_decoding %d.%d => lmod10 %d
\n
"
,
frame_rx
,
subframe_rx
,
ljmod10
);
// slot FEP
if
(
ue
->
sl_fep_done
==
0
)
{
ue
->
sl_fep_done
=
1
;
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
...
...
@@ -1139,10 +1143,15 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
));
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
)
+
1
);
// extract symbols from slot
for
(
int
l
=
0
;
l
<
Nsymb
;
l
++
)
{
slot_fep_ul
(
&
ru_tmp
,
l
,(
subframe_rx
<<
1
),
0
);
if
(
l
<
Nsymb
-
1
)
// skip last symbol in second slot
slot_fep_ul
(
&
ru_tmp
,
l
,(
subframe_rx
<<
1
)
+
1
,
0
);
}
LOG_I
(
PHY
,
"SLSCH Slot FEP %d.%d
\n
"
,
frame_rx
,
subframe_rx
);
}
// extract symbols from slot
for
(
int
l
=
0
;
l
<
Nsymb
;
l
++
)
{
ulsch_extract_rbs_single
((
int32_t
**
)
rxdataF
,
(
int32_t
**
)
rxdataF_ext
,
slsch
->
RB_start
,
...
...
@@ -1152,8 +1161,6 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
&
ue
->
frame_parms
);
if
(
l
<
Nsymb
-
1
)
{
// skip last symbol in second slot
slot_fep_ul
(
&
ru_tmp
,
l
,(
subframe_rx
<<
1
)
+
1
,
0
);
ulsch_extract_rbs_single
((
int32_t
**
)
rxdataF
,
(
int32_t
**
)
rxdataF_ext
,
slsch
->
RB_start
,
...
...
@@ -1263,9 +1270,9 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
rxdataF_comp
[
0
],
slsch
->
L_CRBs
*
12
);
//
#ifdef PSSCH_DEBUG
#ifdef PSSCH_DEBUG
write_output
(
"slsch_rxF_comp.m"
,
"slschrxF_comp"
,
rxdataF_comp
[
0
],
ue
->
frame_parms
.
N_RB_UL
*
12
*
14
,
1
,
1
);
//
#endif
#endif
int
E
=
12
*
Qm
*
slsch
->
L_CRBs
*
((
Nsymb
-
1
)
<<
1
);
...
...
@@ -1316,10 +1323,11 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
}
}
#ifdef PSSCH_DEBUG
write_output
(
"slsch_llr.m"
,
"slschllr"
,
ue
->
slsch_ulsch_llr
,
12
*
Qm
*
(
ue
->
frame_parms
.
symbols_per_tti
),
12
*
slsch
->
L_CRBs
*
Qm
*
(
ue
->
frame_parms
.
symbols_per_tti
-
2
),
1
,
0
);
#endif
// unscrambling
...
...
@@ -1414,6 +1422,7 @@ void slsch_decoding(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,int frame_rx,int subfra
else
LOG_I
(
PHY
,
"sLSCH received in error for rvidx %d round %d (L_CRBs %d, mcs %d)
\n
"
,
slsch
->
rvidx
,(
ue
->
dlsch_rx_slsch
->
harq_processes
[
0
]
->
round
+
3
)
&
3
,
slsch
->
L_CRBs
,
slsch
->
mcs
);
}
void
rx_slsch
(
PHY_VARS_UE
*
ue
,
UE_rxtx_proc_t
*
proc
,
int
frame_rx
,
int
subframe_rx
)
{
...
...
openair1/PHY/defs.h
View file @
47658e56
...
...
@@ -1192,6 +1192,7 @@ typedef struct PHY_VARS_eNB_s {
#define debug_msg if (((mac_xface->frame%100) == 0) || (mac_xface->frame < 50)) msg
#define MAX_SLDCH 16
/// Top-level PHY Data Structure for UE
typedef
struct
{
/// \brief Module ID indicator for this instance
...
...
@@ -1265,18 +1266,23 @@ typedef struct {
// This is for SIC in the UE, to store the reencoded data
LTE_eNB_DLSCH_t
*
dlsch_eNB
[
NUMBER_OF_CONNECTED_eNB_MAX
];
// Sidelink-specific variables
int
sl_fep_done
;
SL_chan_t
sl_chan
;
LTE_eNB_DLSCH_t
*
dlsch_slsch
;
LTE_UE_ULSCH_t
*
ulsch_slsch
;
LTE_eNB_PUSCH
*
pusch_slsch
;
LTE_eNB_DLSCH_t
*
dlsch_sldch
;
LTE_UE_ULSCH_t
*
ulsch_sldch
;
LTE_eNB_PUSCH
*
pusch_sldch
;
LTE_eNB_PUSCH
*
pusch_slcch
;
LTE_UE_DLSCH_t
*
dlsch_rx_slsch
;
int16_t
**
slsch_rxdataF
;
int16_t
**
slcch_rxdataF
;
int16_t
**
slsch_rxdata_7_5kHz
;
int16_t
**
slcch_rxdata_7_5kHz
;
LTE_UE_DLSCH_t
*
dlsch_rx_sldch
[
MAX_SLDCH
];
int16_t
**
sl_rxdataF
;
int16_t
**
sl_rxdata_7_5kHz
;
int16_t
*
slsch_dlsch_llr
;
int16_t
*
slsch_ulsch_llr
;
int16_t
*
sldch_dlsch_llr
;
int16_t
*
sldch_ulsch_llr
;
SLSCH_t
*
slsch
;
SLSCH_t
slsch_rx
;
int
slsch_active
;
...
...
@@ -1288,6 +1294,8 @@ typedef struct {
uint32_t
slsch_txcnt
;
uint32_t
slsch_errors
;
uint32_t
slsch_rxcnt
[
4
];
SLDCH_t
*
sldch
;
int
sldch_sdu_active
;
//Paging parameters
uint32_t
IMSImod1024
;
uint32_t
PF
;
...
...
@@ -1368,6 +1376,7 @@ typedef struct {
uint8_t
pscch_coded
;
uint8_t
pscch_generated
;
uint8_t
pssch_generated
;
uint8_t
psdch_generated
;
uint8_t
generate_prach
;
uint8_t
prach_cnt
;
uint8_t
prach_PreambleIndex
;
...
...
openair1/PHY/impl_defs_lte.h
View file @
47658e56
...
...
@@ -355,10 +355,9 @@ typedef enum {
PSCCH_34_ODD
=
4
,
PSSCH_12
=
5
,
PSSCH_34
=
6
,
PSDCH_EVEN
=
7
,
PSDCH_ODD
=
8
,
PSBCH
=
9
,
MAX_SLTYPES
=
10
PSDCH
=
7
,
PSBCH
=
8
,
MAX_SLTYPES
=
9
}
SL_chan_t
;
/// DeltaFList-PUCCH from 36.331 RRC spec
...
...
openair1/SIMULATION/LTE_PHY/slschsim.c
View file @
47658e56
...
...
@@ -62,12 +62,14 @@ int main(int argc, char **argv) {
PHY_VARS_UE
*
UE
;
int
log_level
=
LOG_INFO
;
SLSCH_t
slsch
;
SLDCH_t
sldch
;
SCM_t
channel_model
=
AWGN
;
UE_rxtx_proc_t
proc
;
double
snr0
=
35
;
double
snr_step
=
1
;
double
snr_int
=
1
;
uint8_t
slsch_payload
[
768
*
9
];
uint8_t
sldch_payload
[
32
];
int
mcs
=
10
;
int
nb_rb
=
20
;
char
channel_model_input
[
20
];
...
...
@@ -235,7 +237,8 @@ int main(int argc, char **argv) {
UE
->
N_TA_offset
=
0
;
UE
->
hw_timing_advance
=
0
;
UE
->
slsch
=
&
slsch
;
// SL Configuration
UE
->
sldch
=
&
sldch
;
// SLSCH/CCH Configuration
slsch
.
N_SL_RB
=
20
;
slsch
.
prb_Start
=
5
;
slsch
.
prb_End
=
44
;
...
...
@@ -264,10 +267,28 @@ int main(int argc, char **argv) {
slsch
.
L_CRBs
=
nb_rb
;
slsch
.
payload_length
=
get_TBS_UL
(
slsch
.
mcs
,
slsch
.
L_CRBs
);
slsch
.
payload
=
slsch_payload
;
// SLDCH Configuration
sldch
.
type
=
disc_type1
;
sldch
.
N_SL_RB
=
8
;
sldch
.
prb_Start
=
15
;
sldch
.
prb_End
=
34
;
sldch
.
offsetIndicator
=
0
;
/// 128 frame
sldch
.
discPeriod
=
128
;
// 1 transmission per period
sldch
.
numRepetitions
=
1
;
// 4 transmissions per SLDCH sdu
sldch
.
numRetx
=
3
;
// 16 TXops
sldch
.
bitmap1
=
0xffff
;
sldch
.
bitmap_length
=
16
;
sldch
.
payload_length
=
256
;
// copy sidelink parameters, PSCCH and PSSCH payloads will get overwritten
memcpy
((
void
*
)
&
UE
->
slsch_rx
,(
void
*
)
UE
->
slsch
,
sizeof
(
SLSCH_t
));
for
(
int
i
=
0
;
i
<
768
*
9
;
i
++
)
slsch_payload
[
i
]
=
taus
()
&
255
;
for
(
int
i
=
0
;
i
<
32
;
i
++
)
sldch_payload
[
i
]
=
taus
()
&
255
;
// 0dBm transmit power for PSCCH = 0dBm - 10*log10(12) dBm/RE
...
...
@@ -279,19 +300,22 @@ int main(int argc, char **argv) {
UE
->
slsch_txcnt
=
0
;
UE
->
slsch_rxcnt
[
0
]
=
0
;
UE
->
slsch_rxcnt
[
1
]
=
0
;
UE
->
slsch_rxcnt
[
2
]
=
0
;
UE
->
slsch_rxcnt
[
3
]
=
0
;
pscch_errors
=
0
;
UE
->
sl_fep_done
=
0
;
for
(
trials
=
0
;
trials
<
n_trials
;
trials
++
)
{
UE
->
pscch_coded
=
0
;
UE
->
pscch_generated
=
0
;
UE
->
psdch_generated
=
0
;
for
(
int
absSF
=
0
;
absSF
<
10240
;
absSF
++
)
{
frame
=
absSF
/
10
;
subframe
=
absSF
%
10
;
check_and_generate_psdch
(
UE
,
frame
,
subframe
);
UE
->
slsch_active
=
1
;
check_and_generate_pscch
(
UE
,
frame
,
subframe
);
proc
.
subframe_tx
=
subframe
;
proc
.
frame_tx
=
frame
;
check_and_generate_pssch
(
UE
,
&
proc
,
frame
,
subframe
);
if
(
UE
->
pscch_generated
>
0
||
UE
->
pssch_generated
>
0
)
{
if
(
UE
->
ps
dch_generated
>
0
||
UE
->
ps
cch_generated
>
0
||
UE
->
pssch_generated
>
0
)
{
AssertFatal
(
UE
->
pscch_generated
<
3
,
"Illegal pscch_generated %d
\n
"
,
UE
->
pscch_generated
);
// FEP
ulsch_common_procedures
(
UE
,
&
proc
,
0
);
...
...
@@ -301,12 +325,13 @@ int main(int argc, char **argv) {
// write_output("rxsig0.m","rxs0",&UE->common_vars.rxdata[0][UE->frame_parms.samples_per_tti*subframe],UE->frame_parms.samples_per_tti,1,1);
UE
->
pscch_generated
=
0
;
UE
->
pssch_generated
=
0
;
UE
->
psdch_generated
=
0
;
}
rx_slcch
(
UE
,
frame
,
subframe
);
rx_slsch
(
UE
,
&
proc
,
frame
,
subframe
);
UE
->
sl_fep_done
=
0
;
if
((
absSF
%
320
)
==
319
)
{
if
(
UE
->
slcch_received
==
0
)
pscch_errors
++
;
break
;
...
...
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