纠错码介绍
引入
现代人们在生活中的通信方式是多种多样的,如打电话、传送电子邮件以及宇宙飞船将金星图片传回地球等. 虽然它们的形式不同,但是它们的数学模型可以表示成以下最简单的形式:
发方把信息 通过信道传给收方. 在有线电话系统中, 电话线就是传输信息的信道. 在唐诗 “烽火连三月,家书抵万金”中, 烽火台燃起的烽火和邮差(驿站)分别是传递敌人入侵消息和寄送家书的信道.
通常信息被编码为字符串或数字串发出,事实上,通信中使用最多的是二元域 , 来编码信息.现在假设要传递 8 个信息 {赵, 钱, 孙, 李, 周, 吴, 郑, 王}。如果每位数字取自二元域 中的 0 或 1 , 可以用长为 3 的 8 个向量来表示它们:
设想把 “钱 ”传出, 如果信道中出错, 如第二位的 0 变成 1 , 收方收到了 . 这时收方对于出错毫无所知, 因为收方可认为没有出错, 即发来的是 李, 也有可能是第 1 位出错, 即发来的是 孙, 如此等等. 总之, 这种传输方式完全没有检查和纠正错误的能力.其主要原因是收方收到的任何向量 都是有意义的, 从而收方没有任何判别能力.
如何设计有检查和纠正错误能力的通信系统?
例 1 (奇偶校验码) 前面把 “赵、钱、孙、李、周、吴、郑、王” 8 个信息编成 3 位的向量.现在把每个向量后面增加 1 位,变成 4 位的向量, 使得其中 1 的个数是偶数. 例如, “钱”为 (100), 后面加上 1 成为 (1001), 而 “李” 为 (110), 后面加上 0 成为 (1100). 这样一来,8 个姓分别重新编成 :
于是, 长为 4 的二元向量共有 个, 其中, 1 的个数为偶数的向量占一半, 是有意义的信息, 而另一半 (即 1 的个数为奇数的 8 个向量 (1000), (0100), , , (0111)) 是没有意义的, 不代表任何信息.
现在如果有 1 位发生错误, 如李 的第 2 位出错, 则收方得到 , 其中, 1 的个数为奇数, 它没有意义,于是收方可以断定信道发生了错误. 所以这种编码方式可以检查任何一位出错. 但是收方并不能判定错在哪一位, 因为赵 的第 1 位出错也可以收到 (1000). 所以收方不能纠正任何 1 位的错误. 类似地可以看出,对于这种编码方式, 收方不能检查 2 位出错, 如赵 和钱 只有首末两位不同,赵 的首末两位出错就错成钱 .
例 2 (重复码) 将表示 8 个姓的 3 位向量都重复 3 次,成为:
这就好像是军舰上旗手打旗语时重复 3 次,或者电话中有杂音时, 每句话都重复说 3 次. 这时, 每个姓的编码都是相同的 3 段(每段 3 位).对于不同的姓,在一段中至少有 1 位不同,所以 3 段中至少有 3 位不同. 也就是说, 不同姓的 9 位向量中, 至少有 3 位不同, 所以若一个姓 (如 ) 的 9 位中有 1 位或 2 位出错 (如前两位出错, 收到 (010100100)), 收到向量不会是有意义的, 从而收方发现出错. 这表明, 这种编码方式可以检查出 1 位或 2 位错误. 但是出 3 位错误则不一定能检查出来, 如钱 出 3 位错可能变成赵 (000000000). 进而,这种编码方式可以纠正 1 位错误. 例如, 钱 只有 1 位错, 收到(000100100)(第 1 位出错), 那么它一定有两段一样,而第 1 段 000 的第 1 位是错的. 这就表明,这种编码方式可以纠正 1 位错误. 但是收方不能纠正 2 位错误, 如若钱 错两位成为 (000000100), 收方无法判定发出的信息为 “钱”, 因为它也可能是赵 发生 1 位错误.
分析
长为 9 的二元向量共有 个, 只有 8 个向量是有意义的,剩下 504 个向量没有意义.本来传 8 个信息, 每个信息只用 3 位即可. 现在为了有纠错能力, 将它们重新进行纠错编码, 每个信息要用 9 位. 这样一来,传一个信息所花的时间为原来的 3 倍, 即效率是原来的 . 所以是牺牲了效率而得到了通信的纠错能力. 在例 1 中, 长为 3 的向量为了纠错重新编成长为 4 的向量. 效率 比例 2 中的 损失要小, 但是例 1 只能检查 1 位错, 完全不能纠错, 所以纠错性能不如例 2.
数学模型
从以上例子可以看出, 为了使通信系统有纠错能力, 需要把原始信息重新进行纠错编码,将向量拉长, 从而有许多向量不代表任何信息.在接收端要有设备,能够把出错后收到的向量纠正成正确的信息,发现错误并找出错误, 恢复成正确的信息. 这一步叫做纠错译码. 在增加了纠错编码和纠错译码步骤之后, 一个有纠错能力的通信系统可以表示成如下的数学模型:
它的工作方式为发方将原始信息 (长为 的向量) 编成码字 (长为 的向量, ) 传给收方.在传送过程中发生错误 (长为 的向量), 所以收到 . 收方进行纠错译码, 求出错误 ,然后恢复出正确码字 , 再得到原始信息 .
习题
假设每个信息位取值于 , . 将 7 个信息分别编成 (00000), (11111),, (66666). 试问这个纠错码最多可以检查出几位错误, 最多可以纠正几位错误?
能否将 4 个信息中的每个均编成长为 5 的二元码字 (每个 为 0 或 1 ), 使得可以纠正 1 位或 2 位错误?
解: 纠正一位错误
从以上两个习题能否看出:要想纠正 3 位错误, 编出的码字应当具备什么性质?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)