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
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
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
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
Show 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
...
...
@@ -250,12 +250,13 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
//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
++
)
{
...
...
@@ -283,27 +284,41 @@ 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
;
for
(
int
l
=
rel15
->
StartSymbolIndex
;
l
<
rel15
->
StartSymbolIndex
+
rel15
->
NrOfSymbols
;
l
++
)
{
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
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
;
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
)],
...
...
@@ -313,10 +328,10 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
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
))
{
}
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
...
...
@@ -332,6 +347,8 @@ uint8_t nr_generate_pdsch(PHY_VARS_gNB *gNB,
}
//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
...
...
@@ -24,6 +24,7 @@
#include "SCHED_NR_UE/defs.h"
#include "nr_estimation.h"
#include "PHY/NR_REFSIG/refsig_defs_ue.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
#include "filt16a_32.h"
//#define DEBUG_PDSCH
...
...
@@ -652,8 +653,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
unsigned
char
aarx
;
unsigned
short
k
;
unsigned
int
pilot_cnt
;
int16_t
ch
[
2
],
*
pil
,
*
rxF
,
*
dl_ch
;
int16_t
*
fl
,
*
fm
,
*
fr
,
*
fml
,
*
fmr
,
*
fmm
,
*
fdcl
,
*
fdcr
,
*
fdclh
,
*
fdcrh
;
int16_t
ch
_l
[
2
],
ch_r
[
2
],
ch
[
2
],
*
pil
,
*
rxF
,
*
dl_ch
;
int16_t
*
fl
,
*
fm
,
*
fr
,
*
fml
,
*
fmr
,
*
fmm
,
*
fdcl
,
*
fdcr
,
*
fdclh
,
*
fdcrh
,
*
frl
,
*
frr
;
int
ch_offset
,
symbol_offset
;
//uint16_t Nid_cell = (eNB_offset == 0) ? ue->frame_parms.Nid_cell : ue->measurements.adj_cell_id[eNB_offset-1];
...
...
@@ -662,9 +663,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
int
**
dl_ch_estimates
=
ue
->
pdsch_vars
[
ue
->
current_thread_id
[
Ns
]][
eNB_offset
]
->
dl_ch_estimates
;
int
**
rxdataF
=
ue
->
common_vars
.
common_vars_rx_data_per_thread
[
ue
->
current_thread_id
[
Ns
]].
rxdataF
;
nushift
=
(
p
>>
1
)
&
1
;
ue
->
frame_parms
.
nushift
=
nushift
;
if
(
ue
->
high_speed_flag
==
0
)
// use second channel estimate position for temporary storage
ch_offset
=
ue
->
frame_parms
.
ofdm_symbol_size
;
else
...
...
@@ -680,21 +678,33 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ue
->
frame_parms
.
Ncp
,
Ns
,
k
,
symbol
);
#endif
switch
(
nushift
)
{
case
0
:
fl
=
filt8_l0
;
fm
=
filt8_m0
;
fr
=
filt8_r0
;
fmm
=
filt8_mm0
;
fml
=
filt8_m0
;
fmr
=
filt8_mr0
;
fdcl
=
filt8_dcl0
;
fdcr
=
filt8_dcr0
;
fdclh
=
filt8_dcl0_h
;
fdcrh
=
filt8_dcr0_h
;
// generate pilot for gNB port number 1000+p
uint16_t
rb_offset
=
(
bwp_start_subcarrier
-
ue
->
frame_parms
.
first_carrier_offset
)
/
12
;
uint8_t
config_type
=
ue
->
dmrs_DownlinkConfig
.
pdsch_dmrs_type
;
int8_t
delta
=
get_delta
(
p
,
config_type
);
nr_pdsch_dmrs_rx
(
ue
,
Ns
,
ue
->
nr_gold_pdsch
[
eNB_offset
][
Ns
][
0
],
&
pilot
[
0
],
1000
+
p
,
0
,
nb_rb_pdsch
+
rb_offset
);
if
(
config_type
==
pdsch_dmrs_type1
){
nushift
=
(
p
>>
1
)
&
1
;
ue
->
frame_parms
.
nushift
=
nushift
;
switch
(
delta
)
{
case
0
:
//port 0,1
fl
=
filt8_l0
;
//left interpolation Filter for DMRS config. 1
fm
=
filt8_m0
;
//left middle interpolation Filter
fr
=
filt8_r0
;
//right interpolation Filter
fmm
=
filt8_mm0
;;
//middle middle interpolation Filter
fml
=
filt8_m0
;
//left middle interpolation Filter
fmr
=
filt8_mr0
;
//middle right interpolation Filter
fdcl
=
filt8_dcl0
;
//left DC interpolation Filter (even RB)
fdcr
=
filt8_dcr0
;
//right DC interpolation Filter (even RB)
fdclh
=
filt8_dcl0_h
;
//left DC interpolation Filter (odd RB)
fdcrh
=
filt8_dcr0_h
;
//right DC interpolation Filter (odd RB)
frl
=
NULL
;
frr
=
NULL
;
break
;
case
1
:
case
1
:
//port2,3
fl
=
filt8_l1
;
fm
=
filt8_m1
;
fr
=
filt8_r1
;
...
...
@@ -705,26 +715,62 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
fdcr
=
filt8_dcr1
;
fdclh
=
filt8_dcl1_h
;
fdcrh
=
filt8_dcr1_h
;
frl
=
NULL
;
frr
=
NULL
;
break
;
default:
msg
(
"pdsch_channel_estimation: nushift=%d -> ERROR
\n
"
,
nushift
);
return
(
-
1
)
;
return
-
1
;
break
;
}
}
else
{
//pdsch_dmrs_type2
nushift
=
delta
;
ue
->
frame_parms
.
nushift
=
nushift
;
switch
(
delta
)
{
case
0
:
//port 0,1
fl
=
filt8_l2
;
//left interpolation Filter should be fml
fr
=
filt8_r2
;
//right interpolation Filter should be fmr
fm
=
filt8_l2
;
fmm
=
filt8_r2
;
fml
=
filt8_ml2
;
fmr
=
filt8_mr2
;
frl
=
filt8_rl2
;
frr
=
filt8_rm2
;
fdcl
=
filt8_dcl1
;
fdcr
=
filt8_dcr1
;
fdclh
=
filt8_dcl1_h
;
fdcrh
=
filt8_dcr1_h
;
break
;
case
2
:
//port2,3
fl
=
filt8_l3
;
fm
=
filt8_m2
;
fr
=
filt8_r3
;
fmm
=
filt8_mm2
;
fml
=
filt8_l2
;
fmr
=
filt8_r2
;
frl
=
filt8_rl3
;
frr
=
filt8_rr3
;
fdcl
=
NULL
;
fdcr
=
NULL
;
fdclh
=
NULL
;
fdcrh
=
NULL
;
break
;
// generate pilot
uint16_t
rb_offset
=
(
bwp_start_subcarrier
-
ue
->
frame_parms
.
first_carrier_offset
)
/
12
;
int
config_type
=
0
;
// needs to be updated from higher layer
nr_pdsch_dmrs_rx
(
ue
,
Ns
,
ue
->
nr_gold_pdsch
[
eNB_offset
][
Ns
][
0
],
&
pilot
[
0
],
1000
,
0
,
nb_rb_pdsch
+
rb_offset
);
default:
msg
(
"pdsch_channel_estimation: nushift=%d -> ERROR
\n
"
,
nushift
);
return
-
1
;
break
;
}
}
for
(
aarx
=
0
;
aarx
<
ue
->
frame_parms
.
nb_antennas_rx
;
aarx
++
)
{
pil
=
(
int16_t
*
)
&
pilot
[
rb_offset
*
((
config_type
==
0
)
?
6
:
4
)];
pil
=
(
int16_t
*
)
&
pilot
[
rb_offset
*
((
config_type
==
pdsch_dmrs_type1
)
?
6
:
4
)];
k
=
k
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
k
+
nushift
)];
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
aarx
][
ch_offset
];
re_offset
=
k
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
re_offset
+
nushift
)];
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
memset
(
dl_ch
,
0
,
4
*
(
ue
->
frame_parms
.
ofdm_symbol_size
));
if
(
ue
->
high_speed_flag
==
0
)
// multiply previous channel estimate by ch_est_alpha
...
...
@@ -737,7 +783,8 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
printf
(
"rxF addr %p p %d
\n
"
,
rxF
,
p
);
printf
(
"dl_ch addr %p nushift %d
\n
"
,
dl_ch
,
nushift
);
#endif
//if ((ue->frame_parms.N_RB_DL&1)==0) {
if
(
config_type
==
pdsch_dmrs_type1
)
{
// Treat first 2 pilots specially (left edge)
ch
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
...
...
@@ -867,7 +914,6 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
ch
,
dl_ch
,
8
);
//}
// check if PRB crosses DC and improve estimates around DC
if
((
bwp_start_subcarrier
<
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
bwp_start_subcarrier
+
nb_rb_pdsch
*
12
>=
ue
->
frame_parms
.
ofdm_symbol_size
))
{
...
...
@@ -875,7 +921,7 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
uint16_t
idxDC
=
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
-
bwp_start_subcarrier
);
uint16_t
idxPil
=
idxDC
/
2
;
re_offset
=
k
;
pil
=
(
int16_t
*
)
&
pilot
[
rb_offset
*
((
config_type
==
0
)
?
6
:
4
)];
pil
=
(
int16_t
*
)
&
pilot
[
rb_offset
*
((
config_type
==
pdsch_dmrs_type1
)
?
6
:
4
)];
pil
+=
(
idxPil
-
2
);
dl_ch
+=
(
idxDC
-
4
);
dl_ch
=
memset
(
dl_ch
,
0
,
sizeof
(
int16_t
)
*
10
);
...
...
@@ -920,11 +966,222 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
dl_ch
,
8
);
}
}
}
else
{
//pdsch_dmrs_type2 |dmrs_r,dmrs_l,0,0,0,0,dmrs_r,dmrs_l,0,0,0,0|
// Treat first 4 pilots specially (left edge)
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
printf
(
"ch 0 %d
\n
"
,((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
]));
printf
(
"pilot 0 : rxF - > (%d,%d) addr %p ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
rxF
[
0
],
rxF
[
1
],
&
rxF
[
0
],
ch_l
[
0
],
ch_l
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
dl_ch
[(
0
+
2
*
nushift
)]
=
ch
[
0
];
dl_ch
[(
1
+
2
*
nushift
)]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
multadd_real_vector_complex_scalar
(
fl
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
multadd_real_vector_complex_scalar
(
fr
,
ch
,
dl_ch
,
8
);
dl_ch
+=
12
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
+=
4
;
for
(
pilot_cnt
=
4
;
pilot_cnt
<
4
*
nb_rb_pdsch
;
pilot_cnt
+=
4
)
{
multadd_real_vector_complex_scalar
(
fml
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
printf
(
"pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
,
rxF
[
0
],
rxF
[
1
],
ch_l
[
0
],
ch_l
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
#ifdef DEBUG_PDSCH
printf
(
"pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
+
1
,
rxF
[
0
],
rxF
[
1
],
ch_r
[
0
],
ch_r
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
multadd_real_vector_complex_scalar
(
fmr
,
ch
,
dl_ch
,
8
);
dl_ch
+=
8
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
multadd_real_vector_complex_scalar
(
fm
,
ch
,
dl_ch
,
8
);
pil
+=
2
;
re_offset
=
(
re_offset
+
5
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_l
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_l
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
pil
+=
2
;
re_offset
=
(
re_offset
+
1
)
%
ue
->
frame_parms
.
ofdm_symbol_size
;
rxF
=
(
int16_t
*
)
&
rxdataF
[
aarx
][(
symbol_offset
+
nushift
+
re_offset
)];
ch_r
[
0
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
0
]
-
(
int32_t
)
pil
[
1
]
*
rxF
[
1
])
>>
15
);
ch_r
[
1
]
=
(
int16_t
)(((
int32_t
)
pil
[
0
]
*
rxF
[
1
]
+
(
int32_t
)
pil
[
1
]
*
rxF
[
0
])
>>
15
);
#ifdef DEBUG_PDSCH
printf
(
"pilot %u : rxF - > (%d,%d) ch -> (%d,%d), pil -> (%d,%d)
\n
"
,
pilot_cnt
+
1
,
rxF
[
0
],
rxF
[
1
],
ch_r
[
0
],
ch_r
[
1
],
pil
[
0
],
pil
[
1
]);
#endif
ch
[
0
]
=
(
ch_l
[
0
]
+
ch_r
[
0
])
>>
1
;
ch
[
1
]
=
(
ch_l
[
1
]
+
ch_r
[
1
])
>>
1
;
multadd_real_vector_complex_scalar
(
fmm
,
ch
,
dl_ch
,
8
);
dl_ch
+=
12
;
dl_ch
[
0
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
1
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
[
2
+
2
*
nushift
]
=
ch
[
0
];
dl_ch
[
3
+
2
*
nushift
]
=
ch
[
1
];
dl_ch
+=
4
;
}
// Treat last 2 pilots specially (right edge)
// dl_ch-2+nushift<<1
multadd_real_vector_complex_scalar
(
frl
,
dl_ch
-
2
+
2
*
nushift
,
dl_ch
,
8
);
multadd_real_vector_complex_scalar
(
frr
,
dl_ch
-
14
+
2
*
nushift
,
/*14*/
dl_ch
,
8
);
// check if PRB crosses DC and improve estimates around DC
if
((
bwp_start_subcarrier
<
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
bwp_start_subcarrier
+
nb_rb_pdsch
*
12
>=
ue
->
frame_parms
.
ofdm_symbol_size
)
&&
(
p
<
2
))
{
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
uint16_t
idxDC
=
2
*
(
ue
->
frame_parms
.
ofdm_symbol_size
-
bwp_start_subcarrier
);
dl_ch
+=
(
idxDC
-
8
);
dl_ch
=
memset
(
dl_ch
,
0
,
sizeof
(
int16_t
)
*
20
);
dl_ch
-=
2
;
ch_r
[
0
]
=
dl_ch
[
0
];
ch_r
[
1
]
=
dl_ch
[
1
]
;
dl_ch
+=
22
;
ch_l
[
0
]
=
dl_ch
[
0
];
ch_l
[
1
]
=
dl_ch
[
1
]
;
// for proper allignment of SIMD vectors
if
((
ue
->
frame_parms
.
N_RB_DL
&
1
)
==
0
)
{
dl_ch
-=
20
;
//Interpolate fdcrl1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrl1
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdclh1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dclh1
,
ch_l
,
dl_ch
,
8
);
dl_ch
+=
16
;
//Interpolate fdcrh1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrh1
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdcll1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dcll1
,
ch_l
,
dl_ch
,
8
);
}
else
{
dl_ch
-=
28
;
//Interpolate fdcrl1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrl2
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdclh1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dclh2
,
ch_l
,
dl_ch
,
8
);
dl_ch
+=
16
;
//Interpolate fdcrh1 with ch_r
multadd_real_vector_complex_scalar
(
filt8_dcrh2
,
ch_r
,
dl_ch
,
8
);
//Interpolate fdcll1 with ch_l
multadd_real_vector_complex_scalar
(
filt8_dcll2
,
ch_l
,
dl_ch
,
8
);
}
}
}
#ifdef DEBUG_PDSCH
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
aarx
][
ch_offset
];
dl_ch
=
(
int16_t
*
)
&
dl_ch_estimates
[
p
*
ue
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
for
(
uint16_t
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pdsch
*
12
/
8
);
idxP
++
)
{
for
(
uint8_t
idxI
=
0
;
idxI
<
16
;
idxI
+=
2
)
{
printf
(
"%d
\t
%d
\t
"
,
dl_ch
[
idxP
*
16
+
idxI
],
dl_ch
[
idxP
*
16
+
idxI
+
1
]);
...
...
@@ -933,7 +1190,5 @@ int nr_pdsch_channel_estimation(PHY_VARS_NR_UE *ue,
}
#endif
}
return
(
0
);
}
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,10 +1819,7 @@ 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
...
...
@@ -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
;
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
++
)
{
...
...
@@ -2403,27 +2409,37 @@ unsigned short nr_dlsch_extract_rbs_single(int **rxdataF,
memcpy
((
void
*
)
dl_ch0_ext
,(
void
*
)
dl_ch0
,
12
*
sizeof
(
*
dl_ch0_ext
));
dl_ch0_ext
+=
12
;
rxF_ext
+=
12
;
}
else
{
}
else
{
//the symbol contains DMRS
j
=
0
;
for
(
i
=
(
1
-
frame_parms
->
nushift
);
i
<
12
;
i
+=
2
)
{
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
);
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
...
...
@@ -715,6 +715,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_pdsch_rb
,
unsigned
char
nr_tti_rx
,
...
...
@@ -1003,6 +1004,7 @@ void nr_dlsch_scale_channel(int32_t **dl_ch_estimates_ext,
NR_UE_DLSCH_t
**
dlsch_ue
,
uint8_t
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,14 +738,26 @@ 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
)
{
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
,
0
/*p*/
,
aatx
/*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
);
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
;
}
}
...
...
targets/PROJECTS/GENERIC-LTE-EPC/CONF/gnb.band78.tm1.106PRB.usrpn300.conf
View file @
e097bec7
...
...
@@ -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