From 09e514732788d821189c59ddc58e70355ba1a3cb Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Mon, 23 Sep 2019 20:09:39 +0200 Subject: Add code from common repository --- src/fec/decode_rs.h | 298 ---------------------------------------------------- 1 file changed, 298 deletions(-) delete mode 100644 src/fec/decode_rs.h (limited to 'src/fec/decode_rs.h') diff --git a/src/fec/decode_rs.h b/src/fec/decode_rs.h deleted file mode 100644 index c165cf3..0000000 --- a/src/fec/decode_rs.h +++ /dev/null @@ -1,298 +0,0 @@ -/* The guts of the Reed-Solomon decoder, meant to be #included - * into a function body with the following typedefs, macros and variables supplied - * according to the code parameters: - - * data_t - a typedef for the data symbol - * data_t data[] - array of NN data and parity symbols to be corrected in place - * retval - an integer lvalue into which the decoder's return code is written - * NROOTS - the number of roots in the RS code generator polynomial, - * which is the same as the number of parity symbols in a block. - Integer variable or literal. - * NN - the total number of symbols in a RS block. Integer variable or literal. - * PAD - the number of pad symbols in a block. Integer variable or literal. - * ALPHA_TO - The address of an array of NN elements to convert Galois field - * elements in index (log) form to polynomial form. Read only. - * INDEX_OF - The address of an array of NN elements to convert Galois field - * elements in polynomial form to index (log) form. Read only. - * MODNN - a function to reduce its argument modulo NN. May be inline or a macro. - * FCR - An integer literal or variable specifying the first consecutive root of the - * Reed-Solomon generator polynomial. Integer variable or literal. - * PRIM - The primitive root of the generator poly. Integer variable or literal. - * DEBUG - If set to 1 or more, do various internal consistency checking. Leave this - * undefined for production code - - * The memset(), memmove(), and memcpy() functions are used. The appropriate header - * file declaring these functions (usually ) must be included by the calling - * program. - */ - - -#if !defined(NROOTS) -#error "NROOTS not defined" -#endif - -#if !defined(NN) -#error "NN not defined" -#endif - -#if !defined(PAD) -#error "PAD not defined" -#endif - -#if !defined(ALPHA_TO) -#error "ALPHA_TO not defined" -#endif - -#if !defined(INDEX_OF) -#error "INDEX_OF not defined" -#endif - -#if !defined(MODNN) -#error "MODNN not defined" -#endif - -#if !defined(FCR) -#error "FCR not defined" -#endif - -#if !defined(PRIM) -#error "PRIM not defined" -#endif - -#if !defined(NULL) -#define NULL ((void *)0) -#endif - -#undef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#undef A0 -#define A0 (NN) - -{ - int deg_lambda, el, deg_omega; - int i, j, r,k; - data_t u,q,tmp,num1,num2,den,discr_r; - data_t lambda[NROOTS+1], s[NROOTS]; /* Err+Eras Locator poly - * and syndrome poly */ - data_t b[NROOTS+1], t[NROOTS+1], omega[NROOTS+1]; - data_t root[NROOTS], reg[NROOTS+1], loc[NROOTS]; - int syn_error, count; - - /* form the syndromes; i.e., evaluate data(x) at roots of g(x) */ - for(i=0;i 0) { - /* Init lambda to be the erasure locator polynomial */ - lambda[1] = ALPHA_TO[MODNN(PRIM*(NN-1-eras_pos[0]))]; - for (i = 1; i < no_eras; i++) { - u = MODNN(PRIM*(NN-1-eras_pos[i])); - for (j = i+1; j > 0; j--) { - tmp = INDEX_OF[lambda[j - 1]]; - if(tmp != A0) - lambda[j] ^= ALPHA_TO[MODNN(u + tmp)]; - } - } - -#if DEBUG >= 1 - /* Test code that verifies the erasure locator polynomial just constructed - Needed only for decoder debugging. */ - - /* find roots of the erasure location polynomial */ - for(i=1;i<=no_eras;i++) - reg[i] = INDEX_OF[lambda[i]]; - - count = 0; - for (i = 1,k=IPRIM-1; i <= NN; i++,k = MODNN(k+IPRIM)) { - q = 1; - for (j = 1; j <= no_eras; j++) - if (reg[j] != A0) { - reg[j] = MODNN(reg[j] + j); - q ^= ALPHA_TO[reg[j]]; - } - if (q != 0) - continue; - /* store root and error location number indices */ - root[count] = i; - loc[count] = k; - count++; - } - if (count != no_eras) { - printf("count = %d no_eras = %d\n lambda(x) is WRONG\n",count,no_eras); - count = -1; - goto finish; - } -#if DEBUG >= 2 - printf("\n Erasure positions as determined by roots of Eras Loc Poly:\n"); - for (i = 0; i < count; i++) - printf("%d ", loc[i]); - printf("\n"); -#endif -#endif - } - for(i=0;i 0; j--){ - if (reg[j] != A0) { - reg[j] = MODNN(reg[j] + j); - q ^= ALPHA_TO[reg[j]]; - } - } - if (q != 0) - continue; /* Not a root */ - /* store root (index-form) and error location number */ -#if DEBUG>=2 - printf("count %d root %d loc %d\n",count,i,k); -#endif - root[count] = i; - loc[count] = k; - /* If we've already found max possible roots, - * abort the search to save time - */ - if(++count == deg_lambda) - break; - } - if (deg_lambda != count) { - /* - * deg(lambda) unequal to number of roots => uncorrectable - * error detected - */ - count = -1; - goto finish; - } - /* - * Compute err+eras evaluator poly omega(x) = s(x)*lambda(x) (modulo - * x**NROOTS). in index form. Also find deg(omega). - */ - deg_omega = deg_lambda-1; - for (i = 0; i <= deg_omega;i++){ - tmp = 0; - for(j=i;j >= 0; j--){ - if ((s[i - j] != A0) && (lambda[j] != A0)) - tmp ^= ALPHA_TO[MODNN(s[i - j] + lambda[j])]; - } - omega[i] = INDEX_OF[tmp]; - } - - /* - * Compute error values in poly-form. num1 = omega(inv(X(l))), num2 = - * inv(X(l))**(FCR-1) and den = lambda_pr(inv(X(l))) all in poly-form - */ - for (j = count-1; j >=0; j--) { - num1 = 0; - for (i = deg_omega; i >= 0; i--) { - if (omega[i] != A0) - num1 ^= ALPHA_TO[MODNN(omega[i] + i * root[j])]; - } - num2 = ALPHA_TO[MODNN(root[j] * (FCR - 1) + NN)]; - den = 0; - - /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ - for (i = MIN(deg_lambda,NROOTS-1) & ~1; i >= 0; i -=2) { - if(lambda[i+1] != A0) - den ^= ALPHA_TO[MODNN(lambda[i+1] + i * root[j])]; - } -#if DEBUG >= 1 - if (den == 0) { - printf("\n ERROR: denominator = 0\n"); - count = -1; - goto finish; - } -#endif - /* Apply error to data */ - if (num1 != 0 && loc[j] >= PAD) { - data[loc[j]-PAD] ^= ALPHA_TO[MODNN(INDEX_OF[num1] + INDEX_OF[num2] + NN - INDEX_OF[den])]; - } - } - finish: - if(eras_pos != NULL){ - for(i=0;i