分享

Reed-Solomon Code

 angie&flora 2005-08-29
Maple 7 Worksheet PostScript

Reed-Solomon Code

Michal Mnuk (mnuk@in.)

Parameter s=3, t=1, d.h. 2 Fehler (max. 6 bits) erkennen und 1 Fehler (max. 3 Bits) korrigieren.

> ### WARNING: persistent store makes one-argument readlib obsolete
readlib(GF):

> p := x^3+x+1: K := GF(2,3,p):

> evalGF := proc (expr)
sort(collect(expand(Rem(expr, p, x) mod 2), z), [z,x]) end:

> K[isPrimitiveElement](K[ConvertIn](x));

true

Nachricht: 7, 6, 1, 5, 0

> m := [[1,1,1],[1,1,0],[0,0,1],[1,0,1], [0,0,0]];

m := [[1, 1, 1], [1, 1, 0], [0, 0, 1], [1, 0, 1], [...

> mGF := [x^2+x+1, x^2+x, 1, x^2+1, 0];

mGF := [x^2+x+1, x^2+x, 1, x^2+1, 0]

> g := z -> Rem((z-x)*(z-x^2), p, x) mod 2;

g := proc (z) options operator, arrow; `mod`(Rem((z...

> sort(collect(expand(g(z)),z),[z,x]);

z^2+(x^2+x)*z+x+1

Codierung

> c :=collect(expand(Rem(g(z)*add(mGF[i]*z^(5-i), i=1..5), p, x) mod 2), z);

c := (x^2+x+1)*z^6+x*z^5+z^4+x*z^3+z*x^2

> evalGF(subs(z=x, c));

0

> evalGF(subs(z=x^2, c));

0

W鋒rend der 躡ertragung sind 2 Fehler passiert (x+1 -> x bei z^6, 0 -> 1 bei z^2).

> c;

(x^2+x+1)*z^6+x*z^5+z^4+x*z^3+z*x^2

> ce := evalGF(c+(z^6+z^2));

ce := (x^2+x)*z^6+z^5*x+z^4+z^3*x+z*x^2+z^2

Durch Auswertung an den Stellen x und x^2 wird der Fehler erkannt.

> evalGF(subs(z=x, ce));
evalGF(subs(z=x^2, ce));

1

1

Ein anderes Codewort, das sich an 3(!) Stellen von c unterscheidet.

> evalGF(c+g(z));

(x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z^2+z*x+x+1

> c;

(x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z*x^2

> evalGF(subs(z=x, c+g(z)));
evalGF(subs(z=x^2, c+g(z)));

0

0

Falls h鯿hstens 1 Fehler passiert ist, kann das gesendete Wort hergestellt werden.

Wort mit Fehlern empfangen.

> ce1 := evalGF(c+(x^2+x)*z^2);

ce1 := (x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z*x^2+(x^2+x)*...

> c;

(x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z*x^2

Wir bestimmen zun鋍hst die Restklasse vom empfangenen Wort mod g(z)

> e := evalGF(Rem(ce1, g(z), z) mod 2);

e := z*x+1

... und bestimmen denjenigen Repr鋝entanten dieser Restklasse, der die kleinste Anzahl

der von Null verschiedenen Koeffizienten hat.

> evalGF(e);

z*x+1

> evalGF(e+(x^2+x)*g(z));

(x^2+x)*z^2

Dieses Element wird zum empfangenen Wort addiert. Das Ergebnis ist das gesendete Wort.

> evalGF(ce1+e+(x^2+x)*g(z));

(x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z*x^2

> c;

(x^2+x+1)*z^6+z^5*x+z^4+z^3*x+z*x^2

Decodierung

Teilen durch g(z)

> evalGF(Quo(c,g(z), z) mod 2);

(x^2+x+1)*z^4+(x^2+x)*z^3+z^2+(x^2+1)*z

Die urspr黱gliche Nachricht wird aus den Koeffizienten bei Potenzen von z abgelesen:

Koeffizient bei z^4 : x^2 +x+1 -> 1,1,1 (bin鋜)-> 7 (dezimal)

Koeffizient bei z^3 : x^2 +x -> 1,1,0 -> 6

Koeffizient bei z^2 : 1

Koeffizient bei z : x^2+1 -> 1,0,1 -> 5

Koeffizient bei z^0 : 0

=> Nachricht: 7, 6, 1, 5, 0

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多