// ------------------------------------------------------------------------ // Name: pearl.c // Created: January 27, 2000 // // Iterative probabilistic decoding of linear block codes // Based on Pearl's Belief Propagation in Bayesian Networks // ------------------------------------------------------------------------ // 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 275 // 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 size_M[NODES]; // Size of row index sets int size_N[NODES]; // Size of column index sets int set_M[NODES][J]; // Column sets for code nodes int set_N[NODES][K]; // Row sets for check nodes int n; // length int k; // dimension int nk; // redundancy float rate; // code rate int M,N; // Size of parity-check matrix 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, snr_rms; 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 belprop(void); main(int argc, char *argv[]) { // Command line processing if (argc != 11) { printf("Usage: %s length(n) dimension(k) file_parity-check 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", &max_iter); sscanf(argv[5],"%lf", &init_snr); sscanf(argv[6],"%lf", &final_snr); sscanf(argv[7],"%lf", &snr_increment); sscanf(argv[8],"%lf",&num_sim); sscanf(argv[9],"%s", name2); sscanf(argv[10],"%ld",&seed); nk = n-k; rate = (float) k / (float) n; printf("\nITERATIVE PROBABILISTIC DECODING OF LINEAR BLOCK CODES\n"); printf("max_iter = %d\n", 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.5) decoded[i] = 1; else decoded[i] = 0; } // 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; // snr_rms = 2.0*rate*(pow(10.0,(snr/10.0))); // SNR per bit // snr_rms = 2.0*(pow(10.0,(snr/10.0))); // SNR per symbol snr_rms = 2.0*sqrt(2.0*rate*(pow(10.0,(snr/10.0)))); // SNR per bit }