计算机组成原理:循环冗余校验码CRC具备“一位纠错”功能的思考与探索

笔者在阅读华中科技大学谭志虎老师主编的《计算机组成原理(微课版)》教材进行复习时,产生了一个疑问,并针对性地进行了一些思考。欢迎广大复习到这里同样有问题的同学(寒假开学接着考试实在有点汗,谁愿意寒假学习啊)&&CSDN博友针对我的疑问或想法进行批评讨论。

在编写本篇文章前,我参考了博主黎猫大侠的博客,链接放在下面。一道题带你搞懂CRC循环冗余校验是如何纠错的, 体会CRC的奇妙之处, 献给充满好奇心的你._黎猫大侠的博客-CSDN博客_crc纠错

这位博主的文章给我启发很大,感谢大虾0w0。但我在读完后仍然有一些问题。下面大概说一下我的想法:

作为循环冗余校验码,CRC的检错性能是大家有目共睹的。只要我们拿着带CRC码的信息去模2除以生成多项式,得到的余数不为0,我们便晓得是有错误出现了。

如果想要更加具体一点,知道哪位/哪几位错了,我们可以提前做一些计算工作,然后去查生成多项式对应的余数表格(类似于下图这种,实际应用中应该也能提前算出来)。如果数据信息比较短、选择的生成多项式比较好,比如(7,3)码的一些生成多项式,我们就可以利用提前搞出来的表格,顺利区分一位错和两位错,并在没有3位错的前提下检查出两位错和纠正一位错。

但是:对于CRC一位纠错性能的介绍,课本上语焉不详,只是说“可以利用CRC的编码特性设计组合逻辑电路来进行纠错”(“编码特性”是CRC的循环特性,也即:将余数左移一位除以生成多项式,得到下一个余数,再左移做除法得余数,重复这般操作,最后余数会循环变回自己。这一点在前文提及的博客里说得很详细,如果不知道可以跳转先去看看);网络上我搜集了一些资料,也只有前文博客在承认具有纠错功能的基础上讲述得比较详细(或许是我的信息检索能力比较差吧)。不过,基于前文博客的内容,我产生了一个疑惑,这里放一段博客里的话:

做个类比。假若我面对的是一个约定好的、稍微有些冷门的生成多项式,计算机咋就知道第一位出错的余数是啥(即上面情况中的101)?如果说,我已经在计算机里存储好了(或者手边就有)前文说的那种余数表,那我大可不必大费周章再来搞什么循环计算,直接查一下对应过去就完事了;如果我没有存这种余数表,那我还啥也不知道呢,(包括第一位出错的余数),我怎么就能晓得第一位出错的余数究竟是循环过程中的哪个呢?

(当然,现在看来思考这个问题的意义好像不大,因为没必要用冷门的生成多项式去实现一些功能,且CRC好像主要还是用来检错而不是纠错的)(之所以想这些才不是因为有一道作业题我写的答案很逆天,被分数gank了,尝试给自己找个台阶下呢QAQ)

我对这个问题的考虑是这样的:

先对一些定义或约定进行说明:

将原信息用一个信息多项式M(x)表示,其中Ci序列就是原来的数据信息,可以取0/1。

M(x)=C_{k-1}x^{k-1}+C_{k-2}x^{k-2}+...+C_{1}x+C_0

将M(x)左移r位,表示成M(x)*2^r,这样就能在右侧空出r位放产生的CRC校验码。

M(x)*2^r按照 模2运算规则 除以 生成多项式G(x) ,得到的余数R(x)就是待填入的CRC校验码。

(注意:模2运算规则下加运算和减运算效果相同)

也就是说,最后得到的含CRC校验码的信息应该是: M(1)|R(1)  (“|”表示把他俩连接起来)

我们有等式: (重要)

M(x)*2^r+R(x)=Q(x)G(x)                    ①

说一个猜想:这个例子中第一位错的时候余数是101;k=4,r=3,G(x)=1011。那么有没有这样一种可能,第一位错的余数与k、r、G(x)的取值直接相关,所以我们可以直接算出当前CRC约定下的第一位错的余数而不用拐着弯的去算余数表,并为后续利用循环特性完成的计算提供数据基础?(后面的证明如果有反例或者逻辑错误请速速联系我,主打一个光速耻辱删帖好吧 

道理还是比较简单的,就是写起来和表达起来有点繁琐。对于只有第一位出错而言,他只影响最高的信息位。记影响前M(x)的定义与前文相同,影响后M'(x)的定义为:M'(x)=C_{k-1}^{ '}x^{k-1}+C_{k-2}x^{k-2}+...+C_1x+C_0

显然,C'_{k-1}C_{k-1}的值 可以且仅可以 为1/0和0/1两种组合情况。而在模2运算下,加运算和减运算等效,因此我们有:M'(x)-M(x)=x^{k-1}      ②

由等式①和等式②,我们作出如下叙述:(键盘敲太麻烦,写起来 2^{***} 跟 x^{***} 又写得挺混乱的,但意思应该能到吧,求谅解T T) (“?”就指代例子中我们在此处研究的“101”)

总结一下:

设第一位出错时的余数为'?',那么它的计算方法是: ? = 2^{r+k-1} modG(x)

这样,我们在拿到CRC生成的规则后,就可以找到一种行之有效的方法迅速推理出第一位出错时的余数是啥,而且是当前约定好的CRC生成规则(k、r、G(x)的取值固定)下“放之四海而皆准”的余数。一切问题也就迎刃而解。剩下的,如果想搞余数表,整个水落石出、明明白白,那就放手去做吧,搞余数表或者查现成的表;如果想好好体验一把“CRC循环特性”(雾),就可以祭出黎猫大侠的方法,体验就完事了。(虽然我感觉这种体验其实并不好,打表才是yyds)

因为我还没学完(平时没听课,悲),所以上面的内容仅代表个人观点。希望上文对您有帮助!如果有纰漏疏忽的地方,敬请批评指正!如果有没讲明白的地方,欢迎评论留言!如果马上就要组原考试的话,祝你(也祝我)考个好成绩!另外,复习考试不要像我这个joker一样,对着一个不是考点的东西看起来没完,快要自学不完了(又悲)...
 

2023-5-6:来还愿,组原考试没有寄穿,反而成了一众科目里面发挥还不戳的一门。
祝大家学习组原的道路也一帆风顺捏!QWQ(当然不顺也没事,最后弄懂了就行=w=)

  • 20
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值