Implement Rice encoding (shoutout to ChatGPT for coding this part)
This commit is contained in:
parent
973c5c89ba
commit
ce28f600ce
36
bitstream.py
36
bitstream.py
@ -3,6 +3,7 @@ import heapq
|
|||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from arithmetic_compressor import AECompressor
|
from arithmetic_compressor import AECompressor
|
||||||
from arithmetic_compressor.models import StaticModel
|
from arithmetic_compressor.models import StaticModel
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
class BaseEncoder(ABC):
|
class BaseEncoder(ABC):
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@ -86,10 +87,8 @@ class BinomialHuffmanEncoder(BaseEncoder):
|
|||||||
return codebook
|
return codebook
|
||||||
|
|
||||||
def build_model(self, data):
|
def build_model(self, data):
|
||||||
# Number of possible 10-bit integers (0 to 1023)
|
num_symbols = 2**10
|
||||||
num_symbols = 1024
|
|
||||||
|
|
||||||
# Mean and standard deviation for a binomial distribution centered around 0
|
|
||||||
mean = (num_symbols - 1) / 2
|
mean = (num_symbols - 1) / 2
|
||||||
std_dev = math.sqrt(num_symbols / 4)
|
std_dev = math.sqrt(num_symbols / 4)
|
||||||
|
|
||||||
@ -119,3 +118,34 @@ class BinomialHuffmanEncoder(BaseEncoder):
|
|||||||
# The root of the Huffman tree
|
# The root of the Huffman tree
|
||||||
self.root = heapq.heappop(heap)
|
self.root = heapq.heappop(heap)
|
||||||
self.codebook = self._generate_codes(self.root)
|
self.codebook = self._generate_codes(self.root)
|
||||||
|
|
||||||
|
class RiceEncoder(BaseEncoder):
|
||||||
|
def encode(self, data):
|
||||||
|
data = np.array(data).astype(int)
|
||||||
|
q = data // self.m
|
||||||
|
r = data % self.m
|
||||||
|
|
||||||
|
encoded_data = []
|
||||||
|
for qi, ri in zip(q, r):
|
||||||
|
encoded_data.append('1' * qi + '0' + format(ri, f'0{self.k}b'))
|
||||||
|
|
||||||
|
return ''.join(encoded_data)
|
||||||
|
|
||||||
|
def decode(self, encoded_data):
|
||||||
|
decoded_output = []
|
||||||
|
i = 0
|
||||||
|
while i < len(encoded_data):
|
||||||
|
q = 0
|
||||||
|
while encoded_data[i] == '1':
|
||||||
|
q += 1
|
||||||
|
i += 1
|
||||||
|
i += 1 # skip the '0'
|
||||||
|
r = int(encoded_data[i:i + self.k], 2)
|
||||||
|
i += self.k
|
||||||
|
decoded_output.append(q * self.m + r)
|
||||||
|
|
||||||
|
return np.array(decoded_output)
|
||||||
|
|
||||||
|
def build_model(self, data, k=3):
|
||||||
|
self.k = k
|
||||||
|
self.m = 1 << k
|
||||||
|
Loading…
Reference in New Issue
Block a user