CD-ROM格式數據的軟解碼模塊設計
關(guān)鍵詞:CD-ROM格式 軟解碼 EDC檢錯 ECC糾錯
引言
CD-ROM是目前應用非常廣泛的大容量、低成本的存儲設備。為了減小誤碼率,原始數據經(jīng)過(guò)格式化編碼和信道編碼后,才寫(xiě)入CD-ROM盤(pán)片中;在讀取時(shí),則需經(jīng)過(guò)信道解碼和格式化解碼后才能得到所需的原始數據。CD-ROM數據的讀寫(xiě)過(guò)程如圖1所示。
在一般的音像設備(如VCD機)和個(gè)人電腦中,CD-ROM數據的解碼過(guò)程是由專(zhuān)用解碼芯片來(lái)完成的;而CD-ROM不但可以應用在音像設備和個(gè)人電腦中,還可以應用到需要讀取大量數據的嵌入式系統中。比如在車(chē)輛導般系統中,就可使用CD-ROM存放地理信息數據。嵌入式系統中的CD-ROM數據的解碼方法比較靈活,可以使用專(zhuān)用解碼芯片(暫稱(chēng)硬解碼),也可以通過(guò)處理器的解碼程序來(lái)完成(軟解碼)。相對于硬解碼來(lái)說(shuō),軟解碼有其獨特的優(yōu)點(diǎn)所在。因為它只需增加一個(gè)解碼程序模塊,就省掉了專(zhuān)用解碼芯片電路,簡(jiǎn)化了系統的硬件電路,降低了系統的成本。如圖1所示,CD-ROM數據經(jīng)過(guò)信道解碼后,得到的是以扇區結構組織的CD-ROM格式數據,還需進(jìn)行CD-ROM格式化解碼才能得到最終的用戶(hù)數據。本文介紹的就是嵌入式系統中CD-ROM格式數據軟解碼模塊的設計。
1 CD-ROM格式數據的扇區結構
CD-ROM數據是以扇區為基本單元進(jìn)行編碼處理的。經(jīng)過(guò)信道解碼處理后得到的扇區對于不同的數據來(lái)源,其結構是不同的。對于CD-DA(雙聲道的CD音頻)數據,由于沒(méi)有經(jīng)過(guò)格式化編碼,可以直接得到用戶(hù)數據;而CD-ROM數據和VCD數據都經(jīng)過(guò)CD-ROM格式化編碼成扇區結構,必須經(jīng)CD-ROM格式化解碼才能得到用戶(hù)數據。
CD-ROM扇區有兩種模式:模式1和模式2。其扇區結構如圖2所示。
由圖2可知,一個(gè)扇區的CD-ROM格式數據總共有2352字節。其中,兩種扇區模式都有12字節的同步信息和4字節的時(shí)間信息(頭信息)。如果是模式1,還有4字節的循環(huán)冗檢錯碼,8字節空字節,276字節的糾錯碼,其中包含172字節的P校驗字和104字節的Q校驗字,用戶(hù)數據只有2048字節。如果是模式2,除了同步信息和頭信息外,余下的2336字節全部都是用戶(hù)數據。
實(shí)際中,由于盤(pán)的制作材料的性能、盤(pán)制造生產(chǎn)技術(shù)水平的限制、驅動(dòng)器的性能以及使用不當等諸多原因,從盤(pán)上讀出的數據不可能完全正確。據統計,一片未使用過(guò)的只讀光盤(pán),原始誤碼率約為310 -4,沾有指紋的盤(pán)約為610 -4,有傷痕的盤(pán)約為510 -3。針對這種情況,光盤(pán)存儲系統采用了功能強大的錯誤檢測和糾正措施:CIRC、EDC、ECC。數據經(jīng)信道解碼后,由于采用CIRC糾錯處理,誤碼率由10 -4~10 -5降到10 -9以下。對于音頻和圖像數據來(lái)說(shuō),這樣的誤碼率已經(jīng)足夠。但要用到計算機文件數據,必須要求誤碼率為10 -12以下,因此必須采用二次糾錯處理。通過(guò)EDC和ECC校驗,可以達到這個(gè)要求。
所以,模式1主要用于存儲對錯誤非常敏感的數據,如計算機程序代碼等數據;而模式2則主要用于存儲對錯誤不敏感的數據,如圖像、音響等類(lèi)型的數據。
在模式2的基礎上,CD-ROM/XA格式又分為兩種形式(FORM):形式1和形式2。其扇區結構如圖3所示。我們常用的VCD就是采用CD-ROM/XA的形式2格式。
由上可知,除了扇區模式2可以直接得到2336字節的用戶(hù)數據外,CD-ROM格式解碼還必須進(jìn)行EDC檢錯和ECC糾錯處理。下面分別介紹EDC檢錯和ECC糾錯的原理和解碼算法。
2 CD-ROM扇區中的EDC檢錯原理及算法
CD-ROM扇區采用32位CRC(循環(huán)冗余校驗碼)檢錯碼,其生成多項式為
P(X)=(X 16+X 15+X 2+1)(X 16+X 2+X+1)
對應的碼字是0x18001801B。計算CRC碼時(shí)用的數據塊是從扇區的開(kāi)頭到用戶(hù)數據區結束為止的數據字節。即將字節0~2063共2064字節的數據所對應的長(cháng)多項式整除P(X),得到32位的余式,放在2064~2067字節位置。這2068字節的數據對應的多項式是能夠被生成多項式P(X)整除的。如果不能整除,則表明數據有錯。所以,我們的解碼過(guò)程就將2068字節的數據組成的多項式來(lái)整除生成多項式,如果余式為0,則表明數據正確,否則數據有錯。
但我們不可能直接進(jìn)行長(cháng)除法操作,因為計算機不可能將一個(gè)20688位的極其長(cháng)的二進(jìn)制數直接拿來(lái)做長(cháng)除法。根據長(cháng)除法的規律,以字節(8比特)為單位進(jìn)行操作,每次除法將上一字節的所得的余數與本字節組合成新的數進(jìn)行除法運算。除式是33位的,因此,每個(gè)字節的除法須把這個(gè)字節的數左移24位,跟上次的余式組合成一個(gè)32位的二進(jìn)制數,來(lái)整除除式。主要實(shí)現現代碼如下:
for(i=0;i2068;i++)
crc=edc_crc_32(crc,data_in[i],M32);
其中,crc為余數,M32為生成多項式對應的二進(jìn)制數。函數edc_crc_32(int crc,int ch,int mask)的實(shí)現代碼為
char edc_crc_32(int crc,int int mask){
ch24;
for(int i=0;i8;i++){
if(crc^ch)0x80000000)
crc=(crc1)^mask;
else
crc=1;
ch=1;
}
return crc;
}
由以上代碼可知,每個(gè)字節的求余要進(jìn)行8次移位和8次異或運算,對于ch值相同的數據來(lái)說(shuō),這種運算是完全的重復;對于大量的CD-ROM數據來(lái)說(shuō),是對資源的一種很大的浪費。因此,為了提高效率,可以把256個(gè)8位二進(jìn)制數對應的余式做成表,在程序運行之前先把表讀入內存。通過(guò)查表的方式將極大的提高代碼的效率。代碼如下:
for(int i=0;i2068;i++){
temp=data_in[i]^(crc>>24));
crc=(crc8)^crctable[temp];
}
這種方式除了數據表需要占用內存外,運算效率理論上可以提高8位。實(shí)際上是用較少的內存空間換取了效率的極大提高。這在嵌入式系統中是很有應用價(jià)值的。
3 CD-ROM扇區中的ECC糾錯原理及算法
CD-ROM扇區中的ECC碼,按ISO/IEC10149的規范,采用GF(2 8)域上的RSPC碼產(chǎn)生172字節的P校驗符合和104字節的Q校驗符號。RS碼采用本原多項式
P(x)=x 8+x 4+x 3+x 2+1
和本原元
α=(0 0 0 0 0 0 1 0)
構造GF(2 8)中的256個(gè)元素。
P校驗和Q校驗字的生成方法如圖4所示。每個(gè)扇區中,字節12~2075和ECC域中的字節2076~2351共2340個(gè)字節,組成1170個(gè)字(word)。每個(gè)字S由兩個(gè)字節B組成,分別為最高有效位字節M(mǎn)SB和最低有效位字節LSB。第n個(gè)字由個(gè)面的字節組成:
S(n)=MSB[B(2n+13)]+LSB[B(2n+12)]
其中n=0,1,2,…,1169。
從字節12到2075共2064個(gè)字節組成的數據塊排列成2443的矩陣,可以看成是由一個(gè)MSB字節組成的2443矩陣和由一個(gè)LSB字節組成的2443矩陣。
P校驗符號用(26,24)RS碼產(chǎn)生。43列的每一列24個(gè)字節數據再加24行和25行對應的列上2個(gè)字節的P校驗字節,構成列矢量Vp。這樣構成了2643的矩陣,并且滿(mǎn)足方程
增加P校驗后,得到了一個(gè)2643矩陣,該矩陣對角線(xiàn)元素重新排列得到一個(gè)新的2643矩陣,新矩陣的每行用(45,43)RS碼產(chǎn)生兩個(gè)Q校驗字節放到末端。設為VQ矢量,滿(mǎn)足以下方程
HQVQ=0
其中校驗矩陣為
RS碼錯誤糾正過(guò)程分三步:①計算校正子;②計算錯誤位置;③計算錯誤值。
傳統的ECC算法有迭代算法和大數邏輯譯碼算法,涉及到復雜的矩陣運算及較多的數學(xué)知識,而且程序實(shí)現也很復雜。具體到我們的實(shí)際情況,我們發(fā)現無(wú)論是(26,24)RS還是(45,43)RS,都只有兩字節的校驗位,完全可以通過(guò)直接解二元一次方程組解決,因此可采用比較簡(jiǎn)單的算法。
設校驗位為Q1和Q2,校正子計算如下(以(26,24)RS碼為例):
如果得到S0和S1不全為0,則可斷定數據有錯誤。如果只有個(gè)錯誤,設錯誤值為mx,錯誤位為a x,可通過(guò)解下述方程組求得錯誤位置和錯誤值。
注意:解方程過(guò)程中的加、減、乘、除運算都是在GF(2 8)域上進(jìn)行的,編程的時(shí)候必須對這些運算進(jìn)行特殊定義。
如果計算得到的S0=0,S1≠0,則基本上可斷定至少有兩個(gè)錯誤。出現多重錯誤時(shí),單獨的行內和列內的糾錯是無(wú)能為力的,但將陣列作為一個(gè)整體來(lái)考慮,有些多重錯誤還是可以糾正的。Reference Technology公司提供有一種名為L(cháng)ayered ECC的算法,可以取消多重錯誤,其核心思想是交替執行行糾錯和列糾錯。因為同一行的多重錯誤從列的角度看可能是該列的一個(gè)錯誤,可以先進(jìn)行該列的糾錯,然后再從行的角度看,可以變成單個(gè)的錯誤了,從而可以糾正過(guò)來(lái)。
(26,24)RS碼和(45,43)RS碼都可以糾正出現任何一行和任何一列上的一個(gè)錯誤,并能相當可靠的檢測出行、列中的多得錯誤。實(shí)際中出現個(gè)錯誤的概率是遠遠大于出現多個(gè)錯誤的概率的。因此,EDC碼字的檢錯能力是非常強大的。
4 CD-ROM格式解碼程序流程圖
本數據處理模塊主程序流程如圖5所示。通過(guò)檢測同步字從數據流中獲取完整的一幀數據,再通過(guò)扇區的第16個(gè)字節的頭信息獲取扇區模式,然后根據模式的不同,作不同的處理。如果是模式2,則可直接得到2336字節的用戶(hù)數據,有必要的話(huà)進(jìn)行CD-ROM/XA格式處理:若是扇區模式1,需進(jìn)行EDC檢錯處理,如果無(wú)錯,可取出2048字節的用戶(hù)數據;如果有錯,則進(jìn)行ECC糾錯處理:如果糾錯成功,則直接取出2048字節的用戶(hù)數據。如果錯誤太多,糾正不了,則報告錯誤信息。
對于CD-ROM/XA格式,可以根據基子模式(即模式2的形式)進(jìn)行相應的處理。對于形式2,進(jìn)行EDC檢錯,可得到2324字節的用戶(hù)數據;而對于形式1,可做類(lèi)似于模式1的處理,即進(jìn)行EDC檢錯和ECC糾錯后,得到2048字節的用戶(hù)數據。
當本程序模塊應用到具體的應用系統時(shí),將以系統子程序的形式出現。
結語(yǔ)
在嵌入式系統中,數據解碼的實(shí)現方法應該根據具體應用的特點(diǎn)和要求靈活選擇。本文介紹了通過(guò)軟件方式進(jìn)行CD-ROM格式解碼的實(shí)現方法,對使用CD-ROM的嵌入式系統,很好的應用價(jià)值。
評論