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
常顺宇
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
Hide 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
...
...
@@ -34,6 +34,323 @@
#include "PHY/defs.h"
void
sldch_decoding
(
PHY_VARS_UE
*
ue
,
UE_rxtx_proc_t
*
proc
,
int
frame_rx
,
int
subframe_rx
,
int
npsdch
,
int
nprb
,
int
rvidx
)
{
int
Nsymb
=
7
;
SLDCH_t
*
sldch
=
&
ue
->
sldch
;
int16_t
**
rxdataF_ext
=
ue
->
pusch_sldch
->
rxdataF_ext
;
int16_t
**
drs_ch_estimates
=
ue
->
pusch_sldch
->
drs_ch_estimates
;
int16_t
**
rxdataF_comp
=
ue
->
pusch_sldch
->
rxdataF_comp
;
int16_t
**
ul_ch_mag
=
ue
->
pusch_sldch
->
ul_ch_mag
;
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
];
LOG_I
(
PHY
,
"sldch_decoding %d.%d
\n
"
,
frame_rx
,
subframe_rx
);
// 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
));
memcpy
((
void
*
)
&
ru_tmp
.
frame_parms
,(
void
*
)
&
ue
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
ru_tmp
.
N_TA_offset
=
0
;
ru_tmp
.
common
.
rxdata
=
ue
->
common_vars
.
rxdata
;
ru_tmp
.
common
.
rxdata_7_5kHz
=
(
int32_t
**
)
rxdata_7_5kHz
;
ru_tmp
.
common
.
rxdataF
=
(
int32_t
**
)
rxdataF
;
ru_tmp
.
nb_rx
=
ue
->
frame_parms
.
nb_antennas_rx
;
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
);
}
}
for
(
int
l
=
0
;
l
<
Nsymb
;
l
++
)
{
ulsch_extract_rbs_single
((
int32_t
**
)
rxdataF
,
(
int32_t
**
)
rxdataF_ext
,
nprb
,
2
,
l
,
(
subframe_rx
<<
1
),
&
ue
->
frame_parms
);
if
(
l
<
Nsymb
-
1
)
// skip last symbol in second slot
ulsch_extract_rbs_single
((
int32_t
**
)
rxdataF
,
(
int32_t
**
)
rxdataF_ext
,
nprb
,
2
,
l
,
(
subframe_rx
<<
1
)
+
1
,
&
ue
->
frame_parms
);
}
#ifdef PSDCH_DEBUG
write_output
(
"sldch_rxF.m"
,
"sldchrxF"
,
&
rxdataF
[
0
][
0
],
14
*
ue
->
frame_parms
.
ofdm_symbol_size
,
1
,
1
);
write_output
(
"sldch_rxF_ext.m"
,
"sldchrxF_ext"
,
rxdataF_ext
[
0
],
14
*
12
*
ue
->
frame_parms
.
N_RB_DL
,
1
,
1
);
#endif
lte_ul_channel_estimation
(
&
ue
->
frame_parms
,
(
int32_t
**
)
drs_ch_estimates
,
(
int32_t
**
)
NULL
,
(
int32_t
**
)
rxdataF_ext
,
2
,
frame_rx
,
subframe_rx
,
0
,
//u
0
,
//v
0
,
//cyclic_shift
3
,
1
,
// interpolation
0
);
lte_ul_channel_estimation
(
&
ue
->
frame_parms
,
(
int32_t
**
)
drs_ch_estimates
,
(
int32_t
**
)
NULL
,
(
int32_t
**
)
rxdataF_ext
,
2
,
frame_rx
,
subframe_rx
,
0
,
//u
0
,
//v
0
,
//cyclic_shift,
10
,
1
,
// interpolation
0
);
ulsch_channel_level
(
drs_ch_estimates
,
&
ue
->
frame_parms
,
avgU
,
2
);
#ifdef PSDCH_DEBUG
write_output
(
"drs_ext0.m"
,
"drsest0"
,
drs_ch_estimates
[
0
],
ue
->
frame_parms
.
N_RB_UL
*
12
*
14
,
1
,
1
);
#endif
avgs
=
0
;
for
(
int
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
avgs
=
cmax
(
avgs
,
avgU
[
aarx
]);
// log2_maxh = 4+(log2_approx(avgs)/2);
log2_maxh
=
(
log2_approx
(
avgs
)
/
2
)
+
log2_approx
(
ue
->
frame_parms
.
nb_antennas_rx
-
1
)
+
4
;
for
(
int
l
=
0
;
l
<
(
Nsymb
<<
1
)
-
1
;
l
++
)
{
if
(((
ue
->
frame_parms
.
Ncp
==
0
)
&&
((
l
==
3
)
||
(
l
==
10
)))
||
// skip pilots
((
ue
->
frame_parms
.
Ncp
==
1
)
&&
((
l
==
2
)
||
(
l
==
8
))))
{
l
++
;
}
ulsch_channel_compensation
(
rxdataF_ext
,
drs_ch_estimates
,
ul_ch_mag
,
NULL
,
rxdataF_comp
,
&
ue
->
frame_parms
,
l
,
2
,
//Qm
2
,
//nb_rb
log2_maxh
);
// log2_maxh+I0_shift
if
(
ue
->
frame_parms
.
nb_antennas_rx
>
1
)
ulsch_detection_mrc
(
&
ue
->
frame_parms
,
rxdataF_comp
,
ul_ch_mag
,
NULL
,
l
,
2
//nb_rb
);
freq_equalization
(
&
ue
->
frame_parms
,
rxdataF_comp
,
ul_ch_mag
,
NULL
,
l
,
24
,
2
);
}
lte_idft
(
&
ue
->
frame_parms
,
rxdataF_comp
[
0
],
24
);
#ifdef PSDCH_DEBUG
write_output
(
"sldch_rxF_comp.m"
,
"sldchrxF_comp"
,
rxdataF_comp
[
0
],
ue
->
frame_parms
.
N_RB_UL
*
12
*
14
,
1
,
1
);
#endif
int
E
=
12
*
2
*
2
*
((
Nsymb
-
1
)
<<
1
);
int16_t
*
llrp
=
ue
->
slsch_ulsch_llr
;
for
(
int
l
=
0
;
l
<
(
Nsymb
<<
1
)
-
1
;
l
++
)
{
if
(((
ue
->
frame_parms
.
Ncp
==
0
)
&&
((
l
==
3
)
||
(
l
==
10
)))
||
// skip pilots
((
ue
->
frame_parms
.
Ncp
==
1
)
&&
((
l
==
2
)
||
(
l
==
8
))))
{
l
++
;
}
ulsch_qpsk_llr
(
&
ue
->
frame_parms
,
rxdataF_comp
,
(
int32_t
*
)
ue
->
slsch_ulsch_llr
,
l
,
2
,
(
int32_t
*
)
&
llrp
);
}
write_output
(
"sldch_llr.m"
,
"sldchllr"
,
ue
->
sldch_ulsch_llr
[
npsdch
],
12
*
2
*
(
ue
->
frame_parms
.
symbols_per_tti
),
1
,
0
);
// unscrambling
uint32_t
x1
,
x2
=
510
;
uint32_t
s
=
lte_gold_generic
(
&
x1
,
&
x2
,
1
);
int
k
=
0
;
int16_t
c
;
for
(
int
i
=
0
;
i
<
(
1
+
(
E
>>
5
));
i
++
)
{
for
(
int
j
=
0
;
j
<
32
;
j
++
,
k
++
)
{
c
=
(
int16_t
)((((
s
>>
j
)
&
1
)
<<
1
)
-
1
);
ue
->
sldch_ulsch_llr
[
k
]
=
c
*
ue
->
sldch_ulsch_llr
[
k
];
}
s
=
lte_gold_generic
(
&
x1
,
&
x2
,
0
);
}
// Deinterleaving
int
Cmux
=
(
Nsymb
-
1
)
*
2
;
for
(
int
i
=
0
,
j
=
0
;
i
<
Cmux
;
i
++
)
{
for
(
int
r
=
0
;
r
<
24
;
r
++
)
{
ue
->
sldch_dlsch_llr
[((
r
*
Cmux
)
+
i
)
<<
1
]
=
ue
->
sldch_ulsch_llr
[
j
++
];
ue
->
sldch_dlsch_llr
[(((
r
*
Cmux
)
+
i
)
<<
1
)
+
1
]
=
ue
->
sldch_ulsch_llr
[
j
++
];
// printf("dlsch_llr[%d] %d(%d) dlsch_llr[%d] %d(%d)\n",
// ((r*Cmux)+i)<<1,ue->slsch_dlsch_llr[((r*Cmux)+i)<<1],j-2,(((r*Cmux)+i)<<1)+1,ue->slsch_dlsch_llr[(((r*Cmux)+i)<<1)+1],j-1);
}
}
// Decoding
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
rvidx
=
rvidx
;
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
nb_rb
=
2
;
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
TBS
=
256
;
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
Qm
=
2
;
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
G
=
E
;
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
]
->
Nl
=
1
;
// for (int i=0;i<E/16;i++) printf("decoding: E[%d] %d\n",i,ue->slsch_dlsch_llr[i]);
int
ret
=
dlsch_decoding
(
ue
,
ue
->
sldch_dlsch_llr
,
&
ue
->
frame_parms
,
ue
->
dlsch_rx_sldch
[
npsdch
],
ue
->
dlsch_rx_sldch
[
npsdch
]
->
harq_processes
[
0
],
frame_rx
,
subframe_rx
,
0
,
0
,
1
);
// printf("slsch decoding round %d ret %d\n",ue->dlsch_rx_slsch->harq_processes[0]->round,ret);
if
(
ret
<
ue
->
dlsch_rx_sldch
[
npsdch
]
->
max_turbo_iterations
)
{
LOG_D
(
PHY
,
"SLDCH received for npsdch %d (rvidx %d, iter %d)
\n
"
,
npsdch
,
rvidx
,
ret
);
}
}
void
rx_sldch
(
PHY_VARS_UE
*
ue
,
UE_rxtx_proc_t
*
proc
,
int
frame_rx
,
int
subframe_rx
)
{
AssertFatal
(
frame_rx
<
1024
&&
frame_rx
>=
0
,
"frame %d is illegal
\n
"
,
frame_rx
);
AssertFatal
(
subframe_rx
<
10
&&
subframe_rx
>=
0
,
"subframe %d is illegal
\n
"
,
subframe_rx
);
SLDCH_t
*
sldch
=
&
ue
->
sldch
;
AssertFatal
(
sldch
!=
NULL
,
"SLDCH is null
\n
"
);
uint32_t
O
=
ue
->
sldch
->
offsetIndicator
;
uint32_t
P
=
ue
->
sldch
->
discPeriod
;
uint32_t
absSF
=
(
frame_rx
*
10
)
+
subframe_rx
;
uint32_t
absSF_offset
,
absSF_modP
;
int
rvtab
[
4
]
=
{
0
,
2
,
3
,
1
};
absSF_offset
=
absSF
-
O
;
if
(
absSF_offset
<
O
)
return
;
absSF_modP
=
absSF_offset
%
P
;
uint64_t
SFpos
=
((
uint64_t
)
1
)
<<
absSF_modP
;
if
((
SFpos
&
sldch
->
bitmap1
)
==
0
)
return
;
// if we get here, then there is a PSDCH subframe for a potential reception
// compute parameters
AssertFatal
(
sldch
->
bitmap_length
==
4
||
sldch
->
bitmap_length
==
8
||
sldch
->
bitmap_length
==
12
||
sldch
->
bitmap_length
==
16
||
sldch
->
bitmap_length
==
30
||
sldch
->
bitmap_length
==
40
||
sldch
->
bitmap_length
==
42
,
"SLDCH Bitmap_length %x not supported
\n
"
,
sldch
->
bitmap_length
);
int
LPSDCH
=
0
;
for
(
int
i
=
0
;
i
<
sldch
->
bitmap_length
;
i
++
)
if
(((((
uint64_t
)
1
)
<<
i
)
&
sldch
->
bitmap1
)
==
1
)
LPSDCH
++
;
AssertFatal
(
sldch
->
type
==
disc_type1
||
sldch
->
type
==
disc_type2B
,
"unknown Discovery type %d
\n
"
,
sldch
->
type
);
int
N_TX_SLD
=
1
+
sldch
->
numRepetitions
;
uint32_t
M_RB_PSDCH_RP
=
sldch
->
N_SL_RB
;
int
first_prb
;
if
(
sldch
->
type
==
disc_type1
)
{
int
Ni
=
LPSDCH
/
N_TX_SLD
;
int
Nf
=
M_RB_PSDCH_RP
>>
1
;
// int a_ji = (((sldch->j-1)*(Nf/N_TX_SLD)) + (sldch->n_psdch/Ni))%Nf;
// int b_1i = sldch->n_psdch%Ni;
// repetition number
int
jrx
;
int
npsdch
;
int
nprb
;
// loop over all candidate PRBs
for
(
int
i
=
0
;
i
<
Nf
;
i
++
){
jrx
=
i
/
(
Nf
/
N_TX_SLD
);
npsdch
=
(
i
%
(
Nf
/
N_TX_SLD
))
*
Ni
+
((
absSF
/
N_TX_SLD
)
%
Ni
);
nprb
=
i
<<
1
;
if
(
nprb
<
(
sldch
->
N_SL_RB
>>
1
))
nprb
+=
sldch
->
prb_Start
;
else
nprb
+=
(
sldch
->
prb_End
-
(
sldch
->
N_SL_RB
>>
1
));
// call decoding for candidate npsdch
LOG_I
(
PHY
,
"SLDCH (RX): Trying npsdch %d, j %d (nprb %d)
\n
"
,
npsdch
,
jrx
,
nprb
);
sldch_decoding
(
ue
,
proc
,
frame_rx
,
subframe_rx
,
npsdch
,
nprb
,
rvtab
[
jrx
]);
}
}
else
{
AssertFatal
(
1
==
0
,
"Discovery Type 2B not supported yet
\n
"
);
}
}
void
generate_sldch
(
PHY_VARS_UE
*
ue
,
SLDCH_t
*
sldch
,
int
frame_tx
,
int
subframe_tx
)
{
UE_tport_t
pdu
;
...
...
@@ -64,13 +381,129 @@ void generate_sldch(PHY_VARS_UE *ue,SLDCH_t *sldch,int frame_tx,int subframe_tx)
#endif
void
sldch_codingmodulation
(
PHY_VARS_UE
*
ue
,
int
frame_tx
,
int
subframe_tx
,
int
nprb
,
int
rvidx
)
{
SLDCH_t
*
sldch
=
ue
->
sldch
;
LTE_eNB_DLSCH_t
*
dlsch
=
ue
->
dlsch_sldch
;
LTE_UE_ULSCH_t
*
ulsch
=
ue
->
ulsch_sldch
;
int
tx_amp
;
uint32_t
Nsymb
=
7
;
// 24 REs/PRB * 2*(Nsymb-1) symbols * 2 bits/RE
uint32_t
E
=
24
*
(
Nsymb
-
1
)
*
2
*
2
;
AssertFatal
(
sldch
!=
NULL
,
"ue->sldch is null
\n
"
);
AssertFatal
(
ue
->
sldch_sdu_active
>
0
,
"ue->sldch_sdu_active isn't active
\n
"
);
int
mcs
=
8
;
LOG_I
(
PHY
,
"Generating SLDCH for rvidx %d, npsdch %d, first rb %d
\n
"
,
rvidx
,
sldch
->
n_psdch
,
nprb
);
ue
->
sldch_sdu_active
=
1
;
dlsch
->
harq_processes
[
0
]
->
nb_rb
=
2
;
dlsch
->
harq_processes
[
0
]
->
TBS
=
256
;
dlsch
->
harq_processes
[
0
]
->
Qm
=
2
;
dlsch
->
harq_processes
[
0
]
->
mimo_mode
=
SISO
;
dlsch
->
harq_processes
[
0
]
->
rb_alloc
[
0
]
=
0
;
// unused for SL
dlsch
->
harq_processes
[
0
]
->
rb_alloc
[
1
]
=
0
;
// unused for SL
dlsch
->
harq_processes
[
0
]
->
rb_alloc
[
2
]
=
0
;
// unused for SL
dlsch
->
harq_processes
[
0
]
->
rb_alloc
[
3
]
=
0
;
// unused for SL
dlsch
->
harq_processes
[
0
]
->
Nl
=
1
;
dlsch
->
harq_processes
[
0
]
->
round
=
sldch
->
j
;
dlsch
->
harq_processes
[
0
]
->
rvidx
=
rvidx
;
dlsch_encoding0
(
&
ue
->
frame_parms
,
sldch
->
payload
,
0
,
// means SL
dlsch
,
frame_tx
,
subframe_tx
,
&
ue
->
ulsch_rate_matching_stats
,
&
ue
->
ulsch_turbo_encoding_stats
,
&
ue
->
ulsch_interleaving_stats
);
int
Cmux
=
(
Nsymb
-
1
)
<<
1
;
uint8_t
*
eptr
;
for
(
int
i
=
0
,
j
=
0
;
i
<
Cmux
;
i
++
)
// 24 = 12*(Nsymb-1)*2/(Nsymb-1)
for
(
int
r
=
0
;
r
<
24
;
r
++
)
{
if
(
dlsch
->
harq_processes
[
0
]
->
Qm
==
2
)
{
eptr
=&
dlsch
->
harq_processes
[
0
]
->
e
[((
r
*
Cmux
)
+
i
)
<<
1
];
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
}
else
if
(
dlsch
->
harq_processes
[
0
]
->
Qm
==
4
)
{
eptr
=&
dlsch
->
harq_processes
[
0
]
->
e
[((
r
*
Cmux
)
+
i
)
<<
2
];
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
ulsch
->
h
[
j
++
]
=
*
eptr
++
;
}
else
{
AssertFatal
(
1
==
0
,
"64QAM not supported for SL
\n
"
);
}
}
// scrambling
uint32_t
cinit
=
510
;
ulsch
->
harq_processes
[
0
]
->
nb_rb
=
2
;
ulsch
->
harq_processes
[
0
]
->
first_rb
=
nprb
;
ulsch
->
harq_processes
[
0
]
->
mcs
=
8
;
ulsch
->
Nsymb_pusch
=
((
Nsymb
-
1
)
<<
1
);
ue
->
sl_chan
=
PSDCH
;
ue
->
tx_power_dBm
[
subframe_tx
]
=
3
;
ue
->
tx_total_RE
[
subframe_tx
]
=
24
;
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
tx_amp
=
get_tx_amp
(
ue
->
tx_power_dBm
[
subframe_tx
],
ue
->
tx_power_max_dBm
,
ue
->
frame_parms
.
N_RB_UL
,
1
);
#else
tx_amp
=
AMP
;
#endif
for
(
int
aa
=
0
;
aa
<
ue
->
frame_parms
.
nb_antennas_tx
;
aa
++
)
{
memset
(
&
ue
->
common_vars
.
txdataF
[
aa
][
subframe_tx
*
ue
->
frame_parms
.
ofdm_symbol_size
*
ue
->
frame_parms
.
symbols_per_tti
],
0
,
ue
->
frame_parms
.
ofdm_symbol_size
*
ue
->
frame_parms
.
symbols_per_tti
*
sizeof
(
int32_t
));
}
ulsch_modulation
(
ue
->
common_vars
.
txdataF
,
tx_amp
,
frame_tx
,
subframe_tx
,
&
ue
->
frame_parms
,
ulsch
,
1
,
cinit
);
generate_drs_pusch
(
ue
,
NULL
,
0
,
tx_amp
,
subframe_tx
,
nprb
,
2
,
0
,
NULL
,
0
);
}
void
check_and_generate_psdch
(
PHY_VARS_UE
*
ue
,
int
frame_tx
,
int
subframe_tx
)
{
AssertFatal
(
frame_tx
<
1024
&&
frame_tx
>=
0
,
"frame %d is illegal
\n
"
,
frame_tx
);
AssertFatal
(
subframe_tx
<
10
&&
subframe_tx
>=
0
,
"subframe %d is illegal
\n
"
,
subframe_tx
);
/*
SLDCH_t
*
sldch
=
ue
->
sldch
;
AssertFatal(sl
sch!=NULL,"SLS
CH is null\n");
AssertFatal
(
sl
dch
!=
NULL
,
"SLD
CH is null
\n
"
);
uint32_t
O
=
ue
->
sldch
->
offsetIndicator
;
uint32_t
P
=
ue
->
sldch
->
discPeriod
;
uint32_t
absSF
=
(
frame_tx
*
10
)
+
subframe_tx
;
...
...
@@ -80,43 +513,55 @@ void check_and_generate_psdch(PHY_VARS_UE *ue,int frame_tx,int subframe_tx) {
if
(
absSF_offset
<
O
)
return
;
absSF_modP = absSF_offset%P
;
if
(
absSF_offset
==
0
)
sldch
->
j
=
0
;
if (absSF_mod == 0) {
ue->psdch_coded =0;
}
absSF_modP
=
absSF_offset
%
P
;
uint64_t
SFpos
=
((
uint64_t
)
1
)
<<
absSF_modP
;
if ((SFpos & slsch->bitmap1) == 0) return;
if
((
SFpos
&
sldch
->
bitmap1
)
==
0
)
return
;
// if we get here, then this is a potential PSDCH subframe
int
rvtab
[
4
]
=
{
0
,
2
,
3
,
1
};
int
rvidx
=
rvtab
[
sldch
->
j
&
3
];
int
nprb
;
// compute parameters
AssertFatal
(
sldch
->
bitmap_length
==
4
||
sldch
->
bitmap_length
==
8
||
sldch
->
bitmap_length
==
12
||
sldch
->
bitmap_length
==
16
||
sldch
->
bitmap_length
==
30
||
sldch
->
bitmap_length
==
40
||
sldch
->
bitmap_length
==
42
,
"SLDCH Bitmap_length %x not supported
\n
"
,
sldch
->
bitmap_length
);
int
LPSDCH
=
0
;
for
(
int
i
=
0
;
i
<
sldch
->
bitmap_length
;
i
++
)
if
(((((
uint64_t
)
1
)
<<
i
)
&
sldch
->
bitmap1
)
>
0
)
LPSDCH
++
;
// if we get here, then there is a PSCCH subframe for a potential transmission
uint32_t sf_index=40,LPSCCH=0;
for (int i=0;i<40;i++) {
if (i==absSF_modP) sf_index=LPSCCH;
if (((((uint64_t)1)<<i) & slsch->bitmap1)>0) LPSCCH++;
AssertFatal
(
LPSDCH
>
0
,
"LPSDCH is 0 (bitmap1 %lx, bitmap_length %d)
\n
"
,
sldch
->
bitmap1
,
sldch
->
bitmap_length
);
AssertFatal
(
sldch
->
type
==
disc_type1
||
sldch
->
type
==
disc_type2B
,
"unknown Discovery type %d
\n
"
,
sldch
->
type
);
int
N_TX_SLD
=
1
+
sldch
->
numRepetitions
;
uint32_t
M_RB_PSDCH_RP
=
sldch
->
N_SL_RB
;
if
(
sldch
->
type
==
disc_type1
)
{
int
Ni
=
LPSDCH
/
N_TX_SLD
;
int
Nf
=
M_RB_PSDCH_RP
>>
1
;
int
a_ji
=
(((
sldch
->
j
-
1
)
*
(
Nf
/
N_TX_SLD
))
+
(
sldch
->
n_psdch
/
Ni
))
%
Nf
;
int
b_1i
=
sldch
->
n_psdch
%
Ni
;
if
(
absSF_modP
!=
((
b_1i
*
N_TX_SLD
)
+
sldch
->
j
-
1
))
return
;
nprb
=
2
*
a_ji
;
}
else
{
AssertFatal
(
1
==
0
,
"Discovery Type 2B not supported yet
\n
"
);
}
AssertFatal(sf_index<40,"sf_index not set, should not happen (absSF_modP %d)\n",absSF_modP);
// sf_index now contains the SF index in 0...LPSCCH-1
// LPSCCH has the number of PSCCH subframes
// number of resources blocks per slot times 2 slots
uint32_t M_RB_PSCCH_RP = slsch->N_SL_RB*LPSCCH<<1;
AssertFatal(slsch->n_pscch < (M_RB_PSCCH_RP>>1)*LPSCCH,"n_pscch not in 0..%d\n",
((M_RB_PSCCH_RP>>1)*LPSCCH)-1);
// hard-coded to transmission mode one for now (Section 14.2.1.1 from 36.213 Rel14.3)
uint32_t a1=slsch->n_pscch/LPSCCH;
uint32_t a2=a1+slsch->n_pscch/LPSCCH+(M_RB_PSCCH_RP>>1);
uint32_t b1=slsch->n_pscch%LPSCCH;
uint32_t b2=(slsch->n_pscch + 1 + (a1%(LPSCCH-1)))%LPSCCH;
LOG_I(PHY,"Checking pscch for absSF %d (LPSCCH %d, M_RB_PSCCH_RP %d, a1 %d, a2 %d, b1 %d, b2 %d) pscch_coded %d\n",
absSF, LPSCCH, M_RB_PSCCH_RP,a1,a2,b1,b2,ue->pscch_coded);
ue->slsch_sdu_active = 1;
if (absSF_modP == b1) pscch_codingmodulation(ue,frame_tx,subframe_tx,a1,0);
else if (absSF_modP == b2) pscch_codingmodulation(ue,frame_tx,subframe_tx,a2,1);
else return;
*/
if
(
nprb
<
sldch
->
N_SL_RB
)
nprb
+=
sldch
->
prb_Start
;
else
nprb
+=
(
sldch
->
prb_End
-
(
sldch
->
N_SL_RB
>>
1
));
sldch_codingmodulation
(
ue
,
frame_tx
,
subframe_tx
,
nprb
,
rvidx
);
ue
->
psdch_generated
=
1
;
}
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,29 +791,31 @@ 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
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
memcpy
((
void
*
)
&
ru_tmp
.
frame_parms
,(
void
*
)
&
ue
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
ru_tmp
.
N_TA_offset
=
0
;
ru_tmp
.
common
.
rxdata
=
ue
->
common_vars
.
rxdata
;
ru_tmp
.
common
.
rxdata_7_5kHz
=
(
int32_t
**
)
rxdata_7_5kHz
;
ru_tmp
.
common
.
rxdataF
=
(
int32_t
**
)
rxdataF
;
ru_tmp
.
nb_rx
=
ue
->
frame_parms
.
nb_antennas_rx
;
if
(
ue
->
sl_fep_done
==
0
)
{
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
memcpy
((
void
*
)
&
ru_tmp
.
frame_parms
,(
void
*
)
&
ue
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
ru_tmp
.
N_TA_offset
=
0
;
ru_tmp
.
common
.
rxdata
=
ue
->
common_vars
.
rxdata
;
ru_tmp
.
common
.
rxdata_7_5kHz
=
(
int32_t
**
)
rxdata_7_5kHz
;
ru_tmp
.
common
.
rxdataF
=
(
int32_t
**
)
rxdataF
;
ru_tmp
.
nb_rx
=
ue
->
frame_parms
.
nb_antennas_rx
;
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
)
+
slot
);
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
)
+
slot
);
#ifdef PSCCH_DEBUG
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
);
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,23 +1128,30 @@ 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
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
memcpy
((
void
*
)
&
ru_tmp
.
frame_parms
,(
void
*
)
&
ue
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
ru_tmp
.
N_TA_offset
=
0
;
ru_tmp
.
common
.
rxdata
=
ue
->
common_vars
.
rxdata
;
ru_tmp
.
common
.
rxdata_7_5kHz
=
(
int32_t
**
)
rxdata_7_5kHz
;
ru_tmp
.
common
.
rxdataF
=
(
int32_t
**
)
rxdataF
;
ru_tmp
.
nb_rx
=
ue
->
frame_parms
.
nb_antennas_rx
;
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
(
ue
->
sl_fep_done
==
0
)
{
ue
->
sl_fep_done
=
1
;
RU_t
ru_tmp
;
memset
((
void
*
)
&
ru_tmp
,
0
,
sizeof
(
RU_t
));
memcpy
((
void
*
)
&
ru_tmp
.
frame_parms
,(
void
*
)
&
ue
->
frame_parms
,
sizeof
(
LTE_DL_FRAME_PARMS
));
ru_tmp
.
N_TA_offset
=
0
;
ru_tmp
.
common
.
rxdata
=
ue
->
common_vars
.
rxdata
;
ru_tmp
.
common
.
rxdata_7_5kHz
=
(
int32_t
**
)
rxdata_7_5kHz
;
ru_tmp
.
common
.
rxdataF
=
(
int32_t
**
)
rxdataF
;
ru_tmp
.
nb_rx
=
ue
->
frame_parms
.
nb_antennas_rx
;
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
));
remove_7_5_kHz
(
&
ru_tmp
,(
subframe_rx
<<
1
)
+
1
);
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
),
1
,
0
);
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