MQ編碼器
MQ編碼器來自于無乘法的Q編碼器算法;而另一來自Q編碼器的算法是QM,這兩個編碼器的區別有:
1. QM是LPS區間在上,MPS區間在下,而MQ正好相反,LPS區間在下,而MPS區間在上。
2. QM編碼器采用的是全進位模式,而MQ的是位填充模式。
如圖:
上圖中發現MQ編碼器的MPS和LPS的區間位:
MPS區間: Qe-A
LPS區間:0-Qe
MQ編碼器的規則:
1. 如果遇到一個MPS
a) 首先將A = A-Qe;這個是MPS的區間大小
b) 如果A大于0x8000的時候,說明不需要重定標;需要將MPS的下界放到輸出符號C中,即:C = C+A
c) 如果A小于0x8000,說明需要重定標;這個時候需要比較一下A與Qe的大小,如果A比Qe小還需要交換區間
d) 如果A比Qe小,首先需要將Qe的值給A,也就是A =Qe;這個時候不需要輸出區間邊界,因為交換之后的MPS區間的下界實際上是原來LPS區間的下界,其是0。
e) 如果A比Qe大,這個過程同b,需要將MPS的區間下界Qe輸出到C中
f) 對于小于0X8000的情況需要重定標,也就是逐次加倍增加A和C,直到A比0x8000大;如果中間的C發生溢出,需要輸出C的高位到輸出字節。
2. 如果是LPS,那么重定標是肯定的,在完成所有操作后進行
a) 如果A比Qe小;這個時候實際上A仍然是MPS的區間,單由于遇到了一個LPS,最終的A應該是LPS區間,大MPS的區間(現在的A)比LPS的區間(Qe)小,所以取兩者小的那個,所以A已經是值了。這實際上是一次區間交換。而交換后的LPS區間下界是交換前的MPS區間下界,也就是Qe,因此將Qe輸出到C。那么C = C + Qe
b) 如果A比Qe大,說明這是一個不需要交換的區間,但這個時候需要將LPS的區間給A,而且將LPS的區間下界輸出到C;對于LPS的區間是Qe,因此A = Qe;而LPS的區間下界是0,所以C沒有變化。
完成上面步驟以后需要進行A和C的重定標,直到A比0X80000大為止。對應QM編碼器可以參見QM編碼器
MQ編碼器代碼下載。
posted on 2007-04-14 21:33 笨笨 閱讀(3254) 評論(4) 編輯 收藏 引用 所屬分類: 壓縮算法