(7,4)汉明码 matlab编程

(7,4)汉明码 matlab编程,第1张

程序改为如下:

S=ones(7,3)%要加的部分

A=[1 1 0 1 1 0 0]

[r,l]=size(A)

E=[0 0 0 0 0 0 00 0 0 0 0 0 10 0 0 0 0 1 00 0 0 0 1 0 00 0 0 1 0 0 00 0 1 0 0 0 00 1 0 0 0 0 01 0 0 0 0 0 0]%%%%%求校正子,然后将其转化成十进制数

for i=1:r 

    Sx=S(i,1)*4+S(i,2)*2+S(i,3)

end%%%%下面是(7,4)码检错

for i=1:r 

    switch(Sx)

        case 0 

            disp('此接收码字没错') 

        case 1 

     亏备       disp('注意:此接收码字的第一位有错,请纠正') 

        case 2 

            disp('注意:此接收码字的第二位有错,请纠正')

        case 4 

            disp('注意:此接收码字的第三位有错,请纠正') 

        case 3 

            disp('注意:此接收码字的第四位有错,请纠正') 

        case 5 

            disp('注意:此接收码字的第五位有错,请纠正') 

        case 6

            disp('注意:此接收码字的第六位有错,请纠正') 

        case 7 

            disp('注意:此接收码字的第七位有错,请纠正') 

    end

end

%%%下面为在知道哪位出错的情况下,进行纠正

for i=1:r 

    switch(Sx)

        case 0 

     信空搏       B(i,:)=A(i,:)+E(1,:)

        case 1

            B(i,:)=A(i,:)+E(2,:)

        case 2 

            B(i,:)=A(i,:)+E(3,:) 

        case 4

            B(i,:)=A(i,:)+E(4,:)

        case 3

            B(i,:)=A(i,:)+E(5,:)

        case 5

            B(i,:)=A(i,:)+E(6,:) 

  滑祥      case 6

            B(i,:)=A(i,:)+E(7,:)

        case 7

            B(i,:)=A(i,:)+E(8,:) 

    end

end

B=rem(B,2)

disp('纠错后的码字')

disp(B)

结果:

注意:此接收码字的第七位有错,请纠正

纠错后的码字

     0     1     0     1     1     0     0

汉明码是Richard Hamming于1950年提出的。是目前广泛采用的一种有效的校验码,其中,主存的ECC(Error Correcting Code)采用的就是类似的校验码搜慧。

----摘自百度百科

这个分组的思想有点不是很理解。

以下使用P代表校验位,H代表汉明码,D代表原始信息位,N位信息位的位数,K位校验位的位数。

则N与K的关系为 2^(K-1) >=N+K+1 ,如下表:

假设原始数据信息位的位数为8,那么他需要的K值位5,即需要有5个校验位,组成的汉明码的位数为13.再根据校验位的分桥猜配原则,组成的汉明码如下:

|位|13| 12| 11 |10| 9| 8| 7 |6| 5| 4| 3| 2| 1|

|-|-|-|-|-|-|-|-|-|-|-|-|-|

|汉明码|P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|

P5本来应该是放在第16位的,但是由于生成的汉明码位数为13所以它就被挪到的第13位了。

那么怎么确定校验呢?最初也困扰我许久。

先看一个表格:

其中H的下标代表在汉明码中的位置,也是P4P3P2P1组成的-十进制数

校验位Pi的偶校验结果就是:

P1 = D1 ^ D2 ^ D4 ^ D5 ^ D7

P2 = D1 ^ D3 ^ D4 ^ D6 ^ D7

P3 = D2 ^ D3 ^ D4 ^ D8

P4 = D5 ^ D6 ^ D7 ^D8

如果是奇校验的话上面的结果取反就是了。

那么还有P5呢?上面的结果中,D4,D7出现了3次,而D1,D2,D3,D5,D6,D8仅出现了2次,为了使其各个信息位在校验中均匀的出现校验,从而定义 P5 = D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8 ,这样,每一位信息位都均匀的出现在3个Pi值得形成关系中,当任意一位信息位变化的时候都会引起3个P值得变化, 即合法汉明码的码距为4 (前面都懂,这个码距为4有点想不明白)

这就是编码了。

现在再来看看这句话

P1,P2,P3,P4,P5的位数分别为1,2,4,8,13

D1的汉明码位数为3,3 = 2 + 1所以D1会被P1,P2两个校验位所校验。

根据偶校验结果以及上应该就清楚了。

将收到的汉明码进行偶校验(当然也可以进行奇校验,前提是前面编码的时候使用的是奇校敏漏型验)

S1 = P1 ^ D1 ^ D2 ^ D4 ^ D5 ^ D7

S2 = P2 ^ D1 ^ D3 ^ D4 ^ D6 ^ D7

S3 = P3 ^ D2 ^ D3 ^ D4 ^ D8

S4 = P4 ^ D5 ^ D6 ^ D7 ^D8

S5 = P5 ^ D1 ^ D2 ^ D3 ^ D5 ^ D6 ^D8

汉明码出错情况:

记录 S = S5 S4 S3 S2 S1

以上结果分析基于偶校验。

|汉明码||P5| D8| D7| D6 | D5| P4| D4| D3| D2| P3| D1| P2| P1|

|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|

|出错位号||H13| H12| H11 |H10|H9| H8| H7 |H6| H5| H4| H3| H2|H1|

||S5|1|1|0|1|1|0|0|1|1|0|1|0|0|

||S4|0|1|1|1|1|1|0|0|0|0|0|0|0|

||S3|0|1|0|0|0|0|1|1|1|1|0|0|0|

||S2|0|0|1|1|0|0|1|1|0|0|1|1|0|

||S1|0|0|1|0|1|0|1|0|1|0|1|0|1|


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12537243.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存