Commit 5c6b2c83 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Improve up/down band generation performance.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 261aedce
...@@ -243,23 +243,35 @@ frame_count (const WavData& wav_data) ...@@ -243,23 +243,35 @@ frame_count (const WavData& wav_data)
return wav_data.n_values() / wav_data.n_channels() / Params::frame_size; return wav_data.n_values() / wav_data.n_channels() / Params::frame_size;
} }
void class UpDownGen
get_up_down (int f, vector<int>& up, vector<int>& down, Random::Stream random_stream)
{ {
vector<int> bands_reorder; Random::Stream random_stream;
for (int i = Params::min_band; i <= Params::max_band; i++) Random random;
bands_reorder.push_back (i);
Random random (f, random_stream); // use per frame random seed public:
random.shuffle (bands_reorder); UpDownGen (Random::Stream random_stream) :
random_stream (random_stream),
random (0, random_stream)
{
}
void
get (int f, vector<int>& up, vector<int>& down)
{
vector<int> bands_reorder;
for (int i = Params::min_band; i <= Params::max_band; i++)
bands_reorder.push_back (i);
assert (2 * Params::bands_per_frame < bands_reorder.size()); random.seed (f, random_stream); // use per frame random seed
for (size_t i = 0; i < Params::bands_per_frame; i++) random.shuffle (bands_reorder);
{
up.push_back (bands_reorder[i]); assert (2 * Params::bands_per_frame < bands_reorder.size());
down.push_back (bands_reorder[Params::bands_per_frame + i]); for (size_t i = 0; i < Params::bands_per_frame; i++)
} {
} up.push_back (bands_reorder[i]);
down.push_back (bands_reorder[Params::bands_per_frame + i]);
}
}
};
template<class T> vector<T> template<class T> vector<T>
randomize_bit_order (const vector<T>& bit_vec, bool encode) randomize_bit_order (const vector<T>& bit_vec, bool encode)
...@@ -414,11 +426,12 @@ gen_mix_entries() ...@@ -414,11 +426,12 @@ gen_mix_entries()
{ {
vector<MixEntry> mix_entries; vector<MixEntry> mix_entries;
UpDownGen up_down_gen (Random::Stream::data_up_down);
for (int f = 0; f < int (mark_data_frame_count()); f++) for (int f = 0; f < int (mark_data_frame_count()); f++)
{ {
vector<int> up; vector<int> up;
vector<int> down; vector<int> down;
get_up_down (f, up, down, Random::Stream::data_up_down); up_down_gen.get (f, up, down);
assert (up.size() == down.size()); assert (up.size() == down.size());
for (size_t i = 0; i < up.size(); i++) for (size_t i = 0; i < up.size(); i++)
...@@ -437,11 +450,11 @@ enum class FrameDelta : uint8_t { ...@@ -437,11 +450,11 @@ enum class FrameDelta : uint8_t {
}; };
void void
prepare_frame_delta (int f, vector<FrameDelta>& frame_delta, int data_bit, Random::Stream random_stream) prepare_frame_delta (UpDownGen& up_down_gen, int f, vector<FrameDelta>& frame_delta, int data_bit)
{ {
vector<int> up; vector<int> up;
vector<int> down; vector<int> down;
get_up_down (f, up, down, random_stream); up_down_gen.get (f, up, down);
for (auto u : up) for (auto u : up)
frame_delta[u] = data_bit ? FrameDelta::UP : FrameDelta::DOWN; frame_delta[u] = data_bit ? FrameDelta::UP : FrameDelta::DOWN;
...@@ -505,12 +518,13 @@ mark_data_stream (vector<vector<FrameDelta>>& frame_mod, const vector<int>& bitv ...@@ -505,12 +518,13 @@ mark_data_stream (vector<vector<FrameDelta>>& frame_mod, const vector<int>& bitv
} }
else else
{ {
UpDownGen up_down_gen (Random::Stream::data_up_down);
// sync block always written in linear order (no mix) // sync block always written in linear order (no mix)
for (int f = 0; f < frame_count; f++) for (int f = 0; f < frame_count; f++)
{ {
size_t index = data_frame_pos (f); size_t index = data_frame_pos (f);
prepare_frame_delta (f, frame_mod[index], bitvec[f / Params::frames_per_bit], Random::Stream::data_up_down); // FIXME: rename prepare_frame_delta (up_down_gen, f, frame_mod[index], bitvec[f / Params::frames_per_bit]); // FIXME: rename
} }
} }
} }
...@@ -527,13 +541,15 @@ mark_sync_stream (vector<vector<FrameDelta>>& frame_mod, int ab) ...@@ -527,13 +541,15 @@ mark_sync_stream (vector<vector<FrameDelta>>& frame_mod, int ab)
const int frame_count = mark_sync_frame_count(); const int frame_count = mark_sync_frame_count();
assert (frame_mod.size() >= mark_sync_frame_count()); assert (frame_mod.size() >= mark_sync_frame_count());
UpDownGen up_down_gen (Random::Stream::sync_up_down);
// sync block always written in linear order (no mix) // sync block always written in linear order (no mix)
for (int f = 0; f < frame_count; f++) for (int f = 0; f < frame_count; f++)
{ {
size_t index = sync_frame_pos (f); size_t index = sync_frame_pos (f);
int data_bit = (f / Params::sync_frames_per_bit + ab) & 1; /* write 010101 for a block, 101010 for b block */ int data_bit = (f / Params::sync_frames_per_bit + ab) & 1; /* write 010101 for a block, 101010 for b block */
prepare_frame_delta (f, frame_mod[index], data_bit, Random::Stream::sync_up_down); // FIXME: rename prepare_frame_delta (up_down_gen, f, frame_mod[index], data_bit); // FIXME: rename
} }
} }
...@@ -1008,6 +1024,7 @@ mix_decode (vector<vector<complex<float>>>& fft_out, int n_channels) ...@@ -1008,6 +1024,7 @@ mix_decode (vector<vector<complex<float>>>& fft_out, int n_channels)
vector<float> vector<float>
linear_decode (vector<vector<complex<float>>>& fft_out, int n_channels) linear_decode (vector<vector<complex<float>>>& fft_out, int n_channels)
{ {
UpDownGen up_down_gen (Random::Stream::data_up_down);
vector<float> raw_bit_vec; vector<float> raw_bit_vec;
const int frame_count = mark_data_frame_count(); const int frame_count = mark_data_frame_count();
...@@ -1020,7 +1037,7 @@ linear_decode (vector<vector<complex<float>>>& fft_out, int n_channels) ...@@ -1020,7 +1037,7 @@ linear_decode (vector<vector<complex<float>>>& fft_out, int n_channels)
const size_t index = data_frame_pos (f) * n_channels + ch; const size_t index = data_frame_pos (f) * n_channels + ch;
vector<int> up; vector<int> up;
vector<int> down; vector<int> down;
get_up_down (f, up, down, Random::Stream::data_up_down); up_down_gen.get (f, up, down);
const double min_db = -96; const double min_db = -96;
for (auto u : up) for (auto u : up)
...@@ -1066,13 +1083,14 @@ class SyncFinder ...@@ -1066,13 +1083,14 @@ class SyncFinder
up.resize (Params::sync_bits); up.resize (Params::sync_bits);
down.resize (Params::sync_bits); down.resize (Params::sync_bits);
UpDownGen up_down_gen (Random::Stream::sync_up_down);
size_t n_bands = Params::max_band - Params::min_band + 1; size_t n_bands = Params::max_band - Params::min_band + 1;
for (int bit = 0; bit < Params::sync_bits; bit++) for (int bit = 0; bit < Params::sync_bits; bit++)
{ {
for (int f = 0; f < Params::sync_frames_per_bit; f++) for (int f = 0; f < Params::sync_frames_per_bit; f++)
{ {
vector<int> frame_up, frame_down; vector<int> frame_up, frame_down;
get_up_down (f + bit * Params::sync_frames_per_bit, frame_up, frame_down, Random::Stream::sync_up_down); up_down_gen.get (f + bit * Params::sync_frames_per_bit, frame_up, frame_down);
for (auto u : frame_up) for (auto u : frame_up)
up[bit].push_back (u - Params::min_band + sync_frame_pos (f + bit * Params::sync_frames_per_bit) * n_bands * wav_data.n_channels()); up[bit].push_back (u - Params::min_band + sync_frame_pos (f + bit * Params::sync_frames_per_bit) * n_bands * wav_data.n_channels());
......
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