kopia lustrzana https://github.com/rs1729/RS
ECC: BCH/Reed-Solomon
rodzic
5e8a95ef4d
commit
b14c733ee3
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue