Main Page | Class List | File List | Class Members | File Members

golay.c File Reference

#include <stdio.h>

Go to the source code of this file.

Defines

#define X22   0x00400000
#define X11   0x00000800
#define MASK12   0xfffff800
#define GENPOL   0x00000c75

Functions

long arr2int (int *a, int r)
void nextcomb (int n, int r, int *a)
long get_syndrome (long pattern)
void gen_enc_table (void)
void gen_dec_table (void)
long encode_golay (long data)
long decode_golay (long codeword)

Variables

long pattern
long encoding_table [4096]
long decoding_table [2048]
long data
long codeword
long recd
long position [23]
long numerr
long errpos [23]
long decerror = 0
int a [4]
int debug


Define Documentation

#define GENPOL   0x00000c75
 

Definition at line 55 of file golay.c.

#define MASK12   0xfffff800
 

Definition at line 54 of file golay.c.

#define X11   0x00000800
 

Definition at line 53 of file golay.c.

#define X22   0x00400000
 

Definition at line 52 of file golay.c.


Function Documentation

long arr2int int *  a,
int  r
 

Definition at line 84 of file golay.c.

References a.

Referenced by gen_dec_table().

00087                                              {i=1}^r 2^{a[i]-1}.
00088  */
00089 {
00090    int i;
00091    long mul, result = 0, temp;
00092  
00093    for (i=1; i<=r; i++) {
00094       mul = 1;
00095       temp = a[i]-1;
00096       while (temp--)
00097          mul = mul << 1;
00098       result += mul;
00099       }
00100    return(result);
00101 }

long decode_golay long  codeword  ) 
 

Definition at line 232 of file golay.c.

References codeword, decoding_table, gen_dec_table(), and get_syndrome().

Referenced by deconstruct_header_level2().

00233 {
00234 /*
00235  * decodes codeword and returns the dataword contained within.  
00236  * 
00237  * note: no detection is done here!
00238  * codeword is assumed to contain the 23 bits in the LSB positions
00239  * the returned bits contain the bits in the LSB positions
00240  * 
00241  * MSB will be ignored, since this is 23,12 code.
00242  */
00243    static int initialized=0;
00244 
00245    if (!initialized) {
00246        gen_dec_table();
00247        initialized=1;
00248    }
00249 
00250    if (debug) {
00251        printf("decode_golay() - codeword =  %#012x\n", codeword);
00252        printf("decode_golay() - syndrome =  %#012x\n", get_syndrome(codeword));
00253    }
00254 
00255    /*
00256     * Calculate the syndrome, look up the corresponding error pattern and
00257     * add it to the received vector.
00258     */
00259    codeword ^= decoding_table[get_syndrome(codeword)];
00260    
00261    if (debug) {
00262      printf("decoded vector =  %#012x\n", codeword);
00263      printf("recovered data =  %#012x\n", (codeword>>11));
00264    }
00265    return codeword >> 11;
00266 }

long encode_golay long  data  ) 
 

Definition at line 213 of file golay.c.

References codeword, encoding_table, and gen_enc_table().

Referenced by construct_header_level2().

00214 {
00215 /*
00216  * encodes data and returns the codeword.  
00217  * data is assumed to contain 12 bits in the least significant bit positions
00218  * codeword contains the 23 bits in the LSB positions
00219  * 
00220  */
00221     static int initialized=0;
00222 
00223     if (!initialized) {
00224         gen_enc_table();
00225         initialized=1;
00226     }
00227     codeword = encoding_table[data];
00228     if (debug) printf("encode_golay() - codeword =        %#012x\n", codeword);
00229     return codeword;
00230 }

void gen_dec_table void   ) 
 

Definition at line 164 of file golay.c.

References a, arr2int(), decoding_table, get_syndrome(), and nextcomb().

Referenced by decode_golay().

00165 {
00166    /*
00167     * ---------------------------------------------------------------------
00168     *                  Generate DECODING TABLE
00169     *
00170     * An entry to the decoding table is a syndrome and the resulting value
00171     * is the most likely error pattern. First an error pattern is generated.
00172     * Then its syndrome is calculated and used as a pointer to the table
00173     * where the error pattern value is stored.
00174     * --------------------------------------------------------------------- 
00175     *            
00176     * (1) Error patterns of WEIGHT 1 (SINGLE ERRORS)
00177     */
00178     long temp;
00179     int i;
00180 
00181     decoding_table[0] = 0;
00182     decoding_table[1] = 1;
00183     temp = 1; 
00184     for (i=2; i<= 23; i++) {
00185         temp *= 2;
00186         decoding_table[get_syndrome(temp)] = temp;
00187         }
00188    /*            
00189     * (2) Error patterns of WEIGHT 2 (DOUBLE ERRORS)
00190     */
00191     a[1] = 1; a[2] = 2;
00192     temp = arr2int(a,2);
00193     decoding_table[get_syndrome(temp)] = temp;
00194     for (i=1; i<253; i++) {
00195         nextcomb(23,2,a);
00196         temp = arr2int(a,2);
00197         decoding_table[get_syndrome(temp)] = temp;
00198         }
00199    /*            
00200     * (3) Error patterns of WEIGHT 3 (TRIPLE ERRORS)
00201     */
00202     a[1] = 1; a[2] = 2; a[3] = 3;
00203     temp = arr2int(a,3);
00204     decoding_table[get_syndrome(temp)] = temp;
00205     for (i=1; i<1771; i++) {
00206         nextcomb(23,3,a);
00207         temp = arr2int(a,3);
00208         decoding_table[get_syndrome(temp)] = temp;
00209         }
00210 }

