ECC: BCH/Reed-Solomon

dump
Zilog80 2016-12-18 22:13:25 +01:00
rodzic 5e8a95ef4d
commit b14c733ee3
1 zmienionych plików z 924 dodań i 922 usunięć

Wyświetl plik

@ -160,16 +160,17 @@ int GF_genTab(GF_t gf, ui8_t expa[], ui8_t loga[]) {
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/*
static ui32_t f256 = 0x11D; static ui32_t f256 = 0x11D;
static ui8_t f256FF = 0x1D; static ui8_t f256FF = 0x1D;
static int gf256_deg(ui8_t p) { static int gf256_deg(ui8_t p) {
int d = 7; /* sizeof(p)*8 - 1 = 7 fuer ui8_t */ int d = 7; // sizeof(p)*8 - 1 = 7 fuer ui8_t
if (p == 0) return -0xFF; /* deg(0) = -infty */ if (p == 0) return -0xFF; // deg(0) = -infty
else { else {
while (d && !(p & (1<<d))) d--; /* d<8, 1L = 1 */ while (d && !(p & (1<<d))) d--; // d<8, 1L = 1
} }
return d; return d;
} }
@ -179,27 +180,27 @@ static ui8_t gf256_mul(ui8_t p, ui8_t q) {
int i, m = gf256_deg(q); int i, m = gf256_deg(q);
if (q & 1) h = p; if (q & 1) h = p;
for (i = 0; i < m; i++) { for (i = 0; i < m; i++) {
if (gf256_deg(p) == 7) /* deg(f256)-1 = 7 */ if (gf256_deg(p) == 7) // deg(f256)-1 = 7
p = (p << 1) ^ f256FF; /* p = p * X - f256FF */ p = (p << 1) ^ f256FF; // p = p * X - f256FF
else p = (p << 1); /* p = p * X */ else p = (p << 1); // p = p * X
q >>= 1; q >>= 1;
if (q & 1) h ^= p; /* q_{i+1} > 0 ? */ if (q & 1) h ^= p; // q_{i+1} > 0 ?
} }
return h; return h;
} }
static int gf256_divmod(ui8_t p, ui8_t q, ui8_t *s, ui8_t *r) { static int gf256_divmod(ui8_t p, ui8_t q, ui8_t *s, ui8_t *r) {
int deg_p, deg_q = gf256_deg(q); /* p = s*q + r */ int deg_p, deg_q = gf256_deg(q); // p = s*q + r
*s = 0; *s = 0;
if (q == 0) { *s = -1; *r = -1; return -1; /* DIV_BY_ZERO */ } if (q == 0) { *s = -1; *r = -1; return -1;} // DIV_BY_ZERO
if (q == 1) { *s = p; *r = 0; } if (q == 1) { *s = p; *r = 0; }
else { else {
deg_p = gf256_deg(p); deg_p = gf256_deg(p);
if (p == 0) { if (p == 0) {
p = f256FF; /* (ui8_t) f256 = f256 & 0xFF = f256FF */ p = f256FF; // (ui8_t) f256 = f256 & 0xFF = f256FF
deg_p = 8; /* deg(f256) = 8 */ deg_p = 8; // deg(f256) = 8
} }
while (deg_p >= deg_q) { while (deg_p >= deg_q) {
*s |= 1 << (deg_p-deg_q); *s |= 1 << (deg_p-deg_q);
@ -211,14 +212,14 @@ static int gf256_divmod(ui8_t p, ui8_t q, ui8_t *s, ui8_t *r) {
return 0; return 0;
} }
static ui8_t gf256_inv(ui8_t a) { /* 1 = x*a + y*f , ggT(a, f) = 1 */ static ui8_t gf256_inv(ui8_t a) { // 1 = x*a + y*f , ggT(a, f) = 1
ui8_t rem, rem1, rem2, aux, aux1, aux2, quo; ui8_t rem, rem1, rem2, aux, aux1, aux2, quo;
if (a == 0) return 0; /* nicht definiert; DIV_BY_ZERO */ if (a == 0) return 0; // nicht definiert; DIV_BY_ZERO
if (a == 1) return 1; if (a == 1) return 1;
rem1 = a; rem1 = a;
rem2 = 0; /* = f256 */ rem2 = 0; // = f256
aux1 = 0x1; aux1 = 0x1;
aux2 = 0x0; aux2 = 0x0;
rem = rem1; rem = rem1;
@ -226,7 +227,7 @@ static ui8_t gf256_inv(ui8_t a) { /* 1 = x*a + y*f , ggT(a, f) = 1 */
while (rem > 0x1) { while (rem > 0x1) {
gf256_divmod(rem2, rem1, &quo, &rem); gf256_divmod(rem2, rem1, &quo, &rem);
aux = gf256_mul(quo, aux1) ^ aux2; /* aux = aux2 - quo*aux1 */ aux = gf256_mul(quo, aux1) ^ aux2; // aux = aux2 - quo*aux1
rem2 = rem1; rem2 = rem1;
rem1 = rem; rem1 = rem;
aux2 = aux1; aux2 = aux1;
@ -234,8 +235,10 @@ static ui8_t gf256_inv(ui8_t a) { /* 1 = x*a + y*f , ggT(a, f) = 1 */
} }
return aux; return aux;
} }
*/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
/*
// F2[X] mod X^8 + X^4 + X^3 + X + 1 // F2[X] mod X^8 + X^4 + X^3 + X + 1
@ -343,18 +346,19 @@ static ui8_t log16[16] = {
-00, 0x0, 0x1, 0x4, 0x2, 0x8, 0x5, 0xA, -00, 0x0, 0x1, 0x4, 0x2, 0x8, 0x5, 0xA,
0x3, 0xE, 0x9, 0x7, 0x6, 0xD, 0xB, 0xC}; 0x3, 0xE, 0x9, 0x7, 0x6, 0xD, 0xB, 0xC};
*/
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
static ui8_t GF_mul(ui8_t p, ui8_t q) { static ui8_t GF_mul(ui8_t p, ui8_t q) {
ui32_t x; ui32_t x;
if ((p == 0) || (q == 0)) return 0; if ((p == 0) || (q == 0)) return 0;
x = (ui32_t)log_a[p] + log_a[q]; x = (ui32_t)log_a[p] + log_a[q];
return exp_a[x % (GF.ord-1)]; /* a^(ord-1) = 1 */ return exp_a[x % (GF.ord-1)]; // a^(ord-1) = 1
} }
static ui8_t GF_inv(ui8_t p) { static ui8_t GF_inv(ui8_t p) {
if (p == 0) return 0; /* DIV_BY_ZERO */ if (p == 0) return 0; // DIV_BY_ZERO
return exp_a[GF.ord-1-log_a[p]]; /* a^(ord-1) = 1 */ return exp_a[GF.ord-1-log_a[p]]; // a^(ord-1) = 1
} }
/* --------------------------------------------------------------------------------------------- */ /* --------------------------------------------------------------------------------------------- */
@ -400,14 +404,14 @@ int poly_deg(ui8_t p[]) {
static static
int poly_divmod(ui8_t p[], ui8_t q[], ui8_t *d, ui8_t *r) { int poly_divmod(ui8_t p[], ui8_t q[], ui8_t *d, ui8_t *r) {
int deg_p, deg_q; /* p(x) = q(x)d(x) + r(x) */ int deg_p, deg_q; // p(x) = q(x)d(x) + r(x)
int i; /* deg(r) < deg(q) */ int i; // deg(r) < deg(q)
ui8_t c; ui8_t c;
deg_p = poly_deg(p); deg_p = poly_deg(p);
deg_q = poly_deg(q); deg_q = poly_deg(q);
if (deg_q < 0) return -1; /* DIV_BY_ZERO */ if (deg_q < 0) return -1; // DIV_BY_ZERO
for (i = 0; i <= MAX_DEG; i++) d[i] = 0; for (i = 0; i <= MAX_DEG; i++) d[i] = 0;
for (i = 0; i <= MAX_DEG; i++) r[i] = 0; for (i = 0; i <= MAX_DEG; i++) r[i] = 0;
@ -918,5 +922,3 @@ int rs_decode_bch_gf2t2(ui8_t cw[], ui8_t *err_pos, ui8_t *err_val) {
return errors; return errors;
} }