RS编码

RS 码是一类纠错能力很强的多进制BCH 码,由于采用了q 进制,所以它是多进制调制时的自然和方便的编码手段。因为RS 码能够纠正t 个q 位二进制码,即 可以纠正≤q 位二进制错误(当然,对于 q 位二进制码中分散的单个错误也能被纠正),所以适合于在衰落信道中使用,以 克服突发性差错。另外RS 码也被应用在计算机存储系统中,以克服这系统中存在的差错串。

RS编码过程:

(1)得到RS码的生成多项式g(x)
  (2)用信息码多项式 m(x)除以生成多项式 g(x),所得余式 r(x)为监督码多项式,将 监督码多项式r(x)置于信息码多项式之后,形成RS 码。

GF(2m)域中计算,码字长度:n=2m-1,纠错能力:t=(n-k)/2

matlab相应函数:

1)rsgenpoly:

Generator polynomial of Reed-Solomon code

genpoly = rsgenpoly(n,k,prim_poly)

genpoly = rsgenpoly(n,k,prim_poly) returns the narrow-sense generator polynomial of a Reed-Solomon code with codeword length n and message length k. The codeword length n must have the form 2m-1 for some integer m, and n-k must be an even integer. The output genpoly is a Galois row vector that represents the coefficients of the generator polynomial in order of descending powers. The narrow-sense generator polynomial is (X - A1)(X - A2)...(X - A2t) where A is a root of the default primitive polynomial for the field GF(n+1) and t is the code's error-correction capability, (n-k)/2. prim_poly is an integer whose binary representation indicates the coefficients of the primitive polynomial. To use the default primitive polynomial GF(n+1), set prim_poly to [].If prim_poly specifies the primitive polynomial for GF(n+1) that has A as a root.

The examples below create Galois row vectors that represent generator polynomials for a [7,3] Reed-Solomon code. The vectors g and g2 both represent the narrow-sense generator polynomial, but with respect to different primitive elements A. More specifically, g2 is defined such that A is a root of the primitive polynomial D3 + D2 + 1 for GF(8), not of the default primitive polynomial D3 + D + 1. The vector g3 represents the generator polynomial (X - A3)(X - A4)(X - A5)(X - A6), where A is a root of D3 + D2 + 1 in GF(8).

2)primpoly

Finding Primitive Polynomials

You can use the primpoly function to find primitive polynomials for GF(2^m) and the isprimitive function to determine whether a polynomial is primitive for GF(2^m). The code below illustrates.

m = 4;

allprimpolys = primpoly(m,'all') % All primitive polys for GF(16)

i1 = isprimitive(25) % Can 25 be the prim_poly input in gf(...)?

function [alpha_to,index_of]=gen_galois()
clc
m=8;
n=2^m-1;
p=de2bi(285);
%p=[1 0 1 0 0 1];
alpha_to=zeros(1,2^m);
mask=1;
alpha_to(m+1)=0;
for i=1:m
alpha_to(i)=mask;
if(p(i)~=0)
 alpha_to(m+1)=bitxor(alpha_to(m+1),mask);
end
mask=mask*2;
end
mask=alpha_to(m);
for i=m+2:n
  if(alpha_to(i-1)>=mask)
  alpha_to(i)=bitxor(alpha_to(m+1),bitxor(alpha_to(i-1),mask)*2);
else
alpha_to(i)=alpha_to(i-1)*2;
end
end
alpha_to(2^m)=0;
 
index_of=zeros(1,2^m);
for i=1:2^m-1
  index_of(alpha_to(i))=i-1;
end
a=3;
b=27;
y=rs_mul(a,b,m,alpha_to,index_of)
ya=rs_add(a,b,m)
 
function y=rs_mul(a,b,m,alpha_to,index_of)
if a*b==0
   y=0;
else
   a1=index_of(a);
   b1=index_of(b);
   c=mod((a1+b1),(2^m-1));
   y=alpha_to(c+1);
end
 
 
function y=rs_add(a,b,m)
a1=de2bi(a,m);
b1=de2bi(b,m);
y1=bitxor(a1,b1);
y=bi2de(y1);
posted @ 2018-06-21 15:25  tck  阅读(5690)  评论(0编辑  收藏  举报