// // 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); } } }
// // 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); } } }
// // 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); } } }