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 @@ ...@@ -4,6 +4,7 @@
#include <assert.h> #include <assert.h>
using std::vector; using std::vector;
using std::string;
int int
parity (unsigned int v) parity (unsigned int v)
...@@ -88,27 +89,81 @@ conv_decode (const vector<int>& coded_bits) ...@@ -88,27 +89,81 @@ conv_decode (const vector<int>& coded_bits)
return decoded_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 int
main() main (int argc, char **argv)
{ {
vector<int> in_bits = bit_str_to_vec ("80f12381"); if (argc == 1)
{
printf ("input vector (k=%zd): ", in_bits.size()); vector<int> in_bits = bit_str_to_vec ("80f12381");
for (auto b : in_bits)
printf ("%d", b); printf ("input vector (k=%zd): ", in_bits.size());
printf ("\n"); for (auto b : in_bits)
printf ("%d", b);
vector<int> coded_bits = conv_encode (in_bits); printf ("\n");
printf ("coded vector (n=%zd): ", coded_bits.size());
for (auto b : coded_bits) vector<int> coded_bits = conv_encode (in_bits);
printf ("%d", b); printf ("coded vector (n=%zd): ", coded_bits.size());
printf ("\n"); for (auto b : coded_bits)
printf ("%d", b);
printf ("coded hex: %s\n", bit_vec_to_str (coded_bits).c_str()); printf ("\n");
vector<int> decoded_bits = conv_decode (coded_bits); printf ("coded hex: %s\n", bit_vec_to_str (coded_bits).c_str());
printf ("output vector (k=%zd): ", decoded_bits.size());
for (auto b : decoded_bits) vector<int> decoded_bits = conv_decode (coded_bits);
printf ("%d", b); printf ("output vector (k=%zd): ", decoded_bits.size());
printf ("\n"); 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