丁伟 宋道星
很多娱乐节目中都有一个名叫“传声筒”的游戏,在游戏中,由于受到各种因素的影响,参与人员在传递信息的过程中会使信息发生错误而产生喜剧效果。而在生活中,信息的传输时刻都在发生,模拟信号在传输过程中,由于各种影响因素的存在,会产生各种失真现象,且不容易纠正。数字信号是利用0、1两个数字的编码来表示信息,在数字设备之间,存储、传输的数据都是数字信号,数据在存储、传输过程中的错误会引起数据的变化。因此,在数字信号的传输过程中,以编码理论为基础的校验纠错技术就顯得尤为重要。
本文奇偶校验原理
在诸多的校验方法中,比较容易理解的是奇偶校验,奇偶校验是一种常用的检验代码传输正确性的校验方法,它根据传输的一组二进制数中的“1”的个数是奇数还是偶数来进行校验。是奇数还是偶数是事先定好的,奇数的叫奇校验,反之叫偶校验。在数据传输之前,我们首先要设定一个校验位,通过这个校验位使传输的数据中“1”的个数为奇数或者偶数。若用奇校验则在接收端收到代码时校验“1”的个数是否为奇数,同理,若用偶校验则校验“1”的个数是否为偶数,如图1所示。
在接收方收到数据后,对数据中“1”的个数进行统计,如果为预定好的奇数或偶数则校验通过,否则表示传输过程中有错误发生,此时接收方可以发送请求要求发送方重新发送数据。这种校验方式只能校验正误,没有纠错能力,称为一维奇偶校验。
二维奇偶校验,也被称为矩阵校验或水平垂直一致校验。计算机在对数据信息进行传送之前,除了对每行数据添加一个奇偶校验位,还要对每列数据添加一个奇偶校验位,所以,二维奇偶校验就是结合行、列两种一维校验的校验方法。通过这种横向、纵向同时进行校验的方式来对整个数据进行校验,这种校验方法拥有更好的校验性能,因为它有可能检测出偶数个错误。尽管每行的校验位无法检测出本行中的偶数个错码,但是按列的方向来进行检测的话检测出来的概率是非常大的。此外,二维奇偶校验码拥有一定的纠错功能,可以纠正部分错码,如对数据中的1个随机错误,就可以通过行列确定错码的位置,从而对其进行纠正。
本文用掌控板模拟数据传递中的奇偶校验
本实验使用掌控板模拟数字信号传输过程中出现误码,并通过二维奇偶校验进行纠错的过程。掌控板是一块微控制器板,板载加速度计、按键、触摸引脚、声光传感器、128*64的OLED屏幕等,通过mPython编程,借助掌控板的显示屏就可以直观地呈现数据。mPython0.5.4是在原版PythonEditor基础上拓展开发的编程软件,可以进行可视化代码编程,有Blockly、Python、Jupyter三种代码读写等功能。
启动mPython0.5.4,使用“显示”模块中的绘制实心和绘制空心积木块,绘制“十”字形二维矩阵。笔者用矩阵中的白色矩形代表数字“1”,用黑色矩形代表数字“0”。假设采用偶检验来进行校验,那么需要在矩阵的最右侧和最下面分别增加一列和一行校验码,使得每行每列的白色矩形均为偶数个,如图2所示。
笔者通过掌控板S(send)上的“A”键来实现这一过程,并通过“B”键将这个二维矩阵发送到另一个掌控板R(receive)上。写好掌控板S的代码后,将掌控板S连接到计算机上,选择好对应的端口号,将代码上传到掌控板,如图3所示。
本文奇偶校验模拟
接下来编写信息接收方掌控板R的代码,首先打开掌控板的无线广播功能,当接收到掌控板S的广播时开始绘制下页图4中含有校验码的二维矩阵。通过校验可以发现第三行中的“1”变成了奇数个,同时第三列中的“1”也变成了奇数个,因此可以判断是第三行和第三列交叉处的数据发生了错误。
这时通过按钮“B”来进行纠错,完成整个的传输纠错过程,代码如下页图5所示。
通过上面的实验可以了解奇偶校验是如何检测并修正一个错误的,但计算机中会有不止一个数据发生错误的时候,当出现这样的情况时,有一种特殊情况是能够被纠正的。下页图6就显示了这样一个奇偶校验阵列(每行每列的白色卡片数均为偶数),但是它的第四列数据全部丢失(灰色区域)。RAID(独立冗余磁盘阵列)硬盘系统采用的就是这种纠错方式,通过将数据分散存储在多块硬盘中,来保证运行的高速性和稳定性。
上述实验只是模拟了奇偶校验中的基本原理,利用这种校验方法还可以设计一个读心术小游戏。首先准备好36张卡片,要保证每张卡片正反两面的图案和颜色不同(如实验中的白色和黑色矩形)。找一个同伴,由他来把卡片放在桌子上,并决定每张卡片放置的正反。接下来,你可以增加几张卡片(添加校验数据),然后转身,这时让你的同伴随意翻转一张卡片,当他翻转后你总能正确地说出哪一张卡片是他翻过的。
奇偶校验系统的优化方案称为RAID5。假设需要使用8个硬盘来储存大量的数据,这些数据包含大量字节,可能超过数亿字节(吉字节)甚至千亿字节(太字节)。这时,可以将每个字节打散成8比特分别储存在多个硬盘上,而不是将数据陆续填满每个磁盘。这样的存储方式会让系统运行得更快,因为当计算机需要读取文件时,它只要分别同时向每块硬盘读取片段即可。该方法也可用于提高纠错性能:如果再增加存有奇偶校验位的第9块硬盘,我们可以用上面的思路让每一列数据分别放在不同的硬盘上,这样一来,如果其中一块硬盘被损坏,即使损失全部数据,仍然能依靠奇偶校验的思路来修复原始数据——只要算出遗失的比特使得9个硬盘上值为1的比特数总保持为偶数即可。正是因为RAID系统的存储速度飞快,任何一块硬盘被损坏也不会影响原始数据的读取。所以,对于大型数据中心和主要的网站来说,RAID已经成为提高运行速度和保障稳定性的优选方案。
信息的传输过程中很难避免干扰和错误的出现,纠错是一种很好的解决方法,纠错的方式有很多,奇偶校验只是一种比较容易理解的方式,通过这种方式可以帮助学生非常直观地理解纠错的原理,这种类似的演示实验设计,可能会成为今后信息科技的一个探索方向。