fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-trx/+/43161?usp=email )
Change subject: Transceiver52M: use lround() for TRXD toa/ci rounding ......................................................................
Transceiver52M: use lround() for TRXD toa/ci rounding
trxd_fill_v0_specific() and trxd_fill_v1_specific() rounded bi->toa and bi->ci to the nearest integer using the "+ 0.5, then truncate" idiom. That only rounds correctly for non-negative inputs: for negative values (toa can be negative for an early burst, ci can be negative under poor C/I conditions) it biases towards zero instead of rounding to nearest, e.g. -1.3 + 0.5 = -0.8, truncated to 0 instead of the correct -1.
Use lround() instead, which rounds-half-away-from-zero correctly for both signs.
Change-Id: I0c52f1b91070e4750a8a0ffbccb222454e694c3b Related: OS#5283 --- M Transceiver52M/proto_trxd.c 1 file changed, 2 insertions(+), 2 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/61/43161/1
diff --git a/Transceiver52M/proto_trxd.c b/Transceiver52M/proto_trxd.c index e5a889d..638f7f3 100644 --- a/Transceiver52M/proto_trxd.c +++ b/Transceiver52M/proto_trxd.c @@ -38,7 +38,7 @@ int toa_int;
/* in 1/256 symbols, round to closest integer */ - toa_int = (int) (bi->toa * 256.0 + 0.5); + toa_int = (int) lround(bi->toa * 256.0); v0->rssi = bi->rssi; osmo_store16be(toa_int, &v0->toa); } @@ -48,7 +48,7 @@ int16_t ci_int_cB;
/* deciBels->centiBels, round to closest integer */ - ci_int_cB = (int16_t)((bi->ci * 10) + 0.5); + ci_int_cB = (int16_t) lround(bi->ci * 10.0);
v1->idle = !!bi->idle; v1->modulation = (bi->modulation == MODULATION_GMSK) ?