Commit 33e58a76 authored by Stefan Westerfeld's avatar Stefan Westerfeld

Reuse memory for SyncFinder fft output db values.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent c2bef3e8
...@@ -842,25 +842,25 @@ public: ...@@ -842,25 +842,25 @@ public:
init_up_down (wav_data); init_up_down (wav_data);
// compute multiple time-shifted fft vectors vector<float> fft_db;
vector<vector<float>> fft_sync_shift_out;
for (size_t sync_shift = 0; sync_shift < Params::frame_size; sync_shift += Params::sync_search_step)
fft_sync_shift_out.push_back (sync_fft (wav_data, sync_shift, frame_count (wav_data) - 1));
// compute multiple time-shifted fft vectors
size_t n_bands = Params::max_band - Params::min_band + 1; size_t n_bands = Params::max_band - Params::min_band + 1;
for (int start_frame = 0; start_frame < frame_count (wav_data); start_frame++) for (size_t sync_shift = 0; sync_shift < Params::frame_size; sync_shift += Params::sync_search_step)
{ {
for (size_t sync_shift = 0; sync_shift < Params::frame_size; sync_shift += Params::sync_search_step) sync_fft (wav_data, sync_shift, frame_count (wav_data) - 1, fft_db);
for (int start_frame = 0; start_frame < frame_count (wav_data); start_frame++)
{ {
const size_t sync_index = start_frame * Params::frame_size + sync_shift; const size_t sync_index = start_frame * Params::frame_size + sync_shift;
if ((start_frame + mark_sync_frame_count()) * wav_data.n_channels() * n_bands < fft_sync_shift_out[sync_shift / Params::sync_search_step].size()) if ((start_frame + mark_sync_frame_count()) * wav_data.n_channels() * n_bands < fft_db.size())
{ {
double quality = sync_decode (wav_data, start_frame, fft_sync_shift_out[sync_shift / Params::sync_search_step]); double quality = sync_decode (wav_data, start_frame, fft_db);
// printf ("%zd %f\n", sync_index, quality); // printf ("%zd %f\n", sync_index, quality);
sync_scores.emplace_back (Score { sync_index, quality }); sync_scores.emplace_back (Score { sync_index, quality });
} }
} }
} }
sort (sync_scores.begin(), sync_scores.end(), [] (const Score& a, const Score &b) { return a.index < b.index; });
for (size_t i = 0; i < sync_scores.size(); i++) for (size_t i = 0; i < sync_scores.size(); i++)
{ {
// printf ("%zd %f\n", sync_scores[i].index, sync_scores[i].quality); // printf ("%zd %f\n", sync_scores[i].index, sync_scores[i].quality);
...@@ -887,10 +887,10 @@ public: ...@@ -887,10 +887,10 @@ public:
int end = sync_scores[i].index + Params::sync_search_step; int end = sync_scores[i].index + Params::sync_search_step;
for (int fine_index = start; fine_index <= end; fine_index += Params::sync_search_fine) for (int fine_index = start; fine_index <= end; fine_index += Params::sync_search_fine)
{ {
vector<float> fft_out_range = sync_fft (wav_data, fine_index, mark_sync_frame_count()); sync_fft (wav_data, fine_index, mark_sync_frame_count(), fft_db);
if (fft_out_range.size()) if (fft_db.size())
{ {
double q = sync_decode (wav_data, 0, fft_out_range); double q = sync_decode (wav_data, 0, fft_db);
if (q > best_quality) if (q > best_quality)
{ {
...@@ -907,11 +907,12 @@ public: ...@@ -907,11 +907,12 @@ public:
return result_scores; return result_scores;
} }
private: private:
vector<float> void
sync_fft (const WavData& wav_data, size_t index, size_t count) sync_fft (const WavData& wav_data, size_t index, size_t count, vector<float>& fft_out_db)
{ {
fft_out_db.clear();
/* computing db-magnitude is expensive, so we better do it here */ /* computing db-magnitude is expensive, so we better do it here */
vector<float> fft_out_db;
for (const vector<complex<float>>& spect : compute_frame_ffts (wav_data, index, count)) for (const vector<complex<float>>& spect : compute_frame_ffts (wav_data, index, count))
{ {
const double min_db = -96; const double min_db = -96;
...@@ -919,7 +920,6 @@ private: ...@@ -919,7 +920,6 @@ private:
for (int i = Params::min_band; i <= Params::max_band; i++) for (int i = Params::min_band; i <= Params::max_band; i++)
fft_out_db.push_back (db_from_factor (abs (spect[i]), min_db)); fft_out_db.push_back (db_from_factor (abs (spect[i]), min_db));
} }
return fft_out_db;
} }
const char* const char*
......
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