Skip to content
Snippets Groups Projects

Add quantize function and enums

Merged Oscar Gustafsson requested to merge quantization into master
Files
4
+ 84
0
"""B-ASIC quantization module."""
import math
from enum import Enum
from b_asic.types import Num
class Quantization(Enum):
"""Quantization tyoes."""
ROUNDING = 1
TRUNCATION = 2
MAGNITUDE_TRUNCATION = 3
JAMMING = 4
UNBIASED_ROUNDING = 5
class Overflow(Enum):
"""Overflow types."""
TWOS_COMPLEMENT = 1
SATURATION = 2
def quantize(
value: Num,
fractional_bits: int,
integer_bits: int = 1,
quantization: Quantization = Quantization.TRUNCATION,
overflow: Overflow = Overflow.TWOS_COMPLEMENT,
):
"""
Quantize *value*.
Parameters
----------
value : int, float, complex
fractional_bits : int
integer_bits : int, default: 1
quantization : Quantization, default: Quantization.TRUNCATION
overflow : Overflow, default: Overflow.TWOS_COMPLEMENT
Returns
-------
"""
if isinstance(value, complex):
return complex(
quantize(
value.real,
fractional_bits=fractional_bits,
integer_bits=integer_bits,
quantization=quantization,
overflow=overflow,
),
quantize(
value.imag,
fractional_bits=fractional_bits,
integer_bits=integer_bits,
quantization=quantization,
overflow=overflow,
),
)
b = 2**fractional_bits
v = b * value
if quantization is Quantization.TRUNCATION:
v = math.floor(v)
elif quantization is Quantization.ROUNDING:
v = math.floor(v + 0.5)
elif quantization is Quantization.MAGNITUDE_TRUNCATION:
if v >= 0:
v = math.floor(v)
else:
v = math.ceil(v)
elif quantization is Quantization.JAMMING:
v = math.floor(v) | 1
else: # Quantization.UNBIASED_ROUNDING
v = round(v)
# TODO: overflow handling
return v / b
Loading