mirror of https://github.com/ericonr/sndio.git
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:
parent
8620da44d1
commit
04d8fe25dd
14
aucat/dsp.c
14
aucat/dsp.c
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue