我正在嘗試爲教育目的實施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符號。我應該以某種方式執行可變長度嗎?或者在我的代碼中存在其他問題?我花了幾天的時間就已經試圖找出哪裏出了問題......
我對QM編碼器不熟悉,但我懷疑你的'renormalize'方法有問題。如果您可以包含您正在使用的_exact_算法的僞代碼,這將有所幫助。 –
感謝您的評論!那麼,這是我完全不理解的一部分,它來自我的老師的材料,他們使用相同的來源。在閱讀「數據壓縮手冊」一章後,我仍然不明白,輸出是如何形成的,所以我從他那裏接管了這篇文章。從我明白的書中可以看出,重整化發生了,因爲我想讓A('self._a'代碼)接近1,所以我可以在編碼時省略更復雜的乘法。原始代碼可以在[教師介紹](http://outrata.inf.upol.cz/courses/kd/komprese.pdf) –