BCH码小述
BCH码是循环码的一种,循环码是线性分组码的一种。循环码有严密的代数理论的支持,应用比较广泛。本文不介绍BCH码的代数理论。本文以实用为目的,理解BCH码的编码和解码流程,并进行程序实现。
1.BCH编码
BCH码是循环码的一种,满足循环码的编码方法。令给定的编码方式为(n,k),生成多项式为g(x),信息码多项式为m(x)。编码步骤如下:
1)用xn-k乘m(x)。这一运算实际上是把信息位码后附加上(n-k)的“0”;
2)用g(x)除xn-k m(x),得到商Q(x)和余式r(x),即(xn-k m(x)) / g(x) = Q(x) + (r(x)/g(x));
3)编码后的输出为T(x) = xn-k m(x) + r(x)。
以上是BCH码的编码步骤,下面给出电路实现,一般用一个除法电路来实现。以生成多项式g(x)=x4+x+1,编码方式为(15,11)为例。在实际应用中生成多项式的选择有比较成熟的规则。编码电路的形式根据生成多项式进行设计,本例的编码电路如下:
该电路的工作分为两个过程:
1)开关S置向下方。该过程中a,b,c,d,e寄存器进行移位,相当于进行多项式除法,所得的商数e进行反馈,输出序列和输入序列相同;
2)开关S置向上方。其实此时已经得到了所要求的余数r(x)。这个过程中反馈e被断开。根据编码步骤中的第一步,信息码后面已经加上n-k个“0”,所以输入序列全为“0”,输出其实就是a,b,c,d寄存器中的值经过移位后输出的序列。
上述过程的C语言实现的程序如下:
#define N 15
#define K 11
void BCH_Code(int *info, int *infor_coded)
{
int i;
int a = 0, b = 0, c = 0, d = 0, e = 0;
for(i=0; i<N; i++) {
if(i<K) {
infor_coded[i] = info[i];
e = d^sendcode[i];
d = c;
c = b;
b = a^e;
a = e;
} else {
infor_coded[i] = d^info[i];
d = c;
c = b;
b = a;
a = 0;
}
}
}
令信息码为二进制序列10110100101,上述编码程序在VC++6.0上仿真结果如下:
参考书籍:
樊昌信 等,《通信原理》,国防工业出版社。