Fix clipping bug in float to fixed point conversion, causing

audible glitches when samples smaller than the quantification
step are converted.
This commit is contained in:
Alexandre Ratchov 2015-05-04 14:53:28 +02:00
parent 8620da44d1
commit 04d8fe25dd
1 changed files with 12 additions and 2 deletions

View File

@ -604,9 +604,19 @@ f32_to_adata(unsigned int x)
s = (x >> 31);
e = (x >> 23) & 0xff;
m = (x << 8) | 0x80000000;
if (e < 127 - 24)
/*
* f32 exponent is (e - 127) and the point is after the 31-th
* bit, thus the shift is:
*
* 31 - (BITS - 1) - (e - 127)
*
* to ensure output is in the 0..(2^BITS)-1 range, the minimum
* shift is 31 - (BITS - 1), and maximum shift is 31
*/
if (e < 127 - (ADATA_BITS - 1))
y = 0;
else if (e > 127 - 1)
else if (e > 127)
y = ADATA_UNIT - 1;
else
y = m >> (127 + (32 - ADATA_BITS) - e);