循环码(Cyclic Code)是线性码的一个子类,但它有一个额外的约束:所有的码字都是彼此的循环移位形式。这个性质使得循环码在实际应用中非常有用,特别是在硬件实现方面。
1. 什么是循环码?
循环码是一种特殊的线性码,它不仅满足线性码的基本性质(如闭包性),还有一个附加的约束条件:
- 循环移位:如果一个码字
C
=
(
c
0
,
c
1
,
…
,
c
n
−
1
)
C = (c_0, c_1, \dots, c_{n-1})
C=(c0,c1,…,cn−1) 是一个有效的循环码码字,那么将它的位移位(右移或左移)也会产生另一个有效的码字。例如:
- 如果 C = ( c 0 , c 1 , c 2 , c 3 ) C = (c_0, c_1, c_2, c_3) C=(c0,c1,c2,c3),那么将其循环移位一次得到 ( c 3 , c 0 , c 1 , c 2 ) (c_3, c_0, c_1, c_2) (c3,c0,c1,c2),这个新的码字也必须是一个有效码字。
2. 为什么循环码有用?
循环码的循环性质使其在硬件实现中非常方便。因为它们的编码和解码可以通过线性反馈移位寄存器(Linear Feedback Shift Register, LFSR)来实现。LFSR 是一种硬件电路,能够高效地生成和检测循环码码字。
3. 循环码的定义: ( n , k ) (n, k) (n,k) 循环码
一个 ( n , k ) (n, k) (n,k) 循环码有以下几个基本参数:
- n n n:码字的长度(包括信息位和校验位)。
- k k k:信息位的数量。
- m = n − k m = n - k m=n−k:校验位的数量,也是生成多项式的阶数。
4. 生成多项式 g ( x ) g(x) g(x)
循环码的构造依赖于一个生成多项式
g
(
x
)
g(x)
g(x)。这个多项式是循环码的核心,它定义了如何将信息位转化为码字。生成多项式
g
(
x
)
g(x)
g(x) 的阶数为
m
m
m,即:
m
=
n
−
k
m = n - k
m=n−k
生成多项式有以下特性:
- 它是一个 n n n 阶二进制多项式的因式。
- 它可以被用来生成循环码的所有码字。
5. 多项式表示和码字的生成
5.1 多项式表示
在循环码中,码字可以用多项式表示。设一个
n
n
n 位码字为
C
=
(
c
0
,
c
1
,
…
,
c
n
−
1
)
C = (c_0, c_1, \dots, c_{n-1})
C=(c0,c1,…,cn−1),我们可以用一个多项式表示它:
C
(
x
)
=
c
0
+
c
1
x
+
c
2
x
2
+
⋯
+
c
n
−
1
x
n
−
1
C(x) = c_0 + c_1x + c_2x^2 + \dots + c_{n-1}x^{n-1}
C(x)=c0+c1x+c2x2+⋯+cn−1xn−1
其中:
- c i c_i ci 是码字中第 i i i 位(取值为 0 或 1)。
- x x x 是一个形式上的变量。
5.2 使用生成多项式 g ( x ) g(x) g(x) 生成码字
一个循环码的所有码字
C
(
x
)
C(x)
C(x) 都可以被生成多项式
g
(
x
)
g(x)
g(x) 整除。也就是说,对于任何一个有效的码字
C
(
x
)
C(x)
C(x),它一定可以表示为:
C
(
x
)
=
M
(
x
)
⋅
g
(
x
)
C(x) = M(x) \cdot g(x)
C(x)=M(x)⋅g(x)
其中:
- M ( x ) M(x) M(x) 是一个信息多项式,它包含了 k k k 位的信息位。
- g ( x ) g(x) g(x) 是生成多项式,其阶数为 m = n − k m = n - k m=n−k。
通过将信息多项式 M ( x ) M(x) M(x) 乘以生成多项式 g ( x ) g(x) g(x),我们可以得到完整的码字 C ( x ) C(x) C(x)。
6. 生成多项式的选择
生成多项式 g ( x ) g(x) g(x) 的选择对于循环码的性能至关重要。一个好的生成多项式可以确保:
- 码字之间有足够大的最小汉明距离,以提高错误检测和纠错能力。
- 码字满足循环移位的性质。
7. 示例:构造一个 ( 7 , 4 ) (7, 4) (7,4) 循环码
我们来看一个具体的例子:构造一个 ( 7 , 4 ) (7, 4) (7,4) 循环码。
- 码字长度 n = 7 n = 7 n=7,信息位数量 k = 4 k = 4 k=4,所以校验位数量为 m = n − k = 3 m = n - k = 3 m=n−k=3。
- 我们选择一个阶数为 3 的生成多项式 g ( x ) = x 3 + x + 1 g(x) = x^3 + x + 1 g(x)=x3+x+1。
步骤 1:表示信息位
假设我们有一个信息多项式
M
(
x
)
=
x
3
+
x
M(x) = x^3 + x
M(x)=x3+x,对应的信息位为 1010
。
步骤 2:生成码字
我们将信息多项式
M
(
x
)
M(x)
M(x) 乘以生成多项式
g
(
x
)
g(x)
g(x):
C
(
x
)
=
M
(
x
)
⋅
g
(
x
)
=
(
x
3
+
x
)
⋅
(
x
3
+
x
+
1
)
C(x) = M(x) \cdot g(x) = (x^3 + x) \cdot (x^3 + x + 1)
C(x)=M(x)⋅g(x)=(x3+x)⋅(x3+x+1)
通过展开并计算多项式,我们得到一个 7 位的多项式 C ( x ) C(x) C(x),这就是生成的码字。
或者说,步骤二可以是,对于7位循环码来说,在1100的基础上先pad with 3个0,然后再利用1100000去除以1011,余数就是parity bits,用parity bits替换3个零,得到的就是生成的码字。
8. 循环码的优点:LFSR 实现
因为循环码具有循环性质,可以使用 LFSR 来高效地实现它。LFSR 是一种硬件电路,可以利用生成多项式 g ( x ) g(x) g(x) 对数据进行循环移位操作,并生成相应的校验位。这种实现方式大大降低了硬件复杂度和成本。
9. 总结
- 循环码是一种线性码的子类,它的所有码字都是彼此的循环移位。
- 通过生成多项式 g ( x ) g(x) g(x),我们可以系统地生成循环码的码字。
- 生成多项式的阶数为 m = n − k m = n - k m=n−k,它决定了码字的结构和校验位的生成方式。
- LFSR 是实现循环码的一种高效方式,利用了循环码的循环性质。