summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/bitloading/src/bitloading.c
diff options
context:
space:
mode:
authorJerome Jutteau2010-10-15 12:06:20 +0200
committerJerome Jutteau2010-10-20 11:43:12 +0200
commita6843b88e0ef0d83ba53a2b53829ca54fd0a99c3 (patch)
tree2934fc3209086a7bc4d7d518831f178e85d38796 /cesar/ce/rx/bitloading/src/bitloading.c
parentcc4d09ace1c18d409f6baffd5c20f89b61e7eb30 (diff)
cesar/ce/rx/bl: new algorithm for optimisation table shifting, refs #1881
Updated function to count the number of shift to perform on the optimisation table. It depends of the action to perform (update +/-). This commit integer the new version of Bitloading algorithm.
Diffstat (limited to 'cesar/ce/rx/bitloading/src/bitloading.c')
-rw-r--r--cesar/ce/rx/bitloading/src/bitloading.c32
1 files changed, 18 insertions, 14 deletions
diff --git a/cesar/ce/rx/bitloading/src/bitloading.c b/cesar/ce/rx/bitloading/src/bitloading.c
index 891b159b50..1e8107d434 100644
--- a/cesar/ce/rx/bitloading/src/bitloading.c
+++ b/cesar/ce/rx/bitloading/src/bitloading.c
@@ -349,30 +349,34 @@ ce_rx_bl_tone_map_update_count (ce_rx_bl_tone_map_update_actions_t action,
dbg_assert (action < CE_RX_BL_TONE_MAP_UPDATE_NB);
dbg_assert (ber_target != 0);
- s16 coeff;
- s8 multi;
+ u64 nb = 0;
- /* Adjust parameters depending on the action. */
if (action == CE_RX_BL_TONE_MAP_UPDATE_MINUS)
{
- coeff = CE_RX_BL_TONE_MAP_UPDATE_MINUS_COEFF;
- multi = 1;
+ /* Number of carriers we may shift in the optimisation table. */
+ nb = ROUND_DIV (CE_RX_BL_TONE_MAP_UPDATE_MINUS_COEFF *
+ MAX (means[CE_RX_BL_BER_SLIDING_MEAN_FAST],
+ means[CE_RX_BL_BER_SLIDING_MEAN_SLOW]),
+ ber_target)
+ - CE_RX_BL_TONE_MAP_UPDATE_MINUS_COEFF + 1;
}
else if (action == CE_RX_BL_TONE_MAP_UPDATE_PLUS)
{
- coeff = CE_RX_BL_TONE_MAP_UPDATE_PLUS_COEFF;
- multi = -1;
+ /* Ber target -X% where X is
+ * CE_RX_BL_TONE_MAP_UPDATE_MIDDLE_PERCENTAGE. */
+ u64 middle_limit = ber_target
+ - (u64) (ber_target / CE_RX_BL_TONE_MAP_UPDATE_MIDDLE_PERCENTAGE);
+
+ /* Number of carriers we may shift in the optimisation table. */
+ nb = -1 * ROUND_DIV (CE_RX_BL_TONE_MAP_UPDATE_PLUS_COEFF *
+ MAX (means[CE_RX_BL_BER_SLIDING_MEAN_FAST],
+ means[CE_RX_BL_BER_SLIDING_MEAN_SLOW]),
+ middle_limit)
+ + CE_RX_BL_TONE_MAP_UPDATE_PLUS_COEFF + 1;
}
else
return 0;
- /* Number of carriers we may shift in the optimisation table. */
- u64 nb =
- multi * ROUND_DIV (coeff *
- MAX (means[CE_RX_BL_BER_SLIDING_MEAN_FAST],
- means[CE_RX_BL_BER_SLIDING_MEAN_SLOW]),
- ber_target) - (multi * coeff) + 1;
-
/* Return value must be <= PHY_CARRIER_NB (max shift value). */
return (nb > PHY_CARRIER_NB ? PHY_CARRIER_NB : nb);
}