#[inline]
pub fn quantize_i16(x: f32) -> i16 {
(x * 32768.0).round().clamp(-32768.0, 32767.0) as i16
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn quantizes_reference_values() {
assert_eq!(quantize_i16(0.0), 0);
assert_eq!(quantize_i16(0.25), 8192);
assert_eq!(quantize_i16(-1.0), -32768);
assert_eq!(quantize_i16(1.0), 32767);
}
#[test]
fn saturates_out_of_range_and_non_finite() {
assert_eq!(quantize_i16(2.0), 32767);
assert_eq!(quantize_i16(-2.0), -32768);
assert_eq!(quantize_i16(f32::NAN), 0);
assert_eq!(quantize_i16(f32::INFINITY), 32767);
assert_eq!(quantize_i16(f32::NEG_INFINITY), -32768);
}
#[test]
fn rounds_half_away_from_zero() {
assert_eq!(quantize_i16(1.5 / 32768.0), 2);
assert_eq!(quantize_i16(-1.5 / 32768.0), -2);
}
}