数据校验方式
数据校验中,有一个码距的概念:码距越大,纠错能力越强,但数据冗余也越大,即编码效率低了。
奇偶校验 (Parity Check)
存在一个校验位:奇校验 or 偶校验。
奇校验:原有数据序列中 + 校验位 1的个数为奇数.
偶校验:原有数据序列中 + 校验位 1的个数为偶数.
例:0 1 1 1 1 1 0 1 如何计算偶检验的校验位: a0 ⊕ a1 ⊕ a2 ⊕ a3 ⊕ a4 ⊕ a5 ⊕ a6 ⊕ a7 = 0, 即校验位为 0.
判断一个数据是否正确有效,依然采用异或的方式:
- 例子获取到的有效数据:0 01111101 -> ⊕ -> 结果为0, 说明数据正确.
- 假设出现 1bit 跳变 -> 0 01111100 bit0跳变 -> ⊕ -> 1,说明数据序列出现了跳变.
结论: 奇偶校验只有1bit的状态位,所以可以表示两种数据状态,对于错,所以没有纠错能力,还有只能检测1bit的跳变.
奇偶校验是最为简单错误检测码,为了保证数据传输正确,因为没有纠错能力,所以如果发现数据错误,需要设备从新传输数据。
海明码 (Hamming Code)
海明码不但有检错功能,还有纠错功能.
海明码的计算步骤:
1) 计算校验位数 : 满足 $2^𝑘 − 1 ≥ n + k $ , 数据位n位,校验位k位, 总共数据序列位数 n+k 位 (n+k是出现1bit错误的存在概率+1次正确数据序列,
2
k
是
校
验
位
所
能
表
示
的
状
态
2^k是校验位所能表示的状态
2k是校验位所能表示的状态).
如:n = 8, k = 4; n = 16, k = 5;
实例代码:采用加法运算实现 2^k 指数运算,求解K校验位的位数:
void foo1 (void)
{
int n,k = 0;
int tmp = 1;
scanf ("%d",&n);
while (tmp < (n + k + 1)) /*2^k >= n+k+1*/
{
tmp += tmp; /*tmp *= 2; add -> mul*/
k++;
}
printf ("%d\n",k);
} /* 采用加法运算实现 2^k 指数运算,求解K校验位的位数*/
2) 计算校验码的分布 : 海明码的校验码需要满足一个特定的分布(
P
𝑖
=
2
i
/
2
P𝑖 = 2^i / 2
Pi=2i/2),即位置分布在 P1, P2, P4, P8, P16… 位置上:
假设信息为 1011 :则海明码的校验码数据序列:101
P
3
P3
P3 1
P
2
P
1
P2P1
P2P1
3) 分组以形成校验关系:
每个数据位由多个校验位进行校验,但是需要满足被校验数据的海明码位号等于校验该数据位的各校验码位号的和(校验码不需要被校验)。
- 数据位 H 3 ( D 1 ) H3(D1) H3(D1), 由校验位 H 2 , H 1 ( P 2 , P 1 ) H2,H1(P2,P1) H2,H1(P2,P1)的校验位进行校验;
- 数据位 H 5 ( D 2 ) H5(D2) H5(D2), 由校验位 H 1 , H 4 ( P 1 , P 3 ) H1,H4(P1,P3) H1,H4(P1,P3)的校验位进行校验;
- 数据位 H 6 ( D 3 ) H6(D3) H6(D3), 由校验位 H 2 , H 4 ( P 2 , P 3 ) H2,H4(P2,P3) H2,H4(P2,P3)的校验位进行校验;
- 数据位 H 7 ( D 4 ) H7(D4) H7(D4), 由校验位 H 4 , H 2 , H 1 ( P 3 , P 2 , P 1 ) H4,H2,H1(P3,P2,P1) H4,H2,H1(P3,P2,P1)的校验位进行校验;
4) 校验位取值 :
- P 1 P1 P1: 由分组校验关系,可知 P 1 P1 P1作为D1,D2,D4的校验位之一,所以 P 1 = D 1 ⊕ D 2 ⊕ D 4 P1 = D1⊕D2⊕D4 P1=D1⊕D2⊕D4.
- P 2 P2 P2: 由分组校验关系,可知 P 2 P2 P2作为D1,D3,D4的校验位之一,所以 P 2 = D 1 ⊕ D 3 ⊕ D 4 P2 = D1⊕D3⊕D4 P2=D1⊕D3⊕D4.
-
P
3
P3
P3: 由分组校验关系,可知
P
3
P3
P3作为D2,D3,D4的校验位之一,所以
P
3
=
D
2
⊕
D
3
⊕
D
4
P3 = D2⊕D3⊕D4
P3=D2⊕D3⊕D4.
P1 = 1; P2 = 0; P3 = 0; 故1011的海明码为 1 0 1 0 1 0 1 .
5) 海明码校验原理 :
每个校验组分别利用校验位和参与校验位的数据位进行奇偶校验检查,构成K个校验方程.
- S 1 = P 1 ⊕ D 1 ⊕ D 2 ⊕ D 4 S1 = P1⊕D1⊕D2⊕D4 S1=P1⊕D1⊕D2⊕D4
- S 2 = P 2 ⊕ D 1 ⊕ D 3 ⊕ D 4 S2 = P2⊕D1⊕D3⊕D4 S2=P2⊕D1⊕D3⊕D4
-
S
3
=
P
3
⊕
D
2
⊕
D
3
⊕
D
4
S3 = P3⊕D2⊕D3⊕D4
S3=P3⊕D2⊕D3⊕D4
S i Si Si组成的序列,构成了数据校验出错的H位数,如 S 3 S 2 S 1 = 000 表 示 无 错 ; S 3 S 2 S 1 = 101 表 示 海 明 码 中 第 5 位 数 据 出 现 了 错 误 , 需 要 取 反 即 可 改 正 S3S2S1 = 000 表示无错;S3S2S1 = 101表示海明码中第5位数据出现了错误,需要取反即可改正 S3S2S1=000表示无错;S3S2S1=101表示海明码中第5位数据出现了错误,需要取反即可改正; 此类似奇偶校验,异或为0说明这组数据正确, 异或为1说明这组数据存在错误.
【例】使用海明码进行纠错,7位码长(x7x6x5x4x3x2x1),其中4位数据,监督关系式为: C0 = x1+x3+x5+x7 C1 = x2+x3+x6+x7 C2 = x4+x5+x6+x7 如果接收到的码字为1000101,那么纠错后的码字是()
解:由题可得:
C0=1,C1=0,C2=1,即C2C1C0=101。所以海明码中第五位数据出错,取反可得,10#1#0101
关于 循环冗余校验 CRC (Cyclic Redundancy Check),下一章学习.
欲望以提升热忱,毅力以磨平高山. 始得 ~