void benchmark_bpacketsync(struct rusage *_start, struct rusage *_finish, unsigned long int *_num_iterations) { // adjust number of iterations *_num_iterations *= 4; // options unsigned int dec_msg_len = 64; // original data message length crc_scheme check = LIQUID_CRC_NONE; // data integrity check fec_scheme fec0 = LIQUID_FEC_NONE; // inner code fec_scheme fec1 = LIQUID_FEC_NONE; // outer code // create packet generator bpacketgen pg = bpacketgen_create(0, dec_msg_len, check, fec0, fec1); // compute packet length unsigned int enc_msg_len = bpacketgen_get_packet_len(pg); // initialize arrays unsigned char msg_org[dec_msg_len]; // original message unsigned char msg_enc[enc_msg_len]; // encoded message unsigned int num_packets_found=0; // create packet synchronizer bpacketsync ps = bpacketsync_create(0, bpacketsync_benchmark_callback, (void*)&num_packets_found); unsigned long int i; // initialize original data message for (i=0; i<dec_msg_len; i++) msg_org[i] = rand() % 256; // encode packet bpacketgen_encode(pg,msg_org,msg_enc); // start trials getrusage(RUSAGE_SELF, _start); for (i=0; i<(*_num_iterations); i++) { // push packet through synchronizer bpacketsync_execute_byte(ps, msg_enc[(4*i+0)%enc_msg_len]); bpacketsync_execute_byte(ps, msg_enc[(4*i+1)%enc_msg_len]); bpacketsync_execute_byte(ps, msg_enc[(4*i+2)%enc_msg_len]); bpacketsync_execute_byte(ps, msg_enc[(4*i+3)%enc_msg_len]); } getrusage(RUSAGE_SELF, _finish); *_num_iterations *= 4; printf("found %u packets\n", num_packets_found); // clean up allocated objects bpacketgen_destroy(pg); bpacketsync_destroy(ps); }
// run synchronizer on array of input bytes // _q : bpacketsync object // _bytes : input data array [size: _n x 1] // _n : input array size void bpacketsync_execute(bpacketsync _q, unsigned char * _bytes, unsigned int _n) { unsigned int i; for (i=0; i<_n; i++) bpacketsync_execute_byte(_q, _bytes[i]); }
int main(int argc, char*argv[]) { srand(time(NULL)); // options unsigned int n=8; // original data message length crc_scheme check = LIQUID_CRC_32; // data integrity check fec_scheme fec0 = LIQUID_FEC_HAMMING74; // inner code fec_scheme fec1 = LIQUID_FEC_NONE; // outer code float bit_error_rate = 0.0f; // bit error rate // read command-line options int dopt; while((dopt = getopt(argc,argv,"uhn:e:v:c:k:")) != EOF){ switch (dopt) { case 'h': case 'u': usage(); return 0; case 'n': n = atoi(optarg); break; case 'e': bit_error_rate = atof(optarg); break; case 'v': // data integrity check check = liquid_getopt_str2crc(optarg); if (check == LIQUID_CRC_UNKNOWN) { fprintf(stderr,"error: unknown/unsupported CRC scheme \"%s\"\n\n",optarg); exit(1); } break; case 'c': // inner FEC scheme fec0 = liquid_getopt_str2fec(optarg); if (fec0 == LIQUID_FEC_UNKNOWN) { fprintf(stderr,"error: unknown/unsupported inner FEC scheme \"%s\"\n\n",optarg); exit(1); } break; case 'k': // outer FEC scheme fec1 = liquid_getopt_str2fec(optarg); if (fec1 == LIQUID_FEC_UNKNOWN) { fprintf(stderr,"error: unknown/unsupported outer FEC scheme \"%s\"\n\n",optarg); exit(1); } break; default: exit(1); } } // validate input if (n == 0) { fprintf(stderr,"error: %s, packet length must be greater than zero\n", argv[0]); exit(1); } else if (bit_error_rate < 0.0f || bit_error_rate > 1.0f) { fprintf(stderr,"error: %s, channel bit error rate must be in [0,1]\n", argv[0]); exit(1); } // create packet generator bpacketgen pg = bpacketgen_create(0, n, check, fec0, fec1); bpacketgen_print(pg); unsigned int i; // compute packet length unsigned int k = bpacketgen_get_packet_len(pg); // initialize arrays unsigned char msg_org[n]; // original message unsigned char msg_enc[k]; // encoded message unsigned char msg_rec[k+1]; // recieved message unsigned char msg_dec[n]; // decoded message // create packet synchronizer bpacketsync ps = bpacketsync_create(0, callback, (void*)msg_dec); // initialize original data message for (i=0; i<n; i++) msg_org[i] = rand() % 256; // // encode packet // bpacketgen_encode(pg,msg_org,msg_enc); // // channel // // add delay msg_rec[0] = rand() & 0xff; // initialize first byte as random memmove(&msg_rec[1], msg_enc, k*sizeof(unsigned char)); liquid_lbshift(msg_rec, (k+1)*sizeof(unsigned char), rand()%8); // random shift // add random errors for (i=0; i<k+1; i++) { unsigned int j; for (j=0; j<8; j++) { if (randf() < bit_error_rate) msg_rec[i] ^= 1 << (8-j-1); } } // // run packet synchronizer // // push random bits through synchronizer for (i=0; i<100; i++) bpacketsync_execute_byte(ps, rand() & 0xff); // push packet through synchronizer for (i=0; i<k+1; i++) bpacketsync_execute_byte(ps, msg_rec[i]); // // count errors // unsigned int num_bit_errors = 0; for (i=0; i<n; i++) num_bit_errors += count_bit_errors(msg_org[i], msg_dec[i]); printf("number of bit errors received: %4u / %4u\n", num_bit_errors, n*8); // clean up allocated objects bpacketgen_destroy(pg); bpacketsync_destroy(ps); return 0; }