Commit ae67a40c authored by Stefan Westerfeld's avatar Stefan Westerfeld

Add test for soft decoding.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent dd32a347
#include "utils.hh"
#include "convcode.hh"
#include <random>
#include <assert.h>
using std::vector;
......@@ -89,4 +91,60 @@ main (int argc, char **argv)
printf ("%f %f\n", (100.0 * bit_errors) / coded_bit_count, (100.0 * bad_decode) / test_size);
}
}
if (argc == 2 && string (argv[1]) == "soft-error")
{
for (double stddev = 0; stddev < 1; stddev += 0.01)
{
size_t coded_bit_count = 0;
int bad_decode1 = 0, bad_decode2 = 0;
constexpr int test_size = 20;
int local_be = 0;
for (int i = 0; i < test_size; i++)
{
vector<int> in_bits;
while (in_bits.size() != 128)
in_bits.push_back (rand() & 1);
vector<int> coded_bits = conv_encode (in_bits);
coded_bit_count = coded_bits.size();
std::default_random_engine generator;
std::normal_distribution<double> dist (0, stddev);
vector<float> recv_bits;
for (auto b : coded_bits)
recv_bits.push_back (b + dist (generator));
vector<int> decoded_bits1 = conv_decode_soft (recv_bits);
vector<int> recv_hard_bits;
for (auto b : recv_bits)
recv_hard_bits.push_back ((b > 0.5) ? 1 : 0);
for (size_t x = 0; x < recv_hard_bits.size(); x++)
local_be += coded_bits[x] ^ recv_hard_bits[x];
vector<int> decoded_bits2 = conv_decode_hard (recv_hard_bits);
assert (decoded_bits1.size() == 128);
assert (decoded_bits2.size() == 128);
int e1 = 0;
int e2 = 0;
for (size_t i = 0; i < 128; i++)
{
if (decoded_bits1[i] != in_bits[i])
e1++;
if (decoded_bits2[i] != in_bits[i])
e2++;
}
if (e1)
bad_decode1++;
if (e2)
bad_decode2++;
}
printf ("%f %f %f\n", double (100 * local_be) / test_size / coded_bit_count, (100.0 * bad_decode1) / test_size, (100.0 * bad_decode2) / test_size);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment