CD-ROM格式数据的软解码模块设计
f(crc^ch)&0x80000000)
crc=(crc<<1)^mask;
else
crc<<=1;
ch<<=1;
}
returncrc;
}
由以上代码可知,每个字节的求余要进行8次移位和8次异或运算,对于ch值相同的数据来说,这种运算是完全的重复;对于大量的CD-ROM数据来说,是对资源的一种很大的浪费。因此,为了提高效率,可以把256个8位二进制数对应的余式做成表,在程序运行之前先把表读入内存。通过查表的方式将极大的提高代码的效率。代码如下:
for(inti=0;i<2068;i++){
temp=data_in[i]^(crc>>24));
crc=(crc<<8)^crctable[temp];
}
这种方式除了数据表需要占用内存外,运算效率理论上可以提高8位。实际上是用较少的内存空间换取了效率的极大提高。这在嵌入式系统中是很有应用价值的。
3CD-ROM扇区中的ECC纠错原理及算法
CD-ROM扇区中的ECC码,按ISO/IEC10149的规范,采用GF(28)域上的RSPC码产生172字节的P校验符合和104字节的Q校验符号。RS码采用本原多项式
P(x)=x8+x4+x3+x2+1
和本原元
α=(00000010)
构造GF(28)中的256个元素。
P校验和Q校验字的生成方法如图4所示。每个扇区中,字节12~2075和ECC域中的字节2076~2351共2340个字节,组成1170个字(word)。每个字S由两个字节B组成,分别为最高有效位字节MSB和最低有效位字节LSB。第n个字由个面的字节组成:
S(n)=MSB[B(2n+13)]+LSB[B(2n+12)]
其中n=0,1,2,…,1169。
从字节12到2075共2064个字节组成的数据块排列成24×43的矩阵,可以看成是由一个MSB字节组成的24×43矩阵和由一个LSB字节组成的24×43矩阵。
P校验符号用(26,24)RS码产生。43列的每一列24个字节数据再加24行和25行对应的列上2个字节的P校验字节,构成列矢量Vp。这样构成了26×43的矩阵,并且满足方程
增加P校验后,得到了一个26×43矩阵,该矩阵对角线元素重新排列得到一个新的26×43矩阵,新矩阵的每行用(45,43)RS码产生两个Q校验字节放到末端。设为VQ矢量,满足以下方程
HQ×VQ=0
其中校验矩阵为
RS码错误纠正过程分三步:①计算校正子;②计算错误位置;③计算错误值。
传统的ECC算法有迭代算法和大数逻辑译码算法,涉及到复杂的矩阵运算及较多的数学知识,而且程序实现也很复杂。具体到我们的实际情况,我们发现无论是(26,24)RS还是(45,43)RS,都只有两字节的校验位,完全可以通过直接解二元一次方程组解决,因此可采用比较简单的算法。
设校验位为Q1和Q2,校正子计算如下(以(26,24)RS码为例):
如果得到S0和S1不全为0,则可断定数据有错误。如果只有个错误,设错误值为mx,错误位为ax,可通过解下述方程组求得错误位置和错误值。
注意:解方程过程中的加、减、乘、除运算都是在GF(28)域上进行的,编程的时候必须对这些运算进行特殊定义。
如果计算得到的S0=0,S1≠0,则基本上可断定至少有两个错误。出现多重错误时,单独的行内和列内的纠错是无能为力的,但将阵列作为一个整体来考虑,有些多重错误还是可以纠正的。ReferenceTechnology公司提供有一种名为LayeredECC的算法,可以取消多重错误,其核心思想是交替执行行纠错和列纠错。因为同一行的多重错误从列的角度看可能是该列的一个错误,可以先进行该列的纠错,然后再从行的角度看,可以变成单个的错误了,从而可以纠正过来。
(26,24)RS码和(45,43)RS码都可以纠正出现任何一行和任何一列上的一个错误,并能相当可靠的检测出行、列中的多得错误。实际中出现个错误的概率是远远大于出现多个错误的概率的。因此,EDC码字的检错能力是非常强大的。
4CD-ROM格式解码程序流程图
本数据处理模块主程序流程如图5所示。通过检测同步字从数据流中获取完整的一帧数据,再通过扇区的第16个字节的头信息获取扇区模式,然后根据模式的不同,作不同的处理。如果是模式2,则可直接得到2336字节的用户数据,有必要的话进行CD-ROM/XA格式处理:若是扇区模式1,需进行EDC检错处理,如果无错,可取出2048字节的用户数据;如果有错,则进行ECC纠错处理:如果纠错成功,则直接取出2048字节的用户数据。如果错误太多,纠正不了,则报告错误信息。
对于CD-ROM/XA格式,可以根据基子模式(即模式2的形式)进行相应的处理。对于形式2,进行EDC检错,可得到2324字节的用户数据;而对于形式1,可做类似 《CD-ROM格式数据的软解码模块设计(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/173503.html
crc=(crc<<1)^mask;
else
crc<<=1;
ch<<=1;
}
returncrc;
}
由以上代码可知,每个字节的求余要进行8次移位和8次异或运算,对于ch值相同的数据来说,这种运算是完全的重复;对于大量的CD-ROM数据来说,是对资源的一种很大的浪费。因此,为了提高效率,可以把256个8位二进制数对应的余式做成表,在程序运行之前先把表读入内存。通过查表的方式将极大的提高代码的效率。代码如下:
for(inti=0;i<2068;i++){
temp=data_in[i]^(crc>>24));
crc=(crc<<8)^crctable[temp];
}
这种方式除了数据表需要占用内存外,运算效率理论上可以提高8位。实际上是用较少的内存空间换取了效率的极大提高。这在嵌入式系统中是很有应用价值的。
3CD-ROM扇区中的ECC纠错原理及算法
CD-ROM扇区中的ECC码,按ISO/IEC10149的规范,采用GF(28)域上的RSPC码产生172字节的P校验符合和104字节的Q校验符号。RS码采用本原多项式
P(x)=x8+x4+x3+x2+1
和本原元
α=(00000010)
构造GF(28)中的256个元素。
P校验和Q校验字的生成方法如图4所示。每个扇区中,字节12~2075和ECC域中的字节2076~2351共2340个字节,组成1170个字(word)。每个字S由两个字节B组成,分别为最高有效位字节MSB和最低有效位字节LSB。第n个字由个面的字节组成:
S(n)=MSB[B(2n+13)]+LSB[B(2n+12)]
其中n=0,1,2,…,1169。
从字节12到2075共2064个字节组成的数据块排列成24×43的矩阵,可以看成是由一个MSB字节组成的24×43矩阵和由一个LSB字节组成的24×43矩阵。
P校验符号用(26,24)RS码产生。43列的每一列24个字节数据再加24行和25行对应的列上2个字节的P校验字节,构成列矢量Vp。这样构成了26×43的矩阵,并且满足方程
增加P校验后,得到了一个26×43矩阵,该矩阵对角线元素重新排列得到一个新的26×43矩阵,新矩阵的每行用(45,43)RS码产生两个Q校验字节放到末端。设为VQ矢量,满足以下方程
HQ×VQ=0
其中校验矩阵为
RS码错误纠正过程分三步:①计算校正子;②计算错误位置;③计算错误值。
传统的ECC算法有迭代算法和大数逻辑译码算法,涉及到复杂的矩阵运算及较多的数学知识,而且程序实现也很复杂。具体到我们的实际情况,我们发现无论是(26,24)RS还是(45,43)RS,都只有两字节的校验位,完全可以通过直接解二元一次方程组解决,因此可采用比较简单的算法。
设校验位为Q1和Q2,校正子计算如下(以(26,24)RS码为例):
如果得到S0和S1不全为0,则可断定数据有错误。如果只有个错误,设错误值为mx,错误位为ax,可通过解下述方程组求得错误位置和错误值。
注意:解方程过程中的加、减、乘、除运算都是在GF(28)域上进行的,编程的时候必须对这些运算进行特殊定义。
如果计算得到的S0=0,S1≠0,则基本上可断定至少有两个错误。出现多重错误时,单独的行内和列内的纠错是无能为力的,但将阵列作为一个整体来考虑,有些多重错误还是可以纠正的。ReferenceTechnology公司提供有一种名为LayeredECC的算法,可以取消多重错误,其核心思想是交替执行行纠错和列纠错。因为同一行的多重错误从列的角度看可能是该列的一个错误,可以先进行该列的纠错,然后再从行的角度看,可以变成单个的错误了,从而可以纠正过来。
(26,24)RS码和(45,43)RS码都可以纠正出现任何一行和任何一列上的一个错误,并能相当可靠的检测出行、列中的多得错误。实际中出现个错误的概率是远远大于出现多个错误的概率的。因此,EDC码字的检错能力是非常强大的。
4CD-ROM格式解码程序流程图
本数据处理模块主程序流程如图5所示。通过检测同步字从数据流中获取完整的一帧数据,再通过扇区的第16个字节的头信息获取扇区模式,然后根据模式的不同,作不同的处理。如果是模式2,则可直接得到2336字节的用户数据,有必要的话进行CD-ROM/XA格式处理:若是扇区模式1,需进行EDC检错处理,如果无错,可取出2048字节的用户数据;如果有错,则进行ECC纠错处理:如果纠错成功,则直接取出2048字节的用户数据。如果错误太多,纠正不了,则报告错误信息。
对于CD-ROM/XA格式,可以根据基子模式(即模式2的形式)进行相应的处理。对于形式2,进行EDC检错,可得到2324字节的用户数据;而对于形式1,可做类似 《CD-ROM格式数据的软解码模块设计(第2页)》