ALeLacheur's picture
Voiceblock demo: Attempt 8
957e2dc
import random
import torch
from src.simulation.effect import Effect
################################################################################
# Simulate simple quantization distortions
################################################################################
class Quantize(Effect):
def __init__(self, bits: any = 8):
super().__init__(compute_grad=False)
self.min_bits, self.max_bits = self.parse_range(
bits,
int,
f'Invalid bit depth {bits}'
)
self.bits = None
self.sample_params()
def forward(self, x: torch.Tensor):
# rescale full range to -2^(bits - 1), 2^(bits - 1)
scale_factor = 2 ** (self.bits - 1)
x_scaled = x * scale_factor / self.scale
x_quant = torch.round(x_scaled)
return x_quant * self.scale / scale_factor
def sample_params(self):
self.bits = round(
random.uniform(self.min_bits, self.max_bits)
)