Bill Yi | 4e213d5 | 2015-06-23 13:53:11 -0700 | [diff] [blame] | 1 | /* The guts of the Reed-Solomon encoder, meant to be #included |
| 2 | * into a function body with the following typedefs, macros and variables supplied |
| 3 | * according to the code parameters: |
| 4 | |
| 5 | * data_t - a typedef for the data symbol |
| 6 | * data_t data[] - array of NN-NROOTS-PAD and type data_t to be encoded |
| 7 | * data_t parity[] - an array of NROOTS and type data_t to be written with parity symbols |
| 8 | * NROOTS - the number of roots in the RS code generator polynomial, |
| 9 | * which is the same as the number of parity symbols in a block. |
| 10 | Integer variable or literal. |
| 11 | * |
| 12 | * NN - the total number of symbols in a RS block. Integer variable or literal. |
| 13 | * PAD - the number of pad symbols in a block. Integer variable or literal. |
| 14 | * ALPHA_TO - The address of an array of NN elements to convert Galois field |
| 15 | * elements in index (log) form to polynomial form. Read only. |
| 16 | * INDEX_OF - The address of an array of NN elements to convert Galois field |
| 17 | * elements in polynomial form to index (log) form. Read only. |
| 18 | * MODNN - a function to reduce its argument modulo NN. May be inline or a macro. |
| 19 | * GENPOLY - an array of NROOTS+1 elements containing the generator polynomial in index form |
| 20 | |
| 21 | * The memset() and memmove() functions are used. The appropriate header |
| 22 | * file declaring these functions (usually <string.h>) must be included by the calling |
| 23 | * program. |
| 24 | |
| 25 | * Copyright 2004, Phil Karn, KA9Q |
| 26 | * May be used under the terms of the GNU Lesser General Public License (LGPL) |
| 27 | */ |
| 28 | |
| 29 | |
| 30 | #undef A0 |
| 31 | #define A0 (NN) /* Special reserved value encoding zero in index form */ |
| 32 | |
| 33 | { |
| 34 | int i, j; |
| 35 | data_t feedback; |
| 36 | |
| 37 | memset(parity,0,NROOTS*sizeof(data_t)); |
| 38 | |
| 39 | for(i=0;i<NN-NROOTS-PAD;i++){ |
| 40 | feedback = INDEX_OF[data[i] ^ parity[0]]; |
| 41 | if(feedback != A0){ /* feedback term is non-zero */ |
| 42 | #ifdef UNNORMALIZED |
| 43 | /* This line is unnecessary when GENPOLY[NROOTS] is unity, as it must |
| 44 | * always be for the polynomials constructed by init_rs() |
| 45 | */ |
| 46 | feedback = MODNN(NN - GENPOLY[NROOTS] + feedback); |
| 47 | #endif |
| 48 | for(j=1;j<NROOTS;j++) |
| 49 | parity[j] ^= ALPHA_TO[MODNN(feedback + GENPOLY[NROOTS-j])]; |
| 50 | } |
| 51 | /* Shift */ |
| 52 | memmove(&parity[0],&parity[1],sizeof(data_t)*(NROOTS-1)); |
| 53 | if(feedback != A0) |
| 54 | parity[NROOTS-1] = ALPHA_TO[MODNN(feedback + GENPOLY[0])]; |
| 55 | else |
| 56 | parity[NROOTS-1] = 0; |
| 57 | } |
| 58 | } |