summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/bitloading
diff options
context:
space:
mode:
authorJérémy Dufour2011-12-06 16:49:13 +0100
committerJérémy Dufour2012-09-12 16:20:43 +0200
commit79860d6d338d5c81d2fc0a6566f22c8db99c1011 (patch)
treef5b8566346acb0ea55388b14b47028d4dc807fcd /cesar/ce/rx/bitloading
parent5e9395298847310fbe0a806140645a1c8f9f6dcc (diff)
cesar/ce/rx/bl: do not restart BMU for low PBER when BL is at max, refs #2376
Diffstat (limited to 'cesar/ce/rx/bitloading')
-rw-r--r--cesar/ce/rx/bitloading/ber_margin_update.h4
-rw-r--r--cesar/ce/rx/bitloading/src/ber_margin_update.c6
-rw-r--r--cesar/ce/rx/bitloading/src/transition.c3
-rw-r--r--cesar/ce/rx/bitloading/test/src/test_ber_margin_update.c16
4 files changed, 23 insertions, 6 deletions
diff --git a/cesar/ce/rx/bitloading/ber_margin_update.h b/cesar/ce/rx/bitloading/ber_margin_update.h
index 713c016045..03bf463ab4 100644
--- a/cesar/ce/rx/bitloading/ber_margin_update.h
+++ b/cesar/ce/rx/bitloading/ber_margin_update.h
@@ -101,11 +101,13 @@ ce_rx_bl_bmu_apply_margin (ce_rx_bl_bmu_t *bmu, s64 ber,
* \param pber PBER sliding mean
* \param ber BER target of the current tone map
* \param fecrate FEC rate of the current tone map
+ * \param bl_max true BL algorithm has done its maximum (and can not do
+ * better)
* \return true if a BMU has been done, false otherwise
*/
bool
ce_rx_bl_bmu_run (ce_rx_t *ce_rx, ce_rx_bl_bmu_t *bmu, u32 pber, u64 ber,
- phy_fecrate_t fecrate);
+ phy_fecrate_t fecrate, bool bl_max);
END_DECLS
diff --git a/cesar/ce/rx/bitloading/src/ber_margin_update.c b/cesar/ce/rx/bitloading/src/ber_margin_update.c
index 28cbc9777d..c2ad52282b 100644
--- a/cesar/ce/rx/bitloading/src/ber_margin_update.c
+++ b/cesar/ce/rx/bitloading/src/ber_margin_update.c
@@ -57,7 +57,7 @@ ce_rx_bl_bmu_apply_margin (ce_rx_bl_bmu_t *bmu, s64 ber,
bool
ce_rx_bl_bmu_run (ce_rx_t *ce_rx, ce_rx_bl_bmu_t *bmu, u32 pber, u64 ber,
- phy_fecrate_t fecrate)
+ phy_fecrate_t fecrate, bool bl_max)
{
dbg_assert (bmu);
dbg_assert (ber <= CE_RX_BL_BER_DEFAULT_OVER);
@@ -71,8 +71,8 @@ ce_rx_bl_bmu_run (ce_rx_t *ce_rx, ce_rx_bl_bmu_t *bmu, u32 pber, u64 ber,
ce_rx_bl_bmu_poly_t poly = CE_RX_BL_BMU_POLY_NONE;
- /* If under tunnel and not at limit. */
- if (pber < conf->pber_limit[CE_RX_BL_BMU_MIN])
+ /* If under tunnel and not at limit and BL has already done its maximum */
+ if (pber < conf->pber_limit[CE_RX_BL_BMU_MIN] && !bl_max)
poly = CE_RX_BL_BMU_POLY_MINUS;
/* If over tunnel and not at limit. */
else if
diff --git a/cesar/ce/rx/bitloading/src/transition.c b/cesar/ce/rx/bitloading/src/transition.c
index 766e2323c2..8ee75f0256 100644
--- a/cesar/ce/rx/bitloading/src/transition.c
+++ b/cesar/ce/rx/bitloading/src/transition.c
@@ -474,7 +474,8 @@ ce_rx_bl_fsm__TRACKING__data (ce_rx_t *ce_rx,
{
/* Restart CE if BER margins changed. */
if (ce_rx_bl_bmu_run (ce_rx, &bl->bmu, bl->pber.mean_q16,
- tm->ber_target, tm->fecrate))
+ tm->ber_target, tm->fecrate,
+ bl->optimization_failed))
{
CE_RX_TRACE (RESTART_BER_MARGIN_UPDATE, sta->tei,
tm->fecrate);
diff --git a/cesar/ce/rx/bitloading/test/src/test_ber_margin_update.c b/cesar/ce/rx/bitloading/test/src/test_ber_margin_update.c
index 2f47664235..01ec5b6f68 100644
--- a/cesar/ce/rx/bitloading/test/src/test_ber_margin_update.c
+++ b/cesar/ce/rx/bitloading/test/src/test_ber_margin_update.c
@@ -116,7 +116,7 @@ test_ce_rx_bl_bmu (test_t t)
bmu.ber_margin[fecrate] = ber_margin_in;
test_fail_if (ce_rx_bl_bmu_run (ce_rx, &bmu, pber, ber_target,
- fecrate)
+ fecrate, false)
!= result, "iteration %d failed (got %s)\n", i,
result ? "true" : "false");
test_fail_if (bmu.ber_margin[fecrate] != ber_margin_out,
@@ -125,6 +125,20 @@ test_ce_rx_bl_bmu (test_t t)
ber_margin_out - bmu.ber_margin[fecrate]);
}
} test_end;
+
+ test_begin (t, "BER margin update, BL can not optimize")
+ {
+ /* Fake BMU can be triggered. */
+ bmu.frame_counter = ce_rx_bl_bmu_conf.frame_count_min + 1;
+ fecrate = PHY_FEC_RATE_1_2;
+ bmu.ber_margin[fecrate] = 0;
+ /* Use a PBER set to 0, to force a situation where BMU should be
+ * triggered and ensure BL at max flag is correctly used. */
+ test_fail_if (ce_rx_bl_bmu_run (ce_rx, &bmu, 0, 0, fecrate, true)
+ == true);
+ test_fail_if (ce_rx_bl_bmu_run (ce_rx, &bmu, 0, 0, fecrate, false)
+ == false);
+ } test_end;
}
int