最通俗易懂的海明码校验纠错讲解

一、海明码编码

1.1. 求海明码位数

公式:2^{k}≥N+k+1,其中N为有效信息位数,K为校验码位数。

例子:编码前有效信息为10011101,求校验码位数?

解:

        有效信息码10011101长度为8则,N=8,求K=?,可以将N带入公式2^{k}≥8+k+1然后K可依次用正整数带入,取维持等式成立的最小值,解得K=4。并根据经验总结,得出信息码位与校验码位关系,如下表所示。

信息码位数

1

2~4

5~11

12~26

27~57

58~120

121~247

校验码位数

2

3

4

5

6

7

8

                                                                            1-1 信息码位数与校验码位数关系表

1.2. 求海明码位置

公式:效验码只能放在2^{n}2^{0}2^{1}2^{2}...)位置。

例子:当效验码为4位时(即K=4)校验位置分布如下表,P代表校验码,D代表信息码。

1

2

3

4

5

6

7

8

9

10

11

12

P1

P2

D1

P3

D2

D3

D4

P4

D5

D6

D7

D8

2^{0}2^{1}

 

2^{2}.

 

 

 

2^{3}

 

 

 

 

 

1.3. 求海明码数值

1

2

3

4

5

6

7

8

9

10

11

12

P1

P2

D1

P3

D2

D3

D4

P4

D5

D6

D7

D8

1

0

0

1

1

1

0

1

公式:在偶校验方式下Pn的取值,受到Pn所能验证位中所有1的个数影响,当1为偶数个时则Pn=0,当1的个数为奇数个时则Pn=1。Pn能验证的位=Pn位数起,校验n位,然后跳过n位,以此规则循环至末尾。

例子:

        P1(第1个校验位,也是整个码位的第1位)的校验规则是: P1位数起,连续校验1位,然后跳过1位,再连续校验1位,再跳过1位,……。如下表

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

P1

P2

1

P3

0

0

1

P4

1

1

0

1

P1

 

 

 

 

 

 

                                      P1取值

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

P1

 

1

 

0

 

1

 

1

 

0

 

        此时有奇数个1,为保证偶校验,则此时P1应取1,即P1=1。

         P2(第2个校验位,也是整个码位的第2位)的校验规则是: P2位数起,连续校验2位,然后跳过2位,再连续校验2位,再跳过2位,……。如下表

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

P2

1

P3

0

0

1

P4

1

1

0

1

P1

 

 

 

 

 

 

P2

 

 

 

 

 

 

                                      P2取值

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

P2

1

 

 

0

1

 

 

1

0

 

        此时有奇数个1,为保证偶校验,则此时P2应取1,即P2=1

         p3(第3个校验位,也是整个码位的第4位)的校验规则是:从当前位数起位数起,连续校验4位,然后跳过4位,再连续校验4位,再跳过4位,……。如下表

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

1

1

P3

0

0

1

P4

1

1

0

1

P1

 

 

 

 

 

 

P2

 

 

 

 

 

 

P3

 

 

 

 

 

 

 

                                      P3取值

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

 

 

P3

0

0

1

 

 

 

 

1

        此时有偶数个1,为保证偶校验,则此时P3应取0,即P3=0

        P4(第4个校验位,也是整个码位的第8位)的校验规则是:从当前位数起位数起,连续校验8位,然后跳过8位,再连续校验8位,再跳过8位,……。如下表

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

1

1

0

0

0

1

P4

1

1

0

1

P1

 

 

 

 

 

 

P2

 

 

 

 

 

 

P3

 

 

 

 

 

 

 

P4

 

 

 

 

 

 

 

                                      P4取值

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

 

 

 

 

 

 

P4

1

1

0

1

        此时有奇数个1,为保证偶校验,则此时P4应取1,即P4=1

        到此整个编码工作结束,各校验码的码值和码位如下

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

1

1

0

0

0

1

1

1

1

0

1

 

二、海明码解码

        举一个例子来说明,经过此前编码工作源端发送出的海明码为111000111101共12位长度,假设在传输过程中出现了错误,将第5位由0变成了1,则接收端实际接收到的编码为111010111101。

2.1. 求出错位置

        将P1、P2、P3、P4所负责验证的码位取名为组,即得到对应的G1、G2、G3、G4四个组,然后分别用奇偶校验法去验证各组码值定位错误。

G1验证组:经过奇偶校验发现G1组中有奇数个1,使用异或运算G1=1(简单办法是直接数1的个数奇数为1偶数为0)

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

 

