Commit 6e2184b6 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Merge sync finder / speed detection raw bit quality function.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent c76a923f
......@@ -89,6 +89,28 @@ SyncFinder::normalize_sync_quality (double raw_quality)
return raw_quality / min (Params::water_delta, 0.080) / 2.9;
}
double
SyncFinder::bit_quality (float umag, float dmag, int bit)
{
const int expect_data_bit = bit & 1; /* expect 010101 */
/* convert avoiding bias, raw_bit < 0 => 0 bit received; raw_bit > 0 => 1 bit received */
double raw_bit;
if (umag == 0 || dmag == 0)
{
raw_bit = 0;
}
else if (umag < dmag)
{
raw_bit = 1 - umag / dmag;
}
else
{
raw_bit = dmag / umag - 1;
}
return expect_data_bit ? raw_bit : -raw_bit;
}
double
SyncFinder::sync_decode (const WavData& wav_data, const size_t start_frame,
const vector<float>& fft_out_db,
......@@ -118,24 +140,7 @@ SyncFinder::sync_decode (const WavData& wav_data, const size_t start_frame,
frame_bit_count++;
}
}
/* convert avoiding bias, raw_bit < 0 => 0 bit received; raw_bit > 0 => 1 bit received */
double raw_bit;
if (umag == 0 || dmag == 0)
{
raw_bit = 0;
}
else if (umag < dmag)
{
raw_bit = 1 - umag / dmag;
}
else
{
raw_bit = dmag / umag - 1;
}
const int expect_data_bit = bit & 1; /* expect 010101 */
const double q = expect_data_bit ? raw_bit : -raw_bit;
sync_quality += q * frame_bit_count;
sync_quality += bit_quality (umag, dmag, bit) * frame_bit_count;
bit_count += frame_bit_count;
}
if (bit_count)
......
......@@ -99,6 +99,8 @@ private:
public:
std::vector<Score> search (const WavData& wav_data, Mode mode);
std::vector<std::vector<FrameBit>> get_sync_bits (const WavData& wav_data, Mode mode);
static double bit_quality (float umag, float dmag, int bit);
private:
void sync_fft (const WavData& wav_data,
size_t index,
......
......@@ -349,23 +349,7 @@ SpeedSync::compare (double relative_speed)
{
const auto& bv = bit_values[bit];
/* convert avoiding bias, raw_bit < 0 => 0 bit received; raw_bit > 0 => 1 bit received */
double raw_bit;
if (bv.umag == 0 || bv.dmag == 0)
{
raw_bit = 0;
}
else if (bv.umag < bv.dmag)
{
raw_bit = 1 - bv.umag / bv.dmag;
}
else
{
raw_bit = bv.dmag / bv.umag - 1;
}
const int expect_data_bit = bit & 1; /* expect 010101 */
const double q = expect_data_bit ? raw_bit : -raw_bit;
sync_quality += q * bv.count;
sync_quality += SyncFinder::bit_quality (bv.umag, bv.dmag, bit) * bv.count;
bit_count += bv.count;
}
if (bit_count)
......@@ -373,7 +357,7 @@ SpeedSync::compare (double relative_speed)
sync_quality /= bit_count;
sync_quality = fabs (sync_quality);
//sync_quality = fabs (sync_finder.normalize_sync_quality (sync_quality));
//printf ("%d %f\n", offset, fabs (sync_quality));
if (sync_quality > best_score.quality)
{
best_score.quality = sync_quality;
......
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