// ------------------------------------------------------------------------ // File: bitf.c // Created: February 14, 2000 // // Gallager's iterative BIT-FLIP decoding of linear block codes // ------------------------------------------------------------------------ // This program is complementary material for the book: // // R.H. Morelos-Zaragoza, The Art of Error Correcting Coding, Wiley, 2002. // // ISBN 0471 49581 6 // // This and other programs are available at http://the-art-of-ecc.com // // You may use this program for academic and personal purposes only. // If this program is used to perform simulations whose results are // published in a journal or book, please refer to the book above. // // The use of this program in a commercial product requires explicit // written permission from the author. The author is not responsible or // liable for damage or loss that may be caused by the use of this program. // // Copyright (c) 2002. Robert H. Morelos-Zaragoza. All rights reserved. // ------------------------------------------------------------------------ #include #include #include #include #include #define MAX_RANDOM LONG_MAX // Maximum value of random() #define NODES 16384 // Maximum of number of code/check nodes #define J 17 // Maximum number of checks per code bit #define K 17 // Maximum number of code bits per check int max_size_M; int max_size_N; int threshold; int n; // length int k; // dimension int nk; // redundancy float rate; // code rate int M,N; // Size of parity-check matrix // --------------- // NODE STRUCTURES // --------------- struct parent_node { int size; int index[J]; // indexes of children }; struct child_node { int size; int index[K]; // indexes of parents int syndrome; }; struct parent_node code_node[NODES]; struct child_node check_node[NODES]; double init_snr, final_snr, snr_increment; double sim, num_sim, ber, amp; long seed; int error; int data[NODES], codeword[NODES]; int data_int; double snr; float transmited[NODES], received[NODES]; int hard[NODES], decoded[NODES]; int i,j, iter, max_iter; char filename[40], name2[40]; FILE *fp, *fp2; void initialize(void); void awgn(void); void encode(void); void bitflip(void); main(int argc, char *argv[]) { // Command line processing if (argc != 12) { printf("Usage: %s length(n) dimension(k) file_parity-check threshold max_iter init_snr final_snr snr_inc num_sim output_file seed\n", argv[0]); exit(0); } sscanf(argv[1],"%d", &n); sscanf(argv[2],"%d", &k); sscanf(argv[3],"%s", filename); sscanf(argv[4],"%d", &threshold); sscanf(argv[5],"%d", &max_iter); sscanf(argv[6],"%lf", &init_snr); sscanf(argv[7],"%lf", &final_snr); sscanf(argv[8],"%lf", &snr_increment); sscanf(argv[9],"%lf",&num_sim); sscanf(argv[10],"%s", name2); sscanf(argv[11],"%ld",&seed); nk = n-k; rate = (float) k / (float) n; printf("\nGALLAGER'S BIT-FLIP DECODING OF LINEAR BLOCK CODES\n"); printf("threshold = %d \tmax_iter = %d\n", threshold, max_iter); printf("SNR from %lf to %lf in increments of %lf\n", init_snr, final_snr, snr_increment); printf("%.0f codewords transmitted per SNR\n", num_sim); printf("\nn=%d, k=%d, n-k=%d, and rate = %lf\n\n",n,k,nk,rate); if ((fp = fopen(filename,"r")) != NULL) { fscanf(fp, "%d %d", &N, &M); fscanf(fp, "%d %d", &max_size_N, &max_size_M); for (i=0; i +1, "1" --> -1 for (i=0; i 0.0) hard[i] = 0; else hard[i] = 1; // ----------- ITERATIVE BIT-FLIP DECODING bitflip(); // ----------- COUNT THE NUMBER OF BIT ERRORS for (i=0; i threshold) // if (count > (code_node[i].size-1)/2 ) { decoded[i] ^= 1; } } } // Increment the number of iterations, and check if maximum reached iter++; } while (iter < max_iter); } void encode() // // Systematic encoding // { //int i,j; //for (j=0; j= 1); noise = u1 * sqrt( (-2.0*log(s))/s ); received[i] = transmited[i] + noise/amp; #ifdef NO_NOISE received[i] = transmited[i]; #endif } } void initialize() { amp = sqrt(2.0*rate*pow(10.0,(snr/10.0))); ber = 0.0; sim = 0.0; }