参考本文:https://www.digikey.com/eewiki/display/microcontroller/CRC+基础
多项式密钥是CRC的重要组成部分。密钥不仅仅是随机多项式;它们是使用一组数学公式生成的,并且旨在增加CRC过程识别的错误数量。多项式通常由网络协议或外部设备定义。由于存在一组完善的可用密钥,因此此处不讨论定义密钥的过程。
我了解如何用给定的多项式密钥计算CRC,然而,如何生成多项式密钥,并确保它可以在给定的协议集中捕获尽可能多的错误?
我认为多项式密钥与有关
- 数据长度
- 数据速度
- 其他人
关于使用数学公式生成CRC多项式的部分有些误导。CRC多项式中的1比特的数量是该多项式的最大可能汉明距离(HD(,并且通常实际汉明距离将更小,这取决于数据长度。最大的比特误差检测是汉明距离-1。
通常,检测较高比特数的CRC多项式是多个素数多项式的乘积。例如,对于可以检测数据+CRC长度=1024位的多达7个错误的32位CRC,33位CRC多项式0x1f1922815=0x787*0x557*0x465*0x3*0x3。0x3因子将检测任何奇数个比特错误,因此CRC需要检测1024比特中所有可能的6比特错误。
我不知道确定最大比特错误检测的公式,通常会进行一些优化的蛮力搜索。例如,假设正在检查32位CRC多项式以查看其是否能够检测到1024位的数据+CRC长度的所有6位错误,则1024位中可能的6位错误模式的数目为comb(1024,6(=1577953087760896。为了将其减少到合理的程度,使用可能的3位错误的数量comb(1024,3(=178433024来创建一个大表,每个条目都包含CRC和3位索引。该表被排序,然后用于检查冲突,其中3位模式的CRC与不同的3位模式相同。还需要检查4位模式的故障(检查两个不同的2位模式之间的冲突(。
通常,随着数据长度变小,保证检测到的错误比特的最大数量增加。这里有一个链接到一组CRC多项式及其错误检测能力。
https://users.ece.cmu.edu/~koopman/ccrc/crc32.html
注释页面解释了表格条目:
http://users.ece.cmu.edu/~koopman/crc/notes.html