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
zzha zzha
OpenXG-RAN
Commits
51a72b84
Commit
51a72b84
authored
Mar 09, 2022
by
rmagueta
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
LS channel estimation at UE based on CSI-RS
parent
db0ce84a
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
81 additions
and
2 deletions
+81
-2
openair1/PHY/INIT/nr_init_ue.c
openair1/PHY/INIT/nr_init_ue.c
+25
-0
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
+2
-1
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
+50
-1
openair1/PHY/defs_nr_common.h
openair1/PHY/defs_nr_common.h
+4
-0
No files found.
openair1/PHY/INIT/nr_init_ue.c
View file @
51a72b84
...
@@ -364,11 +364,16 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
...
@@ -364,11 +364,16 @@ int init_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
AssertFatal
(
ue
->
nr_csi_rs_info
->
nr_gold_csi_rs
[
slot
][
symb
]
!=
NULL
,
"NR init: csi reference signal for slot %d symbol %d - malloc failed
\n
"
,
slot
,
symb
);
AssertFatal
(
ue
->
nr_csi_rs_info
->
nr_gold_csi_rs
[
slot
][
symb
]
!=
NULL
,
"NR init: csi reference signal for slot %d symbol %d - malloc failed
\n
"
,
slot
,
symb
);
}
}
}
}
ue
->
nr_csi_rs_info
->
noise_power
=
(
uint32_t
*
)
malloc16_clear
(
sizeof
(
uint32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_csi_rs_info
->
csi_rs_ls_estimated_channel
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
ue
->
nr_csi_rs_info
->
csi_rs_estimated_channel_freq
=
(
int32_t
**
)
malloc16
(
fp
->
nb_antennas_rx
*
sizeof
(
int32_t
*
)
);
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
for
(
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_ls_estimated_channel
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
ue
->
nr_csi_rs_info
->
csi_rs_estimated_channel_freq
[
i
]
=
(
int32_t
*
)
malloc16_clear
(
fp
->
samples_per_frame_wCP
*
sizeof
(
int32_t
));
}
}
ue
->
nr_srs_info
=
(
nr_srs_info_t
*
)
malloc16_clear
(
sizeof
(
nr_srs_info_t
));
ue
->
nr_srs_info
=
(
nr_srs_info_t
*
)
malloc16_clear
(
sizeof
(
nr_srs_info_t
));
...
@@ -647,6 +652,26 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
...
@@ -647,6 +652,26 @@ void term_nr_ue_signal(PHY_VARS_NR_UE *ue, int nb_connected_gNB)
free_and_zero
(
ue
->
pdcch_vars
[
th_id
][
gNB_id
]);
free_and_zero
(
ue
->
pdcch_vars
[
th_id
][
gNB_id
]);
}
}
for
(
int
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
[
i
]);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
[
i
]);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_ls_estimated_channel
[
i
]);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_estimated_channel_freq
[
i
]);
}
for
(
int
slot
=
0
;
slot
<
fp
->
slots_per_frame
;
slot
++
)
{
for
(
int
symb
=
0
;
symb
<
fp
->
symbols_per_slot
;
symb
++
)
{
free_and_zero
(
ue
->
nr_csi_rs_info
->
nr_gold_csi_rs
[
slot
][
symb
]);
}
free_and_zero
(
ue
->
nr_csi_rs_info
->
nr_gold_csi_rs
[
slot
]);
}
free_and_zero
(
ue
->
nr_csi_rs_info
->
noise_power
);
free_and_zero
(
ue
->
nr_csi_rs_info
->
nr_gold_csi_rs
);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_ls_estimated_channel
);
free_and_zero
(
ue
->
nr_csi_rs_info
->
csi_rs_estimated_channel_freq
);
free_and_zero
(
ue
->
nr_csi_rs_info
);
for
(
int
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
for
(
int
i
=
0
;
i
<
fp
->
nb_antennas_rx
;
i
++
)
{
free_and_zero
(
ue
->
nr_srs_info
->
srs_received_signal
[
i
]);
free_and_zero
(
ue
->
nr_srs_info
->
srs_received_signal
[
i
]);
free_and_zero
(
ue
->
nr_srs_info
->
srs_ls_estimated_channel
[
i
]);
free_and_zero
(
ue
->
nr_srs_info
->
srs_ls_estimated_channel
[
i
]);
...
...
openair1/PHY/NR_TRANSPORT/nr_csi_rs.c
View file @
51a72b84
...
@@ -79,6 +79,7 @@ void nr_generate_csi_rs(NR_DL_FRAME_PARMS frame_parms,
...
@@ -79,6 +79,7 @@ void nr_generate_csi_rs(NR_DL_FRAME_PARMS frame_parms,
uint8_t
fi
=
0
;
uint8_t
fi
=
0
;
double
rho
,
alpha
;
double
rho
,
alpha
;
uint32_t
beta
=
amp
;
uint32_t
beta
=
amp
;
nr_csi_rs_info
->
csi_rs_generated_signal_bits
=
log2_approx
(
amp
);
AssertFatal
(
b
!=
0
,
"Invalid CSI frequency domain mapping: no bit selected in bitmap
\n
"
);
AssertFatal
(
b
!=
0
,
"Invalid CSI frequency domain mapping: no bit selected in bitmap
\n
"
);
...
@@ -639,7 +640,7 @@ void nr_generate_csi_rs(NR_DL_FRAME_PARMS frame_parms,
...
@@ -639,7 +640,7 @@ void nr_generate_csi_rs(NR_DL_FRAME_PARMS frame_parms,
((
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
;
((
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
;
}
}
#ifdef NR_CSIRS_DEBUG
#ifdef NR_CSIRS_DEBUG
printf
(
"l,k (%d
%d) seq. index %d
\t
port %d
\t
(%d,%d)
\n
"
,
l
,
k
,
mprime
,
p
+
3000
,
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
)
+
(
2
*
dataF_offset
)],
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
dataF_offset
)]);
((
int16_t
*
)
dataF
[
p
])[((
l
*
frame_parms
.
ofdm_symbol_size
+
k
)
<<
1
)
+
1
+
(
2
*
dataF_offset
)]);
#endif
#endif
...
...
openair1/PHY/NR_UE_TRANSPORT/csi_rx.c
View file @
51a72b84
...
@@ -63,7 +63,7 @@ int nr_get_csi_rs_signal(PHY_VARS_NR_UE *ue,
...
@@ -63,7 +63,7 @@ int nr_get_csi_rs_signal(PHY_VARS_NR_UE *ue,
#ifdef NR_CSIRS_DEBUG
#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
*
ue
->
frame_parms
.
samples_per_slot_wCP
;
int16_t
*
tx_csi_rs_signal
=
(
int16_t
*
)
&
nr_csi_rs_info
->
csi_rs_generated_signal
[
ant
][
symbol_offset
+
dataF_offset
];
int16_t
*
tx_csi_rs_signal
=
(
int16_t
*
)
&
nr_csi_rs_info
->
csi_rs_generated_signal
[
ant
][
symbol_offset
+
dataF_offset
];
LOG_I
(
NR_PHY
,
"l,k (%
d %d)
\t
tx (%d,%d)
\t
rx (%d,%
d)
\n
"
,
LOG_I
(
NR_PHY
,
"l,k (%
2d,%3d) |
\t
tx (%4d,%4d)
\t
rx (%4d,%4
d)
\n
"
,
symb
,
symb
,
nr_csi_rs_info
->
map_list
[
symb
][
k_id
],
nr_csi_rs_info
->
map_list
[
symb
][
k_id
],
tx_csi_rs_signal
[
k
<<
1
],
tx_csi_rs_signal
[
k
<<
1
],
...
@@ -78,6 +78,48 @@ int nr_get_csi_rs_signal(PHY_VARS_NR_UE *ue,
...
@@ -78,6 +78,48 @@ int nr_get_csi_rs_signal(PHY_VARS_NR_UE *ue,
return
0
;
return
0
;
}
}
int
nr_csi_rs_channel_estimation
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
nr_csi_rs_info_t
*
nr_csi_rs_info
,
int32_t
**
csi_rs_generated_signal
,
int32_t
**
csi_rs_received_signal
,
int32_t
**
csi_rs_estimated_channel_freq
,
uint32_t
*
noise_power
)
{
NR_DL_FRAME_PARMS
*
frame_parms
=
&
ue
->
frame_parms
;
int
dataF_offset
=
proc
->
nr_slot_rx
*
ue
->
frame_parms
.
samples_per_slot_wCP
;
int16_t
ls_estimated
[
2
];
for
(
int
ant
=
0
;
ant
<
frame_parms
->
nb_antennas_rx
;
ant
++
)
{
for
(
int
symb
=
0
;
symb
<
NR_SYMBOLS_PER_SLOT
;
symb
++
)
{
uint64_t
symbol_offset
=
symb
*
frame_parms
->
ofdm_symbol_size
;
int16_t
*
tx_csi_rs_signal
=
(
int16_t
*
)
&
nr_csi_rs_info
->
csi_rs_generated_signal
[
ant
][
symbol_offset
+
dataF_offset
];
int16_t
*
rx_csi_rs_signal
=
(
int16_t
*
)
&
csi_rs_received_signal
[
ant
][
symbol_offset
];
for
(
int
k_id
=
0
;
k_id
<
nr_csi_rs_info
->
k_list_length
[
symb
];
k_id
++
)
{
uint16_t
k
=
nr_csi_rs_info
->
map_list
[
symb
][
k_id
];
ls_estimated
[
0
]
=
(
int16_t
)(((
int32_t
)
tx_csi_rs_signal
[
k
<<
1
]
*
rx_csi_rs_signal
[
k
<<
1
]
+
(
int32_t
)
tx_csi_rs_signal
[(
k
<<
1
)
+
1
]
*
rx_csi_rs_signal
[(
k
<<
1
)
+
1
])
>>
nr_csi_rs_info
->
csi_rs_generated_signal_bits
);
ls_estimated
[
1
]
=
(
int16_t
)(((
int32_t
)
tx_csi_rs_signal
[
k
<<
1
]
*
rx_csi_rs_signal
[(
k
<<
1
)
+
1
]
-
(
int32_t
)
tx_csi_rs_signal
[(
k
<<
1
)
+
1
]
*
rx_csi_rs_signal
[
k
<<
1
])
>>
nr_csi_rs_info
->
csi_rs_generated_signal_bits
);
#ifdef NR_CSIRS_DEBUG
LOG_I
(
NR_PHY
,
"l,k (%2d,%3d) |
\t
tx (%4d,%4d)
\t
rx (%4d,%4d)
\t
ls (%4d,%4d)
\n
"
,
symb
,
nr_csi_rs_info
->
map_list
[
symb
][
k_id
],
tx_csi_rs_signal
[
k
<<
1
],
tx_csi_rs_signal
[(
k
<<
1
)
+
1
],
rx_csi_rs_signal
[
k
<<
1
],
rx_csi_rs_signal
[(
k
<<
1
)
+
1
],
ls_estimated
[
0
],
ls_estimated
[
1
]);
#endif
}
}
}
return
0
;
}
int
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
uint8_t
gNB_id
)
{
int
nr_ue_csi_im_procedures
(
PHY_VARS_NR_UE
*
ue
,
UE_nr_rxtx_proc_t
*
proc
,
uint8_t
gNB_id
)
{
return
0
;
return
0
;
}
}
...
@@ -117,5 +159,12 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
...
@@ -117,5 +159,12 @@ int nr_ue_csi_rs_procedures(PHY_VARS_NR_UE *ue, UE_nr_rxtx_proc_t *proc, uint8_t
nr_get_csi_rs_signal
(
ue
,
proc
,
ue
->
nr_csi_rs_info
,
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
);
nr_get_csi_rs_signal
(
ue
,
proc
,
ue
->
nr_csi_rs_info
,
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
);
nr_csi_rs_channel_estimation
(
ue
,
proc
,
ue
->
nr_csi_rs_info
,
ue
->
nr_csi_rs_info
->
csi_rs_generated_signal
,
ue
->
nr_csi_rs_info
->
csi_rs_received_signal
,
ue
->
nr_csi_rs_info
->
csi_rs_estimated_channel_freq
,
ue
->
nr_csi_rs_info
->
noise_power
);
return
0
;
return
0
;
}
}
openair1/PHY/defs_nr_common.h
View file @
51a72b84
...
@@ -268,8 +268,12 @@ typedef struct {
...
@@ -268,8 +268,12 @@ typedef struct {
uint32_t
***
nr_gold_csi_rs
;
uint32_t
***
nr_gold_csi_rs
;
uint16_t
k_list_length
[
NR_SYMBOLS_PER_SLOT
];
uint16_t
k_list_length
[
NR_SYMBOLS_PER_SLOT
];
uint16_t
map_list
[
NR_SYMBOLS_PER_SLOT
][
NR_MAX_CSI_RS_LENGTH
];
uint16_t
map_list
[
NR_SYMBOLS_PER_SLOT
][
NR_MAX_CSI_RS_LENGTH
];
uint8_t
csi_rs_generated_signal_bits
;
int32_t
**
csi_rs_generated_signal
;
int32_t
**
csi_rs_generated_signal
;
int32_t
**
csi_rs_received_signal
;
int32_t
**
csi_rs_received_signal
;
int32_t
**
csi_rs_ls_estimated_channel
;
int32_t
**
csi_rs_estimated_channel_freq
;
uint32_t
*
noise_power
;
}
nr_csi_rs_info_t
;
}
nr_csi_rs_info_t
;
typedef
struct
NR_DL_FRAME_PARMS
NR_DL_FRAME_PARMS
;
typedef
struct
NR_DL_FRAME_PARMS
NR_DL_FRAME_PARMS
;
...
...
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