CD-ROM格式数据的软解码模块设计
[10-10 20:38:44] 来源:http://www.88dzw.com 电子制作 阅读:8119次
文章摘要:所以,模式1主要用于存储对错误非常敏感的数据,如计算机程序代码等数据;而模式2则主要用于存储对错误不敏感的数据,如图像、音响等类型的数据。在模式2的基础上,CD-ROM/XA格式又分为两种形式(FORM):形式1和形式2。其扇区结构如图3所示。我们常用的VCD就是采用CD-ROM/XA的形式2格式。由上可知,除了扇区模式2可以直接得到2336字节的用户数据外,CD-ROM格式解码还必须进行EDC检错和ECC纠错处理。下面分别介绍EDC检错和ECC纠错的原理和解码算法。2 CD-ROM扇区中的EDC检错原理及算法CD-ROM扇区采用32位CRC(循环冗余校验码)检错码,其生成多项式为P(X)=(
CD-ROM格式数据的软解码模块设计,标签:电子小制作,http://www.88dzw.com所以,模式1主要用于存储对错误非常敏感的数据,如计算机程序代码等数据;而模式2则主要用于存储对错误不敏感的数据,如图像、音响等类型的数据。
在模式2的基础上,CD-ROM/XA格式又分为两种形式(FORM):形式1和形式2。其扇区结构如图3所示。我们常用的VCD就是采用CD-ROM/XA的形式2格式。
由上可知,除了扇区模式2可以直接得到2336字节的用户数据外,CD-ROM格式解码还必须进行EDC检错和ECC纠错处理。下面分别介绍EDC检错和ECC纠错的原理和解码算法。
2 CD-ROM扇区中的EDC检错原理及算法
CD-ROM扇区采用32位CRC(循环冗余校验码)检错码,其生成多项式为
P(X)=(X 16+X 15+X 2+1)×(X 16+X 2+X+1)
对应的码字是0x18001801B。计算CRC码时用的数据块是从扇区的开头到用户数据区结束为止的数据字节。即将字节0~2063共2064字节的数据所对应的长多项式整除P(X),得到32位的余式,放在2064~2067字节位置。这2068字节的数据对应的多项式是能够被生成多项式P(X)整除的。如果不能整除,则表明数据有错。所以,我们的解码过程就将2068字节的数据组成的多项式来整除生成多项式,如果余式为0,则表明数据正确,否则数据有错。
但我们不可能直接进行长除法操作,因为计算机不可能将一个2068×8位的极其长的二进制数直接拿来做长除法。根据长除法的规律,以字节(8比特)为单位进行操作,每次除法将上一字节的所得的余数与本字节组合成新的数进行除法运算。除式是33位的,因此,每个字节的除法须把这个字节的数左移24位,跟上次的余式组合成一个32位的二进制数,来整除除式。主要实现现代码如下:
for(i=0;i<2068;i++)
crc=edc_crc_32(crc,data_in[i],M32);
其中,crc为余数,M32为生成多项式对应的二进制数。函数edc_crc_32(int crc,int ch,int mask)的实现代码为
char edc_crc_32(int crc,int int mask){
ch<<24;
for(int i=0;i<8;i++){
if(crc^ch)&0x80000000)
crc=(crc<<1)^mask;
else
crc<<=1;
ch<<=1;
}
return crc;
}
由以上代码可知,每个字节的求余要进行8次移位和8次异或运算,对于ch值相同的数据来说,这种运算是完全的重复;对于大量的CD-ROM数据来说,是对资源的一种很大的浪费。因此,为了提高效率,可以把256个8位二进制数对应的余式做成表,在程序运行之前先把表读入内存。通过查表的方式将极大的提高代码的效率。代码如下:
for(int i=0;i<2068;i++){
temp=data_in[i]^(crc>>24));
crc=(crc<<8)^crctable[temp];
}
这种方式除了数据表需要占用内存外,运算效率理论上可以提高8位。实际上是用较少的内存空间换取了效率的极大提高。这在嵌入式系统中是很有应用价值的。
《CD-ROM格式数据的软解码模块设计》相关文章
- › 使用CD-ROM时,屏幕提示“请将磁盘插入驱动器”
- › CD-ROM格式数据的软解码模块设计
- › 为什么CD-R可以超刻而DVD-R不能
- › CD-RW格式化时 提示"非法的请求0x8052000"
- › DVD光驱不能读取CD-R和CD-RW格式的光盘
- 在百度中搜索相关文章:CD-ROM格式数据的软解码模块设计
- 在谷歌中搜索相关文章:CD-ROM格式数据的软解码模块设计
- 在soso中搜索相关文章:CD-ROM格式数据的软解码模块设计
- 在搜狗中搜索相关文章:CD-ROM格式数据的软解码模块设计