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); }
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); }
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 ; }
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); }
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; }
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; }
int rs_decode2(int k,int n,char *data[],int size) { void* code=get_code(k,n); return rs_decode(code,data,size); }
//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); }