nbit = 2*fdmdv_bits_per_frame(f->fdmdv);
f->tx_bits = (int*)malloc(nbit*sizeof(int));
f->rx_bits = (int*)malloc(nbit*sizeof(int));
-
+
nbit = fdmdv_bits_per_frame(f->fdmdv);
f->fdmdv_bits = (int*)malloc(nbit*sizeof(int));
recd_codeword = 0;
for(i=0; i<8; i++) {
recd_codeword <<= 1;
- recd_codeword |= f->rx_bits[i];
+ recd_codeword |= (f->rx_bits[i] & 0x1);
}
for(i=11; i<15; i++) {
recd_codeword <<= 1;
- recd_codeword |= f->rx_bits[i];
+ recd_codeword |= (f->rx_bits[i] & 0x1);
}
for(i=bits_per_codec_frame; i<bits_per_codec_frame+11; i++) {
recd_codeword <<= 1;
- recd_codeword |= f->rx_bits[i];
+ recd_codeword |= (f->rx_bits[i] & 0x1);
}
codeword1 = golay23_decode(recd_codeword);
f->total_bit_errors += golay23_count_errors(recd_codeword, codeword1);
To test:
- src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST
+ src$ gcc golay23.c -o golay23 -Wall -DGOLAY23_UNITTEST -DRUN_TIME_TABLES
src$ ./golay23
To generate tables:
int golay23_encode(int data) {
assert(inited);
+ assert(data <= 0xfff);
//printf("data: 0x%x\n", data);
- assert(data <= 0xfff);
return encoding_table[data];
}
int golay23_decode(int received_codeword) {
assert(inited);
+ assert((received_codeword < (1<<23)) && (received_codeword >= 0));
//printf("syndrome: 0x%x\n", get_syndrome(received_codeword));
return received_codeword ^= decoding_table[get_syndrome(received_codeword)];