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);
}
Exemple #2
0
// 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;
}