aboutsummaryrefslogtreecommitdiffstats
path: root/tests/power
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-10-18 21:31:40 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-10-19 17:30:33 +0700
commitbdea34165b0aa8a4880549125c07ac9f223d0ef4 (patch)
treea5da057e2b0978e4406971eb4f19b416cd270b77 /tests/power
parent284e4c4437cf8fd02e9411ec2810eb752e37d20e (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/power')
-rw-r--r--tests/power/power_test.c28
-rw-r--r--tests/power/power_test.err13
-rw-r--r--tests/power/power_test.ok16
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