1

 

1

 

1

 

1

 

0

 

G2验证组:经过奇偶校验发现G2组中有偶数个1,使用异或运算G2=0(简单办法是直接数1的个数奇数为1偶数为0)

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

1

1

 

 

0

1

 

 

1

0

 

G3验证组:经过奇偶校验发现G3组中有奇数个1,使用异或运算G3=1(简单办法是直接数1的个数奇数为1偶数为0)

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

 

 

0

1

0

1

 

 

 

 

1

G4验证组:经过奇偶校验发现G4组中有偶数个1,使用异或运算G4=0(简单办法是直接数1的个数奇数为1偶数为0)

 

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

 

 

 

 

 

 

 

1

1

1

0

1

        根据以上验证结果可以使用计算法或图表法来定位出错位。

1)计算法

        将校验位降序排列可得G4 G3 G2 G1(二进制高位在左),设出错位为N,则得公式N = G4 G3 G2 G1,即N=0101转换成十进制得5则说明,接收端得到的海明码第五位出现了传输错误。

2)图表法

码位

1

2

3

4

5

6

7

8

9

10

11

12

码值

1

1

1

0

0

0

1

1

1

1

0

1

P1

G1

 

 

 

 

 

 

P2

G2

 

 

 

 

 

 

P3

G3

 

 

 

 

 

 

 

P4

G4

 

 

 

 

 

 

 

       经过计算只有G1和G3的值为1,结合图表可以看出仅由G1和G3同时验证的码位只有第5位,则说明第五位出现了传输错误。

2.2. 纠正错误值

       二进制位非0即1,当判断出是哪位出错对该位取反即可。则经过纠正的海明码为111000111101,与发送端保持了一致。

### 海明简介 海明是一种可以检测并纠正一位错误的编方式。通过增加冗余位,使得接收方能够识别传输过程中发生的单比特错误,并自动修正这些错误。 ### 使用JavaScript实现海明检错和纠错 为了在JavaScript中实现海明的功能,下面提供了一个简单的函数来计算校验位以及进行错误检测与更正: ```javascript function calculateParityBits(messageLength) { let parityCount = 0; while (Math.pow(2, parityCount) < messageLength + parityCount + 1) { ++parityCount; } return parityCount; } function insertParityBits(data) { const m = data.length; const r = calculateParityBits(m); let j = 0; // Index of current bit being processed in original data. let k = 0; // Position within encoded result array. const hammingCodeArray = new Array(m + r).fill('P'); for (; k < m + r; ++k) { if ((k + 1) === Math.pow(2, parseInt(Math.log(k + 1) / Math.LN2))) { continue; } else { hammingCodeArray[k] = data[j++]; } } for (let i = 0; i < r; ++i) { let pos = Math.pow(2, i); // Parity position index starts from 1 not zero. let ones = 0; for (let j = pos - 1; j < hammingCodeArray.length; j += pos * 2) { for (let n = 0; n < pos && (j + n) < hammingCodeArray.length; ++n) { if (hammingCodeArray[j + n] === '1') { ++ones; } } } hammingCodeArray[pos - 1] = ones % 2 ? '1' : '0'; } return hammingCodeArray.join(''); } function detectAndCorrectError(receivedHammingCode) { const receivedData = [...receivedHammingCode]; const totalBits = receivedData.length; const parityPositions = []; for (let i = 0; ; ++i) { const powOfTwo = Math.pow(2, i); if (powOfTwo >= totalBits) break; parityPositions.push(powOfTwo); } let syndromeSum = 0; for (const pPos of parityPositions) { let oneCount = 0; for (let i = pPos - 1; i < totalBits; i += pPos * 2) { for (let j = 0; j < pPos && (i + j) < totalBits; ++j) { if (receivedData[i + j] === '1') { ++oneCount; } } } if (oneCount % 2 !== 0) { syndromeSum += pPos; } } if (syndromeSum === 0) { console.log("No Error Found"); } else { console.log(`Error found at position ${syndromeSum}`); receivedData[syndromeSum - 1] = receivedData[syndromeSum - 1] === '1' ? '0' : '1'; console.log("After Correction:", receivedData.join('')); } } ``` 上述代实现了以下几个功能: - `calculateParityBits` 函数用于确定所需添加的奇偶校验位数量。 - `insertParityBits` 方法负责构建完整的汉明码序列,在适当位置插入必要的奇偶校验位。 - `detectAndCorrectError` 接收已接收到的数据流作为输入参数,并执行错误定位及修复操作[^1]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值