<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 消費(fèi)電子 > 設(shè)計(jì)應(yīng)用 > CD-ROM格式數(shù)據(jù)的軟解碼模塊設(shè)計(jì)

          CD-ROM格式數(shù)據(jù)的軟解碼模塊設(shè)計(jì)

          作者: 時(shí)間:2004-12-11 來源:網(wǎng)絡(luò) 收藏
          摘要:介紹應(yīng)用于嵌入式系統(tǒng)的方法;分析結(jié)構(gòu),給出EDC及ECC算法的軟件實(shí)現(xiàn)方法以及該的軟件流程圖。

          關(guān)鍵詞: EDC檢錯(cuò) ECC糾錯(cuò)

          引言

          CD-ROM是目前應(yīng)用非常廣泛的大容量、低成本的存儲(chǔ)設(shè)備。為了減小誤碼率,原始經(jīng)過格式化編碼和信道編碼后,才寫入CD-ROM盤片中;在讀取時(shí),則需經(jīng)過信道解碼和格式化解碼后才能得到所需的原始數(shù)據(jù)。CD-ROM數(shù)據(jù)的讀寫過程如圖1所示。

          在一般的音像設(shè)備(如VCD機(jī))和個(gè)人電腦中,CD-ROM數(shù)據(jù)的解碼過程是由專用解碼芯片來完成的;而CD-ROM不但可以應(yīng)用在音像設(shè)備和個(gè)人電腦中,還可以應(yīng)用到需要讀取大量數(shù)據(jù)的嵌入式系統(tǒng)中。比如在車輛導(dǎo)般系統(tǒng)中,就可使用CD-ROM存放地理信息數(shù)據(jù)。嵌入式系統(tǒng)中的CD-ROM數(shù)據(jù)的解碼方法比較靈活,可以使用專用解碼芯片(暫稱硬解碼),也可以通過處理器的解碼程序來完成(軟解碼)。相對于硬解碼來說,軟解碼有其獨(dú)特的優(yōu)點(diǎn)所在。因?yàn)樗恍柙黾右粋€(gè)解碼程序,就省掉了專用解碼芯片電路,簡化了系統(tǒng)的硬件電路,降低了系統(tǒng)的成本。如圖1所示,CD-ROM數(shù)據(jù)經(jīng)過信道解碼后,得到的是以扇區(qū)結(jié)構(gòu)組織的CD-ROM格式數(shù)據(jù),還需進(jìn)行CD-ROM格式化解碼才能得到最終的用戶數(shù)據(jù)。本文介紹的就是嵌入式系統(tǒng)中CD-ROM格式數(shù)據(jù)軟解碼模塊的。

          1 CD-ROM格式數(shù)據(jù)的扇區(qū)結(jié)構(gòu)

          CD-ROM數(shù)據(jù)是以扇區(qū)為基本單元進(jìn)行編碼處理的。經(jīng)過信道解碼處理后得到的扇區(qū)對于不同的數(shù)據(jù)來源,其結(jié)構(gòu)是不同的。對于CD-DA(雙聲道的CD音頻)數(shù)據(jù),由于沒有經(jīng)過格式化編碼,可以直接得到用戶數(shù)據(jù);而CD-ROM數(shù)據(jù)和VCD數(shù)據(jù)都經(jīng)過CD-ROM格式化編碼成扇區(qū)結(jié)構(gòu),必須經(jīng)CD-ROM格式化解碼才能得到用戶數(shù)據(jù)。

          CD-ROM扇區(qū)有兩種模式:模式1和模式2。其扇區(qū)結(jié)構(gòu)如圖2所示。

          由圖2可知,一個(gè)扇區(qū)的CD-ROM格式數(shù)據(jù)總共有2352字節(jié)。其中,兩種扇區(qū)模式都有12字節(jié)的同步信息和4字節(jié)的時(shí)間信息(頭信息)。如果是模式1,還有4字節(jié)的循環(huán)冗檢錯(cuò)碼,8字節(jié)空字節(jié),276字節(jié)的糾錯(cuò)碼,其中包含172字節(jié)的P校驗(yàn)字和104字節(jié)的Q校驗(yàn)字,用戶數(shù)據(jù)只有2048字節(jié)。如果是模式2,除了同步信息和頭信息外,余下的2336字節(jié)全部都是用戶數(shù)據(jù)。

          實(shí)際中,由于盤的制作材料的性能、盤制造生產(chǎn)技術(shù)水平的限制、驅(qū)動(dòng)器的性能以及使用不當(dāng)?shù)戎T多原因,從盤上讀出的數(shù)據(jù)不可能完全正確。據(jù)統(tǒng)計(jì),一片未使用過的只讀光盤,原始誤碼率約為310 -4,沾有指紋的盤約為610 -4,有傷痕的盤約為510 -3。針對這種情況,光盤存儲(chǔ)系統(tǒng)采用了功能強(qiáng)大的錯(cuò)誤檢測和糾正措施:CIRC、EDC、ECC。數(shù)據(jù)經(jīng)信道解碼后,由于采用CIRC糾錯(cuò)處理,誤碼率由10 -4~10 -5降到10 -9以下。對于音頻和圖像數(shù)據(jù)來說,這樣的誤碼率已經(jīng)足夠。但要用到計(jì)算機(jī)文件數(shù)據(jù),必須要求誤碼率為10 -12以下,因此必須采用二次糾錯(cuò)處理。通過EDC和ECC校驗(yàn),可以達(dá)到這個(gè)要求。

          所以,模式1主要用于存儲(chǔ)對錯(cuò)誤非常敏感的數(shù)據(jù),如計(jì)算機(jī)程序代碼等數(shù)據(jù);而模式2則主要用于存儲(chǔ)對錯(cuò)誤不敏感的數(shù)據(jù),如圖像、音響等類型的數(shù)據(jù)。

          在模式2的基礎(chǔ)上,CD-ROM/XA格式又分為兩種形式(FORM):形式1和形式2。其扇區(qū)結(jié)構(gòu)如圖3所示。我們常用的VCD就是采用CD-ROM/XA的形式2格式。

          由上可知,除了扇區(qū)模式2可以直接得到2336字節(jié)的用戶數(shù)據(jù)外,CD-ROM格式解碼還必須進(jìn)行EDC檢錯(cuò)和ECC糾錯(cuò)處理。下面分別介紹EDC檢錯(cuò)和ECC糾錯(cuò)的原理和解碼算法。

          2 CD-ROM扇區(qū)中的EDC檢錯(cuò)原理及算法

          CD-ROM扇區(qū)采用32位CRC(循環(huán)冗余校驗(yàn)碼)檢錯(cuò)碼,其生成多項(xiàng)式為

          P(X)=(X 16+X 15+X 2+1)(X 16+X 2+X+1)

          對應(yīng)的碼字是0x18001801B。計(jì)算CRC碼時(shí)用的數(shù)據(jù)塊是從扇區(qū)的開頭到用戶數(shù)據(jù)區(qū)結(jié)束為止的數(shù)據(jù)字節(jié)。即將字節(jié)0~2063共2064字節(jié)的數(shù)據(jù)所對應(yīng)的長多項(xiàng)式整除P(X),得到32位的余式,放在2064~2067字節(jié)位置。這2068字節(jié)的數(shù)據(jù)對應(yīng)的多項(xiàng)式是能夠被生成多項(xiàng)式P(X)整除的。如果不能整除,則表明數(shù)據(jù)有錯(cuò)。所以,我們的解碼過程就將2068字節(jié)的數(shù)據(jù)組成的多項(xiàng)式來整除生成多項(xiàng)式,如果余式為0,則表明數(shù)據(jù)正確,否則數(shù)據(jù)有錯(cuò)。

          但我們不可能直接進(jìn)行長除法操作,因?yàn)橛?jì)算機(jī)不可能將一個(gè)20688位的極其長的二進(jìn)制數(shù)直接拿來做長除法。根據(jù)長除法的規(guī)律,以字節(jié)(8比特)為單位進(jìn)行操作,每次除法將上一字節(jié)的所得的余數(shù)與本字節(jié)組合成新的數(shù)進(jìn)行除法運(yùn)算。除式是33位的,因此,每個(gè)字節(jié)的除法須把這個(gè)字節(jié)的數(shù)左移24位,跟上次的余式組合成一個(gè)32位的二進(jìn)制數(shù),來整除除式。主要實(shí)現(xiàn)現(xiàn)代碼如下:

          for(i=0;i2068;i++)

          crc=edc_crc_32(crc,data_in[i],M32);

          其中,crc為余數(shù),M32為生成多項(xiàng)式對應(yīng)的二進(jìn)制數(shù)。函數(shù)edc_crc_32(int crc,int ch,int mask)的實(shí)現(xiàn)代碼為

          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è)字節(jié)的求余要進(jìn)行8次移位和8次異或運(yùn)算,對于ch值相同的數(shù)據(jù)來說,這種運(yùn)算是完全的重復(fù);對于大量的CD-ROM數(shù)據(jù)來說,是對資源的一種很大的浪費(fèi)。因此,為了提高效率,可以把256個(gè)8位二進(jìn)制數(shù)對應(yīng)的余式做成表,在程序運(yùn)行之前先把表讀入內(nèi)存。通過查表的方式將極大的提高代碼的效率。代碼如下:

          for(int i=0;i2068;i++){

          temp=data_in[i]^(crc>>24));

          crc=(crc8)^crctable[temp];

          }

          這種方式除了數(shù)據(jù)表需要占用內(nèi)存外,運(yùn)算效率理論上可以提高8位。實(shí)際上是用較少的內(nèi)存空間換取了效率的極大提高。這在嵌入式系統(tǒng)中是很有應(yīng)用價(jià)值的。

          3 CD-ROM扇區(qū)中的ECC糾錯(cuò)原理及算法

          CD-ROM扇區(qū)中的ECC碼,按ISO/IEC10149的規(guī)范,采用GF(2 8)域上的RSPC碼產(chǎn)生172字節(jié)的P校驗(yàn)符合和104字節(jié)的Q校驗(yàn)符號(hào)。RS碼采用本原多項(xiàng)式

          P(x)=x 8+x 4+x 3+x 2+1

          和本原元

          α=(0 0 0 0 0 0 1 0)

          構(gòu)造GF(2 8)中的256個(gè)元素。

          P校驗(yàn)和Q校驗(yàn)字的生成方法如圖4所示。每個(gè)扇區(qū)中,字節(jié)12~2075和ECC域中的字節(jié)2076~2351共2340個(gè)字節(jié),組成1170個(gè)字(word)。每個(gè)字S由兩個(gè)字節(jié)B組成,分別為最高有效位字節(jié)MSB和最低有效位字節(jié)LSB。第n個(gè)字由個(gè)面的字節(jié)組成:

          S(n)=MSB[B(2n+13)]+LSB[B(2n+12)]

          其中n=0,1,2,…,1169。

          從字節(jié)12到2075共2064個(gè)字節(jié)組成的數(shù)據(jù)塊排列成2443的矩陣,可以看成是由一個(gè)MSB字節(jié)組成的2443矩陣和由一個(gè)LSB字節(jié)組成的2443矩陣。

          P校驗(yàn)符號(hào)用(26,24)RS碼產(chǎn)生。43列的每一列24個(gè)字節(jié)數(shù)據(jù)再加24行和25行對應(yīng)的列上2個(gè)字節(jié)的P校驗(yàn)字節(jié),構(gòu)成列矢量Vp。這樣構(gòu)成了2643的矩陣,并且滿足方程

          增加P校驗(yàn)后,得到了一個(gè)2643矩陣,該矩陣對角線元素重新排列得到一個(gè)新的2643矩陣,新矩陣的每行用(45,43)RS碼產(chǎn)生兩個(gè)Q校驗(yàn)字節(jié)放到末端。設(shè)為VQ矢量,滿足以下方程

          HQVQ=0

          其中校驗(yàn)矩陣為

          RS碼錯(cuò)誤糾正過程分三步:①計(jì)算校正子;②計(jì)算錯(cuò)誤位置;③計(jì)算錯(cuò)誤值。

          傳統(tǒng)的ECC算法有迭代算法和大數(shù)邏輯譯碼算法,涉及到復(fù)雜的矩陣運(yùn)算及較多的數(shù)學(xué)知識(shí),而且程序?qū)崿F(xiàn)也很復(fù)雜。具體到我們的實(shí)際情況,我們發(fā)現(xiàn)無論是(26,24)RS還是(45,43)RS,都只有兩字節(jié)的校驗(yàn)位,完全可以通過直接解二元一次方程組解決,因此可采用比較簡單的算法。

          設(shè)校驗(yàn)位為Q1和Q2,校正子計(jì)算如下(以(26,24)RS碼為例):

          如果得到S0和S1不全為0,則可斷定數(shù)據(jù)有錯(cuò)誤。如果只有個(gè)錯(cuò)誤,設(shè)錯(cuò)誤值為mx,錯(cuò)誤位為a x,可通過解下述方程組求得錯(cuò)誤位置和錯(cuò)誤值。

          注意:解方程過程中的加、減、乘、除運(yùn)算都是在GF(2 8)域上進(jìn)行的,編程的時(shí)候必須對這些運(yùn)算進(jìn)行特殊定義。

          如果計(jì)算得到的S0=0,S1≠0,則基本上可斷定至少有兩個(gè)錯(cuò)誤。出現(xiàn)多重錯(cuò)誤時(shí),單獨(dú)的行內(nèi)和列內(nèi)的糾錯(cuò)是無能為力的,但將陣列作為一個(gè)整體來考慮,有些多重錯(cuò)誤還是可以糾正的。Reference Technology公司提供有一種名為Layered ECC的算法,可以取消多重錯(cuò)誤,其核心思想是交替執(zhí)行行糾錯(cuò)和列糾錯(cuò)。因?yàn)橥恍械亩嘀劐e(cuò)誤從列的角度看可能是該列的一個(gè)錯(cuò)誤,可以先進(jìn)行該列的糾錯(cuò),然后再從行的角度看,可以變成單個(gè)的錯(cuò)誤了,從而可以糾正過來。

          (26,24)RS碼和(45,43)RS碼都可以糾正出現(xiàn)任何一行和任何一列上的一個(gè)錯(cuò)誤,并能相當(dāng)可靠的檢測出行、列中的多得錯(cuò)誤。實(shí)際中出現(xiàn)個(gè)錯(cuò)誤的概率是遠(yuǎn)遠(yuǎn)大于出現(xiàn)多個(gè)錯(cuò)誤的概率的。因此,EDC碼字的檢錯(cuò)能力是非常強(qiáng)大的。

          4 CD-ROM格式解碼程序流程圖

          本數(shù)據(jù)處理模塊主程序流程如圖5所示。通過檢測同步字從數(shù)據(jù)流中獲取完整的一幀數(shù)據(jù),再通過扇區(qū)的第16個(gè)字節(jié)的頭信息獲取扇區(qū)模式,然后根據(jù)模式的不同,作不同的處理。如果是模式2,則可直接得到2336字節(jié)的用戶數(shù)據(jù),有必要的話進(jìn)行CD-ROM/XA格式處理:若是扇區(qū)模式1,需進(jìn)行EDC檢錯(cuò)處理,如果無錯(cuò),可取出2048字節(jié)的用戶數(shù)據(jù);如果有錯(cuò),則進(jìn)行ECC糾錯(cuò)處理:如果糾錯(cuò)成功,則直接取出2048字節(jié)的用戶數(shù)據(jù)。如果錯(cuò)誤太多,糾正不了,則報(bào)告錯(cuò)誤信息。

          對于CD-ROM/XA格式,可以根據(jù)基子模式(即模式2的形式)進(jìn)行相應(yīng)的處理。對于形式2,進(jìn)行EDC檢錯(cuò),可得到2324字節(jié)的用戶數(shù)據(jù);而對于形式1,可做類似于模式1的處理,即進(jìn)行EDC檢錯(cuò)和ECC糾錯(cuò)后,得到2048字節(jié)的用戶數(shù)據(jù)。

          當(dāng)本程序模塊應(yīng)用到具體的應(yīng)用系統(tǒng)時(shí),將以系統(tǒng)子程序的形式出現(xiàn)。

          結(jié)語

          在嵌入式系統(tǒng)中,數(shù)據(jù)解碼的實(shí)現(xiàn)方法應(yīng)該根據(jù)具體應(yīng)用的特點(diǎn)和要求靈活選擇。本文介紹了通過軟件方式進(jìn)行CD-ROM格式解碼的實(shí)現(xiàn)方法,對使用CD-ROM的嵌入式系統(tǒng),很好的應(yīng)用價(jià)值。



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();