基于TMS320C54X的RS+变织+卷积的级联纠错码
2.1 RS码迭代解码的实现
RS解码分频域解码和时域解码,比较常用的解码方法是时域的迭代解码。解码的主要步骤如下:①由接收码字r(x)求出部分伴随式Si的值,若Si全为0,则输出接收码字r(x);②由伴随式Si求出σi(i=1,2,…K),确定差
错多项式σ(x);③通过搜索法得到σ(x)的根,进一步确定差错位置βi;
④由部分伴随式Si及其差错位置βi求出差错大小;⑤由差错位置和差错大小求出误码多项式e(x),计算c(x)=r(x)-e(x);⑥校验是否成立,若成立,则输出c(x),否则输出r(x)。
程序设计的关键在于域中运算的实现。对于中的乘法,可以采用指数形式表示元素,从而将相乘运算转换成相加运算。对于域中的加法,我们采用矢量形式表示,从而将加法运算转换成位异或运算。因而我们需要设计两张查找表,当遇到加法运算时,可以很方便的将元素从指数形式转换成矢量形式;遇到乘法时,可以将元素从矢量从指数形式转换成矢量形式;遇到乘法时,可以将元素从矢量形式转换成多项式形式。下面给出的是GF(2 4)域中,元素从指数形式转换矢量形式查表Alpha_to,由矢量形式转换成指数形式查表Index_of,其中域的生成多项式是g(x)=x5+x2+1。
Int Index_of[]={-1,31,1,18,2,5,19,11,3,29,6,27,20,8,12,23,4,10,30,17,7,22,28,26,21,25,9,16,13,14,24,15};
Int Alpha_to[]={1,2,4,8,16,5,10,20,13,26,17,7,14,28,29,31,27,19,3,6,12,24,21,15,30,25,23,11,22,9,18,1};
由上面我们可以很方便地进行运算,例如伴随式的计算程序如下:
for(j=0;j<NN;j++)
if(recd[j]!=0) s[i]^=Alpha_to[(Index_of[j])+i*j]]+i*j)%NN];其中recd[]存储的是Yi的值。是域中的本原元。
2.2 卷积码Viterbi解码的实现
Viterbi解码算法是一种最大似然算法,它不是在网格图上依次比较所有可能的路径,而是接收一段,计算、比较一段,保留最有可能的路径,从而达到整个码序列是一个最大似然序列。虽然如此,Viterbi解码算法的运算量还是巨大的,而且随着卷积码结束长度的增大成几何级数增长。
2.2 卷积码Viterbi解码的实现
Viterbi解码算法是一种最大似然算法,它不是在网络图上依次比较所有可能的路径,而是接收一段,计算,比较一段,保留最有可能的路径,从而达到整个码序列是一个最大似然序列。虽然如此,Viterbi解码算法的运算量还是巨大的,而且随着卷积码约束长度的增大成几何级数增长。因而如何减少运算量,尽可能的采用结束长度长的码,成为Viterbi解码程序设计的关键。54X系列DSP中的结构和指令系统,通过精巧的算法和编程,可以使Viterbi解码快速实现。许多卷积码网络图中存在蝶形结构,因而可以利用DSP的相加、比较和存储单元(ACS)快速地实现蝶形运算。DSP的双字节指令,可以在个周期内进行单字节加减运算。指令系统包括单寻址重复和块指令重复操作。总之,通过充分利用DSP芯片的特点进行编程,可以达到较快的速度。蝶形单元运算的宏编程如下:
BFLY_DIR .macro
DADST *AR5,A ;A=Old_
《基于TMS320C54X的RS+变织+卷积的级联纠错码(第2页)》