Commit 584d4a3f authored by Stefan Westerfeld's avatar Stefan Westerfeld

Add randomized error test for convolution encode/decode.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 4ece7494
......@@ -4,6 +4,7 @@
#include <assert.h>
using std::vector;
using std::string;
int
parity (unsigned int v)
......@@ -88,27 +89,81 @@ conv_decode (const vector<int>& coded_bits)
return decoded_bits;
}
vector<int>
generate_error_vector (size_t n, int errors)
{
vector<int> ev (n);
while (errors)
{
size_t pos = rand() % ev.size();
if (ev[pos] != 1)
{
ev[pos] = 1;
errors--;
}
}
return ev;
}
int
main()
main (int argc, char **argv)
{
vector<int> in_bits = bit_str_to_vec ("80f12381");
printf ("input vector (k=%zd): ", in_bits.size());
for (auto b : in_bits)
printf ("%d", b);
printf ("\n");
vector<int> coded_bits = conv_encode (in_bits);
printf ("coded vector (n=%zd): ", coded_bits.size());
for (auto b : coded_bits)
printf ("%d", b);
printf ("\n");
printf ("coded hex: %s\n", bit_vec_to_str (coded_bits).c_str());
vector<int> decoded_bits = conv_decode (coded_bits);
printf ("output vector (k=%zd): ", decoded_bits.size());
for (auto b : decoded_bits)
printf ("%d", b);
printf ("\n");
if (argc == 1)
{
vector<int> in_bits = bit_str_to_vec ("80f12381");
printf ("input vector (k=%zd): ", in_bits.size());
for (auto b : in_bits)
printf ("%d", b);
printf ("\n");
vector<int> coded_bits = conv_encode (in_bits);
printf ("coded vector (n=%zd): ", coded_bits.size());
for (auto b : coded_bits)
printf ("%d", b);
printf ("\n");
printf ("coded hex: %s\n", bit_vec_to_str (coded_bits).c_str());
vector<int> decoded_bits = conv_decode (coded_bits);
printf ("output vector (k=%zd): ", decoded_bits.size());
for (auto b : decoded_bits)
printf ("%d", b);
printf ("\n");
}
if (argc == 2 && string (argv[1]) == "error")
{
for (size_t bit_errors = 0; bit_errors < 100; bit_errors++)
{
size_t coded_bit_count = 0;
int bad_decode = 0;
constexpr int test_size = 1000;
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();
vector<int> error_bits = generate_error_vector (coded_bits.size(), bit_errors);
for (size_t pos = 0; pos < coded_bits.size(); pos++)
coded_bits[pos] ^= error_bits[pos];
vector<int> decoded_bits = conv_decode (coded_bits);
assert (decoded_bits.size() == 128);
int errors = 0;
for (size_t i = 0; i < 128; i++)
if (decoded_bits[i] != in_bits[i])
errors++;
if (errors > 0)
bad_decode++;
}
printf ("%f %f\n", (100.0 * bit_errors) / coded_bit_count, (100.0 * bad_decode) / 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