Merge remote-tracking branch 'origin/srs-delay-comp' into integration_2026_w12 (!3859)
Delay compensation in SRS
Implementation of delay compensation in channel estimation based on SRS.
Testing, for example, with
sudo ./nr_ulsim -n1 -s50 -S50 -R51 -E 1 -W2 -y2 -z2 -d 10
we obtain the following logs.
LOGs with develop branch:
[NR_PHY] __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__
[NR_PHY] ( 0) 687 -198 | 688 -198 | -1 -3
[NR_PHY] ( 1) 0 0 | 688 -196 | -1 -3
[NR_PHY] ( 2) 687 -198 | 644 -272 | -1 -1
[NR_PHY] ( 3) 0 0 | 600 -346 | -1 -1
[NR_PHY] ( 4) 513 -498 | 556 -422 | -1 -1
[NR_PHY] ( 5) 0 0 | 512 -496 | -1 -1
[NR_PHY] ( 6) 513 -498 | 440 -542 | -1 0
[NR_PHY] ( 7) 0 0 | 370 -588 | -1 0
[NR_PHY] ( 8) 226 -682 | 298 -634 | -1 -3
[NR_PHY] ( 9) 0 0 | 228 -680 | -1 -3
[NR_PHY] ( 10) 226 -682 | 140 -686 | -1 -1
[NR_PHY] ( 11) 0 0 | 52 -690 | -1 -1
intRe and intIm are the real and imaginary part of the interpolated
channel, respectively. These are the columns that matter. As we can see,
for example, in subcarrier 0 we have (688, -198), then in subcarrier 1
we have (688, -196), which is almost the same, and then in subcarrier 3
we have a jump (644, -272). This MR improves channel estimation by
taking delay into account. If we look at the following logs, we see that
the values vary more consistently from subcarrier to subcarrier.
LOGs with this MR:
[NR_PHY] __lsRe__________lsIm__|____intRe_______intIm__|____noiRe_______noiIm__
[NR_PHY] ( 0) 487 -139 | 490 -111 | -1 0
[NR_PHY] ( 1) 487 -139 | 483 -138 | -1 0
[NR_PHY] ( 2) 487 -139 | 465 -197 | 0 0
[NR_PHY] ( 3) 487 -139 | 436 -254 | 0 0
[NR_PHY] ( 4) 364 -353 | 402 -305 | -1 -1
[NR_PHY] ( 5) 364 -353 | 361 -352 | -1 -1
[NR_PHY] ( 6) 364 -353 | 317 -392 | -1 -1
[NR_PHY] ( 7) 364 -353 | 269 -426 | -1 -1
[NR_PHY] ( 8) 160 -481 | 214 -455 | 0 -1
[NR_PHY] ( 9) 160 -481 | 159 -478 | 0 -1
[NR_PHY] ( 10) 160 -481 | 98 -495 | -1 0
[NR_PHY] ( 11) 160 -481 | 39 -502 | -1 0
This commit is contained in:
@@ -195,7 +195,7 @@ static void gnb_main_gui(gnb_gui *e, gui *g, event_handler *h, void *database, g
|
||||
e->ul_freq_estimate_ue_xy_plot = w;
|
||||
widget_add_child(g, line, w, -1);
|
||||
xy_plot_set_range(g, w, 0, 2048, -10, 80);
|
||||
l = new_framelog(h, database, "GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE", "subframe", "chest_t");
|
||||
l = new_framelog(h, database, "GNB_PHY_UL_FREQ_CHANNEL_ESTIMATE", "subframe", "chest_f");
|
||||
framelog_set_update_only_at_sf9(l, 0);
|
||||
v = new_view_xy(2048, 10, g, w, new_color(g, "#0c0c72"), XY_LOOP_MODE);
|
||||
logger_add_view(l, v);
|
||||
|
||||
@@ -366,6 +366,10 @@ void nr_deconstruct_5g_s_tmsi(const uint64_t fiveg_s_tmsi, uint16_t *amf_set_id,
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
#define BOUNDED_EVAL(a, b, c) (min(c, max(a, b)))
|
||||
|
||||
/* Macro used to perform a circular increment. This implementation is computationally more efficient than using the remainder of the
|
||||
* integer division, and improves code readability when compared to repetitive if... else statements. */
|
||||
#define CIRCULAR_INC(val, inc, size) (((val) + (inc) >= (size)) ? ((val) + (inc) - (size)) : ((val) + (inc)))
|
||||
|
||||
static const char *const duplex_mode_txt[] = {"FDD", "TDD"};
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
||||
Reference in New Issue
Block a user