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
Michael Black
OpenXG-RAN
Commits
e223f4ee
Commit
e223f4ee
authored
Jan 27, 2023
by
Roberto Louro Magueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Apply delay compensation for UL in nr_pusch_channel_estimation()
parent
0b05fce7
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
63 additions
and
26 deletions
+63
-26
openair1/PHY/INIT/nr_init.c
openair1/PHY/INIT/nr_init.c
+12
-0
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
+47
-26
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+4
-0
No files found.
openair1/PHY/INIT/nr_init.c
View file @
e223f4ee
...
@@ -66,6 +66,17 @@ int l1_north_init_gNB() {
...
@@ -66,6 +66,17 @@ int l1_north_init_gNB() {
return
(
0
);
return
(
0
);
}
}
void
init_ul_delay_table
(
NR_DL_FRAME_PARMS
*
fp
)
{
for
(
int
delay
=
-
MAX_UL_DELAY_COMP
;
delay
<=
MAX_UL_DELAY_COMP
;
delay
++
)
{
for
(
int
k
=
0
;
k
<
fp
->
ofdm_symbol_size
;
k
++
)
{
double
complex
delay_cexp
=
cexp
(
I
*
(
2
.
0
*
M_PI
*
k
*
delay
/
fp
->
ofdm_symbol_size
));
fp
->
ul_delay_table
[
MAX_UL_DELAY_COMP
+
delay
][
k
].
r
=
(
int16_t
)
round
(
256
*
creal
(
delay_cexp
));
fp
->
ul_delay_table
[
MAX_UL_DELAY_COMP
+
delay
][
k
].
i
=
(
int16_t
)
round
(
256
*
cimag
(
delay_cexp
));
}
}
}
int
init_codebook_gNB
(
PHY_VARS_gNB
*
gNB
)
{
int
init_codebook_gNB
(
PHY_VARS_gNB
*
gNB
)
{
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
){
if
(
gNB
->
frame_parms
.
nb_antennas_tx
>
1
){
...
@@ -500,6 +511,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
...
@@ -500,6 +511,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB)
load_nrLDPClib_offload
();
load_nrLDPClib_offload
();
init_codebook_gNB
(
gNB
);
init_codebook_gNB
(
gNB
);
init_ul_delay_table
(
fp
);
// PBCH DMRS gold sequences generation
// PBCH DMRS gold sequences generation
nr_init_pbch_dmrs
(
gNB
);
nr_init_pbch_dmrs
(
gNB
);
...
...
openair1/PHY/NR_ESTIMATION/nr_ul_channel_estimation.c
View file @
e223f4ee
...
@@ -100,6 +100,17 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
...
@@ -100,6 +100,17 @@ __attribute__((always_inline)) inline c16_t c32x16cumulVectVectWithSteps(c16_t *
return
c16x32div
(
cumul
,
N
);
return
c16x32div
(
cumul
,
N
);
}
}
int
get_delay_idx
(
int
delay
)
{
int
delay_idx
=
MAX_UL_DELAY_COMP
+
delay
;
if
(
delay_idx
<
0
)
{
delay_idx
=
0
;
}
if
(
delay_idx
>
MAX_UL_DELAY_COMP
<<
1
)
{
delay_idx
=
MAX_UL_DELAY_COMP
<<
1
;
}
return
delay_idx
;
}
int
nr_pusch_channel_estimation
(
PHY_VARS_gNB
*
gNB
,
int
nr_pusch_channel_estimation
(
PHY_VARS_gNB
*
gNB
,
unsigned
char
Ns
,
unsigned
char
Ns
,
unsigned
short
p
,
unsigned
short
p
,
...
@@ -209,9 +220,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
...
@@ -209,9 +220,9 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
c16_t
ch16
=
{.
r
=
(
int16_t
)
ch
.
r
,
.
i
=
(
int16_t
)
ch
.
i
};
c16_t
ch16
=
{.
r
=
(
int16_t
)
ch
.
r
,
.
i
=
(
int16_t
)
ch
.
i
};
*
max_ch
=
max
(
*
max_ch
,
max
(
abs
(
ch
.
r
),
abs
(
ch
.
i
)));
*
max_ch
=
max
(
*
max_ch
,
max
(
abs
(
ch
.
r
),
abs
(
ch
.
i
)));
for
(
int
k
=
pilot_cnt
<<
1
;
k
<
(
pilot_cnt
<<
1
)
+
4
;
k
++
)
{
ul_ls_est
[
pilot_cnt
<<
1
]
=
ch16
;
ul_ls_est
[
k
]
=
ch16
;
ul_ls_est
[(
pilot_cnt
+
1
)
<<
1
]
=
ch16
;
}
pilot_cnt
+=
2
;
pilot_cnt
+=
2
;
}
}
...
@@ -221,6 +232,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
...
@@ -221,6 +232,8 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
nr_est_timing_advance_pusch
(
&
gNB
->
frame_parms
,
gNB
->
pusch_vars
[
ul_id
]
->
ul_ch_estimates_time
[
aarx
],
&
gNB
->
measurements
.
delay
[
ul_id
]);
nr_est_timing_advance_pusch
(
&
gNB
->
frame_parms
,
gNB
->
pusch_vars
[
ul_id
]
->
ul_ch_estimates_time
[
aarx
],
&
gNB
->
measurements
.
delay
[
ul_id
]);
int
delay
=
gNB
->
measurements
.
delay
[
ul_id
].
pusch_est_delay
;
int
delay
=
gNB
->
measurements
.
delay
[
ul_id
].
pusch_est_delay
;
int
delay_idx
=
get_delay_idx
(
delay
);
c16_t
*
ul_delay_table
=
gNB
->
frame_parms
.
ul_delay_table
[
delay_idx
];
#ifdef DEBUG_PUSCH
#ifdef DEBUG_PUSCH
printf
(
"Estimated delay = %i
\n
"
,
delay
>>
1
);
printf
(
"Estimated delay = %i
\n
"
,
delay
>>
1
);
...
@@ -231,21 +244,25 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
...
@@ -231,21 +244,25 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
// Channel interpolation
// Channel interpolation
for
(
int
k_line
=
0
;
k_line
<=
1
;
k_line
++
)
{
for
(
int
k_line
=
0
;
k_line
<=
1
;
k_line
++
)
{
// Apply delay
int
k
=
pilot_cnt
<<
1
;
c16_t
ch16
=
c16mulShift
(
ul_ls_est
[
k
],
ul_delay_table
[
k
],
8
);
#ifdef DEBUG_PUSCH
#ifdef DEBUG_PUSCH
re_offset
=
(
k0
+
(
n
<<
2
)
+
(
k_line
<<
1
))
%
symbolSize
;
re_offset
=
(
k0
+
(
n
<<
2
)
+
(
k_line
<<
1
))
%
symbolSize
;
c16_t
*
rxF
=
&
rxdataF
[
soffset
+
re_offset
];
c16_t
*
rxF
=
&
rxdataF
[
soffset
+
re_offset
];
printf
(
"pilot %4u: pil -> (%6d,%6d), rxF -> (%4d,%4d), ch -> (%4d,%4d)
\n
"
,
printf
(
"ch -> (%4d,%4d), ch_delay_comp -> (%4d,%4d)
\n
"
,
ul_ls_est
[
k
].
r
,
ul_ls_est
[
k
].
i
,
ch16
.
r
,
ch16
.
i
);
pilot_cnt
,
pil
->
r
,
pil
->
i
,
rxF
->
r
,
rxF
->
i
,
ul_ls_est
[
pilot_cnt
<<
1
].
r
,
ul_ls_est
[
pilot_cnt
<<
1
].
i
);
#endif
#endif
if
(
pilot_cnt
==
0
)
{
if
(
pilot_cnt
==
0
)
{
c16multaddVectRealComplex
(
filt16_ul_p0
,
&
ul_ls_est
[
pilot_cnt
<<
1
]
,
ul_ch
,
16
);
c16multaddVectRealComplex
(
filt16_ul_p0
,
&
ch16
,
ul_ch
,
16
);
}
else
if
(
pilot_cnt
==
1
||
pilot_cnt
==
2
)
{
}
else
if
(
pilot_cnt
==
1
||
pilot_cnt
==
2
)
{
c16multaddVectRealComplex
(
filt16_ul_p1p2
,
&
ul_ls_est
[
pilot_cnt
<<
1
]
,
ul_ch
,
16
);
c16multaddVectRealComplex
(
filt16_ul_p1p2
,
&
ch16
,
ul_ch
,
16
);
}
else
if
(
pilot_cnt
==
(
6
*
nb_rb_pusch
-
1
))
{
}
else
if
(
pilot_cnt
==
(
6
*
nb_rb_pusch
-
1
))
{
c16multaddVectRealComplex
(
filt16_ul_last
,
&
ul_ls_est
[
pilot_cnt
<<
1
]
,
ul_ch
,
16
);
c16multaddVectRealComplex
(
filt16_ul_last
,
&
ch16
,
ul_ch
,
16
);
}
else
{
}
else
{
c16multaddVectRealComplex
(
filt16_ul_middle
,
&
ul_ls_est
[
pilot_cnt
<<
1
]
,
ul_ch
,
16
);
c16multaddVectRealComplex
(
filt16_ul_middle
,
&
ch16
,
ul_ch
,
16
);
if
(
pilot_cnt
%
2
==
0
)
{
if
(
pilot_cnt
%
2
==
0
)
{
ul_ch
+=
4
;
ul_ch
+=
4
;
}
}
...
@@ -255,19 +272,24 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
...
@@ -255,19 +272,24 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
}
}
}
}
// Revert delay
pilot_cnt
=
0
;
ul_ch
=
&
ul_ch_estimates
[
p
*
gNB
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
int
inv_delay_idx
=
get_delay_idx
(
-
delay
);
c16_t
*
ul_inv_delay_table
=
gNB
->
frame_parms
.
ul_delay_table
[
inv_delay_idx
];
for
(
int
n
=
0
;
n
<
3
*
nb_rb_pusch
;
n
++
)
{
for
(
int
k_line
=
0
;
k_line
<=
1
;
k_line
++
)
{
int
k
=
pilot_cnt
<<
1
;
ul_ch
[
k
]
=
c16mulShift
(
ul_ch
[
k
],
ul_inv_delay_table
[
k
],
8
);
ul_ch
[
k
+
1
]
=
c16mulShift
(
ul_ch
[
k
+
1
],
ul_inv_delay_table
[
k
+
1
],
8
);
#ifdef DEBUG_PUSCH
#ifdef DEBUG_PUSCH
ul_ch
=
&
ul_ch_estimates
[
p
*
gNB
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
re_offset
=
(
k0
+
(
n
<<
2
)
+
(
k_line
<<
1
))
%
symbolSize
;
c16_t
*
rxF
=
&
rxdataF
[
soffset
+
re_offset
];
for
(
uint16_t
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pusch
*
12
/
8
);
idxP
++
)
{
printf
(
"ch -> (%4d,%4d), ch_inter -> (%4d,%4d)
\n
"
,
ul_ls_est
[
k
].
r
,
ul_ls_est
[
k
].
i
,
ul_ch
[
k
].
r
,
ul_ch
[
k
].
i
);
printf
(
"(%3d)
\t
"
,
idxP
);
#endif
pilot_cnt
++
;
for
(
uint8_t
idxI
=
0
;
idxI
<
8
;
idxI
++
)
{
printf
(
"%d
\t
%d
\t
"
,
ul_ch
[
idxP
*
8
+
idxI
].
r
,
ul_ch
[
idxP
*
8
+
idxI
].
i
);
}
}
printf
(
"
\n
"
);
}
}
#endif
}
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type2
&&
chest_freq
==
0
)
{
// pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
}
else
if
(
pusch_pdu
->
dmrs_config_type
==
pusch_dmrs_type2
&&
chest_freq
==
0
)
{
// pusch_dmrs_type2 |p_r,p_l,d,d,d,d,p_r,p_l,d,d,d,d|
LOG_D
(
PHY
,
"PUSCH estimation DMRS type 2, Freq-domain interpolation
\n
"
);
LOG_D
(
PHY
,
"PUSCH estimation DMRS type 2, Freq-domain interpolation
\n
"
);
...
@@ -452,16 +474,15 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
...
@@ -452,16 +474,15 @@ int nr_pusch_channel_estimation(PHY_VARS_gNB *gNB,
}
}
#ifdef DEBUG_PUSCH
#ifdef DEBUG_PUSCH
ul_ch
=
&
ul_ch_estimates
[
p
*
gNB
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
ul_ch
=
&
ul_ch_estimates
[
p
*
gNB
->
frame_parms
.
nb_antennas_rx
+
aarx
][
ch_offset
];
for
(
int
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pusch
*
12
/
8
);
idxP
++
)
{
for
(
int
idxP
=
0
;
idxP
<
ceil
((
float
)
nb_rb_pusch
*
12
/
8
);
idxP
++
)
{
for
(
int
idxI
=
0
;
idxI
<
8
;
idxI
++
)
{
for
(
int
idxI
=
0
;
idxI
<
8
;
idxI
++
)
{
printf
(
"%d
\t
%d
\t
"
,
ul_ch
[
idxP
*
8
+
idxI
].
r
,
ul_ch
[
idxP
*
8
+
idxI
].
i
);
printf
(
"%d
\t
%d
\t
"
,
ul_ch
[
idxP
*
8
+
idxI
].
r
,
ul_ch
[
idxP
*
8
+
idxI
].
i
);
}
}
printf
(
"%d
\n
"
,
idxP
);
printf
(
"%d
\n
"
,
idxP
);
}
}
#endif
#endif
}
}
#ifdef DEBUG_CH
#ifdef DEBUG_CH
...
...
openair1/PHY/defs_nr_common.h
View file @
e223f4ee
...
@@ -95,6 +95,8 @@
...
@@ -95,6 +95,8 @@
#define NR_NB_NSCID 2
#define NR_NB_NSCID 2
#define MAX_UL_DELAY_COMP 20
typedef
enum
{
typedef
enum
{
NR_MU_0
=
0
,
NR_MU_0
=
0
,
NR_MU_1
,
NR_MU_1
,
...
@@ -219,6 +221,8 @@ struct NR_DL_FRAME_PARMS {
...
@@ -219,6 +221,8 @@ struct NR_DL_FRAME_PARMS {
/// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
/// sequence used to compensate the phase rotation due to timeshifted OFDM symbols
/// First dimenstion is for different CP lengths
/// First dimenstion is for different CP lengths
c16_t
timeshift_symbol_rotation
[
4096
*
2
]
__attribute__
((
aligned
(
16
)));
c16_t
timeshift_symbol_rotation
[
4096
*
2
]
__attribute__
((
aligned
(
16
)));
/// Table used to apply the delay compensation in UL
c16_t
ul_delay_table
[
2
*
MAX_UL_DELAY_COMP
+
1
][
NR_MAX_OFDM_SYMBOL_SIZE
*
2
];
/// shift of pilot position in one RB
/// shift of pilot position in one RB
uint8_t
nushift
;
uint8_t
nushift
;
/// SRS configuration from TS 38.331 RRC
/// SRS configuration from TS 38.331 RRC
...
...
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