Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
OpenXG-RAN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
ZhouShuya
OpenXG-RAN
Commits
e097bec7
Commit
e097bec7
authored
Nov 19, 2020
by
hardy
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/nr_dl_dmrs_type2' into integration_2020_wk48
parents
b57ef17b
0e298d87
Changes
15
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
558 additions
and
157 deletions
+558
-157
openair1/PHY/INIT/nr_parms.c
openair1/PHY/INIT/nr_parms.c
+3
-3
openair1/PHY/NR_REFSIG/dmrs_nr.c
openair1/PHY/NR_REFSIG/dmrs_nr.c
+3
-2
openair1/PHY/NR_REFSIG/dmrs_nr.h
openair1/PHY/NR_REFSIG/dmrs_nr.h
+1
-0
openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
+5
-5
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+62
-45
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
+2
-2
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
+54
-0
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
+36
-0
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+308
-53
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+44
-28
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+6
-4
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+1
-1
openair1/PHY/impl_defs_nr.h
openair1/PHY/impl_defs_nr.h
+2
-2
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+21
-9
targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
.../GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
+10
-3
No files found.
openair1/PHY/INIT/nr_parms.c
View file @
e097bec7
...
...
@@ -290,9 +290,9 @@ int nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg,
fp
->
slots_per_frame
=
10
*
fp
->
slots_per_subframe
;
fp
->
nb_antenna_ports_gNB
=
1
;
// default value until overwritten by RRCConnectionReconfiguration
fp
->
nb_antennas_rx
=
1
;
// default value until overwritten by RRCConnectionReconfiguration
fp
->
nb_antennas_tx
=
1
;
// default value until overwritten by RRCConnectionReconfiguration
fp
->
nb_antenna_ports_gNB
=
cfg
->
carrier_config
.
num_tx_ant
.
value
;
// It corresponds to pdsch_AntennaPorts
fp
->
nb_antennas_rx
=
cfg
->
carrier_config
.
num_rx_ant
.
value
;
// It denotes the number of rx antennas at gNB
fp
->
nb_antennas_tx
=
1
;
// It corresponds to the number of UE Tx antennas
fp
->
symbols_per_slot
=
((
Ncp
==
NORMAL
)
?
14
:
12
);
// to redefine for different slot formats
fp
->
samples_per_subframe_wCP
=
fp
->
ofdm_symbol_size
*
fp
->
symbols_per_slot
*
fp
->
slots_per_subframe
;
...
...
openair1/PHY/NR_REFSIG/dmrs_nr.c
View file @
e097bec7
...
...
@@ -37,6 +37,7 @@
uint8_t
allowed_xlsch_re_in_dmrs_symbol
(
uint16_t
k
,
uint16_t
start_sc
,
uint16_t
ofdm_symbol_size
,
uint8_t
numDmrsCdmGrpsNoData
,
uint8_t
dmrs_type
)
{
uint8_t
delta
;
...
...
@@ -44,7 +45,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
if
(
k
>
start_sc
)
diff
=
k
-
start_sc
;
else
diff
=
start_sc
-
k
;
diff
=
(
ofdm_symbol_size
-
start_sc
)
+
k
;
for
(
int
i
=
0
;
i
<
numDmrsCdmGrpsNoData
;
i
++
){
if
(
dmrs_type
==
NFAPI_NR_DMRS_TYPE1
)
{
delta
=
i
;
...
...
@@ -53,7 +54,7 @@ uint8_t allowed_xlsch_re_in_dmrs_symbol(uint16_t k,
}
else
{
delta
=
i
<<
1
;
if
(
(((
diff
)
%
6
)
==
delta
)
||
(((
k
-
start_sc
)
%
6
)
==
(
delta
+
1
))
)
if
(
((
diff
%
6
)
==
delta
)
||
((
diff
%
6
)
==
(
delta
+
1
))
)
return
(
0
);
}
}
...
...
openair1/PHY/NR_REFSIG/dmrs_nr.h
View file @
e097bec7
...
...
@@ -58,6 +58,7 @@ uint16_t get_dmrs_freq_idx_ul(uint16_t n, uint8_t k_prime, uint8_t delta, uint8_
uint8_t
allowed_xlsch_re_in_dmrs_symbol
(
uint16_t
k
,
uint16_t
start_sc
,
uint16_t
ofdm_symbol_size
,
uint8_t
numDmrsCdmGrpsNoData
,
uint8_t
dmrs_type
);
...
...
openair1/PHY/NR_REFSIG/nr_dmrs_rx.c
View file @
e097bec7
...
...
@@ -121,18 +121,18 @@ int nr_pdsch_dmrs_rx(PHY_VARS_NR_UE *ue,
array_of_w
*
wf
;
array_of_w
*
wt
;
config_type
=
0
;
//to be updated by higher layer
config_type
=
ue
->
dmrs_DownlinkConfig
.
pdsch_dmrs_type
;
wf
=
(
config_type
==
0
)
?
wf1
:
wf2
;
wt
=
(
config_type
==
0
)
?
wt1
:
wt2
;
wf
=
(
config_type
==
pdsch_dmrs_type1
)
?
wf1
:
wf2
;
wt
=
(
config_type
==
pdsch_dmrs_type1
)
?
wt1
:
wt2
;
if
(
config_type
>
1
)
LOG_E
(
PHY
,
"Bad PDSCH DMRS config type %d
\n
"
,
config_type
);
if
((
p
>=
1000
)
&&
(
p
<
((
config_type
==
0
)
?
1008
:
1012
)))
{
if
((
p
>=
1000
)
&&
(
p
<
((
config_type
==
pdsch_dmrs_type1
)
?
1008
:
1012
)))
{
if
(
ue
->
frame_parms
.
Ncp
==
NORMAL
)
{
for
(
int
i
=
0
;
i
<
nb_pdsch_rb
*
((
config_type
==
0
)
?
6
:
4
);
i
++
)
{
for
(
int
i
=
0
;
i
<
nb_pdsch_rb
*
((
config_type
==
pdsch_dmrs_type1
)
?
6
:
4
);
i
++
)
{
w
=
(
wf
[
p
-
1000
][
i
&
1
])
*
(
wt
[
p
-
1000
][
lp
]);
mod_table
=
(
w
==
1
)
?
nr_rx_mod_table
:
nr_rx_nmod_table
;
...
...
openair1/PHY/NR_TRANSPORT/nr_dlsch.c
View file @
e097bec7
...
...
@@ -140,7 +140,7 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
uint32_t
scrambled_output
[
NR_MAX_NB_CODEWORDS
][
NR_MAX_PDSCH_ENCODED_LENGTH
>>
5
];
int16_t
**
mod_symbs
=
(
int16_t
**
)
dlsch
->
mod_symbs
;
int16_t
**
tx_layers
=
(
int16_t
**
)
dlsch
->
txdataF
;
int8_t
Wf
[
2
],
Wt
[
2
],
l0
,
l_prime
[
2
]
,
delta
;
int8_t
Wf
[
2
],
Wt
[
2
],
l0
,
l_prime
,
l_overline
,
delta
;
uint8_t
dmrs_Type
=
rel15
->
dmrsConfigType
;
int
nb_re_dmrs
;
uint16_t
n_dmrs
;
...
...
@@ -153,10 +153,10 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
n_dmrs
=
((
rel15
->
rbSize
+
rel15
->
rbStart
)
*
4
)
<<
1
;
}
uint16_t
nb_re
;
nb_re
=
((
12
*
rel15
->
NrOfSymbols
)
-
nb_re_dmrs
-
xOverhead
)
*
rel15
->
rbSize
*
rel15
->
NrOfCodeword
s
;
nb_re
=
((
12
*
rel15
->
NrOfSymbols
)
-
nb_re_dmrs
-
xOverhead
)
*
rel15
->
rbSize
*
rel15
->
nrOfLayer
s
;
uint8_t
Qm
=
rel15
->
qamModOrder
[
0
];
uint32_t
encoded_length
=
nb_re
*
Qm
;
int16_t
mod_dmrs
[
n_dmrs
<<
1
]
__attribute__
((
aligned
(
16
)));
int16_t
mod_dmrs
[
14
][
n_dmrs
]
__attribute__
((
aligned
(
16
)));
/// CRC, coding, interleaving and rate matching
...
...
@@ -248,18 +248,19 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
/// Antenna port mapping
//to be moved to init phase potentially, for now tx_layers 1-8 are mapped on antenna ports 1000-1007
/// DMRS QPSK modulation
l0
=
get_l0
(
rel15
->
dlDmrsSymbPos
);
nr_modulation
(
pdsch_dmrs
[
l0
][
0
],
n_dmrs
,
DMRS_MOD_ORDER
,
mod_dmrs
);
// currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
if
(
rel15
->
dlDmrsSymbPos
&
(
1
<<
l
))
nr_modulation
(
pdsch_dmrs
[
l
][
0
],
n_dmrs
,
DMRS_MOD_ORDER
,
mod_dmrs
[
l
]);
// currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated
}
#ifdef DEBUG_DLSCH
l0
=
get_l0
(
rel15
->
dlDmrsSymbPos
);
printf
(
"DMRS modulation (single symbol %d, %d symbols, type %d):
\n
"
,
l0
,
n_dmrs
>>
1
,
dmrs_Type
);
for
(
int
i
=
0
;
i
<
n_dmrs
>>
4
;
i
++
)
{
for
(
int
j
=
0
;
j
<
8
;
j
++
)
{
printf
(
"%d %d
\t
"
,
mod_dmrs
[((
i
<<
3
)
+
j
)
<<
1
],
mod_dmrs
[(((
i
<<
3
)
+
j
)
<<
1
)
+
1
]);
printf
(
"%d %d
\t
"
,
mod_dmrs
[((
i
<<
3
)
+
j
)
<<
1
],
mod_dmrs
[(((
i
<<
3
)
+
j
)
<<
1
)
+
1
]);
}
printf
(
"
\n
"
);
}
...
...
@@ -283,55 +284,71 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
get_Wt
(
Wt
,
ap
,
dmrs_Type
);
get_Wf
(
Wf
,
ap
,
dmrs_Type
);
delta
=
get_delta
(
ap
,
dmrs_Type
);
l_prime
[
0
]
=
0
;
// single symbol ap 0
uint8_t
dmrs_symbol
=
l0
+
l_prime
[
0
];
l_prime
=
0
;
// single symbol ap 0
l0
=
get_l0
(
rel15
->
dlDmrsSymbPos
);
l_overline
=
l0
;
#ifdef DEBUG_DLSCH_MAPPING
uint8_t
dmrs_symbol
=
l0
+
l_prime
;
printf
(
"DMRS Type %d params for ap %d: Wt %d %d
\t
Wf %d %d
\t
delta %d
\t
l_prime %d
\t
l0 %d
\t
DMRS symbol %d
\n
"
,
1
+
dmrs_Type
,
ap
,
Wt
[
0
],
Wt
[
1
],
Wf
[
0
],
Wf
[
1
],
delta
,
l_prime
[
0
]
,
l0
,
dmrs_symbol
);
1
+
dmrs_Type
,
ap
,
Wt
[
0
],
Wt
[
1
],
Wf
[
0
],
Wf
[
1
],
delta
,
l_prime
,
l0
,
dmrs_symbol
);
#endif
uint8_t
k_prime
=
0
;
uint16_t
m
=
0
,
n
=
0
,
dmrs_idx
=
0
,
k
=
0
;
int
txdataF_offset
=
(
slot
%
2
)
*
frame_parms
->
samples_per_slot_wCP
;
if
(
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
// another if condition to be included to check pdsch config type (reference of k)
dmrs_idx
=
rel15
->
rbStart
*
6
;
else
dmrs_idx
=
rel15
->
rbStart
*
4
;
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
k
=
start_sc
;
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
if
((
l
==
dmrs_symbol
)
&&
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
n
,
k_prime
,
delta
,
dmrs_Type
))
%
(
frame_parms
->
ofdm_symbol_size
))))
{
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
[
0
]]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
dmrs_idx
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
[
0
]]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[(
dmrs_idx
<<
1
)
+
1
])
>>
15
;
k
=
start_sc
;
n
=
0
;
k_prime
=
0
;
if
(
dmrs_Type
==
NFAPI_NR_DMRS_TYPE1
)
// another if condition to be included to check pdsch config type (reference of k)
dmrs_idx
=
rel15
->
rbStart
*
6
;
else
dmrs_idx
=
rel15
->
rbStart
*
4
;
for
(
int
i
=
0
;
i
<
rel15
->
rbSize
*
NR_NB_SC_PER_RB
;
i
++
)
{
if
((
rel15
->
dlDmrsSymbPos
&
(
1
<<
l
))
&&
(
k
==
((
start_sc
+
get_dmrs_freq_idx
(
n
,
k_prime
,
delta
,
dmrs_Type
))
%
(
frame_parms
->
ofdm_symbol_size
))))
{
if
(
l
==
(
l_overline
+
1
))
//take into account the double DMRS symbols
l_prime
=
1
;
else
if
(
l
>
(
l_overline
+
1
))
{
//new DMRS pair
l_overline
=
l
;
l_prime
=
0
;
}
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][
dmrs_idx
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
Wt
[
l_prime
]
*
Wf
[
k_prime
]
*
amp
*
mod_dmrs
[
l
][(
dmrs_idx
<<
1
)
+
1
])
>>
15
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"dmrs_idx %d
\t
l %d
\t
k %d
\t
k_prime %d
\t
n %d
\t
txdataF: %d %d
\n
"
,
dmrs_idx
,
l
,
k
,
k_prime
,
n
,
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
printf
(
"dmrs_idx %d
\t
l %d
\t
k %d
\t
k_prime %d
\t
n %d
\t
txdataF: %d %d
\n
"
,
dmrs_idx
,
l
,
k
,
k_prime
,
n
,
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
#endif
dmrs_idx
++
;
k_prime
++
;
k_prime
&=
1
;
n
+=
(
k_prime
)
?
0
:
1
;
}
else
{
if
(
(
l
!=
dmrs_symbol
)
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][
m
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][(
m
<<
1
)
+
1
])
>>
15
;
dmrs_idx
++
;
k_prime
++
;
k_prime
&=
1
;
n
+=
(
k_prime
)
?
0
:
1
;
}
else
{
if
(
(
!
(
rel15
->
dlDmrsSymbPos
&
(
1
<<
l
)))
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
frame_parms
->
ofdm_symbol_size
,
rel15
->
numDmrsCdmGrpsNoData
,
dmrs_Type
))
{
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][
m
<<
1
])
>>
15
;
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]
=
(
amp
*
tx_layers
[
ap
][(
m
<<
1
)
+
1
])
>>
15
;
#ifdef DEBUG_DLSCH_MAPPING
printf
(
"m %d
\t
l %d
\t
k %d
\t
txdataF: %d %d
\n
"
,
m
,
l
,
k
,
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
printf
(
"m %d
\t
l %d
\t
k %d
\t
txdataF: %d %d
\n
"
,
m
,
l
,
k
,
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
txdataF_offset
)],
((
int16_t
*
)
txdataF
[
ap
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
txdataF_offset
)]);
#endif
m
++
;
}
}
if
(
++
k
>=
frame_parms
->
ofdm_symbol_size
)
k
-=
frame_parms
->
ofdm_symbol_size
;
}
//RE loop
m
++
;
}
}
if
(
++
k
>=
frame_parms
->
ofdm_symbol_size
)
k
-=
frame_parms
->
ofdm_symbol_size
;
}
//RE loop
}
// symbol loop
}
// layer loop
dlsch
->
slot_tx
[
slot
]
=
0
;
}
// dlsch loop
return
0
;
...
...
openair1/PHY/NR_TRANSPORT/nr_sch_dmrs.c
View file @
e097bec7
...
...
@@ -67,12 +67,12 @@ void get_antenna_ports(uint8_t *ap, uint8_t n_symbs, uint8_t config) {
void
get_Wt
(
int8_t
*
Wt
,
uint8_t
ap
,
uint8_t
config
)
{
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
(
Wt
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
3
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
3
+
i
]);
*
(
Wt
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
5
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
5
+
i
]);
}
void
get_Wf
(
int8_t
*
Wf
,
uint8_t
ap
,
uint8_t
config
)
{
for
(
int
i
=
0
;
i
<
2
;
i
++
)
*
(
Wf
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
5
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
5
+
i
]);
*
(
Wf
+
i
)
=
(
config
==
NFAPI_NR_DMRS_TYPE1
)
?
(
pdsch_dmrs_1
[
ap
][
3
+
i
])
:
(
pdsch_dmrs_2
[
ap
][
3
+
i
]);
}
uint8_t
get_delta
(
uint8_t
ap
,
uint8_t
config
)
{
...
...
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.c
View file @
e097bec7
...
...
@@ -185,3 +185,57 @@ short filt8_rr1[8] = {
short
filt8_rr2
[
8
]
=
{
-
4096
,
-
8192
,
-
12288
,
-
16384
,
0
,
0
,
0
,
0
};
short
filt8_l2
[
8
]
=
{
0
,
0
,
13107
,
9830
,
6554
,
3277
,
0
,
0
};
short
filt8_r2
[
8
]
=
{
0
,
0
,
3277
,
6554
,
9830
,
13107
,
0
,
0
};
short
filt8_m2
[
8
]
=
{
0
,
0
,
0
,
0
,
13107
,
9830
,
6554
,
3277
};
short
filt8_mm2
[
8
]
=
{
0
,
0
,
0
,
0
,
3277
,
6554
,
9830
,
13107
};
short
filt8_rl2
[
8
]
=
{
19661
,
22938
,
26214
,
29491
,
0
,
0
,
0
,
0
};
short
filt8_rm2
[
8
]
=
{
-
3277
,
-
6554
,
-
9830
,
-
13107
,
0
,
0
,
0
,
0
};
//-3277,-6554,-9830,-13107
short
filt8_l3
[
8
]
=
{
22938
,
19661
,
0
,
0
,
13107
,
9830
,
6554
,
3277
};
short
filt8_r3
[
8
]
=
{
-
7537
,
-
4260
,
0
,
0
,
3277
,
6554
,
9830
,
13107
};
//-6554,-3277
short
filt8_rl3
[
8
]
=
{
0
,
0
,
19661
,
22938
,
0
,
0
,
0
,
0
};
short
filt8_rr3
[
8
]
=
{
0
,
0
,
-
4260
,
-
7537
,
0
,
0
,
0
,
0
};
//-3277,-6554
short
filt8_dcrl1
[
8
]
=
{
14895
,
13405
,
11916
,
10426
,
8937
,
7447
,
5958
,
4468
};
short
filt8_dcrh1
[
8
]
=
{
2979
,
1489
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt8_dcll1
[
8
]
=
{
13405
,
14895
,
0
,
0
,
0
,
0
,
0
,
0
};
short
filt8_dclh1
[
8
]
=
{
1489
,
2979
,
4468
,
5958
,
7447
,
8937
,
10426
,
11916
};
short
filt8_dcrl2
[
8
]
=
{
0
,
0
,
0
,
0
,
14895
,
13405
,
11916
,
10426
};
short
filt8_dcrh2
[
8
]
=
{
8937
,
7447
,
5958
,
4468
,
2979
,
1489
,
0
,
0
,};
short
filt8_dcll2
[
8
]
=
{
7447
,
8937
,
10426
,
11916
,
13405
,
14895
,
0
,
0
};
short
filt8_dclh2
[
8
]
=
{
0
,
0
,
0
,
0
,
1489
,
2979
,
4468
,
5958
};
openair1/PHY/NR_UE_ESTIMATION/filt16a_32.h
View file @
e097bec7
...
...
@@ -133,4 +133,40 @@ extern short filt8_rr1[8];
extern
short
filt8_rr2
[
8
];
extern
short
filt8_rm2
[
8
];
extern
short
filt8_rl2
[
8
];
extern
short
filt8_l2
[
8
];
extern
short
filt8_r2
[
8
];
extern
short
filt8_m2
[
8
];
extern
short
filt8_mm2
[
8
];
extern
short
filt8_l3
[
8
];
extern
short
filt8_r3
[
8
];
extern
short
filt8_rr3
[
8
];
extern
short
filt8_rl3
[
8
];
extern
short
filt8_dcrl1
[
8
];
extern
short
filt8_dcrh1
[
8
];
extern
short
filt8_dcll1
[
8
];
extern
short
filt8_dclh1
[
8
];
extern
short
filt8_dcrl2
[
8
];
extern
short
filt8_dcrh2
[
8
];
extern
short
filt8_dcll2
[
8
];
extern
short
filt8_dclh2
[
8
];
#endif
\ No newline at end of file
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
View file @
e097bec7
This diff is collapsed.
Click to expand it.
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
View file @
e097bec7
...
...
@@ -151,6 +151,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
uint32_t
llr_offset_symbol
;
//uint16_t bundle_L = 2;
uint8_t
pilots
=
0
;
uint8_t
config_type
=
ue
->
dmrs_DownlinkConfig
.
pdsch_dmrs_type
;
uint16_t
n_tx
=
1
,
n_rx
=
1
;
int32_t
median
[
16
];
uint32_t
len
;
...
...
@@ -377,6 +378,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
pdsch_vars
[
eNB_id
]
->
pmi_ext
,
symbol
,
pilots
,
config_type
,
start_rb
,
nb_rb_pdsch
,
nr_tti_rx
,
...
...
@@ -393,7 +395,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
return
(
-
1
);
}
len
=
(
pilots
==
1
)
?
(
nb_rb
*
6
)
:
(
nb_rb
*
12
);
len
=
(
pilots
==
1
)
?
(
(
config_type
==
pdsch_dmrs_type1
)
?
nb_rb
*
(
12
-
6
*
dlsch0_harq
->
n_dmrs_cdm_groups
)
:
nb_rb
*
(
12
-
4
*
dlsch0_harq
->
n_dmrs_cdm_groups
)
)
:
(
nb_rb
*
12
);
#if UE_TIMING_TRACE
stop_meas
(
&
ue
->
generic_stat_bis
[
ue
->
current_thread_id
[
nr_tti_rx
]][
slot
]);
...
...
@@ -417,6 +419,7 @@ int nr_rx_pdsch(PHY_VARS_NR_UE *ue,
dlsch
,
symbol
,
pilots
,
len
,
nb_rb
);
#if UE_TIMING_TRACE
...
...
@@ -1806,6 +1809,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
NR_UE_DLSCH_t
**
dlsch_ue
,
uint8_t
symbol
,
uint8_t
pilots
,
uint32_t
len
,
unsigned
short
nb_rb
)
{
...
...
@@ -1815,17 +1819,14 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
unsigned
char
aatx
,
aarx
;
__m128i
*
dl_ch128
,
ch_amp128
;
if
(
pilots
==
1
){
nb_rb
=
nb_rb
>>
1
;
}
uint32_t
nb_rb_0
=
len
/
12
+
((
len
%
12
)
?
1
:
0
);
// Determine scaling amplitude based the symbol
ch_amp
=
1024
*
8
;
//((pilots) ? (dlsch_ue[0]->sqrt_rho_b) : (dlsch_ue[0]->sqrt_rho_a));
LOG_D
(
PHY
,
"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d
\n
"
,
symbol
,
ch_amp
,
pilots
,
nb_rb
,
frame_parms
->
Ncp
,
symbol
);
// printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
LOG_D
(
PHY
,
"Scaling PDSCH Chest in OFDM symbol %d by %d, pilots %d nb_rb %d NCP %d symbol %d
\n
"
,
symbol
,
ch_amp
,
pilots
,
nb_rb
,
frame_parms
->
Ncp
,
symbol
);
// printf("Scaling PDSCH Chest in OFDM symbol %d by %d\n",symbol_mod,ch_amp);
ch_amp128
=
_mm_set1_epi16
(
ch_amp
);
// Q3.13
...
...
@@ -1834,7 +1835,7 @@ void nr_dlsch_scale_channel(int **dl_ch_estimates_ext,
dl_ch128
=
(
__m128i
*
)
&
dl_ch_estimates_ext
[(
aatx
<<
1
)
+
aarx
][
symbol
*
nb_rb
*
12
];
for
(
rb
=
0
;
rb
<
nb_rb
;
rb
++
)
{
for
(
rb
=
0
;
rb
<
nb_rb
_0
;
rb
++
)
{
dl_ch128
[
0
]
=
_mm_mulhi_epi16
(
dl_ch128
[
0
],
ch_amp128
);
dl_ch128
[
0
]
=
_mm_slli_epi16
(
dl_ch128
[
0
],
3
);
...
...
@@ -2360,6 +2361,7 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
unsigned
char
*
pmi_ext
,
unsigned
char
symbol
,
uint8_t
pilots
,
uint8_t
config_type
,
unsigned
short
start_rb
,
unsigned
short
nb_rb_pdsch
,
unsigned
char
nr_tti_rx
,
...
...
@@ -2376,8 +2378,12 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
unsigned
char
j
=
0
;
AssertFatal
(
frame_parms
->
nushift
==
0
||
frame_parms
->
nushift
==
1
,
"nushift %d is illegal
\n
"
,
frame_parms
->
nushift
);
if
(
config_type
==
pdsch_dmrs_type1
)
AssertFatal
(
frame_parms
->
nushift
==
0
||
frame_parms
->
nushift
==
1
,
"nushift %d is illegal
\n
"
,
frame_parms
->
nushift
);
else
AssertFatal
(
frame_parms
->
nushift
==
0
||
frame_parms
->
nushift
==
2
||
frame_parms
->
nushift
==
4
,
"nushift %d is illegal
\n
"
,
frame_parms
->
nushift
);
for
(
aarx
=
0
;
aarx
<
frame_parms
->
nb_antennas_rx
;
aarx
++
)
{
...
...
@@ -2397,34 +2403,44 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
if
(
k
>
frame_parms
->
ofdm_symbol_size
)
{
k
=
k
-
frame_parms
->
ofdm_symbol_size
;
rxF
=
&
rxdataF
[
aarx
][(
k
+
(
symbol
*
(
frame_parms
->
ofdm_symbol_size
)))];
}
}
if
(
pilots
==
0
)
{
memcpy
((
void
*
)
rxF_ext
,(
void
*
)
rxF
,
12
*
sizeof
(
*
rxF_ext
));
memcpy
((
void
*
)
dl_ch0_ext
,(
void
*
)
dl_ch0
,
12
*
sizeof
(
*
dl_ch0_ext
));
dl_ch0_ext
+=
12
;
rxF_ext
+=
12
;
}
else
{
j
=
0
;
for
(
i
=
(
1
-
frame_parms
->
nushift
);
i
<
12
;
i
+=
2
)
{
rxF_ext
[
j
]
=
rxF
[
i
];
dl_ch0_ext
[
j
]
=
dl_ch0
[
i
];
j
++
;
}
dl_ch0_ext
+=
6
;
rxF_ext
+=
6
;
}
else
{
//the symbol contains DMRS
j
=
0
;
if
(
config_type
==
pdsch_dmrs_type1
){
for
(
i
=
(
1
-
frame_parms
->
nushift
);
i
<
12
;
i
+=
2
)
{
rxF_ext
[
j
]
=
rxF
[
i
];
dl_ch0_ext
[
j
]
=
dl_ch0
[
i
];
j
++
;
}
dl_ch0_ext
+=
6
;
rxF_ext
+=
6
;
}
else
{
for
(
i
=
(
2
+
frame_parms
->
nushift
);
i
<
6
;
i
++
)
{
rxF_ext
[
j
]
=
rxF
[
i
];
dl_ch0_ext
[
j
]
=
dl_ch0
[
i
];
j
++
;
}
for
(
i
=
(
8
+
frame_parms
->
nushift
);
i
<
12
;
i
++
)
{
rxF_ext
[
j
]
=
rxF
[
i
];
dl_ch0_ext
[
j
]
=
dl_ch0
[
i
];
j
++
;
}
dl_ch0_ext
+=
8
;
rxF_ext
+=
8
;
}
}
dl_ch0
+=
12
;
rxF
+=
12
;
k
+=
12
;
if
(
k
>=
frame_parms
->
ofdm_symbol_size
)
{
k
=
k
-
(
frame_parms
->
ofdm_symbol_size
);
rxF
=
&
rxdataF
[
aarx
][
k
+
(
symbol
*
(
frame_parms
->
ofdm_symbol_size
))];
k
=
k
-
(
frame_parms
->
ofdm_symbol_size
);
rxF
=
&
rxdataF
[
aarx
][
k
+
(
symbol
*
(
frame_parms
->
ofdm_symbol_size
))];
}
}
}
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
View file @
e097bec7
...
...
@@ -714,9 +714,10 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
unsigned
short
pmi
,
unsigned
char
*
pmi_ext
,
unsigned
char
symbol
,
uint8_t
pilots
,
unsigned
short
start_rb
,
unsigned
short
nb_pdsch_rb
,
uint8_t
pilots
,
uint8_t
config_type
,
unsigned
short
start_rb
,
unsigned
short
nb_pdsch_rb
,
unsigned
char
nr_tti_rx
,
uint32_t
high_speed_flag
,
NR_DL_FRAME_PARMS
*
frame_parms
);
...
...
@@ -1002,7 +1003,8 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_DL_FRAME_PARMS
*
frame_parms
,
NR_UE_DLSCH_t
**
dlsch_ue
,
uint8_t
symbol
,
uint8_t
start_symbol
,
uint8_t
start_symbol
,
uint32_t
len
,
uint16_t
nb_rb
);
/** \brief This is the top-level entry point for DLSCH decoding in UE. It should be replicated on several
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
View file @
e097bec7
...
...
@@ -360,7 +360,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
ptrs_idx
++
;
}
else
if
(
!
is_dmrs_sym
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
cdm_grps_no_data
,
dmrs_type
))
{
}
else
if
(
!
is_dmrs_sym
||
allowed_xlsch_re_in_dmrs_symbol
(
k
,
start_sc
,
frame_parms
->
ofdm_symbol_size
,
cdm_grps_no_data
,
dmrs_type
))
{
((
int16_t
*
)
txdataF
[
ap
])[(
sample_offsetF
)
<<
1
]
=
((
int16_t
*
)
ulsch_ue
->
y
)[
m
<<
1
];
((
int16_t
*
)
txdataF
[
ap
])[((
sample_offsetF
)
<<
1
)
+
1
]
=
((
int16_t
*
)
ulsch_ue
->
y
)[(
m
<<
1
)
+
1
];
...
...
openair1/PHY/impl_defs_nr.h
View file @
e097bec7
...
...
@@ -496,8 +496,8 @@ typedef struct{ // CSI-MeasConfig IE is used to configure CSI-RS (reference sign
uint8_t
reportTriggerSize
;
}
csi_MeasConfig_t
;
typedef
enum
{
pdsch_dmrs_type1
=
1
,
pdsch_dmrs_type2
=
2
pdsch_dmrs_type1
=
0
,
pdsch_dmrs_type2
=
1
}
pdsch_dmrs_type_t
;
typedef
enum
{
pusch_dmrs_type1
=
0
,
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
e097bec7
...
...
@@ -738,15 +738,27 @@ int nr_ue_pdsch_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, int eNB_
// do channel estimation for first DMRS only
for
(
m
=
s0
;
m
<
3
;
m
++
)
{
if
(((
1
<<
m
)
&
dlsch0
->
harq_processes
[
harq_pid
]
->
dlDmrsSymbPos
)
>
0
)
{
nr_pdsch_channel_estimation
(
ue
,
0
/*eNB_id*/
,
nr_tti_rx
,
0
/*p*/
,
m
,
ue
->
frame_parms
.
first_carrier_offset
+
(
BWPStart
+
pdsch_start_rb
)
*
12
,
pdsch_nb_rb
);
LOG_D
(
PHY
,
"Channel Estimation in symbol %d
\n
"
,
m
);
break
;
for
(
uint8_t
aatx
=
0
;
aatx
<
1
;
aatx
++
)
{
//for MIMO Config: it shall loop over no_layers
nr_pdsch_channel_estimation
(
ue
,
0
/*eNB_id*/
,
nr_tti_rx
,
aatx
/*p*/
,
m
,
ue
->
frame_parms
.
first_carrier_offset
+
(
BWPStart
+
pdsch_start_rb
)
*
12
,
pdsch_nb_rb
);
LOG_D
(
PHY
,
"PDSCH Channel estimation gNB id %d, PDSCH antenna port %d, slot %d, symbol %d
\n
"
,
0
,
aatx
,
nr_tti_rx
,
m
);
#if 0
///LOG_M: the channel estimation
int nr_frame_rx = proc->frame_rx;
char filename[100];
for (uint8_t aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
sprintf(filename,"PDSCH_CHANNEL_frame%d_slot%d_sym%d_port%d_rx%d.m", nr_frame_rx, nr_tti_rx, m, aatx,aarx);
int **dl_ch_estimates = ue->pdsch_vars[ue->current_thread_id[nr_tti_rx]][0]->dl_ch_estimates;
LOG_M(filename,"channel_F",&dl_ch_estimates[aatx*ue->frame_parms.nb_antennas_rx+aarx][ue->frame_parms.ofdm_symbol_size*m],ue->frame_parms.ofdm_symbol_size, 1, 1);
}
#endif
}
break
;
}
}
for
(
m
=
s0
;
m
<
(
s1
+
s0
);
m
++
)
{
...
...
targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
View file @
e097bec7
...
...
@@ -23,7 +23,7 @@ gNBs =
ssb_SubcarrierOffset
=
0
;
pdsch_AntennaPorts
=
1
;
servingCellConfigCommon
= (
{
#spCellConfigCommon
...
...
@@ -247,8 +247,15 @@ RUs = (
max_pdschReferenceSignalPower
= -
27
;
max_rxgain
=
75
;
eNB_instances
= [
0
];
#beamforming 1x4 matrix:
bf_weights
= [
0
x00007fff
,
0
x0000
,
0
x0000
,
0
x0000
];
##beamforming 1x2 matrix: 1 layer x 2 antennas
bf_weights
= [
0
x00007fff
,
0
x0000
];
##beamforming 1x4 matrix: 1 layer x 4 antennas
#bf_weights = [0x00007fff, 0x0000,0x0000, 0x0000];
## beamforming 2x2 matrix:
# bf_weights = [0x00007fff, 0x00000000, 0x00000000, 0x00007fff];
## beamforming 4x4 matrix:
#bf_weights = [0x00007fff, 0x0000, 0x0000, 0x0000, 0x00000000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff, 0x0000, 0x0000, 0x0000, 0x0000, 0x00007fff];
sdr_addrs
=
"addr=192.168.10.2,mgmt_addr=192.168.10.2,second_addr=192.168.20.2"
;
clock_src
=
"external"
;
}
...
...
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