MQ編碼器來(lái)自于無(wú)乘法的Q編碼器算法;而另一來(lái)自Q編碼器的算法是QM,這兩個(gè)編碼器的區(qū)別有:
1. QM是LPS區(qū)間在上,MPS區(qū)間在下,而MQ正好相反,LPS區(qū)間在下,而MPS區(qū)間在上。
2. QM編碼器采用的是全進(jìn)位模式,而MQ的是位填充模式。
如圖:

上圖中發(fā)現(xiàn)MQ編碼器的MPS和LPS的區(qū)間位:
MPS區(qū)間: Qe-A
LPS區(qū)間:0-Qe
MQ編碼器的規(guī)則:
1. 如果遇到一個(gè)MPS
a) 首先將A = A-Qe;這個(gè)是MPS的區(qū)間大小
b) 如果A大于0x8000的時(shí)候,說(shuō)明不需要重定標(biāo);需要將MPS的下界放到輸出符號(hào)C中,即:C = C+A
c) 如果A小于0x8000,說(shuō)明需要重定標(biāo);這個(gè)時(shí)候需要比較一下A與Qe的大小,如果A比Qe小還需要交換區(qū)間
d) 如果A比Qe小,首先需要將Qe的值給A,也就是A =Qe;這個(gè)時(shí)候不需要輸出區(qū)間邊界,因?yàn)榻粨Q之后的MPS區(qū)間的下界實(shí)際上是原來(lái)LPS區(qū)間的下界,其是0。
e) 如果A比Qe大,這個(gè)過(guò)程同b,需要將MPS的區(qū)間下界Qe輸出到C中
f) 對(duì)于小于0X8000的情況需要重定標(biāo),也就是逐次加倍增加A和C,直到A比0x8000大;如果中間的C發(fā)生溢出,需要輸出C的高位到輸出字節(jié)。
2. 如果是LPS,那么重定標(biāo)是肯定的,在完成所有操作后進(jìn)行
a) 如果A比Qe小;這個(gè)時(shí)候?qū)嶋H上A仍然是MPS的區(qū)間,單由于遇到了一個(gè)LPS,最終的A應(yīng)該是LPS區(qū)間,大MPS的區(qū)間(現(xiàn)在的A)比LPS的區(qū)間(Qe)小,所以取兩者小的那個(gè),所以A已經(jīng)是值了。這實(shí)際上是一次區(qū)間交換。而交換后的LPS區(qū)間下界是交換前的MPS區(qū)間下界,也就是Qe,因此將Qe輸出到C。那么C = C + Qe
b) 如果A比Qe大,說(shuō)明這是一個(gè)不需要交換的區(qū)間,但這個(gè)時(shí)候需要將LPS的區(qū)間給A,而且將LPS的區(qū)間下界輸出到C;對(duì)于LPS的區(qū)間是Qe,因此A = Qe;而LPS的區(qū)間下界是0,所以C沒(méi)有變化。
完成上面步驟以后需要進(jìn)行A和C的重定標(biāo),直到A比0X80000大為止。
對(duì)應(yīng)QM編碼器可以參見(jiàn)QM編碼器 MQ編碼器
代碼下載。