多语言展示
当前在线:1909今日阅读:84今日分享:32

如何利用Matlab Simulink 深入理解奇偶校验检错

奇偶校验码是一种最简单的数据校验码,它的码距等于2,可以检测出一位错误(或奇数位错误),但不能确定出错的位置,也不能检测出偶数位错误。事实上一位出错的概率比多位同时出现的概率要高得多,所以虽然奇偶校验码的检错能力很低,但还是一种应用最广泛的校验方法,常用于存储器读、写检查或ASCII 字符传送过程中的检查。
工具/原料
1

Windows 10家庭中文版

2

Matlab 7.0

奇偶校验码
1

一、奇偶校验概念奇偶校验码是一种最简单的数据校验码,它的码距等于2,可以检测出一位错误(或奇数位错误),但不能确定出错的位置,也不能检测出偶数位错误。事实上一位出错的概率比多位同时出现的概率要高得多,所以虽然奇偶校验码的检错能力很低,但还是一种应用最广泛的校验方法,常用于存储器读、写检查或ASCII 字符传送过程中的检查。奇偶校验实现方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码,如图所示。校验位的取值(0 或1)将使整个校验码中“1”的个数为奇数或偶数,所以有两种可供选择的校验规律: 奇校验——整个校验码(有效信息位和校验位)中“1”的个数为奇数;偶校验——整个校验码中“1”的个数为偶数。表1 奇偶校验码实例

2

二、简单奇偶校验简单奇偶校验仅实现横向的奇偶校验,表1给出几个字节的奇偶校验码的编码结果。在表1 所示的奇校验码或偶校验码中,最高一位为校验位,其余八位为信息位。在实际应用中,多采用奇校验,因为奇校验中不存在全“0”代码,在某些场合下更便于判别。奇偶校验码的编码和校验是由专门的电路实现的,常见的有并行奇偶统计电路,如下图所示。这是一个由若干个异或门组成的塔形结构,同时给出了“偶形成”、“奇形成”、“偶校验出错”和“奇校验出错”等信号。

3

下面以奇校验为例,说明对主存信息进行奇偶检验的全过程。1. 校验位形成当要把一个字节的代码D7~D0 写入主存时,就同时将它们送往奇偶校验逻辑电路,该电路产生的“奇形成”信号就是校验位。它将与8 位代码一起作为奇校验码写入主存。若D7~D0 中有偶数个“1”,则“奇形成”=1,若D7~D0 中有奇数个“1”,则“奇形成”=0。2. 校验检测读出时,将读出的9 位代码(8 位信息位和1 位校验位)同时送入奇偶校验电路检测。若读出代码无错,则“奇校验出错”=0;若读出代码中的某一位上出现错误,则“奇校验出错”=1,从而指示这个9 位代码中一定有某一位出现了错误,但具体的错误位置是不能确定的。

奇偶校验仿真实验设计思路:

在数据传输前附加一位奇偶校验位,用来表示传输的数据中'1'的个数是奇数还是偶数,为奇数时,校验位置为'0',否则置为'1',用以保持数据的奇偶性不变。例如,需要传输 '11001110',数据中含 5 个'1',所以其奇校验位为'0',同时把'110011100'传输给接收方, 接收方收到数据后再一次计算奇偶性,'110011100'中仍然含有 5个'1',所以接收方计算出的奇校验位还是'0',与发送方一致,表示在此次传输过程中未发生错误。奇偶校验就是接收方用来验证发送方在传输过程中所传数据是否由于某些原因造成破坏。奇偶校验电路主要用于检测代码在传输和存储过程中是否出现差错。奇偶校验原理是基于异或逻辑功能。奇偶校验的编码方法是在原信息码组后添加一位监督码元,奇偶校验分为奇校验和偶校验,奇校验是原信息码元加上监督码元后,使之组成的整个数码组中,1的个数为奇数个。偶校验的工作原理则正好与奇校验相反, 1的个数为偶数个。对于n位二进码a1a2a3…an-1an的奇校验有如下表达式:      a1⊕a2⊕a3⊕an-1⊕an⊕C=1偶校验的表达式为:      a1⊕a2⊕a3⊕an-1⊕an⊕C=0其中,C为监督码元。

仿真实例

现假定有一列含有10个数的随机0、1数列沿信号线传输,在传输过程中该数列因干扰信号,任意数字发生改变的几率为0.5%,试用MATLAB对奇偶校验器的功能进行仿真,  设计奇偶校验系统的SIMULIN仿真模型及M文件仿真程序,对比两者的异同。

模型分析
1

奇偶校验器的收发过程如图所示。在发送端,让其产生的监督码元与信息码一起发送。其中,在发送端产生的监督码元为C,C= a1⊕a2⊕a3⊕a4,在接收端,计算校验因子的表达式为:S=a1⊕a2⊕a3⊕a4⊕C,奇偶校验器传送信号示意图,如下图所示:

2

