背景技术
在通信***中,在信息发送之前,需要按照一定的规则,在数据流中人为地加入冗余以便接收端能够进行误码检测和校正。RS纠错编码是目前最有效、应用最广泛的差错控制编码方式之一。RS码可以用于纠正随机错误,也适合于纠正突发错误,已经在卫星通信、数字电视传输等领域得到广泛应用。
常用(n,k,d)表示RS码;其中n为码字长度,k为信息符号数,d为设计距离,若可纠正的最大差错个数用t表示,则2t为校验符号数。RS码的参数具有如下的关系:
设输入的信息序列为m(x)=mk-1xk-1+mk-2xk-2+......+m2x2+m1x1+m0x0,生成的码字为c(x)=cn-1xn-1+cn-2xn-2+......+c2x2+c1x1+c0x0。若采用***码的形式,则编码算法为c(x)=xn-km(x)+R(x),其中R(x)=xn-k·m(x)modg(x),g(x)是RS码的生成多项式,mod表示相除取余数多项式。RS编码电路与一般循环码的编码电路类似,用除法电路来实现。
这里的码元(如mi、ci)均在有限域GF(2m)上。有限域GF(2m)上的每个元素由m比特组成,因此,连续m比特的错误仅相当于该码字1个码元的错误,这样RS码就可以大幅度地提高抗突发错误的能力。RS码也可以看作(mn,mk,d)二进制码。
m阶本原多项式Poly(x)的根是有限域GF(2m)的本原域元素,有限域GF(2m)上的所有非零元素都是本原域元素(a)的整数次幂,则由a的0到2m-2次方构成了有限域GF(2m)中所有2m-1个非0元素。RS编码的生成多项式定义为:
RS译码算法可以分为以下三步:
(1)根据接收码字矢量y(x)=yn-1xn-1+yn-2xn-2+......+y2x2+y1x1+y0,计算伴随式S(x)。
S(x)=S1+S2x+......+S2tx2t-1
其中:
(2)计算错误位置多项式σ(x)和出错值多项式ω(x).
假设有v个未知的错误,定义错误值为Yl,出错位置为Xl=al,l=1,2,……,v,则错误位置多项式σ(x)为v阶多项式,定义为:
其中σl(l=1,2,……,v)是错误位置多项式的系数。
出错值多项式定义为:
其中Yl是错误值,Xj是出错位置,Xj=aj。
错误位置多项式和出错值多项式满足σ(x)S(x)≡ω(x)modx2t,
由S(x)根据上式可以求出错误位置多项式σ(x)和出错值多项式ω(x)。
(3)求错误位置和错误值。
若第i个错误位置Xi=ai,则σ(Xi -1)=0。因此求错误位置就是利用Chien搜索算法,把
n-1≥i≥0依次代入,求使σ(x)=0的Xj就是出错位置。
当出错位置确定后,对应的出错值为:
其中σ′(X)是σ(X)的导数。
若σ(x)=1+σ1x+......σvxv,
则σ′(x)=σ1+2σ2x1+3σ3x2+......vσvxv-1,
系数是有限域GF(2m)上的符号,每个符号由m比特组成,符号相加对应于m个比特的模二和,两个相同的数模二和为0,所以2σ2=4σ4=......=0。所以上式可简化为:
根据求出的Xj和Yj就可以对接收码字矢量纠错,从而实现RS码的译码。
从上述编译码算法中可以看出,有限域GF(2m)上的多项式的计算是最主要的运算,其中用到大量的有限域GF(2m)上的加法和乘法。因此,有限域GF(2m)上的加法器和乘法器是设计的关键。
有限域GF(2m)上的元素可以表示成域的一组基如(am-1,am-2,......a2,a1,1)的线性组合,X=xm-1am-1+xm-2am-2+…x1a1+x0。现有的技术中,有限域GF(2m)上的元素通常用线性组合的系数表示,即
这样有限域GF(2m)上的加法器实现比较简单,将两个数逐位异或(xor)即可,Z=X+Y,zi=xiyi,0≤i≤m-1;乘法运算有查表法和非查表法两类方法。
若采用查表法,由X和Y通过查表求X*Y,记做Z=(zm-1,zm-2,…z1,z0),则地址为(xm-1,xm-2,…x1,x0,ym-1,ym-2,…y1,y0)宽2m比特,数据Z宽m比特,查找表的存储量为22m·m比特,这种方法速度快,但占用的资源多得难以接受,例如当m=8时,存储量为512k比特。
非查表法求出的积还要对本原多项式求模(除以本原多项式求余式),该方法实现的电路简单、面积小,但速度慢。
在高速通信***中,为了提高编译码速度,并使硬件复杂度较为合理,需要降低有限域GF(2m)上的运算复杂度,为此本发明改进了现有的RS码编译码算法。
具体实施方式
若设计要求信息符号数为k,每个符号m比特,可纠正的最大差错符号个数为t,则用幂次表示码元的RS码的设计具体如下:
对于编码器输入的mk个比特,每m个比特构成一个符号,共k个符号。选择一个m阶本原多项式Poly(x),设本原多项式的根为本原域元素a。和传统RS码编码相同的是仍采用多项式除法形式生成余数多项式,不同的是输入的符号表示的是传统RS码元素对应的a的幂次,并假设符号0对应于元素a的2m-1次方,用符号2m-1表示传统RS码的0元素,通过这种数学含义的改变,可以简化编译码过程中的运算。
把信息序列多项式乘以xn-k,再除以生成多项式求余数多项式。其中多项式的系数都用元素对应的a的幂次表示,运算过程中涉及的多项式及多项式系数的计算方法如下:
(1)有限域GF(2m)的乘法:
有限域GF(2m)上的两个元素X和Y相乘等于对应的两个指数的相加,即X=ax,Y=ay,Z=X·Y=az,则
(2)有限域GF(2m)的除法:
有限域GF(2m)上的两个元素X和Y相除等于对应的两个指数的相减,即X=ax,Y=ay,Z=X/Y=az,则
(3)有限域GF(2m)的加减法:
建立f(s)查找表的准备工作:两个用幂次表示的元素的加法运算不能直接计算,需要先变换到一组基的线性组合的形式,再作加法运算,最后再变换到用幂次表示的形式,因此需要求出这两种表示方法之间的映射关系。ai(i=0,1,2,…,2m-2)用基(am-1,am-2,......a2,a1,1)的线性组合表示等于ai除以本原多项式Poly(x=a)的余式,设余式为xm-1am-1+xm-2am-2+…x1a1+x0,用其系数(xm-1xm-2…x1x0)表示,系数xj(j=0,1,2,…m-1)的取值为0或1,x′=(xm-1xm-2…x1x0)2是二进制数,其取值为1到2m-1的整数。把求出的每组i和x′存储到两个长2m的查找表power[]和index[]中,查找幂次的power[x′]=i,查找系数的index[i]=x′,再令power[0]=2m-1,index[2m-1]=0。这样有限域GF(2m)上的任一元素,如果是a的i次幂,则根据查找表index[]可以查出它用基的线性组合表示的系数,反之如果其线性组合的系数是x′,根据查找表power[]可以查出它是a的几次幂。
建立函数f(s)的查找表:s取值于0到2m-1之间的所有整数,求满足af(s)=1+as的f(s),首先查表得x′=(xm-1xm-2…x1x0)2=index[s],即as=xm-1am-1+xm-2am-2+…x1a1+x0,则1+as=xm-1am-1+xm-2am-2+…x1a1+(x01),再用(xm-1xm-2…x1(x01))查出1+as对应的a的幂次即为f(s),即f(s)=power[(xm-1xm-2…x1(x01))2],把求出的s和f(s)存储到长为2m的函数f(s)查找表中,从而建立函数f(s)的查找表,此后不再需要查找表power[]和index[],因此只要按照上述方法预先求出f(s)查找表,在译码器中就只需要存储f(s)查找表。
有限域GF(2m)上的任意两个元素X和Y的差与和相等(X-Y)=(X+Y)。加减法采用查表法,X=ax,Y=ay,Z=X+Y=X-Y=az=ax+ay=ax(1+ay-x),用y-x查表得出f(y-x),即af(y-x)=1+ay-x,又因为az=ax(1+ay-x)=ax·af(y-x)=ax+f(y-x)则
(4)多项式加减法:
有限域GF(2m)上的两个多项式之差等于它们的和,所以二者算法相同。
和 则wi=ui+vi,0≤i≤N,系数是
有限域GF(2m)上的元素,加法采用(3)中所述的算法。
(5)多项式乘法:
有限域GF(2m)上的两个多项式
和
则
0≤i≤N+M,系数是有限域GF(2m)上的元素,乘法采用(1)中所述的算法,加法采用(3)中所述的算法。
(6)多项式除法取余:
有限域GF(2m)上的两个多项式相除,除法的过程和普通的多项式除法相同,不同之处在于多项式系数的运算。设
u(x)/v(x)的部分商式为 余式为r(x)=u(x)-w(x)·v(x),如果余式的阶数不低于除式的阶数,则令被除式等于余式,再次除以除式,反复此过程,直到余式的阶数低于除式的阶数为止,最后一次所得的余式为u(x)/v(x)的余式,每次所得的部分商之和为u(x)/v(x)的商式。这里的多项式相乘采用(5)中所述的算法,多项式相减采用(4)中所述的算法。
(7)求生成多项式:
生成多项式可表示为:
根据上式,采用(5)中所述的算法进行2t个多项式连乘,即可求出g(x)。
采用(1)-(6)中所述的计算方法。这样生成的码多项式的系数也是用元素对应的a的幂次表示的。设输入的信息序列为m(x)=mk-1xk-1+mk-2xk-2+......+m2x2+m1x1+m0x0,生成的码字为c(x)=cn-1xn-1+cn-2xn-2+......+c2x2+c1x1+c0x0。则编码算法为c(x)=xn-km(x)+R(x),其中R(x)=xn-k·m(x)modg(x),g(x)是RS码的生成多项式。
在译码时,多项式系数用元素对应的a的幂次表示,从而使得多项式系数及多项式的加减乘除运算可简化为(1)-(6)中所述的计算方法,其他和传统的RS码译码算法相同。
具体分为以下三步:
1.计算伴随式S(x)=S1+S2x+......+S2tx2t-1:
接收码字矢量y(x)=yn-1xn-1+yn-2xn-2+......+y2x2+y1x1+y0
j=1,2,......2t
(2)计算错误位置多项式σ(x)和出错值多项式ω(x).
由S(x)计算错误位置多项式σ(x)和出错值多项式ω(x)是译码过程中的核心问题,在现有的各种算法中,扩展欧几里得算法是其中最适合Systolic阵列处理结构硬件实现的算法。
具体如下:
I.)初始化
σ(-1)(x)=0,σ(0)(x)=1,
ω(-1)(x)=x2t,ω(0)(x)=S(x)
II.)计算
ω(i+1)(x)=ω(i-1)(x)-Q(i)(x)ω(i)(x)
σ(i+1)(x)=σ(i-1)(x)-Q(i)(x)σ(i)(x)
其中ω(i+1)的阶小于ω(i)。也就是ω(i+1)(x)是ω(i-1)(x)除以ω(i)(x)的余数多项式,而Q(i)(x)等于商多项式。
迭代运算直到i+1=j为止,j是使ω(j)的阶小于t的最小整数。
σ(x)=σ(j)(x)
ω(x)=ω(j)(x)
(3)求错误位置和错误值。
σ(x)=σeven(x2)+xσodd(x2)
其中
σeven(x2)=σ0+σ2x2+σ4x4+......
σodd(x2)=σ1+σ3x2+σ5x4+......
σ(x)=0的充要条件是x-1σeven(x2)=σodd(x2)。
把x=a-i,n-1≥i≥0依次代入,求x-1σeven(x2)和σodd(x2),其中使x-1σxeven(x2)=σodd(x2)的Xj就是出错位置。
当出错位置确定后,对应的出错值为:
根据求出的Xj和Yj就可以对接收码字矢量纠错,从而实现RS码的译码。
举例说明用幂次表示码元的RS码的编译码方法:
若RS码信息符号数为k=3,可纠正的最大差错个数为t=2,则码字符号数n=7,并给定一个3阶本原多项式Poly(x)=x3+x+1,本原元素a为本原多项式的根。
(1)建立函数f(s)查找表:
准备工作:
计算x
2a
2+x
1a
1+x
0=a
imod(Poly(x=a))=a
imod(a
3+a+1),i从0到6:
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
(x2x1x0) |
001 |
010 |
100 |
011 |
110 |
111 |
101 |
i和x′=(x
2x
1x
0)
2存储到两个长8的查找表power[]和index[]中:
i |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
index[i] |
1 |
2 |
4 |
3 |
6 |
7 |
5 |
0 |
x′ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
power[x′] | 7 | 0 | 1 | 3 | 2 | 6 | 4 | 5 |
建立函数f(s)的查找表:
例如s=4,x′=(xm-1xm-2…x1x0)2=index[s]=6=(110)2,
1+as=xm-1am-1+xm-2am-2+…x1a1+(x01)=(111)2=7,
f(s=4)=power[(xm-1xm-2…x1(x01))2]=5,
即f(4)=5。
再例如s=7,x′=(xm-1xm-2…x1x0)2=index[s]=0=(000)2,
1+as=xm-1am-1+xm-2am-2+…x1a1+(x01)=(001)2=1,
f(s=7)=power[(xm-1xm-2…x1(x01))2]=0,
即f(7)=0。
S |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
f(s) |
7 |
3 |
6 |
1 |
5 |
4 |
2 |
0 |
然后删除查找表power[]和index[],只保存f(s)的查找表。
(2)求生成多项式:
(3)编码:
设信息序列为(6,3,1)即m(x)=a6x2+a3x+a,
R(x)=xn-k·m(x)mod g(x)
=x4·(a6x2+a3x+a)mod(x4+a3x3+x2+ax+a3)
=ax3+a2x2+a3x+a2
c(x)=xn-km(x)+R(x)=a6x6+a3x5+ax4+ax3+a2x2+a3x+a2
码字序列为(6,3,1,1,2,3,2)。
(4)译码:
假设传输过程产生误码,导致接收端收到的序列为(6,3,4,1,2,3,6),则接收序列多项式为y(x)=a6x6+a3x5+a4x4+ax3+a2x2+a3x+a6。
计算伴随式S(x):
j=1,2,......2t
S2=y(a2)=(......((a6a2+a3)a2+a4)a2+a)a2+a2)a2+a3)a2+a6=a
S1=y(a)=a2,S3=y(a3)=0,S4=y(a4)=a5
所以S(x)=S1+S2x+......+S2tx2t-1=a5x3+ax+a2
计算错误位置多项式σ(x)和出错值多项式ω(x):
(I)初始化
σ(-1)(x)=0,σ(0)(x)=1,
ω(-1)(x)=x2t=x4,ω(0)(x)=S(x)=a5x3+ax+a2
(II)计算
ω(1)(x)=ω(-1)(x)-Q(0)(x)ω(0)(x)=x4mod(a5x3+ax+a2)=a3x2+a4x,其中Q(0)(x)=a2x
σ(1)(x)=σ(-1)(x)-Q(0)(x)σ(0)(x)=0-a2x·1=a2x
(III)计算
ω(2)(x)=ω(0)(x)-Q(1)(x)ω(1)(x)=(a5x3+ax+a2)mod(a3x2+a4x)=a3x+a2,其中Q(1)(x)=a2x+a3
σ(2)(x)=σ(0)(x)-Q(1)(x)σ(1)(x)=1-(a2x+a3)·a2x=a4x2+a5x+1
因为ω(2)(x)的阶小于t=2,所以结束迭代运算。
ω(x)=ω(j)(x)=a3x+a2
σ(x)=σ(j)(x)=a4x2+a5x+1
求错误位置和错误值:
σeven(x2)=σ0+σ2x2=a4x2+1
σodd(x2)=σ1=a5
把x=a-i,6≥i≥0依次代入,求使x-1σeven(x2)=σodd(x2)的Xj就是出错位置。
i=4,x=a-4,x-1σeven(x2)=a5,σodd(x2)=a5,所以X4=a4是一个出错位置。
把x=a-i,6≥i≥0依次代入,可以求出共有两个出错位置,另一个是X0=a0=1,Y0=1。从而求得错误多项式为
纠正接收多项式的错误得到译码结果:
与发送的码字多项式相同,所以译码算法正确地纠正了传输引起的错误。传统的RS码编译码器中的乘法器非常复杂,需要两个多项式相乘,再除以本原多项式取模,如果采用查表法需要地址线2m比特宽,数据m比特,存储量为22m·m。采用本方法后,大大简化了多项式的乘除法,而加法采用查表法,只需要m比特宽的地址线和数据线的查找表,存储量为2m·m,大大降低了所需的存储量。
图1为本发明所述的用幂次表示码元的RS码的编码器流程图,图2为本发明所述的用幂次表示码元的RS码的译码器流程图。
此方法可以用计算机程序完成,也可在各种可编程逻辑器件或专用集成电路中实施。一个具体的实施例子是用c程序完成的这种RS码编译码的方法。
现有技术和本发明中RS码的码元分别采用一组基的线性组合的系数和本原域元素的幂次表示,因为编译码算法的原理相同,所以二者的纠错性能相同,仿真实验的结果充分的验证了这一点。不同的是现有技术中码元相加为模二和、相乘有两种方法,一种需要复杂的乘法和对本原多项式取模,另一种需要很大的查找表,而本发明中的码元乘法可以用简单的加法实现、而码元加法用比较小的查找表实现,与现有技术中非查表乘法相比,电路中的延时减少,从而提高了编译码速度;与现有技术中查表乘法相比则降低了存储量和复杂度,例如当m=8时,此方法所需存储量仅为2k比特。