void gen_enc_table void   ) 
 

Definition at line 143 of file golay.c.

References encoding_table, get_syndrome(), and pattern.

Referenced by encode_golay().

00144 {
00145    /*
00146     * ---------------------------------------------------------------------
00147     *                  Generate ENCODING TABLE
00148     *
00149     * An entry to the table is an information vector, a 32-bit integer,
00150     * whose 12 least significant positions are the information bits. The
00151     * resulting value is a codeword in the (23,12,7) Golay code: A 32-bit
00152     * integer whose 23 least significant bits are coded bits: Of these, the
00153     * 12 most significant bits are information bits and the 11 least
00154     * significant bits are redundant bits (systematic encoding).
00155     * --------------------------------------------------------------------- 
00156     */
00157    long temp;
00158    for (pattern = 0; pattern < 4096; pattern++) {
00159        temp = pattern << 11;          /* multiply information by X^{11} */
00160        encoding_table[pattern] = temp + get_syndrome(temp);/* add redundancy */
00161    }
00162 }

long get_syndrome long  pattern  ) 
 

Definition at line 121 of file golay.c.

References pattern.

Referenced by decode_golay(), gen_dec_table(), and gen_enc_table().

00126                                                    : (1) pattern = infomation
00127  * bits, when constructing the encoding table; (2) pattern = error pattern,
00128  * when constructing the decoding table; and (3) pattern = received vector, to
00129  * obtain its syndrome in decoding.
00130  */
00131 {
00132     long aux = X22;
00133  
00134     if (pattern >= X11)
00135        while (pattern & MASK12) {
00136            while (!(aux & pattern))
00137               aux = aux >> 1;
00138            pattern ^= (aux/X11) * GENPOL;
00139            }
00140     return(pattern);
00141 }

void nextcomb int  n,
int  r,
int *  a
 

Definition at line 103 of file golay.c.

References a.

Referenced by gen_dec_table().

00107 {
00108   int  i, j;
00109  
00110   a[r]++;
00111   if (a[r] <= n)
00112       return;
00113   j = r - 1;
00114   while (a[j] == n - r + j)
00115      j--;
00116   for (i = r; i >= j; i--)
00117       a[i] = a[j] + i - j + 1;
00118   return;
00119 }


Variable Documentation

int a[4]
 

Definition at line 81 of file golay.c.

Referenced by arr2int(), close_audio_codec(), code_audio(), correlation(), decode_audio(), gen_dec_table(), minus(), new_audio_codec(), nextcomb(), parse_line(), and ratio_difference().

long codeword
 

Definition at line 73 of file golay.c.

Referenced by decode_golay(), deconstruct_header_level2(), and encode_golay().

long data
 

Definition at line 73 of file golay.c.

Referenced by apply_errors(), bread(), bwrite(), Clip(), CodeOneIntra(), FillChromBlock(), FillLumBlock(), FindChromBlock_P(), fwdccitthware(), lremove(), place_rcpc(), ReconChromBlock_P(), ReconImage(), ReconLumBlock_P(), and ZeroMBlock().

int debug
 

Definition at line 23 of file main.c.

long decerror = 0
 

Definition at line 80 of file golay.c.

long decoding_table[2048]
 

Definition at line 72 of file golay.c.

Referenced by decode_golay(), and gen_dec_table().

long encoding_table[4096]
 

Definition at line 72 of file golay.c.

Referenced by encode_golay(), and gen_enc_table().

long errpos[23]
 

Definition at line 80 of file golay.c.

long numerr
 

Definition at line 80 of file golay.c.

long pattern
 

Definition at line 71 of file golay.c.

Referenced by add_to_mux_table(), gen_enc_table(), get_syndrome(), write_pattern(), and write_pattern1().

long position[23]
 

Initial value:

 { 0x00000001, 0x00000002, 0x00000004, 0x00000008,
                      0x00000010, 0x00000020, 0x00000040, 0x00000080,
                      0x00000100, 0x00000200, 0x00000400, 0x00000800,
                      0x00001000, 0x00002000, 0x00004000, 0x00008000,
                      0x00010000, 0x00020000, 0x00040000, 0x00080000,
                      0x00100000, 0x00200000, 0x00400000 }

Definition at line 74 of file golay.c.

Referenced by Code_sac_Coeff().

long recd
 

Definition at line 73 of file golay.c.


Generated on Sun Jul 16 16:27:45 2006 by  doxygen 1.3.9.1