import numpy as np values = np.array([-1.0, -0.55, -0.10, 0.25, 0.60, 1.0]) bits = 4 largest_code = 2 ** (bits - 1) - 1 scale = np.max(np.abs(values)) / largest_code codes = np.rint(values / scale) codes = np.clip(codes, -largest_code, largest_code).astype(np.int8) restored = codes * scale print("original values:", values.tolist()) print("4-bit codes:", codes.tolist()) print("restored values:", np.round(restored, 3).tolist()) print("raw payload:", len(values) * 16, "bits ->", len(values) * 4, "bits") # Output: """ original values: [-1.0, -0.55, -0.1, 0.25, 0.6, 1.0] 4-bit codes: [-7, -4, -1, 2, 4, 7] restored values: [-1.0, -0.571, -0.143, 0.286, 0.571, 1.0] raw payload: 96 bits -> 24 bits """