Commit 73960517 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Refactor sync search: move helpers to SyncFinder class.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 496ea67f
......@@ -818,7 +818,7 @@ public:
get_up_down (i, up[i], down[i]);
}
double
sync_decode (const WavData& wav_data, vector<vector<complex<float>>>& fft_out, vector<vector<complex<float>>>& fft_orig_out)
sync_decode (const WavData& wav_data, const vector<vector<complex<float>>>& fft_out, const vector<vector<complex<float>>>& fft_orig_out)
{
// FIXME: is copypasted
const int frame_count = mark_sync_frame_count();
......@@ -865,49 +865,9 @@ public:
sync_quality = normalize_sync_quality (sync_quality);
return sync_quality;
}
};
vector<vector<complex<float>>>
sync_fft (const WavData& wav_data, size_t index, size_t count)
{
if (wav_data.n_values() < (index + count * Params::frame_size) * wav_data.n_channels())
return {};
vector<float> part_signal;
for (size_t i = 0; i < count * Params::frame_size; i++)
void
search (const WavData& wav_data)
{
for (int ch = 0; ch < wav_data.n_channels(); ch++)
part_signal.push_back (wav_data.samples()[(index + i) * wav_data.n_channels() + ch]);
}
WavData wav_part (part_signal, wav_data.n_channels(), wav_data.mix_freq(), wav_data.bit_depth());
return compute_frame_ffts (wav_part);
}
const char*
find_closest_sync (size_t index)
{
int best_error = 0xffff;
int best = 0;
for (int i = 0; i < 100; i++)
{
int error = abs (int (index) - int (i * Params::sync_bits * Params::sync_frames_per_bit * Params::frame_size));
if (error < best_error)
{
best = i;
best_error = error;
}
}
static char buffer[1024]; // this code is for debugging only, so this should be ok
sprintf (buffer, "n:%d offset:%d", best, int (index) - int (best * Params::sync_bits * Params::sync_frames_per_bit * Params::frame_size));
return buffer;
}
int
decode_and_report (const WavData& wav_data, const string& orig_pattern, vector<vector<complex<float>>>& fft_out, vector<vector<complex<float>>>& fft_orig_out)
{
SyncFinder sync_finder;
struct SyncScore {
size_t index;
double quality;
......@@ -928,7 +888,7 @@ decode_and_report (const WavData& wav_data, const string& orig_pattern, vector<v
{
vector<vector<complex<float>>> fft_out_range = get_frame_range (wav_data, fft_sync_shift_out[sync_shift / 128], start_frame, mark_sync_frame_count());
double quality = sync_finder.sync_decode (wav_data, fft_out_range, /* FIXME: non-blind */ fft_orig_out);
double quality = sync_decode (wav_data, fft_out_range, /* FIXME: non-blind */ {});
// printf ("%zd %f\n", sync_index, quality);
sync_scores.emplace_back (SyncScore { sync_index, quality });
}
......@@ -964,7 +924,7 @@ decode_and_report (const WavData& wav_data, const string& orig_pattern, vector<v
vector<vector<complex<float>>> fft_out_range = sync_fft (wav_data, fine_index, mark_sync_frame_count());
if (fft_out_range.size())
{
double q = sync_finder.sync_decode (wav_data, fft_out_range, fft_orig_out);
double q = sync_decode (wav_data, fft_out_range, {});
if (q > best_quality)
{
......@@ -977,6 +937,50 @@ decode_and_report (const WavData& wav_data, const string& orig_pattern, vector<v
}
}
}
}
vector<vector<complex<float>>>
sync_fft (const WavData& wav_data, size_t index, size_t count)
{
if (wav_data.n_values() < (index + count * Params::frame_size) * wav_data.n_channels())
return {};
vector<float> part_signal;
for (size_t i = 0; i < count * Params::frame_size; i++)
{
for (int ch = 0; ch < wav_data.n_channels(); ch++)
part_signal.push_back (wav_data.samples()[(index + i) * wav_data.n_channels() + ch]);
}
WavData wav_part (part_signal, wav_data.n_channels(), wav_data.mix_freq(), wav_data.bit_depth());
return compute_frame_ffts (wav_part);
}
const char*
find_closest_sync (size_t index)
{
int best_error = 0xffff;
int best = 0;
for (int i = 0; i < 100; i++)
{
int error = abs (int (index) - int (i * Params::sync_bits * Params::sync_frames_per_bit * Params::frame_size));
if (error < best_error)
{
best = i;
best_error = error;
}
}
static char buffer[1024]; // this code is for debugging only, so this should be ok
sprintf (buffer, "n:%d offset:%d", best, int (index) - int (best * Params::sync_bits * Params::sync_frames_per_bit * Params::frame_size));
return buffer;
}
};
int
decode_and_report (const WavData& wav_data, const string& orig_pattern, vector<vector<complex<float>>>& fft_out, vector<vector<complex<float>>>& fft_orig_out)
{
SyncFinder sync_finder;
sync_finder.search (wav_data);
return 0;
vector<float> soft_bit_vec;
......
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