2017-06-10 35 views
14

我正在嘗試爲教育目的實施QM編碼。我的主要資源是數據壓縮手冊第5版第5.11章。這是我粗略實現編碼器的現在:Python中的QM編碼實現 - 是16位字強制性的嗎?

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 

我區間映射到整數,因爲它應該是我的理解更加高效。在這本書中,有人提到,16位字用於映射,但由於我在Python中這樣做,我不確定是否不強制所有變量的16位長度。問題在於,當我運行我的編碼器時,如果我正確理解MPS間隔的底部,它將很快溢出超過16位長度,並且其值會變得非常大,所以我應該運行編碼器C(代碼爲self._c)。正因爲如此,編碼位大多隻是一串LPS符號。我應該以某種方式執行可變長度嗎?或者在我的代碼中存在其他問題?我花了幾天的時間就已經試圖找出哪裏出了問題......

+1

我對QM編碼器不熟悉,但我懷疑你的'renormalize'方法有問題。如果您可以包含您正在使用的_exact_算法的僞代碼,這將有所幫助。 –

+1

感謝您的評論!那麼,這是我完全不理解的一部分,它來自我的老師的材料,他們使用相同的來源。在閱讀「數據壓縮手冊」一章後,我仍然不明白,輸出是如何形成的,所以我從他那裏接管了這篇文章。從我明白的書中可以看出,重整化發生了,因爲我想讓A('self._a'代碼)接近1,所以我可以在編碼時省略更復雜的乘法。原始代碼可以在[教師介紹](http://outrata.inf.upol.cz/courses/kd/komprese.pdf) –

回答

3

在任何形式的算術壓縮(如QM)中,都需要保持在最大允許位數(本例中爲16位)內,否則你會遇到各種各樣的問題。這些問題包括舍入誤差,因爲理論上你可能需要無限精度。該算法本身將在必要時進行四捨五入,並執行重新歸一化以最大限度地使用位範圍。您的問題的答案是「是」。

+2

的幻燈片63中看到使用16位字,可以使用'ctypes'模塊:https://docs.python.org/3/library/ctypes.html#ctypes.c_int16 –

+0

非常感謝!這個答案雖然沒有讓我的代碼工作,但卻促使我推進它的工作。現在輸出看起來更合理,但編碼/解碼過程不會返回原始輸入,所以我必須進一步研究一下,因爲可能存在另一個錯誤。 –

+0

看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#的2.16章節v = onepage&q =算術%20壓縮%20qm&f =假。算法的很好的描述。有趣的是,JPEG使用QM壓縮。 – mikep