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
spbro
OpenXG-RAN
Commits
21744d88
Commit
21744d88
authored
May 09, 2024
by
francescomani
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
code improvement and formatting
parent
f30b42d8
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
523 additions
and
554 deletions
+523
-554
openair1/PHY/NR_REFSIG/nr_refsig.h
openair1/PHY/NR_REFSIG/nr_refsig.h
+15
-0
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
+476
-501
openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
+0
-15
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
+0
-1
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
+27
-31
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
+0
-1
openair1/SCHED_NR_UE/defs.h
openair1/SCHED_NR_UE/defs.h
+3
-3
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+2
-2
No files found.
openair1/PHY/NR_REFSIG/nr_refsig.h
View file @
21744d88
...
...
@@ -61,6 +61,21 @@ int nr_pusch_dmrs_rx(PHY_VARS_gNB *gNB,
uint32_t
re_offset
,
uint8_t
dmrs_type
);
void
nr_generate_csi_rs
(
const
NR_DL_FRAME_PARMS
*
frame_parms
,
int32_t
**
dataF
,
const
int16_t
amp
,
nr_csi_info_t
*
nr_csi_info
,
const
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t
*
csi_params
,
const
int
slot
,
uint8_t
*
N_cdm_groups
,
uint8_t
*
CDM_group_size
,
uint8_t
*
k_prime
,
uint8_t
*
l_prime
,
uint8_t
*
N_ports
,
uint8_t
*
j_cdm
,
uint8_t
*
k_overline
,
uint8_t
*
l_overline
);
void
init_scrambling_luts
(
void
);
void
nr_generate_modulation_table
(
void
);
...
...
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
View file @
21744d88
...
...
@@ -19,23 +19,21 @@
* contact@openairinterface.org
*/
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/MODULATION/nr_modulation.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
//#define NR_CSIRS_DEBUG
void
nr_init_csi_rs
(
const
NR_DL_FRAME_PARMS
*
fp
,
uint32_t
***
csi_rs
,
uint32_t
Nid
)
{
uint32_t
x1
=
0
,
x2
=
0
;
uint
8_t
reset
;
int
csi_dmrs_init_length
=
((
fp
->
N_RB_DL
<<
4
)
>>
5
)
+
1
;
for
(
uint8_t
slot
=
0
;
slot
<
fp
->
slots_per_frame
;
slot
++
)
{
for
(
uint8_t
symb
=
0
;
symb
<
fp
->
symbols_per_slot
;
symb
++
)
{
reset
=
1
;
x2
=
((
1
<<
10
)
*
(
fp
->
symbols_per_slot
*
slot
+
symb
+
1
)
*
((
Nid
<<
1
)
+
1
)
+
(
Nid
)
);
for
(
uint32_t
n
=
0
;
n
<
csi_dmrs_init_length
;
n
++
)
{
void
nr_init_csi_rs
(
const
NR_DL_FRAME_PARMS
*
fp
,
uint32_t
***
csi_rs
,
uint32_t
Nid
)
{
uint
32_t
x1
=
0
;
int
csi_dmrs_init_length
=
((
fp
->
N_RB_DL
<<
4
)
>>
5
)
+
1
;
for
(
int
slot
=
0
;
slot
<
fp
->
slots_per_frame
;
slot
++
)
{
for
(
int
symb
=
0
;
symb
<
fp
->
symbols_per_slot
;
symb
++
)
{
uint8_t
reset
=
1
;
uint32_t
x2
=
((
1
<<
10
)
*
(
fp
->
symbols_per_slot
*
slot
+
symb
+
1
)
*
((
Nid
<<
1
)
+
1
)
+
Nid
);
for
(
uint32_t
n
=
0
;
n
<
csi_dmrs_init_length
;
n
++
)
{
csi_rs
[
slot
][
symb
][
n
]
=
lte_gold_generic
(
&
x1
,
&
x2
,
reset
);
reset
=
0
;
}
...
...
@@ -56,8 +54,8 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
uint8_t
*
N_ports
,
uint8_t
*
j_cdm
,
uint8_t
*
k_overline
,
uint8_t
*
l_overline
)
{
uint8_t
*
l_overline
)
{
#ifdef NR_CSIRS_DEBUG
LOG_I
(
NR_PHY
,
"csi_params->subcarrier_spacing = %i
\n
"
,
csi_params
->
subcarrier_spacing
);
LOG_I
(
NR_PHY
,
"csi_params->cyclic_prefix = %i
\n
"
,
csi_params
->
cyclic_prefix
);
...
...
@@ -75,19 +73,12 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
LOG_I
(
NR_PHY
,
"csi_params->power_control_offset_ss = %i
\n
"
,
csi_params
->
power_control_offset_ss
);
#endif
int
dataF_offset
=
slot
*
frame_parms
->
samples_per_slot_wCP
;
int
dataF_offset
=
slot
*
frame_parms
->
samples_per_slot_wCP
;
uint32_t
**
nr_gold_csi_rs
=
nr_csi_info
->
nr_gold_csi_rs
[
slot
];
//*8(max allocation per RB)*2(QPSK))
int
csi_rs_length
=
frame_parms
->
N_RB_DL
<<
4
;
int
csi_rs_length
=
frame_parms
->
N_RB_DL
<<
4
;
int16_t
mod_csi
[
frame_parms
->
symbols_per_slot
][
csi_rs_length
>>
1
]
__attribute__
((
aligned
(
16
)));
uint16_t
b
=
csi_params
->
freq_domain
;
uint16_t
n
,
p
,
k
,
l
,
mprime
,
na
,
kpn
;
uint8_t
size
,
ports
,
kprime
,
lprime
,
i
,
gs
;
uint8_t
j
[
16
],
k_n
[
6
],
koverline
[
16
],
loverline
[
16
];
int
found
=
0
;
int
wf
,
wt
,
lp
,
kp
,
symb
;
uint8_t
fi
=
0
;
double
rho
,
alpha
;
uint32_t
beta
=
amp
;
nr_csi_info
->
csi_rs_generated_signal_bits
=
log2_approx
(
amp
);
...
...
@@ -99,469 +90,479 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
nr_init_csi_rs
(
frame_parms
,
nr_csi_info
->
nr_gold_csi_rs
,
csi_params
->
scramb_id
);
}
switch
(
csi_params
->
row
)
{
int
size
,
ports
,
kprime
,
lprime
;
int
j
[
16
],
k_n
[
6
],
koverline
[
16
],
loverline
[
16
];
int
found
=
0
;
int
fi
=
0
;
// implementation of table 7.4.1.5.3-1 of 38.211
// lprime and kprime are the max value of l' and k'
case
1
:
ports
=
1
;
kprime
=
0
;
lprime
=
0
;
size
=
3
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
;
found
++
;
}
else
switch
(
csi_params
->
row
)
{
case
1
:
ports
=
1
;
kprime
=
0
;
lprime
=
0
;
size
=
3
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
;
found
++
;
}
else
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
]
+
(
i
<<
2
);
}
break
;
case
2
:
ports
=
1
;
kprime
=
0
;
lprime
=
0
;
size
=
1
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
;
found
++
;
}
else
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
3
:
ports
=
2
;
kprime
=
1
;
lprime
=
0
;
size
=
1
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
else
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
4
:
ports
=
4
;
kprime
=
1
;
lprime
=
0
;
size
=
2
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
2
;
found
++
;
}
else
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
]
+
(
i
<<
1
);
}
break
;
case
5
:
ports
=
4
;
kprime
=
1
;
lprime
=
0
;
size
=
2
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
else
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
i
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
6
:
ports
=
8
;
kprime
=
1
;
lprime
=
0
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
]
+
(
i
<<
2
);
}
break
;
case
2
:
ports
=
1
;
kprime
=
0
;
lprime
=
0
;
size
=
1
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
;
found
++
;
}
else
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
7
:
ports
=
8
;
kprime
=
1
;
lprime
=
0
;
size
=
4
;
while
(
found
<
2
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
3
:
ports
=
2
;
kprime
=
1
;
lprime
=
0
;
size
=
1
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
else
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
1
);
koverline
[
i
]
=
k_n
[
i
%
2
];
}
break
;
case
8
:
ports
=
8
;
kprime
=
1
;
lprime
=
1
;
size
=
2
;
while
(
found
<
2
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
0
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
4
:
ports
=
4
;
kprime
=
1
;
lprime
=
0
;
size
=
2
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
2
;
found
++
;
}
else
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
9
:
ports
=
12
;
kprime
=
1
;
lprime
=
0
;
size
=
6
;
while
(
found
<
6
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
0
]
+
(
i
<<
1
);
}
break
;
case
5
:
ports
=
4
;
kprime
=
1
;
lprime
=
0
;
size
=
2
;
while
(
found
<
1
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
else
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
10
:
ports
=
12
;
kprime
=
1
;
lprime
=
1
;
size
=
3
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
i
;
koverline
[
i
]
=
k_n
[
0
];
}
break
;
case
6
:
ports
=
8
;
kprime
=
1
;
lprime
=
0
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
7
:
ports
=
8
;
kprime
=
1
;
lprime
=
0
;
size
=
4
;
while
(
found
<
2
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
1
);
koverline
[
i
]
=
k_n
[
i
%
2
];
}
break
;
case
8
:
ports
=
8
;
kprime
=
1
;
lprime
=
1
;
size
=
2
;
while
(
found
<
2
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
9
:
ports
=
12
;
kprime
=
1
;
lprime
=
0
;
size
=
6
;
while
(
found
<
6
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
10
:
ports
=
12
;
kprime
=
1
;
lprime
=
1
;
size
=
3
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
11
:
ports
=
16
;
kprime
=
1
;
lprime
=
0
;
size
=
8
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
2
);
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
12
:
ports
=
16
;
kprime
=
1
;
lprime
=
1
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
13
:
ports
=
24
;
kprime
=
1
;
lprime
=
0
;
size
=
12
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
6
)
loverline
[
i
]
=
csi_params
->
symb_l0
+
i
/
3
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
+
i
/
9
;
koverline
[
i
]
=
k_n
[
i
%
3
];
}
break
;
case
14
:
ports
=
24
;
kprime
=
1
;
lprime
=
1
;
size
=
6
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
3
)
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
;
koverline
[
i
]
=
k_n
[
i
%
3
];
}
break
;
case
15
:
ports
=
24
;
kprime
=
1
;
lprime
=
3
;
size
=
3
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
16
:
ports
=
32
;
kprime
=
1
;
lprime
=
0
;
size
=
16
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
8
)
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
2
);
else
loverline
[
i
]
=
csi_params
->
symb_l1
+
(
i
/
12
);
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
17
:
ports
=
32
;
kprime
=
1
;
lprime
=
1
;
size
=
8
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
4
)
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
11
:
ports
=
16
;
kprime
=
1
;
lprime
=
0
;
size
=
8
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
2
);
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
12
:
ports
=
16
;
kprime
=
1
;
lprime
=
1
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
;
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
18
:
ports
=
32
;
kprime
=
1
;
lprime
=
3
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
default:
AssertFatal
(
0
==
1
,
"Row %d is not valid for CSI Table 7.4.1.5.3-1
\n
"
,
csi_params
->
row
);
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
13
:
ports
=
24
;
kprime
=
1
;
lprime
=
0
;
size
=
12
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
6
)
loverline
[
i
]
=
csi_params
->
symb_l0
+
i
/
3
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
+
i
/
9
;
koverline
[
i
]
=
k_n
[
i
%
3
];
}
break
;
case
14
:
ports
=
24
;
kprime
=
1
;
lprime
=
1
;
size
=
6
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
3
)
loverline
[
i
]
=
csi_params
->
symb_l0
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
;
koverline
[
i
]
=
k_n
[
i
%
3
];
}
break
;
case
15
:
ports
=
24
;
kprime
=
1
;
lprime
=
3
;
size
=
3
;
while
(
found
<
3
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
case
16
:
ports
=
32
;
kprime
=
1
;
lprime
=
0
;
size
=
16
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
8
)
loverline
[
i
]
=
csi_params
->
symb_l0
+
(
i
>>
2
);
else
loverline
[
i
]
=
csi_params
->
symb_l1
+
(
i
/
12
);
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
17
:
ports
=
32
;
kprime
=
1
;
lprime
=
1
;
size
=
8
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
if
(
i
<
4
)
loverline
[
i
]
=
csi_params
->
symb_l0
;
else
loverline
[
i
]
=
csi_params
->
symb_l1
;
koverline
[
i
]
=
k_n
[
i
%
4
];
}
break
;
case
18
:
ports
=
32
;
kprime
=
1
;
lprime
=
3
;
size
=
4
;
while
(
found
<
4
)
{
if
((
b
>>
fi
)
&
0x01
)
{
k_n
[
found
]
=
fi
<<
1
;
found
++
;
}
fi
++
;
}
for
(
int
i
=
0
;
i
<
size
;
i
++
)
{
j
[
i
]
=
i
;
loverline
[
i
]
=
csi_params
->
symb_l0
;
koverline
[
i
]
=
k_n
[
i
];
}
break
;
default:
AssertFatal
(
false
,
"Row %d is not valid for CSI Table 7.4.1.5.3-1
\n
"
,
csi_params
->
row
);
}
#ifdef NR_CSIRS_DEBUG
printf
(
" row %d, n. of ports %d
\n
k' "
,
csi_params
->
row
,
ports
);
for
(
kp
=
0
;
kp
<=
kprime
;
kp
++
)
for
(
int
kp
=
0
;
kp
<=
kprime
;
kp
++
)
printf
(
"%d, "
,
kp
);
printf
(
"l' "
);
for
(
lp
=
0
;
lp
<=
lprime
;
lp
++
)
printf
(
"%d, "
,
lp
);
for
(
int
lp
=
0
;
lp
<=
lprime
;
lp
++
)
printf
(
"%d, "
,
lp
);
printf
(
"
\n
k overline "
);
for
(
i
=
0
;
i
<
size
;
i
++
)
for
(
i
nt
i
=
0
;
i
<
size
;
i
++
)
printf
(
"%d, "
,
koverline
[
i
]);
printf
(
"
\n
l overline "
);
for
(
i
=
0
;
i
<
size
;
i
++
)
for
(
i
nt
i
=
0
;
i
<
size
;
i
++
)
printf
(
"%d, "
,
loverline
[
i
]);
printf
(
"
\n
"
);
#endif
// setting the frequency density from its index
double
rho
=
0
;
switch
(
csi_params
->
freq_density
)
{
case
0
:
rho
=
0
.
5
;
break
;
case
1
:
rho
=
0
.
5
;
break
;
case
2
:
rho
=
1
;
break
;
case
3
:
rho
=
3
;
break
;
default:
AssertFatal
(
0
==
1
,
"Invalid frequency density index for CSI
\n
"
);
case
0
:
rho
=
0
.
5
;
break
;
case
1
:
rho
=
0
.
5
;
break
;
case
2
:
rho
=
1
;
break
;
case
3
:
rho
=
3
;
break
;
default:
AssertFatal
(
false
,
"Invalid frequency density index for CSI
\n
"
);
}
double
alpha
=
0
;
if
(
ports
==
1
)
alpha
=
rho
;
else
alpha
=
2
*
rho
;
alpha
=
2
*
rho
;
#ifdef NR_CSIRS_DEBUG
printf
(
" rho %f, alpha %f
\n
"
,
rho
,
alpha
);
printf
(
" rho %f, alpha %f
\n
"
,
rho
,
alpha
);
#endif
// CDM group size from CDM type index
int
gs
=
0
;
switch
(
csi_params
->
cdm_type
)
{
case
0
:
gs
=
1
;
break
;
case
1
:
gs
=
2
;
break
;
case
2
:
gs
=
4
;
break
;
case
3
:
gs
=
8
;
break
;
default:
AssertFatal
(
0
==
1
,
"Invalid cdm type index for CSI
\n
"
);
case
0
:
gs
=
1
;
break
;
case
1
:
gs
=
2
;
break
;
case
2
:
gs
=
4
;
break
;
case
3
:
gs
=
8
;
break
;
default:
AssertFatal
(
false
,
"Invalid cdm type index for CSI
\n
"
);
}
uint16_
t
csi_length
;
in
t
csi_length
;
if
(
rho
<
1
)
{
if
(
csi_params
->
freq_density
==
0
)
{
csi_length
=
(((
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
)
>>
1
)
<<
kprime
)
<<
1
;
csi_length
=
(((
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
)
>>
1
)
<<
kprime
)
<<
1
;
}
else
{
csi_length
=
((((
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
)
>>
1
)
<<
kprime
)
+
1
)
<<
1
;
csi_length
=
((((
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
)
>>
1
)
<<
kprime
)
+
1
)
<<
1
;
}
}
else
{
csi_length
=
(((
uint16_t
)
rho
*
(
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
))
<<
kprime
)
<<
1
;
csi_length
=
(((
uint16_t
)
rho
*
(
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
))
<<
kprime
)
<<
1
;
}
#ifdef NR_CSIRS_DEBUG
printf
(
" start rb %d, nr of rbs %d, csi length %d
\n
"
,
csi_params
->
start_rb
,
csi_params
->
nr_of_rbs
,
csi_length
);
printf
(
" start rb %d, nr of rbs %d, csi length %d
\n
"
,
csi_params
->
start_rb
,
csi_params
->
nr_of_rbs
,
csi_length
);
#endif
if
(
N_cdm_groups
)
*
N_cdm_groups
=
size
;
if
(
CDM_group_size
)
*
CDM_group_size
=
gs
;
if
(
k_prime
)
*
k_prime
=
kprime
;
if
(
l_prime
)
*
l_prime
=
lprime
;
if
(
N_ports
)
*
N_ports
=
ports
;
if
(
j_cdm
)
memcpy
(
j_cdm
,
j
,
16
*
sizeof
(
uint8_t
));
if
(
k_overline
)
memcpy
(
k_overline
,
koverline
,
16
*
sizeof
(
uint8_t
));
if
(
l_overline
)
memcpy
(
l_overline
,
loverline
,
16
*
sizeof
(
uint8_t
));
// TRS
if
(
csi_params
->
csi_type
==
0
)
{
// ???
#ifdef NR_CSIRS_DEBUG
if
(
N_ports
)
LOG_I
(
NR_PHY
,
"nr_csi_info->N_ports = %d
\n
"
,
*
N_ports
);
if
(
N_cdm_groups
)
LOG_I
(
NR_PHY
,
"nr_csi_info->N_cdm_groups = %d
\n
"
,
*
N_cdm_groups
);
if
(
CDM_group_size
)
LOG_I
(
NR_PHY
,
"nr_csi_info->CDM_group_size = %d
\n
"
,
*
CDM_group_size
);
if
(
k_prime
)
LOG_I
(
NR_PHY
,
"nr_csi_info->kprime = %d
\n
"
,
*
k_prime
);
if
(
l_prime
)
LOG_I
(
NR_PHY
,
"nr_csi_info->lprime = %d
\n
"
,
*
l_prime
);
if
(
N_cdm_groups
)
{
for
(
int
ji
=
0
;
ji
<
*
N_cdm_groups
;
ji
++
)
{
LOG_I
(
NR_PHY
,
"(CDM group %d) j = %d, koverline = %d, loverline = %d
\n
"
,
ji
,
j
[
ji
],
koverline
[
ji
],
loverline
[
ji
]);
}
}
#endif
// NZP CSI RS
if
(
csi_params
->
csi_type
==
1
)
{
// assuming amp is the amplitude of SSB channels
switch
(
csi_params
->
power_control_offset_ss
)
{
if
(
csi_params
->
csi_type
==
2
)
// ZP-CSI
return
;
// assuming amp is the amplitude of SSB channels
switch
(
csi_params
->
power_control_offset_ss
)
{
case
0
:
beta
=
(
amp
*
ONE_OVER_SQRT2_Q15
)
>>
15
;
break
;
...
...
@@ -572,73 +573,68 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
beta
=
(
amp
*
ONE_OVER_SQRT2_Q15
)
>>
14
;
break
;
case
3
:
beta
=
amp
<<
1
;
beta
=
amp
<<
1
;
break
;
default:
AssertFatal
(
0
==
1
,
"Invalid SS power offset density index for CSI
\n
"
);
}
AssertFatal
(
false
,
"Invalid SS power offset density index for CSI
\n
"
);
}
for
(
lp
=
0
;
lp
<=
lprime
;
lp
++
){
symb
=
csi_params
->
symb_l0
;
nr_modulation
(
nr_gold_csi_rs
[
symb
+
lp
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
lp
]);
if
((
csi_params
->
row
==
5
)
||
(
csi_params
->
row
==
7
)
||
(
csi_params
->
row
==
11
)
||
(
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
))
nr_modulation
(
nr_gold_csi_rs
[
symb
+
1
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
1
]);
if
((
csi_params
->
row
==
14
)
||
(
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
)
||
(
csi_params
->
row
==
17
))
{
symb
=
csi_params
->
symb_l1
;
nr_modulation
(
nr_gold_csi_rs
[
symb
+
lp
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
lp
]);
if
((
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
))
nr_modulation
(
nr_gold_csi_rs
[
symb
+
1
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
1
]);
}
for
(
int
lp
=
0
;
lp
<=
lprime
;
lp
++
)
{
int
symb
=
csi_params
->
symb_l0
;
nr_modulation
(
nr_gold_csi_rs
[
symb
+
lp
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
lp
]);
if
((
csi_params
->
row
==
5
)
||
(
csi_params
->
row
==
7
)
||
(
csi_params
->
row
==
11
)
||
(
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
))
nr_modulation
(
nr_gold_csi_rs
[
symb
+
1
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
1
]);
if
((
csi_params
->
row
==
14
)
||
(
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
)
||
(
csi_params
->
row
==
17
))
{
symb
=
csi_params
->
symb_l1
;
nr_modulation
(
nr_gold_csi_rs
[
symb
+
lp
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
lp
]);
if
((
csi_params
->
row
==
13
)
||
(
csi_params
->
row
==
16
))
nr_modulation
(
nr_gold_csi_rs
[
symb
+
1
],
csi_length
,
DMRS_MOD_ORDER
,
mod_csi
[
symb
+
1
]);
}
}
uint16_t
start_sc
=
frame_parms
->
first_carrier_offset
;
// resource mapping according to 38.211 7.4.1.5.3
for
(
n
=
csi_params
->
start_rb
;
n
<
(
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
);
n
++
)
{
if
(
(
csi_params
->
freq_density
>
1
)
||
(
csi_params
->
freq_density
==
(
n
%
2
)))
{
// for freq density 0.5 checks if even or odd RB
for
(
int
ji
=
0
;
ji
<
size
;
ji
++
)
{
// loop over CDM groups
for
(
int
s
=
0
;
s
<
gs
;
s
++
)
{
// loop over each CDM group size
p
=
s
+
j
[
ji
]
*
gs
;
// port index
for
(
kp
=
0
;
kp
<=
kprime
;
kp
++
)
{
// loop over frequency resource elements within a group
k
=
(
start_sc
+
(
n
*
NR_NB_SC_PER_RB
)
+
koverline
[
ji
]
+
kp
)
%
(
frame_parms
->
ofdm_symbol_size
);
// frequency index of current resource element
for
(
int
n
=
csi_params
->
start_rb
;
n
<
(
csi_params
->
start_rb
+
csi_params
->
nr_of_rbs
);
n
++
)
{
if
((
csi_params
->
freq_density
>
1
)
||
(
csi_params
->
freq_density
==
(
n
%
2
)))
{
// for freq density 0.5 checks if even or odd RB
for
(
int
ji
=
0
;
ji
<
size
;
ji
++
)
{
// loop over CDM groups
for
(
int
s
=
0
;
s
<
gs
;
s
++
)
{
// loop over each CDM group size
int
p
=
s
+
j
[
ji
]
*
gs
;
// port index
for
(
int
kp
=
0
;
kp
<=
kprime
;
kp
++
)
{
// loop over frequency resource elements within a group
// frequency index of current resource element
int
k
=
(
start_sc
+
(
n
*
NR_NB_SC_PER_RB
)
+
koverline
[
ji
]
+
kp
)
%
(
frame_parms
->
ofdm_symbol_size
);
// wf according to tables 7.4.5.3-2 to 7.4.5.3-5
if
(
kp
==
0
)
wf
=
1
;
else
wf
=
-
2
*
(
s
%
2
)
+
1
;
na
=
n
*
alpha
;
kpn
=
(
rho
*
koverline
[
ji
])
/
NR_NB_SC_PER_RB
;
mprime
=
na
+
kp
+
kpn
;
// sequence index
for
(
lp
=
0
;
lp
<=
lprime
;
lp
++
)
{
// loop over frequency resource elements within a group
l
=
lp
+
loverline
[
ji
];
// wt according to tables 7.4.5.3-2 to 7.4.5.3-5
int
wf
=
kp
==
0
?
1
:
(
-
2
*
(
s
%
2
)
+
1
);
int
na
=
n
*
alpha
;
int
kpn
=
(
rho
*
koverline
[
ji
])
/
NR_NB_SC_PER_RB
;
int
mprime
=
na
+
kp
+
kpn
;
// sequence index
for
(
int
lp
=
0
;
lp
<=
lprime
;
lp
++
)
{
// loop over frequency resource elements within a group
int
l
=
lp
+
loverline
[
ji
];
// wt according to tables 7.4.5.3-2 to 7.4.5.3-5
int
wt
;
if
(
s
<
2
)
wt
=
1
;
else
if
(
s
<
4
)
wt
=
-
2
*
(
lp
%
2
)
+
1
;
wt
=
-
2
*
(
lp
%
2
)
+
1
;
else
if
(
s
<
6
)
wt
=
-
2
*
(
lp
/
2
)
+
1
;
wt
=
-
2
*
(
lp
/
2
)
+
1
;
else
{
if
((
lp
==
0
)
||
(
lp
==
3
))
wt
=
1
;
else
wt
=
-
1
;
}
// ZP CSI RS
if
(
csi_params
->
csi_type
==
2
)
{
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
dataF_offset
)]
=
0
;
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
dataF_offset
)]
=
0
;
}
else
{
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
dataF_offset
)]
=
(
beta
*
wt
*
wf
*
mod_csi
[
l
][
mprime
<<
1
])
>>
15
;
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
dataF_offset
)]
=
(
beta
*
wt
*
wf
*
mod_csi
[
l
][(
mprime
<<
1
)
+
1
])
>>
15
;
}
int
index
=
((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
dataF_offset
);
((
int16_t
*
)
dataF
[
p
])[
index
]
=
(
beta
*
wt
*
wf
*
mod_csi
[
l
][
mprime
<<
1
])
>>
15
;
((
int16_t
*
)
dataF
[
p
])[
index
+
1
]
=
(
beta
*
wt
*
wf
*
mod_csi
[
l
][(
mprime
<<
1
)
+
1
])
>>
15
;
#ifdef NR_CSIRS_DEBUG
printf
(
"l,k (%d,%d) seq. index %d
\t
port %d
\t
(%d,%d)
\n
"
,
l
,
k
,
mprime
,
p
+
3000
,
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
(
2
*
dataF_offset
)],
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
->
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
dataF_offset
)]);
printf
(
"l,k (%d,%d) seq. index %d
\t
port %d
\t
(%d,%d)
\n
"
,
l
,
k
,
mprime
,
p
+
3000
,
((
int16_t
*
)
dataF
[
p
])[
index
],
((
int16_t
*
)
dataF
[
p
])[
index
+
1
]);
#endif
}
}
...
...
@@ -646,25 +642,4 @@ void nr_generate_csi_rs(const NR_DL_FRAME_PARMS *frame_parms,
}
}
}
if
(
N_cdm_groups
)
*
N_cdm_groups
=
size
;
if
(
CDM_group_size
)
*
CDM_group_size
=
gs
;
if
(
k_prime
)
*
k_prime
=
kprime
;
if
(
l_prime
)
*
l_prime
=
lprime
;
if
(
N_ports
)
*
N_ports
=
ports
;
if
(
j_cdm
)
memcpy
(
j_cdm
,
j
,
16
*
sizeof
(
uint8_t
));
if
(
k_overline
)
memcpy
(
k_overline
,
koverline
,
16
*
sizeof
(
uint8_t
));
if
(
l_overline
)
memcpy
(
l_overline
,
loverline
,
16
*
sizeof
(
uint8_t
));
#ifdef NR_CSIRS_DEBUG
if
(
N_ports
)
LOG_I
(
NR_PHY
,
"nr_csi_info->N_ports = %d
\n
"
,
*
N_ports
);
if
(
N_cdm_groups
)
LOG_I
(
NR_PHY
,
"nr_csi_info->N_cdm_groups = %d
\n
"
,
*
N_cdm_groups
);
if
(
CDM_group_size
)
LOG_I
(
NR_PHY
,
"nr_csi_info->CDM_group_size = %d
\n
"
,
*
CDM_group_size
);
if
(
k_prime
)
LOG_I
(
NR_PHY
,
"nr_csi_info->kprime = %d
\n
"
,
*
k_prime
);
if
(
l_prime
)
LOG_I
(
NR_PHY
,
"nr_csi_info->lprime = %d
\n
"
,
*
l_prime
);
if
(
N_cdm_groups
)
{
for
(
int
ji
=
0
;
ji
<*
N_cdm_groups
;
ji
++
)
{
LOG_I
(
NR_PHY
,
"(CDM group %d) j = %d, koverline = %d, loverline = %d
\n
"
,
ji
,
j
[
ji
],
koverline
[
ji
],
loverline
[
ji
]);
}
}
#endif
}
openair1/PHY/NR_TRANSPORT/nr_transport_proto.h
View file @
21744d88
...
...
@@ -310,21 +310,6 @@ void init_prach_ru_list(RU_t *ru);
void
free_nr_ru_prach_entry
(
RU_t
*
ru
,
int
prach_id
);
uint8_t
get_nr_prach_duration
(
uint8_t
prach_format
);
void
nr_generate_csi_rs
(
const
NR_DL_FRAME_PARMS
*
frame_parms
,
int32_t
**
dataF
,
const
int16_t
amp
,
nr_csi_info_t
*
nr_csi_info
,
const
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t
*
csi_params
,
const
int
slot
,
uint8_t
*
N_cdm_groups
,
uint8_t
*
CDM_group_size
,
uint8_t
*
k_prime
,
uint8_t
*
l_prime
,
uint8_t
*
N_ports
,
uint8_t
*
j_cdm
,
uint8_t
*
k_overline
,
uint8_t
*
l_overline
);
void
free_nr_prach_entry
(
PHY_VARS_gNB
*
gNB
,
int
prach_id
);
void
nr_decode_pucch1
(
c16_t
**
rxdataF
,
...
...
openair1/PHY/NR_UE_ESTIMATION/nr_dl_channel_estimation.c
View file @
21744d88
...
...
@@ -28,7 +28,6 @@
#include "PHY/NR_REFSIG/ptrs_nr.h"
#include "PHY/NR_REFSIG/nr_mod_table.h"
#include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "nr_phy_common.h"
#include "filt16a_32.h"
#include "T.h"
...
...
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
View file @
21744d88
...
...
@@ -36,8 +36,8 @@
#include "executables/nr-softmodem-common.h"
#include "nr_transport_proto_ue.h"
#include "PHY/phy_extern_nr_ue.h"
#include "PHY/NR_REFSIG/nr_refsig.h"
#include "common/utils/nr/nr_common.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "PHY/NR_UE_ESTIMATION/filt16a_32.h"
// Additional memory allocation, because of applying the filter and the memory offset to ensure memory alignment
...
...
@@ -191,13 +191,13 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
int32_t
csi_rs_received_signal
[][
ue
->
frame_parms
.
samples_per_slot_wCP
],
uint32_t
*
rsrp
,
int
*
rsrp_dBm
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
const
NR_DL_FRAME_PARMS
*
f
rame_parms
=
&
ue
->
frame_parms
;
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
const
NR_DL_FRAME_PARMS
*
f
p
=
&
ue
->
frame_parms
;
uint16_t
meas_count
=
0
;
uint32_t
rsrp_sum
=
0
;
for
(
int
ant_rx
=
0
;
ant_rx
<
f
rame_parms
->
nb_antennas_rx
;
ant_rx
++
)
{
for
(
int
ant_rx
=
0
;
ant_rx
<
f
p
->
nb_antennas_rx
;
ant_rx
++
)
{
for
(
int
rb
=
csirs_config_pdu
->
start_rb
;
rb
<
(
csirs_config_pdu
->
start_rb
+
csirs_config_pdu
->
nr_of_rbs
);
rb
++
)
{
...
...
@@ -212,12 +212,12 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
// loop over frequency resource elements within a group
for
(
int
kp
=
0
;
kp
<=
k_prime
;
kp
++
)
{
uint16_t
k
=
(
f
rame_parms
->
first_carrier_offset
+
(
rb
*
NR_NB_SC_PER_RB
)
+
k_overline
[
cdm_id
]
+
kp
)
%
frame_parms
->
ofdm_symbol_size
;
uint16_t
k
=
(
f
p
->
first_carrier_offset
+
(
rb
*
NR_NB_SC_PER_RB
)
+
k_overline
[
cdm_id
]
+
kp
)
%
fp
->
ofdm_symbol_size
;
// loop over time resource elements within a group
for
(
int
lp
=
0
;
lp
<=
l_prime
;
lp
++
)
{
uint16_t
symb
=
lp
+
l_overline
[
cdm_id
];
uint64_t
symbol_offset
=
symb
*
frame_parms
->
ofdm_symbol_size
;
uint64_t
symbol_offset
=
symb
*
fp
->
ofdm_symbol_size
;
c16_t
*
rx_signal
=
&
rxdataF
[
ant_rx
][
symbol_offset
];
c16_t
*
rx_csi_rs_signal
=
(
c16_t
*
)
&
csi_rs_received_signal
[
ant_rx
][
symbol_offset
];
rx_csi_rs_signal
[
k
].
r
=
rx_signal
[
k
].
r
;
...
...
@@ -229,10 +229,11 @@ int nr_get_csi_rs_signal(const PHY_VARS_NR_UE *ue,
meas_count
++
;
#ifdef NR_CSIRS_DEBUG
int
dataF_offset
=
proc
->
nr_slot_rx
*
ue
->
frame_parms
.
samples_per_slot_wCP
;
int
dataF_offset
=
proc
->
nr_slot_rx
*
fp
->
samples_per_slot_wCP
;
uint16_t
port_tx
=
s
+
j_cdm
[
cdm_id
]
*
CDM_group_size
;
c16_t
*
tx_csi_rs_signal
=
(
c16_t
*
)
&
nr_csi_info
->
csi_rs_generated_signal
[
port_tx
][
symbol_offset
+
dataF_offset
];
LOG_I
(
NR_PHY
,
"l,k (%2d,%4d) |
\t
port_tx %d (%4d,%4d)
\t
ant_rx %d (%4d,%4d)
\n
"
,
c16_t
*
tx_csi_rs_signal
=
(
c16_t
*
)
&
nr_csi_info
->
csi_rs_generated_signal
[
port_tx
][
symbol_offset
+
dataF_offset
];
LOG_I
(
NR_PHY
,
"l,k (%2d,%4d) |
\t
port_tx %d (%4d,%4d)
\t
ant_rx %d (%4d,%4d)
\n
"
,
symb
,
k
,
port_tx
+
3000
,
...
...
@@ -728,12 +729,12 @@ int nr_csi_rs_cqi_estimation(const uint32_t precoded_sinr,
return
0
;
}
int
nr_csi_im_power_estimation
(
const
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
const
fapi_nr_dl_config_csiim_pdu_rel15_t
*
csiim_config_pdu
,
uint32_t
*
interference_plus_noise_power
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
static
void
nr_csi_im_power_estimation
(
const
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
const
fapi_nr_dl_config_csiim_pdu_rel15_t
*
csiim_config_pdu
,
uint32_t
*
interference_plus_noise_power
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
const
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
const
uint16_t
end_rb
=
csiim_config_pdu
->
start_rb
+
csiim_config_pdu
->
nr_of_rbs
>
csiim_config_pdu
->
bwp_size
?
...
...
@@ -772,7 +773,7 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
uint16_t
sc0_offset
=
(
frame_parms
->
first_carrier_offset
+
rb
*
NR_NB_SC_PER_RB
)
%
frame_parms
->
ofdm_symbol_size
;
for
(
int
sc_idx
=
0
;
sc_idx
<
4
;
sc_idx
++
)
{
for
(
int
sc_idx
=
0
;
sc_idx
<
4
;
sc_idx
++
)
{
uint16_t
sc
=
sc0_offset
+
csiim_config_pdu
->
k_csiim
[
sc_idx
];
if
(
sc
>=
frame_parms
->
ofdm_symbol_size
)
{
...
...
@@ -785,34 +786,31 @@ int nr_csi_im_power_estimation(const PHY_VARS_NR_UE *ue,
sum_re
+=
rx_signal
[
sc
].
r
;
sum_im
+=
rx_signal
[
sc
].
i
;
sum2_re
+=
rx_signal
[
sc
].
r
*
rx_signal
[
sc
].
r
;
sum2_im
+=
rx_signal
[
sc
].
i
*
rx_signal
[
sc
].
i
;
sum2_re
+=
rx_signal
[
sc
].
r
*
rx_signal
[
sc
].
r
;
sum2_im
+=
rx_signal
[
sc
].
i
*
rx_signal
[
sc
].
i
;
count
++
;
}
}
}
}
int32_t
power_re
=
sum2_re
/
count
-
(
sum_re
/
count
)
*
(
sum_re
/
count
);
int32_t
power_im
=
sum2_im
/
count
-
(
sum_im
/
count
)
*
(
sum_im
/
count
);
int32_t
power_re
=
sum2_re
/
count
-
(
sum_re
/
count
)
*
(
sum_re
/
count
);
int32_t
power_im
=
sum2_im
/
count
-
(
sum_im
/
count
)
*
(
sum_im
/
count
);
*
interference_plus_noise_power
=
power_re
+
power_im
;
#ifdef NR_CSIIM_DEBUG
LOG_I
(
NR_PHY
,
"interference_plus_noise_power based on CSI-IM = %i
\n
"
,
*
interference_plus_noise_power
);
#endif
return
0
;
}
int
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
void
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
])
{
int
gNB_id
=
proc
->
gNB_id
;
if
(
!
ue
->
csiim_vars
[
gNB_id
]
->
active
)
{
return
-
1
;
}
if
(
!
ue
->
csiim_vars
[
gNB_id
]
->
active
)
LOG_E
(
NR_PHY
,
"Scheduling reception of CSI-IM that is not active
\n
"
);
const
fapi_nr_dl_config_csiim_pdu_rel15_t
*
csiim_config_pdu
=
(
fapi_nr_dl_config_csiim_pdu_rel15_t
*
)
&
ue
->
csiim_vars
[
gNB_id
]
->
csiim_config_pdu
;
...
...
@@ -828,8 +826,6 @@ int nr_ue_csi_im_procedures(PHY_VARS_NR_UE *ue,
nr_csi_im_power_estimation
(
ue
,
proc
,
csiim_config_pdu
,
&
ue
->
nr_csi_info
->
interference_plus_noise_power
,
rxdataF
);
ue
->
nr_csi_info
->
csi_im_meas_computed
=
true
;
return
0
;
}
static
nfapi_nr_dl_tti_csi_rs_pdu_rel15_t
convert_csirs_pdu
(
const
fapi_nr_dl_config_csirs_pdu_rel15_t
*
csirs_config_pdu
)
...
...
openair1/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
View file @
21744d88
...
...
@@ -30,7 +30,6 @@
*/
#include "PHY/defs_nr_UE.h"
#include "PHY/phy_extern.h"
#include "PHY/NR_TRANSPORT/nr_transport_proto.h"
#include "nr_transport_proto_ue.h"
#include "PHY/sse_intrin.h"
#include "T.h"
...
...
openair1/SCHED_NR_UE/defs.h
View file @
21744d88
...
...
@@ -149,9 +149,9 @@ int nr_ue_pdcch_procedures(PHY_VARS_NR_UE *ue,
int
n_ss
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
]);
int
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
]);
void
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
c16_t
rxdataF
[][
ue
->
frame_parms
.
samples_per_slot_wCP
]);
void
nr_ue_csi_rs_procedures
(
PHY_VARS_NR_UE
*
ue
,
const
UE_nr_rxtx_proc_t
*
proc
,
...
...
openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
View file @
21744d88
...
...
@@ -1024,7 +1024,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
// do procedures for CSI-RS
if
((
ue
->
csirs_vars
[
gNB_id
])
&&
(
ue
->
csirs_vars
[
gNB_id
]
->
active
==
1
))
{
for
(
int
symb
=
0
;
symb
<
NR_SYMBOLS_PER_SLOT
;
symb
++
)
{
if
(
is_csi_rs_in_symbol
(
ue
->
csirs_vars
[
gNB_id
]
->
csirs_config_pdu
,
symb
))
{
if
(
is_csi_rs_in_symbol
(
ue
->
csirs_vars
[
gNB_id
]
->
csirs_config_pdu
,
symb
))
{
if
(
!
slot_fep_map
[
symb
])
{
nr_slot_fep
(
ue
,
&
ue
->
frame_parms
,
proc
,
symb
,
rxdataF
,
link_type_dl
);
slot_fep_map
[
symb
]
=
true
;
...
...
@@ -1041,7 +1041,7 @@ void pdsch_processing(PHY_VARS_NR_UE *ue, const UE_nr_rxtx_proc_t *proc, nr_phy_
uint16_t
nb_symb_sch
=
dlsch_config
->
number_symbols
;
uint16_t
start_symb_sch
=
dlsch_config
->
start_symbol
;
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_slot_rx
);
LOG_D
(
PHY
,
" ------ --> PDSCH ChannelComp/LLR Frame.slot %d.%d ------
\n
"
,
frame_rx
%
1024
,
nr_slot_rx
);
for
(
int
m
=
start_symb_sch
;
m
<
(
nb_symb_sch
+
start_symb_sch
)
;
m
++
)
{
if
(
!
slot_fep_map
[
m
])
{
...
...
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