diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-10-18 21:31:40 +0700 |
---|---|---|
committer | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2020-10-19 17:30:33 +0700 |
commit | bdea34165b0aa8a4880549125c07ac9f223d0ef4 (patch) | |
tree | a5da057e2b0978e4406971eb4f19b416cd270b77 /tests | |
parent | 284e4c4437cf8fd02e9411ec2810eb752e37d20e (diff) |
power_control: tolerate small deviations from 'rx-target'
Recently we've introduced EWMA based uplink power filtering, that
should reduce Uplink power oscillations. However, the power loop
is still quite sensitive to small deviations from the target power
level: even such an insignificant deviation like 2-5 dBm triggers
the loop to increase or decrease the MS power level. Even if the
EWMA based filtering is enabled with 80% smoothing (alpha = 0.2).
This change introduces a new configuration parameter - 'hysteresis':
uplink-power-target <-110-0> hysteresis <1-25>
that together with the 'uplink-power-target' defines a range:
[target - hysteresis .. target + hysteresis]
in which the MS power loop would not trigger any power changes.
This feature is now *enabled* by default, so given that:
- default 'uplink-power-target' is -75 dBm, and
- default 'hysteresis' is 3 dBm,
the default target Uplink power range is: -78 dBm ... -72 dBm.
Change-Id: Iacedbd4d69d3d74e2499af5622a07a8af0423da0
Related: SYS#4916
Diffstat (limited to 'tests')
-rw-r--r-- | tests/power/power_test.c | 28 | ||||
-rw-r--r-- | tests/power/power_test.err | 13 | ||||
-rw-r--r-- | tests/power/power_test.ok | 16 |
3 files changed, 54 insertions, 3 deletions
diff --git a/tests/power/power_test.c b/tests/power/power_test.c index bf474ac9..c5c4db35 100644 --- a/tests/power/power_test.c +++ b/tests/power/power_test.c @@ -1,5 +1,6 @@ /* * (C) 2013,2014 by Holger Hans Peter Freyther + * Contributions by sysmocom - s.m.f.c. GmbH <info@sysmocom.de> * * All Rights Reserved * @@ -205,6 +206,32 @@ static void test_pf_algo_ewma(void) CHECK_UL_RSSI_AVG100(-92.0); } +static void test_power_hysteresis(void) +{ + struct gsm_lchan *lchan; + + init_test(__func__); + lchan = &g_trx->ts[0].lchan[0]; + + /* Tolerate power deviations in range -80 .. -70 */ + g_bts->ul_power_hysteresis = 5; + + lchan->ms_power_ctrl.current = ms_pwr_ctl_lvl(GSM_BAND_1800, 0); + OSMO_ASSERT(lchan->ms_power_ctrl.current == 15); + lchan->ms_power_ctrl.max = ms_pwr_ctl_lvl(GSM_BAND_1800, 26); + OSMO_ASSERT(lchan->ms_power_ctrl.max == 2); + + apply_power_test(lchan, g_bts->ul_power_target, 0, 15); + apply_power_test(lchan, g_bts->ul_power_target + 3, 0, 15); + apply_power_test(lchan, g_bts->ul_power_target - 3, 0, 15); + + apply_power_test(lchan, g_bts->ul_power_target, 0, 15); + apply_power_test(lchan, g_bts->ul_power_target + 5, 0, 15); + apply_power_test(lchan, g_bts->ul_power_target - 5, 0, 15); + + apply_power_test(lchan, g_bts->ul_power_target - 10, 1, 13); +} + int main(int argc, char **argv) { printf("Testing power loop...\n"); @@ -220,6 +247,7 @@ int main(int argc, char **argv) test_power_loop(); test_pf_algo_ewma(); + test_power_hysteresis(); printf("Power loop test OK\n"); diff --git a/tests/power/power_test.err b/tests/power/power_test.err index 1aac5e5c..988b3ba8 100644 --- a/tests/power/power_test.err +++ b/tests/power/power_test.err @@ -4,7 +4,7 @@ (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 9 (12 dBm) to 7, 16 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 7 (16 dBm) to 5, 20 dBm (rx-ms-pwr-lvl 7, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) -(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 5 (20 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 5 (20 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant (hysteresis 0 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 5 (20 dBm) to 3, 24 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 3 (24 dBm) to 2, 26 dBm (rx-ms-pwr-lvl 3, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 2, 26 dBm (rx-ms-pwr-lvl 2, max-ms-pwr-lvl 2, rx-current -90 dBm, rx-target -75 dBm) @@ -13,7 +13,7 @@ (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 0 (30 dBm) to 30, 34 dBm (rx-ms-pwr-lvl 0, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 30 (34 dBm) to 29, 36 dBm (rx-ms-pwr-lvl 30, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29, 36 dBm (rx-ms-pwr-lvl 29, max-ms-pwr-lvl 29, rx-current -90 dBm, rx-target -75 dBm) -(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29 (36 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 29 (36 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant (hysteresis 0 dBm) (bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 29 (36 dBm) to 1, 28 dBm (rx-ms-pwr-lvl 29, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 1 (28 dBm) to 5, 20 dBm (rx-ms-pwr-lvl 1, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 5 (20 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 5, max-ms-pwr-lvl 29, rx-current -45 dBm, rx-target -75 dBm) @@ -21,10 +21,17 @@ (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 10 (10 dBm) to 9, 12 dBm (rx-ms-pwr-lvl 10, max-ms-pwr-lvl 29, rx-current -77 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 9 (12 dBm) to 14, 2 dBm (rx-ms-pwr-lvl 9, max-ms-pwr-lvl 14, rx-current -73 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Lowering MS power from control level 14 (2 dBm) to 15, 0 dBm (rx-ms-pwr-lvl 14, max-ms-pwr-lvl 0, rx-current -40 dBm, rx-target -75 dBm) -(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant (hysteresis 0 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 3 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -78 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 13 (4 dBm) to 11, 8 dBm (rx-ms-pwr-lvl 13, max-ms-pwr-lvl 2, rx-current -80 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 11 (8 dBm) to 9, 11 dBm (rx-ms-pwr-lvl 11, max-ms-pwr-lvl 2, rx-current -78 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -50 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15, 0 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -50 dBm, rx-target -75 dBm) (bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -92 dBm, rx-target -75 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff -3 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 3 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 0 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff -5 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Keeping MS power at control level 15 (0 dBm) because diff 5 dBm from 'rx-target' -75 dBm is not significant (hysteresis 5 dBm) +(bts=0,trx=0,ts=0,ss=0) Raising MS power from control level 15 (0 dBm) to 13, 4 dBm (rx-ms-pwr-lvl 15, max-ms-pwr-lvl 2, rx-current -85 dBm, rx-target -75 dBm) diff --git a/tests/power/power_test.ok b/tests/power/power_test.ok index 25551d82..d463d871 100644 --- a/tests/power/power_test.ok +++ b/tests/power/power_test.ok @@ -72,4 +72,20 @@ lchan_ms_pwr_ctrl(RxLvl=-50 dBm) returns 0 (expected 0) lchan_ms_pwr_ctrl(RxLvl=-110 dBm) returns 1 (expected 1) MS current power 15 -> 13 (expected 13) Avg[t] is -92.00 dBm (expected -92.00 dBm) + +Starting test case 'test_power_hysteresis' +lchan_ms_pwr_ctrl(RxLvl=-75 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-72 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-78 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-75 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-70 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-80 dBm) returns 0 (expected 0) + MS current power 15 -> 15 (expected 15) +lchan_ms_pwr_ctrl(RxLvl=-85 dBm) returns 1 (expected 1) + MS current power 15 -> 13 (expected 13) Power loop test OK |