summaryrefslogtreecommitdiff
path: root/cesar/ce/rx/bitloading/src/bitloading.c
diff options
context:
space:
mode:
authordufour2010-06-11 09:30:24 +0000
committerdufour2010-06-11 09:30:24 +0000
commit31b60f8e5a7baea8dd93b2c016275884598aa7af (patch)
tree1ad0e51550a5313e429ec2b94f4e984fb1acfb08 /cesar/ce/rx/bitloading/src/bitloading.c
parent0101dc6a714849955cbca1f170dc6646a6fdf8fc (diff)
cesar/ce/rx/bl: do not increase last tone if over BER target, closes #1626
git-svn-id: svn+ssh://pessac/svn/cesar/trunk@7191 017c9cb6-072f-447c-8318-d5b54f68fe89
Diffstat (limited to 'cesar/ce/rx/bitloading/src/bitloading.c')
-rw-r--r--cesar/ce/rx/bitloading/src/bitloading.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/cesar/ce/rx/bitloading/src/bitloading.c b/cesar/ce/rx/bitloading/src/bitloading.c
index 141633f587..cd599b06b5 100644
--- a/cesar/ce/rx/bitloading/src/bitloading.c
+++ b/cesar/ce/rx/bitloading/src/bitloading.c
@@ -187,13 +187,24 @@ ce_rx_bl_update_tone_map_at_ber_consign (u64 ber_pt,
}
/* Sanity check: we must have done something! */
dbg_assert (mod != -1);
- /* Remove last one. */
- tm->bits_per_symbol -= CE_BIT_PER_MOD[mod];
- tonemap_write_tone_to_word (tone_word, opti[pos - 1].carrier_index,
- --mod);
- tm->bits_per_symbol += CE_BIT_PER_MOD[mod];
- if (mod == 0)
- tone_en--;
+ /* Remove last tone if we are over target. */
+ if (ber_weighted_sum > ber_pt * tm->bits_per_symbol)
+ {
+ /* Go back to last position. */
+ pos--;
+ dbg_assert (pos < tonemask->carrier_nb);
+ /* Remove last one. */
+ tm->bits_per_symbol -= CE_BIT_PER_MOD[mod];
+ ber_weighted_sum -= (opti[pos].ber_lower + ((u64) opti[pos].ber_diff << 32))
+ * CE_BIT_PER_MOD[mod];
+ /* Write new value. */
+ tonemap_write_tone_to_word (tone_word, opti[pos].carrier_index,
+ --mod);
+ tm->bits_per_symbol += CE_BIT_PER_MOD[mod];
+ ber_weighted_sum += opti[pos].ber_lower * CE_BIT_PER_MOD[mod];
+ if (mod == 0)
+ tone_en--;
+ }
/* Return number of tones enabled. */
return tone_en;
}