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 ui8_t f256FF = 0x1D;
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 {
while (d && !(p & (1<<d))) d--; /* d<8, 1L = 1 */
while (d && !(p & (1<<d))) d--; // d<8, 1L = 1
}
return d;
}
@ -179,27 +180,27 @@ static ui8_t gf256_mul(ui8_t p, ui8_t q) {
int i, m = gf256_deg(q);
if (q & 1) h = p;
for (i = 0; i < m; i++) {
if (gf256_deg(p) == 7) /* deg(f256)-1 = 7 */
p = (p << 1) ^ f256FF; /* p = p * X - f256FF */
else p = (p << 1); /* p = p * X */
if (gf256_deg(p) == 7) // deg(f256)-1 = 7
p = (p << 1) ^ f256FF; // p = p * X - f256FF
else p = (p << 1); // p = p * X
q >>= 1;
if (q & 1) h ^= p; /* q_{i+1} > 0 ? */
if (q & 1) h ^= p; // q_{i+1} > 0 ?
}
return h;
}
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;
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; }
else {
deg_p = gf256_deg(p);
if (p == 0) {
p = f256FF; /* (ui8_t) f256 = f256 & 0xFF = f256FF */
deg_p = 8; /* deg(f256) = 8 */
p = f256FF; // (ui8_t) f256 = f256 & 0xFF = f256FF
deg_p = 8; // deg(f256) = 8
}
while (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;
}
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;
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;
rem1 = a;
rem2 = 0; /* = f256 */
rem2 = 0; // = f256
aux1 = 0x1;
aux2 = 0x0;
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) {
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;
rem1 = rem;
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;
}
*/
/* --------------------------------------------------------------------------------------------- */
/*
// 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,
0x3, 0xE, 0x9, 0x7, 0x6, 0xD, 0xB, 0xC};
*/
/* --------------------------------------------------------------------------------------------- */
static ui8_t GF_mul(ui8_t p, ui8_t q) {
ui32_t x;
if ((p == 0) || (q == 0)) return 0;
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) {
if (p == 0) return 0; /* DIV_BY_ZERO */
return exp_a[GF.ord-1-log_a[p]]; /* a^(ord-1) = 1 */
if (p == 0) return 0; // DIV_BY_ZERO
return exp_a[GF.ord-1-log_a[p]]; // a^(ord-1) = 1
}
/* --------------------------------------------------------------------------------------------- */
@ -400,14 +404,14 @@ int poly_deg(ui8_t p[]) {
static
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 i; /* deg(r) < deg(q) */
int deg_p, deg_q; // p(x) = q(x)d(x) + r(x)
int i; // deg(r) < deg(q)
ui8_t c;
deg_p = poly_deg(p);
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++) 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;
}