Tôi đang cố gắng thực hiện mã hóa QM cho mục đích giáo dục. Tài nguyên chính của tôi là chương 5.11 từ Sổ tay nén dữ liệu, ấn bản lần thứ 5. Đây là việc triển khai bộ mã hóa thô của tôi bây giờ:Thực thi mã QM bằng Python - là bắt buộc từ 16 bit?
def _encode_bit(self, bit):
if bit == self._lps:
self._code_lps()
else:
self._code_mps()
def _code_mps(self):
self._a = self._a - self._q_e()
if self._a < 0x8000:
self._switch_intervals_if_needed()
self._renormalize()
self._p_table.next_mps()
def _code_lps(self):
self._c = self._c + self._a - self._q_e()
self._a = self._q_e()
self._switch_intervals_if_needed()
self._renormalize()
self._p_table.next_lps()
def _renormalize(self):
while self._a < 0x8000:
#C < 0,5 (0xFFFF/3)
if self._c < 0x5555:
b = 0
d = 0
else:
b = 1
d = 0x5555
self._write_bit(b)
logger.debug("Written '%i' to output", b)
#C = 2 * (C - D)
self._c = (self._c - d) << 1
#A = 2 * A
self._a <<= 1
Tôi đang ánh xạ khoảng cách đến số nguyên, vì nó sẽ hiệu quả hơn khi tôi hiểu. Trong cuốn sách, có đề cập, rằng 16 bit từ được sử dụng để lập bản đồ, nhưng kể từ khi tôi đang làm điều này trong Python tôi không chắc chắn liệu không thực thi chiều dài 16 bit của tất cả các biến. Vấn đề là khi tôi chạy bộ mã hóa của mình, mã số C
(self._c
), sẽ trỏ đến cuối khoảng MPS nếu tôi hiểu chính xác nó tràn quá 16 bit rất nhanh và giá trị của nó trở nên rất lớn. Bởi vì điều này, các bit được mã hóa chủ yếu chỉ là một chuỗi ký hiệu LPS. Tôi có nên thực thi chiều dài biến bằng cách nào đó không? Hoặc là có vấn đề khác trong mã của tôi? Tôi đã dành một vài ngày trên nó đã cố gắng tìm ra những gì đã sai ...
Tôi không quen với bộ mã hóa QM, nhưng tôi nghi ngờ có vấn đề với phương pháp 'renormalize' của bạn. Sẽ hữu ích nếu bạn có thể bao gồm mã giả cho thuật toán _exact_ bạn đang sử dụng. –
Cảm ơn bạn đã bình luận! Vâng, đó là một phần tôi không hiểu hoàn toàn và nó xuất phát từ tài liệu của giáo viên của tôi, những người sử dụng cùng một nguồn. Sau khi tôi đọc chương trong Cẩm nang nén dữ liệu, tôi vẫn không hiểu, làm thế nào đầu ra được hình thành, vì vậy tôi đã tiếp nhận phần này từ anh ta. Từ cuốn sách tôi hiểu, việc tái chuẩn hóa diễn ra bởi vì tôi muốn giữ A ('self._a' trong mã) gần 1, vì vậy tôi có thể bỏ qua phép nhân phức tạp hơn trong khi mã hóa. Có thể xem mã gốc tại trang trình bày 63 trong [thuyết trình của giáo viên] (http://outrata.inf.upol.cz/courses/kd/komprese.pdf) –