Commit b3055021 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Report convolution code error score.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 7250bc66
......@@ -988,16 +988,17 @@ decode_and_report (const WavData& wav_data, const string& orig_pattern)
assert (soft_bit_vec.size() >= conv_code_size (Params::payload_size));
soft_bit_vec.resize (conv_code_size (Params::payload_size));
vector<int> bit_vec = conv_decode_soft (randomize_bit_order (soft_bit_vec, /* encode */ false));
float decode_error = 0;
vector<int> bit_vec = conv_decode_soft (randomize_bit_order (soft_bit_vec, /* encode */ false), &decode_error);
if (sync_score.index)
{
const int seconds = lrint (sync_score.index / wav_data.mix_freq());
printf ("pattern %2d:%02d %s %.3f\n", seconds / 60, seconds % 60, bit_vec_to_str (bit_vec).c_str(), sync_score.quality);
printf ("pattern %2d:%02d %s %.3f %.3f\n", seconds / 60, seconds % 60, bit_vec_to_str (bit_vec).c_str(), sync_score.quality, decode_error);
}
else /* this is the combined pattern "all" */
{
printf ("pattern all %s %.3f\n", bit_vec_to_str (bit_vec).c_str(), sync_score.quality);
printf ("pattern all %s %.3f %.3f\n", bit_vec_to_str (bit_vec).c_str(), sync_score.quality, decode_error);
}
if (!orig_pattern.empty())
......
#include "utils.hh"
#include "convcode.hh"
#include <array>
#include <algorithm>
......@@ -74,7 +75,7 @@ conv_encode (const vector<int>& in_bits)
/* decode using viterbi algorithm */
vector<int>
conv_decode_soft (const vector<float>& coded_bits)
conv_decode_soft (const vector<float>& coded_bits, float *error_out)
{
vector<int> decoded_bits;
......@@ -141,6 +142,8 @@ conv_decode_soft (const vector<float>& coded_bits)
}
unsigned int state = 0;
if (error_out)
*error_out = error_count.back()[state].delta / coded_bits.size();
for (size_t idx = error_count.size() - 1; idx > 0; idx--)
{
decoded_bits.push_back (error_count[idx][state].bit);
......
......@@ -7,6 +7,6 @@
size_t conv_code_size (size_t msg_size);
std::vector<int> conv_encode (const std::vector<int>& in_bits);
std::vector<int> conv_decode_hard (const std::vector<int>& coded_bits);
std::vector<int> conv_decode_soft (const std::vector<float>& coded_bits);
std::vector<int> conv_decode_soft (const std::vector<float>& coded_bits, float *error_out = nullptr);
#endif /* AUDIOWMARK_CONV_CODE_HH */
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