2017-06-10 27 views
14

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 ...

+1

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. –

+1

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) –

Trả lời

3

Trong bất kỳ hình thức nén số học nào (như QM), bạn cần phải ở trong các bit tối đa cho phép (16 trong trường hợp này), nếu không bạn sẽ có đủ loại vấn đề. Những vấn đề này bao gồm lỗi roundoff vì lý thuyết bạn có thể cần độ chính xác vô hạn. Bản thân thuật toán sẽ làm tròn khi cần thiết và thực hiện quá trình chuẩn hóa lại để tối đa hóa việc sử dụng dải bit. Câu trả lời cho câu hỏi của bạn là có".

+2

để sử dụng từ 16 bit, mô-đun 'ctypes' có thể được sử dụng : https://docs.python.org/3/library/ctypes.html#ctypes.c_int16 –

+0

Cảm ơn bạn rất nhiều! Câu trả lời này, mặc dù đã không làm cho mã của tôi làm việc, đẩy tôi về phía trước để làm cho nó hoạt động. Bây giờ đầu ra trông hợp lý hơn, nhưng quá trình mã hóa/giải mã sẽ không trả về đầu vào ban đầu, vì vậy tôi phải điều tra thêm chút nữa, vì có thể có một lỗi khác. –

+0

Nhìn vào chương 2.16 của https://books.google.co.in/books?id=ujnQogzx_2EC&pg=PA129&lpg=PA129&dq=arithmetic+compression+qm&source=bl&ots=FpqBpD3wrT&sig=Z81N-n0MTIJV_YNDwcWKWlDds-o&hl=en&sa=X&ved=0ahUKEwirwb3RitTUAhWHNI8KHegkCOUQ6AEIQTAF# v = onepage & q = số học% 20compression% 20qm & f = false. Mô tả đẹp về thuật toán. Hài hước, JPEG sử dụng nén QM. – mikep

Các vấn đề liên quan