此实验中,  这个含有10个0,1数字的随机数列,可以看成是一个10位信息码,设该10位信息码为a1a2a3…a9a10,  监督码元为C,可以推出监督码C的表达式如下:      C= a1⊕a2⊕a3⊕a4⊕a5⊕a6⊕a7⊕a8⊕a9⊕a10在接收端,计算校验因子的表达式如下:      S=a1⊕a2⊕a3⊕a4⊕a5⊕a6⊕a7⊕a8⊕a9⊕a10⊕C      若S=0,表示无错传输: S=1,表示传输有错。若接收端发现有错误传输,则通知发送端重发。

模型设计
1

创建一个 M 文件,保存到MATLAB目录下的work文件夹中。

2

在 M 文件中,首先利用 rand 函数随机生成一组十位的只包含 0 和 1 的数组 a,设置当 a(n) 大于 0.5 时, 则认为 a(n)为 1,当 a(n)小于 0.5,则认为a(n)是 0,这样 0 和 1 等概率出现,即出现一组随机等概率的十位数为 0 或者 1 的数组。(0 和 1 等概率出现,即5 个”0”,5个”1”,但每次运行M文件,“0”和”1”出现位置一般不同,即位置随机出现)。

3

同样用 随机生成rand 函数生成一组十位的只含有 0 和 1 的数组 b, 但是要设置当b(n)大于 0.95 时, 才给其赋值为 1,其他为 0,这样在异或的逻辑检测中容易检测到错误序列,其中的 0.95 是一个自己可以设定的概率大小,本设计选择 0.95。

4

利用已知的数组a相互异或生成数 C,利用数组a 和 b 对应相互异或生成数组 c,然后用 c 和数 C 分别模拟接受到的十位有效位和一位校验位, 把 C 和B相互异或可以生成数 S。

5

把 C 和B相互异或可以生成数 S,当 S 等于 0 时,则表示 b 中有 1 的出现,即出现了干扰,即某些位错误传输了,当 S 等于 0 时,则表示原有效数据传输正确。 (由于奇偶校验只是检查当发生奇数数位变化时,才能够通过异或的关系检测到变化,当错误位为偶数时,不能够检测出你传输出错。)

6

在程序的开始,初始化 S=1,并且设置只能当 S 大于 0 时才进入到后面的数据处理,在程序的结尾,设置了一个判断打印函数和一个断点函数 pause, ,这样当有错误产生的时候,可以提示错误警告暂停运行程序,在重新按下 enter 键时,程序会再次传输一次,一直到 S=0,即传输没有错误产生。

7

在 M 文件中点击运行,观察实验结果,本实验为了更加直观的感受到数据传输和接收的情况,在传输的数据赋值为 send,接收数据为 receive。 该 M 文件中,程序利用校验因子 S 用于判断传输途中是否有错,从而决定信号是否被重新传输;程序利用随机数列 b 模拟使传输信号出错率为 5%的干扰信号。程序中的 while 循环 中被加入了一个 pause 命令。在 pause 的作用下,当程序模拟一次信号传输后,不管模拟的传输信号是否需要被重传,程序都将暂停执行。在程序结束运行之后,如果前一次循环传输成功 (即 S=0),则用户在按下【Enter】键后程序结束运行;如果前一次循环传输有错(即 S=1),则用 户按下【Enter】键后,程序将再次进入 while 循环,如此反复直到传输成功(即 S=0),程序运行结束。

建立仿真
1

打开MATLAB,打开文件菜单,选择菜单新建(NEW),M-File,名称为Parity.m,复制以下代码,保存在Matlab目录下的work文件夹,要求能读懂Parity.m程序中基本思路及功能。Parity.M文件内容如下:其中”%”开始的语句代表解释语句clc;%清理屏幕clear;%清空变量a=rand(1,10); % rand(1,10)产生1行10列的位于(0,1)区间的随机数aS=1; %将校验因子初始化while S>0 %产生随机数列b  b=rand(1,10) % rand(1,10)产生1行10列的位于(0,1)区间的随机数b    for i=1:10        if a(i)>0.5 %产生需要发送的随机数序列            a(i)=1        else a(i)=0        end        if b(i)>0.95 %产生传输中的干扰信号序列            b(i)=1        else b(i)=0        end        c(i)=a(i)+b(i)%干扰信号作用于发送的随机数序列上,得到接收信号        if c(i)==2            c(i)=0 %相当于信号作布尔加法        end        end    end    send=a;    receive=c    for i=1:9    send(i+1)=send(i)*not(send(i+1))+not(send(i))*send(i+1)    receive(i+1)= receive(i)*not( receive(i+1))+not( receive(i))* receive(i+1)end% C=数组a相互异或9次(即第10次)生成数,B=数组c相互异或9次(即第10次)生成数,校验因子S=C⊕B    C=send(10)    B=receive(10)S=B*not(C)+not(B)*C    if S==1   %判断校验因子是否正确,不正确则重传        fprintf('传输错误,请重新传输!')%如果结果中S=1,请重新运行,直到S=0    end    pause;%暂停运行程序命令,按[Enter]键后程序继续运行end如下图所示:

2

