예제 #1
0
파일: dec_ref.c 프로젝트: szabolor/FEC
void decode_data(uint8_t raw[RAW_SIZE], uint8_t data[DATA_SIZE], int8_t error[2]) {
  uint8_t conv[CONV_SIZE];
  uint8_t dec_data[RS_SIZE];
  uint8_t rs[2][RS_BLOCK_SIZE];

  deinterleave(raw, conv);
  viterbi(conv, dec_data);
  descramble_and_deinterleave(dec_data, rs);
  rs_decode(rs, data, error);
}
예제 #2
0
파일: dec_ref.c 프로젝트: szabolor/FEC
void decode_data_debug(
    uint8_t raw[RAW_SIZE],        // Data to be decoded, 5200 byte (soft bit format)
    uint8_t data[DATA_SIZE],      // Decoded data, 256 byte
    int8_t  error[2],             // RS decoder modules corrected errors or -1 if unrecoverable error happened
    uint8_t conv[CONV_SIZE],      // Deinterleaved data with SYNC removed (5132 byte, soft bit format)
    uint8_t dec_data[RS_SIZE],    // Viterbi decoder output (320 byte): two RS codeblock interleaved and scrambled(!)
    uint8_t rs[2][RS_BLOCK_SIZE]  // RS codeblocks without the leading padding 95 zeros
  ) {
  deinterleave(raw, conv);
  viterbi(conv, dec_data);
  descramble_and_deinterleave(dec_data, rs);
  rs_decode(rs, data, error);
}
예제 #3
0
파일: coders.c 프로젝트: Crayzero/simplecfs
int librlc_rs_decode(int k, int m, int w, int packet_size,
        char *available_data, int *data_list, int chunk_num,
        int chunk_len, char **out_data)
{
    int ret = 0;
    rs_coder_t rs_code;
    // rs init
    rs_init(&rs_code, k+m, k, w, packet_size);
    // rs decode
    ret = rs_decode(rs_code.prsi, available_data, data_list, chunk_num, chunk_len, out_data);

    // rs free
    rs_free(&rs_code);

    return ret ;
}
예제 #4
0
파일: main.c 프로젝트: mjftw/CubeSat
void test_reed_solomon()
{
  //this part tests reed solomon coded_bits
  unsigned int false_positives = 0, false_negatives = 0;
  unsigned int tries = 10000;
  unsigned int correct = 0;
  unsigned int j;
  for(j = 0; j < tries; j++)
  {
    int t = 4;
    int error_count = 0;
    raw_data rd;
    rd.length = 64;
    rd.data = (uint8_t*)alloc_named(rd.length, "main rd.data");
    unsigned int i;
    for(i = 0; i < rd.length; i++)
      rd.data[i] = i;
    raw_data encoded = rs_encode(rd, t);

    uint8_t num_errors = rand() % (2 * t);
    for(i = 0; i < num_errors; i++)
      encoded.data[rand() % (rd.length + 2 * t)] = rand();

    raw_data decoded;
    uint8_t success = rs_decode(encoded, &decoded, t, &error_count);

    if(memcmp(rd.data, decoded.data, rd.length) && success)  //different but thinks it's right
    {
      false_positives++;
    }
    else if(!memcmp(rd.data, decoded.data, rd.length) && !success)  //same but thinks it's wrong
      false_negatives++;

    if(!memcmp(rd.data, decoded.data, rd.length))
       correct++;

    dealloc(rd.data);
    dealloc(encoded.data);
    dealloc(decoded.data);
  }
  printf("false_positives = %i\n", false_positives);
  printf("false_negatives = %i\n", false_negatives);
  printf("out of %i tries\n", tries);
  printf("percentage correct = %f\n", (float)(tries - (false_positives + false_negatives)) / (float)tries * 100.0);
  printf("num_correct = %i\n", correct);
}
예제 #5
0
파일: rs92dm_dft.c 프로젝트: rs1729/RS
int rs92_ecc(int msglen) {

    int i, ret = 0;
    int errors;
    ui8_t err_pos[rs_R], err_val[rs_R];

    if (msglen > FRAME_LEN) msglen = FRAME_LEN;
    for (i = msglen; i < FRAME_LEN; i++) frame[i] = 0;//xFF;


    for (i = 0; i < rs_R;            i++) cw[i]      = frame[cfg_rs92.parpos+i];
    for (i = 0; i < cfg_rs92.msglen; i++) cw[rs_R+i] = frame[cfg_rs92.msgpos+i];

    errors = rs_decode(cw, err_pos, err_val);

    //for (i = 0; i < cfg_rs92.hdrlen; i++) frame[i] = data[i];
    for (i = 0; i < rs_R;            i++) frame[cfg_rs92.parpos+i] = cw[i];
    for (i = 0; i < cfg_rs92.msglen; i++) frame[cfg_rs92.msgpos+i] = cw[rs_R+i];

    ret = errors;

    return ret;
}
예제 #6
0
파일: ecc-rs_vaisala.c 프로젝트: rs1729/RS
int main(int argc, char *argv[]) {
    int i, len, l;
    char *str = NULL, strbuf[2*BFSIZE+1];
    FILE *fp = NULL;


    rs = init_rs_char( 8, 0x11d, 0, 1, R, 0); // fec.c

    rs_init_RS255(); // bch_ecc.c

    if (argc < 2) {
        fp = stdin;
        str = fgets(strbuf, 2*BFSIZE, fp);
    }
    else {
        str = argv[1];
    }

    while (str) {

        len = strlen(str)/2;
        if (len > BFSIZE) return -1;

        for (i = 0; i < BFSIZE; i++)  data[i] = 0;
        for (i = 0; i < N; i++) codeword1[i] = codeword2[i] = 0;

        for (i = 0; i < len; i++) {
            l = sscanf(str+2*i, "%2hhx", data+i);  if (l < 1) {/*len = i;*/}
        }

        cfg = detect(data, len);

        if ( cfg.typ == 92 ) {

            for (i = 0; i < cfg.msglen; i++) codeword1[K-1-i] = data[cfg.msgpos+i];
            for (i = 0; i < R; i++) codeword1[N-1-i] = data[cfg.parpos+i];

            for (i = 0; i < N; i++) cw1[i] = codeword1[N-1-i];

            errors1 = decode_rs_char(rs, codeword1, errpos1, 0);

            errs1 = rs_decode(cw1, err_pos1, err_val1);

            if (fp == NULL) {
                printf("RS%d\n", cfg.typ);
                printf("codeword\n");
                printf("errors: %d\n", errors1);
                if (errors1 > 0) {
                    printf("pos: ");
                    for (i = 0; i < errors1; i++) printf(" %d", errpos1[i]);
                    printf("\n");
                }
                for (i = 0; i < N; i++) printf("%02X", codeword1[i]); printf("\n");
                printf("frame:\n");
            }

            for (i = 0; i < cfg.hdrlen; i++) frame[i] = data[i];
            for (i = 0; i < cfg.msglen; i++) frame[cfg.msgpos+i] = codeword1[K-1-i];
            for (i = 0; i < R; i++)          frame[cfg.parpos+i] = codeword1[N-1-i];

            for (i = 0; i < cfg.frmlen; i++) printf("%02x", frame[i]); printf("\n");

            for (i = 0; i < N; i++) {
                if (cw1[i] != codeword1[N-1-i]) {
                    printf("diff[%3d]:  cw: %02x  codeword: %02x\n", i, cw1[i], codeword1[N-1-i]);
                }
            }
        }
        else
          if ( cfg.typ == 41 ) {

            for (i = 0; i < cfg.msglen; i++) {
                codeword1[K-1-i] = data[cfg.msgpos+  2*i];
                codeword2[K-1-i] = data[cfg.msgpos+1+2*i];
            }

            for (i = 0; i < R; i++) {
                codeword1[N-1-i] = data[cfg.parpos+  i];
                codeword2[N-1-i] = data[cfg.parpos+R+i];
            }

            for (i = 0; i < N; i++) cw1[i] = codeword1[N-1-i];
            for (i = 0; i < N; i++) cw2[i] = codeword2[N-1-i];

            errors1 = decode_rs_char(rs, codeword1, errpos1, 0);
            errors2 = decode_rs_char(rs, codeword2, errpos2, 0);

            errs1 = rs_decode(cw1, err_pos1, err_val1);
            errs2 = rs_decode(cw2, err_pos2, err_val2);

            if (fp == NULL) {
                printf("RS%d\n", cfg.typ);
                printf("codeword1\n");
                printf("errors: %d\n", errors1);
                if (errors1 > 0) {
                    printf("pos: ");
                    for (i = 0; i < errors1; i++) printf(" %d", errpos1[i]);
                    printf("\n");
                }
                for (i = 0; i < N; i++) printf("%02X", codeword1[i]); printf("\n");

                printf("codeword2\n");
                printf("errors: %d\n", errors2);
                if (errors2 > 0) {
                    printf("pos: ");
                    for (i = 0; i < errors2; i++) printf(" %d", errpos2[i]);
                    printf("\n");
                }
                for (i = 0; i < N; i++) printf("%02X", codeword2[i]); printf("\n");
                printf("frame:\n");
            }

            for (i = 0; i < cfg.hdrlen; i++) frame[i] = data[i];
            for (i = 0; i < R; i++) {
                frame[cfg.parpos+  i] = codeword1[N-1-i];
                frame[cfg.parpos+R+i] = codeword2[N-1-i];
            }
            for (i = 0; i < cfg.msglen; i++) {
                frame[cfg.msgpos+  2*i] = codeword1[K-1-i];
                frame[cfg.msgpos+1+2*i] = codeword2[K-1-i];
            }

            for (i = 0; i < cfg.frmlen; i++) printf("%02x", frame[i]); printf("\n");

            for (i = 0; i < N; i++) {
                if (cw1[i] != codeword1[N-1-i]) {
                    printf("diff[%3d]:  cw1: %02x  codeword1: %02x\n", i, cw1[i], codeword1[N-1-i]);
                }
            }
            for (i = 0; i < N; i++) {
                if (cw2[i] != codeword2[N-1-i]) {
                    printf("diff[%3d]:  cw2: %02x  codeword2: %02x\n", i, cw2[i], codeword2[N-1-i]);
                }
            }

        }

        if (fp) str = fgets(strbuf, 2*BFSIZE, fp);
        else    str = NULL;
    }


    return 0;
}
예제 #7
0
파일: rs.c 프로젝트: alordred/UDPspeeder
int rs_decode2(int k,int n,char *data[],int size)
{
	void* code=get_code(k,n);
	return rs_decode(code,data,size);
}
예제 #8
0
파일: main.c 프로젝트: mjftw/CubeSat
//tests the methods used encoding and decoding, uses insert_errors2 to accomodate any bit rate
float message_pass_rate(int num_tests, float BER)
{
  int successes = 0;
  int errors = 0;
  int tries = 0;
  int wrong1 = 0, wrong2 = 0;
  //for(unsigned int i = 0; i < num_tests; i++)
  while(errors < 100)
  {

    raw_data rd;
    rd.length = 64;
    rd.data = (uint8_t*)alloc_named(rd.length, "message_pass_rate rd");
    unsigned int i;
    for(i = 0; i < 64; i++)
      rd.data[i] = rand();

    int t = 2;  //PYTHON//

    //p = make_packet(rd);
    //encoded_packet ep = encode(&p);  //currently convolutional- subject to change

    raw_data rs_encoded = rs_encode(rd, t);
    raw_data ep = convolute(rs_encoded);

    interleave(ep);  //interleaves data in place

    insert_errors2(ep.data, ep.length, BER);

    deinterleave(ep);

    raw_data deconvoluted = deconvolute(ep, NULL);

    int isc = is_correctible(rs_encoded, deconvoluted, t, 0);

    raw_data decoded;
    rs_decode(deconvoluted, &decoded, t, NULL);

    //q = decode(ep, NULL);
    if(rd.length != decoded.length)
    {
      printf("lengths are not the same!\n");
      printf("rd.length = %i, decoded.length = %i\n", rd.length, decoded.length);
    }
    if(!memcmp(decoded.data, rd.data, rd.length))
    {
      if(!isc)
        wrong1++;
      //if(!isc)
      //  is_correctible(rs_encoded, deconvoluted, t, 1);
      //assert(isc);
      successes++;
    }
    else
    {
      if(isc)
        wrong2++;
      //assert(!isc);
      errors++;
    }

    dealloc(ep.data);
    dealloc(rs_encoded.data);
    dealloc(deconvoluted.data);
    dealloc(decoded.data);
    dealloc(rd.data);
    if(tries >= num_tests)
    {
      printf("tries = %i, errors = %i\n", tries, errors);
      break;
    }
    tries++;
  }
  //return (float)successes / (float)num_tests;
  printf("wrong1 = %i\n", wrong1);
  printf("wrong2 = %i\n", wrong2);
  printf("tests = %i\n", successes + errors);
  return (float)successes / ((float)successes + (float)errors);
}