quiet / libcorrect

C library for Convolutional codes and Reed-Solomon
BSD 3-Clause "New" or "Revised" License
362 stars 95 forks source link

Running 'convolutional-fec.exe' #44

Open gvanem opened 2 years ago

gvanem commented 2 years ago

When running this test program on MSVC/clang (x86), all I got was: expected to decode 4096 bytes, decoded 0 bytes instead

before it exited. The reason is that error-sim.c and scratch->decode() is expecting a number of bytes decoded. Correct?

But in fact scratch->decode point to functions returning void! Seems that conv_fec27_decode() returns 0 after all. But I patched them all:

--- a/include/correct/util/error-sim-fec.h 2021-07-12 18:28:28
+++ b/include/correct/util/error-sim-fec.h 2022-04-07 14:45:51
@@ -2,7 +2,7 @@

 #include <fec.h>

-void conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
-void conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
-void conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
-void conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
+size_t conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
+size_t conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
+size_t conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);
+size_t conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg);

--- a/util/error-sim-fec.c 2021-07-12 18:28:28
+++ b/util/error-sim-fec.c 2022-04-07 14:46:55
@@ -1,29 +1,33 @@
 #include "correct/util/error-sim-fec.h"

-void conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
+size_t conv_fec27_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
     init_viterbi27(conv_v, 0);
     update_viterbi27_blk(conv_v, soft, soft_len / 2 - 2);
     size_t n_decoded_bits = (soft_len / 2) - 8;
     chainback_viterbi27(conv_v, msg, n_decoded_bits, 0);
+    return n_decoded_bits / 8;
 }

-void conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
+size_t conv_fec29_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
     init_viterbi29(conv_v, 0);
     update_viterbi29_blk(conv_v, soft, soft_len / 2 - 2);
     size_t n_decoded_bits = (soft_len / 2) - 10;
     chainback_viterbi29(conv_v, msg, n_decoded_bits, 0);
+    return n_decoded_bits / 8;
 }

-void conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
+size_t conv_fec39_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
     init_viterbi39(conv_v, 0);
     update_viterbi39_blk(conv_v, soft, soft_len / 3 - 2);
     size_t n_decoded_bits = (soft_len / 3) - 10;
     chainback_viterbi39(conv_v, msg, n_decoded_bits, 0);
+    return n_decoded_bits / 8;
 }

-void conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
+size_t conv_fec615_decode(void *conv_v, uint8_t *soft, size_t soft_len, uint8_t *msg) {
     init_viterbi615(conv_v, 0);
     update_viterbi615_blk(conv_v, soft, soft_len / 6 - 2);
     size_t n_decoded_bits = (soft_len / 6) - 16;
     chainback_viterbi615(conv_v, msg, n_decoded_bits, 0);
+    return n_decoded_bits / 8;
 }

But perhaps static void chainback_viterbi() should return this instead?

So running convolutional-fec.exe now gives something more sensible:

test passed, expected error rate=0.00e+00, observed error rate=0.00e+00 @infdB for rate 2 order 6
test passed, expected error rate=8.00e-06, observed error rate=4.00e-06 @4.5dB for rate 2 order 6
test passed, expected error rate=5.00e-05, observed error rate=2.45e-05 @4.0dB for rate 2 order 6

test passed, expected error rate=0.00e+00, observed error rate=0.00e+00 @infdB for rate 2 order 9
test passed, expected error rate=3.00e-06, observed error rate=0.00e+00 @4.5dB for rate 2 order 9
test passed, expected error rate=8.00e-06, observed error rate=2.75e-06 @4.0dB for rate 2 order 9

test passed, expected error rate=0.00e+00, observed error rate=0.00e+00 @infdB for rate 3 order 9
test passed, expected error rate=3.00e-06, observed error rate=0.00e+00 @4.5dB for rate 3 order 9
test passed, expected error rate=5.00e-06, observed error rate=2.25e-06 @4.0dB for rate 3 order 9

test passed, expected error rate=0.00e+00, observed error rate=0.00e+00 @infdB for rate 6 order 15
test passed, expected error rate=3.00e-06, observed error rate=0.00e+00 @3.0dB for rate 6 order 15
test passed, expected error rate=1.00e-05, observed error rate=0.00e+00 @2.5dB for rate 6 order 15

Takes 2 minutes to complete.