该M文件中,程序利用校验因子S用于判断传输途中是否有错,从而决定信号是否被重新传输;程序利用随机数列b模拟使传输信号出错率为5%的干扰信号。程序中的while循环中被加入了一个pause命令。在pause的作用下,当程序模拟一次信号传输后,不管模拟的传输信号是否需要被重传,程序都将暂停执行。在程序暂停执行之后,如果前一次循环传输成功(即S=0),则用户在按下[Enter]键后,程序结束运行;如果前一次循环传输有错(即S=1),则用户在按下(Enter]键后,程序将再次进入while循环,如此反复直到传输成功(即S=0),程序运行结束。现将该M文件命名为parity.m后保存在matlab目录下的work文件夹,选中debug菜单中Run选项或F5按键运行此M文件。在matlab中的command window窗口中,选中需要拷贝的数值结果,然后在Edit菜单中选择Copy(或右键选择Copy选项),可以粘贴程序运行的结果。

3

注意:由于是随机运行该程序,每次运行生成的数据一般不同,在command window窗口将可以看到以下随机输出结果(主要查看六个参数(a,b,c C,B,S),其中: c=数组a 和 b 对应位置相互异或, C=数组a相互异或9次生成数,B=数组c相互异或9次生成数, 校验因子S=C⊕B,S=0说明传送过程中没有出现错误,S=1说明传送过程中有错误):………以上运行结果,校验码S=0表明:此次模拟传输信号序列中,被传输信号在传输过程中,信号没有受到干扰,一次性传输成功。

实验实施
1

设计奇偶校验器的Simulink模型仿真启动SIMULINLK,根据图所示奇偶校验器原理图,选用Constant、Demux、 Logical Operator和Display模块搭建如图所示的Simulink仿真模型。将文件名称命名为Parity.mdl保存在MATLAB目录下的work文件夹下。如下图所示:

2

从图二中可以看到,该Simulink仿真模型包括的仿真模块和各个模块。其参数设置如下:[Constant模块]此Simulink 仿真模型中包括两个Constant模块,这里分别将其命名为sender和disturb signal.名为sender的Constant模块产生的是原始发送信号,将它的Constant Value值设置为M文件仿真中产生的原始传送序列(Sender Signal)a的10个数值(空格隔开,请注意是随机值,每次运行不一样),即在该模块参数对话框的Constant Value项中填入如下序列:[ 1     0     1     0     1     1     0     0     1     0]  名为disturb signal的Constant模块产生的是传送中的干扰信号,将它的Constant Value值设置为M文件仿真中产生的干扰信号序列b的10个数值(空格隔开),即在该模块参数对话框的Constant Value项中填入如下序列(注意:全0为无干扰信号,如果有干扰信号,干扰后的信号为相应位上原发送信号的相反电平信号):[ 0     0     0     0     0     0     0     0     0     0] [Demux模块]      该Simulink仿真模型中包括两个Demux模块,Demux模块位于Simulink节点下的Signal Routing模块库内,将其参数Number of output值均设置为10。[Logical Operator模块]      该Simulink仿真模型中包括多个Logical Operator模块,利用Logical Operator模块的XOR(异或)功能和Constant模块产生原始发送信号。      发送信号序列产生监督码元C,同样利用Logical Operator的XOR (异或)功能将sender产生的序列与disturb signal 产生的序列做布尔加运算(相当于加法运算,不考虑进位),以此实现干扰信号对所传输信号的影响。最后再次利用Logical Operator的XOR功能实现受干扰的传输信号序列与监督码元C相互作用产生最后计算校验因子S.将该Simulink模型命名为paritymodel.mdl后保存并运行,可以看到在命名为S的Display模块中,s的值显示为0 (如下图所示),这说明传输信号没有改变,成功传输。

3

为了对比观察,  输入信号序列a不变,接下来将名为disturb signal(干扰信号)模块的Constant Value值设置为如下序列(只有最后一个信号受到干扰,即红色的“1”)[0     0     0     0    0     0     0     0     0     1]此序列中的一个”1”说明只有最后一个信号受到干扰(受到干扰,信号就会变为与原信号电平的相反电平),即出现了奇数个错误。由于是奇数是错误,所以能检测出来。这10位代码中一定有某一位出现了错误,请思考具体的错误位置能不能确定?为什么?我们可以再次运行该模型后可以看到,S的值显示为1,表示传输信号被改变(受到干扰),传输不成功。如果再次将disturb signal(干扰信号)的Constant Value值设置为如下序列: [ 0     0     0    0     0     0     1     0     0     1]此序列中的两个”1”说明只有最后一个信号及倒数第四个信号受到干扰,(受到干扰,信号就会变为与原信号电平的相反电平),即出现了偶数个错误。      运行该模型后得到S的值仍为0,这说明该奇偶校验器,能检测出错误码,但只能检查出有奇数个传输码无出错的情况,而不能检测出同时出现偶数个错误传输码的情况(此时有两个码受到干扰)。

注意事项
1

如果对于不同版本的Matlab,其求解操作过程可能有细微的不同,请您自行加以调整。

2

师者,所以传道受业解惑也。人非生而知之者,孰能无惑?惑而不从师,其为惑也,终不解矣。如对您有帮助,请不吝点击投票转发,如您有任何疑问或建议,请留言评论。

推荐信息