Commit 0ecc093f authored by Stefan Westerfeld's avatar Stefan Westerfeld

Deduplicate speed sync quality computation into one function.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent b53d9dbc
...@@ -141,6 +141,8 @@ private: ...@@ -141,6 +141,8 @@ private:
template<bool B2> template<bool B2>
void compare_bits_fft (FFTProcessor& fft_processor, BitValue *bit_values, double relative_speed, double offset); void compare_bits_fft (FFTProcessor& fft_processor, BitValue *bit_values, double relative_speed, double offset);
double sync_quality (const BitValue *bit_values);
std::mutex mutex; std::mutex mutex;
vector<Score> result_scores; vector<Score> result_scores;
const WavData& in_data; const WavData& in_data;
...@@ -402,6 +404,45 @@ SpeedSync::compare_bits_fft (FFTProcessor& fft_processor, BitValue *bit_values, ...@@ -402,6 +404,45 @@ SpeedSync::compare_bits_fft (FFTProcessor& fft_processor, BitValue *bit_values,
} }
} }
double
SpeedSync::sync_quality (const BitValue *bit_values)
{
int bit_count = 0;
double quality = 0;
for (size_t bit = 0; bit < Params::sync_bits; bit++)
{
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;
quality += q * bv.count;
bit_count += bv.count;
}
if (bit_count)
{
quality /= bit_count;
quality = fabs (quality);
// quality = fabs (sync_finder.normalize_sync_quality (sync_quality));
}
return quality;
}
void void
SpeedSync::compare (double relative_speed, bool final_stage) SpeedSync::compare (double relative_speed, bool final_stage)
{ {
...@@ -421,44 +462,12 @@ SpeedSync::compare (double relative_speed, bool final_stage) ...@@ -421,44 +462,12 @@ SpeedSync::compare (double relative_speed, bool final_stage)
compare_bits<false> (bit_values, relative_speed, &start_mi1, offset); compare_bits<false> (bit_values, relative_speed, &start_mi1, offset);
compare_bits<true> (bit_values, relative_speed, &start_mi2, offset + frames_per_block * steps_per_frame); compare_bits<true> (bit_values, relative_speed, &start_mi2, offset + frames_per_block * steps_per_frame);
double sync_quality = 0; double quality = sync_quality (bit_values);
int bit_count = 0; if (quality > best_score.quality)
for (size_t bit = 0; bit < Params::sync_bits; bit++)
{
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;
bit_count += bv.count;
}
if (bit_count)
{ {
sync_quality /= bit_count; best_score.quality = quality;
sync_quality = fabs (sync_quality); best_score.speed = relative_speed * center;
//sync_quality = fabs (sync_finder.normalize_sync_quality (sync_quality)); best_offset = offset;
//printf ("%d %f\n", offset, fabs (sync_quality));
if (sync_quality > best_score.quality)
{
best_score.quality = sync_quality;
best_score.speed = relative_speed * center;
best_offset = offset;
}
} }
} }
if (final_stage) if (final_stage)
...@@ -477,43 +486,11 @@ SpeedSync::compare (double relative_speed, bool final_stage) ...@@ -477,43 +486,11 @@ SpeedSync::compare (double relative_speed, bool final_stage)
compare_bits_fft<false> (fft_processor, bit_values, relative_speed, doffset); compare_bits_fft<false> (fft_processor, bit_values, relative_speed, doffset);
compare_bits_fft<true> (fft_processor, bit_values, relative_speed, doffset + frames_per_block * steps_per_frame); compare_bits_fft<true> (fft_processor, bit_values, relative_speed, doffset + frames_per_block * steps_per_frame);
double sync_quality = 0; double quality = sync_quality (bit_values);
int bit_count = 0; if (quality > best_score.quality)
for (size_t bit = 0; bit < Params::sync_bits; bit++)
{ {
const auto& bv = bit_values[bit]; best_score.quality = quality;
best_score.speed = relative_speed * center;
/* 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;
bit_count += bv.count;
}
if (bit_count)
{
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;
best_score.speed = relative_speed * center;
}
} }
} }
} }
......
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