//
// AUTOTEST: Hamming (31,26) codec
//
void autotest_hamming3126_codec()
{
    unsigned int n=26;  //
    unsigned int k=31;  //
    unsigned int i;     // index of bit to corrupt

    for (i=0; i<k; i++) {
        // generate symbol
        unsigned int sym_org = rand() % (1<<n);

        // encoded symbol
        unsigned int sym_enc = fec_hamming3126_encode_symbol(sym_org);

        // received symbol
        unsigned int sym_rec = sym_enc ^ (1<<(k-i-1));

        // decoded symbol
        unsigned int sym_dec = fec_hamming3126_decode_symbol(sym_rec);

        if (liquid_autotest_verbose) {
            printf("error index : %u\n", i);
            // print results
            printf("    sym org     :   "); liquid_print_bitstring(sym_org, n); printf("\n");
            printf("    sym enc     :   "); liquid_print_bitstring(sym_enc, k); printf("\n");
            printf("    sym rec     :   "); liquid_print_bitstring(sym_rec, k); printf("\n");
            printf("    sym dec     :   "); liquid_print_bitstring(sym_dec, n); printf("\n");

            // print number of bit errors
            printf("    bit errors  :   %u\n", count_bit_errors(sym_org, sym_dec));
        }

        // validate data are the same
        CONTEND_EQUALITY(sym_org, sym_dec);
    }
}
//
// AUTOTEST: SEC-DEC (22,16) codec (double error detection)
//
void autotest_secded2216_codec_e2()
{
    // total combinations of double errors: nchoosek(22,2) = 231

    unsigned int j;
    unsigned int k;

    for (j=0; j<21; j++) {
        if (liquid_autotest_verbose)
            printf("***** %2u *****\n", j);
        
        for (k=0; k<22-j-1; k++) {
            // generate symbol
            unsigned char sym_org[2];
            sym_org[0] = rand() & 0xffff;
            sym_org[1] = rand() & 0xffff;

            // encoded symbol
            unsigned char sym_enc[3];
            fec_secded2216_encode_symbol(sym_org, sym_enc);

            // generate error vector (single error)
            unsigned char e[3] = {0,0,0};

            div_t dj = div(j,8);
            e[3-dj.quot-1] |= 1 << dj.rem;

            div_t dk = div(k+j+1,8);
            e[3-dk.quot-1] |= 1 << dk.rem;

            // received symbol
            unsigned char sym_rec[3];
            sym_rec[0] = sym_enc[0] ^ e[0];
            sym_rec[1] = sym_enc[1] ^ e[1];
            sym_rec[2] = sym_enc[2] ^ e[2];

            // decoded symbol
            unsigned char sym_dec[2];
            int syndrome_flag = fec_secded2216_decode_symbol(sym_rec, sym_dec);


            if (liquid_autotest_verbose) {
                // print error vector
                printf("%3u, e = ", k);
                liquid_print_bitstring(e[0], 6);
                liquid_print_bitstring(e[1], 8);
                liquid_print_bitstring(e[2], 8);
                printf(" flag=%2d\n", syndrome_flag);
            }

            // validate syndrome flag is '2'
            CONTEND_EQUALITY(syndrome_flag, 2);
        }
    }
}
Esempio n. 3
0
//
// AUTOTEST: Golay(24,12) codec
//
void autotest_golay2412_codec()
{
    unsigned int num_trials=50; // number of symbol trials
    unsigned int num_errors;    // number of errors
    unsigned int i;

    for (num_errors=0; num_errors<=3; num_errors++) {
        for (i=0; i<num_trials; i++) {
            // generate symbol
            unsigned int sym_org = rand() % (1<<12);

            // encoded symbol
            unsigned int sym_enc = fec_golay2412_encode_symbol(sym_org);

            // generate error vector
            unsigned int e = golay2412_generate_error_vector(num_errors);

            // received symbol
            unsigned int sym_rec = sym_enc ^ e;

            // decoded symbol
            unsigned int sym_dec = fec_golay2412_decode_symbol(sym_rec);

#if 0
            printf("error index : %u\n", i);
            // print results
            printf("    sym org     :   "); liquid_print_bitstring(sym_org, n); printf("\n");
            printf("    sym enc     :   "); liquid_print_bitstring(sym_enc, k); printf("\n");
            printf("    sym rec     :   "); liquid_print_bitstring(sym_rec, k); printf("\n");
            printf("    sym dec     :   "); liquid_print_bitstring(sym_dec, n); printf("\n");

            // print number of bit errors
            printf("    bit errors  :   %u\n", count_bit_errors(sym_org, sym_dec));
#endif

            // validate data are the same
            CONTEND_EQUALITY(sym_org, sym_dec);
        }
    }
}
Esempio n. 4
0
//
// AUTOTEST: SEC-DEC (72,64) codec (double error detection)
//
void autotest_secded7264_codec_e2()
{
    // total combinations of double errors: nchoosek(72,2) = 2556

    // arrays
    unsigned char sym_org[8];   // original symbol
    unsigned char sym_enc[9];   // encoded symbol
    unsigned char e[9];         // error vector
    unsigned char sym_rec[9];   // received symbol
    unsigned char sym_dec[8];   // decoded symbol

    unsigned int i;
    unsigned int j;
    unsigned int k;

    for (j=0; j<72-1; j++) {
#if 0
        if (liquid_autotest_verbose)
            printf("***** %2u *****\n", j);
#endif
        
        for (k=0; k<72-1-j; k++) {
            // generate symbol
            for (i=0; i<8; i++)
                sym_org[i] = rand() & 0xff;

            // encoded symbol
            fec_secded7264_encode_symbol(sym_org, sym_enc);

            // generate error vector (single error)
            for (i=0; i<9; i++)
                e[i] = 0;

            div_t dj = div(j,8);
            e[9-dj.quot-1] |= 1 << dj.rem;

            div_t dk = div(k+j+1,8);
            e[9-dk.quot-1] |= 1 << dk.rem;

            // received symbol
            for (i=0; i<9; i++)
                sym_rec[i] = sym_enc[i] ^ e[i];

            // decoded symbol
            int syndrome_flag = fec_secded7264_decode_symbol(sym_rec, sym_dec);

#if 0
            if (liquid_autotest_verbose) {
                // print error vector
                printf("%3u, e = ", k);
                liquid_print_bitstring(e[0], 8);
                liquid_print_bitstring(e[1], 8);
                liquid_print_bitstring(e[2], 8);
                liquid_print_bitstring(e[3], 8);
                liquid_print_bitstring(e[4], 8);
                liquid_print_bitstring(e[5], 8);
                liquid_print_bitstring(e[6], 8);
                liquid_print_bitstring(e[7], 8);
                liquid_print_bitstring(e[8], 8);
                printf(" flag=%2d\n", syndrome_flag);
            }
#endif

            // validate syndrome flag is '2'
            CONTEND_EQUALITY(syndrome_flag, 2);
        }
    }
}