Commit aacf8e3b authored by Stefan Westerfeld's avatar Stefan Westerfeld

Fix inf/nan problems for fft bands with mag = 0.0.

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent b050d32e
...@@ -346,6 +346,7 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl ...@@ -346,6 +346,7 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl
vector<int> down; vector<int> down;
get_up_down (f, up, down, random_stream); get_up_down (f, up, down, random_stream);
const double data_bit_sign = data_bit > 0 ? 1 : -1; const double data_bit_sign = data_bit > 0 ? 1 : -1;
const float min_mag = 1e-7; // avoid computing pow (0.0, -water_delta) which would be inf
for (auto u : up) for (auto u : up)
{ {
/* /*
...@@ -353,10 +354,14 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl ...@@ -353,10 +354,14 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl
* *
* this actually increases the amount of energy because mag is less than 1.0 * this actually increases the amount of energy because mag is less than 1.0
*/ */
const float mag_factor = pow (abs (fft_out[u]), -Params::water_delta * data_bit_sign); const float mag = abs (fft_out[u]);
if (mag > min_mag)
{
const float mag_factor = pow (mag, -Params::water_delta * data_bit_sign);
fft_delta_spect[u] = fft_out[u] * (mag_factor - 1); fft_delta_spect[u] = fft_out[u] * (mag_factor - 1);
} }
}
for (auto d : down) for (auto d : down)
{ {
/* /*
...@@ -364,10 +369,14 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl ...@@ -364,10 +369,14 @@ mark_bit_linear (int f, const vector<complex<float>>& fft_out, vector<complex<fl
* *
* this actually decreases the amount of energy because mag is less than 1.0 * this actually decreases the amount of energy because mag is less than 1.0
*/ */
const float mag_factor = pow (abs (fft_out[d]), Params::water_delta * data_bit_sign); const float mag = abs (fft_out[d]);
if (mag > min_mag)
{
const float mag_factor = pow (mag, Params::water_delta * data_bit_sign);
fft_delta_spect[d] = fft_out[d] * (mag_factor - 1); fft_delta_spect[d] = fft_out[d] * (mag_factor - 1);
} }
}
} }
size_t size_t
...@@ -412,6 +421,7 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex ...@@ -412,6 +421,7 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex
assert (bitvec.size() == mark_data_frame_count() / Params::frames_per_bit); assert (bitvec.size() == mark_data_frame_count() / Params::frames_per_bit);
const int frame_count = mark_data_frame_count(); const int frame_count = mark_data_frame_count();
const float min_mag = 1e-7; // avoid computing pow (0.0, -water_delta) which would be inf
if (Params::mix) if (Params::mix)
{ {
...@@ -431,13 +441,20 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex ...@@ -431,13 +441,20 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex
const int u = mix_entries[b].up; const int u = mix_entries[b].up;
const int index = (start_frame + mix_entries[b].frame) * wav_data.n_channels() + ch; const int index = (start_frame + mix_entries[b].frame) * wav_data.n_channels() + ch;
{ {
const float mag_factor = pow (abs (fft_out[index][u]), -Params::water_delta * data_bit_sign); const float mag = abs (fft_out[index][u]);
if (mag > min_mag)
{
const float mag_factor = pow (mag, -Params::water_delta * data_bit_sign);
fft_delta_spect[index][u] = fft_out[index][u] * (mag_factor - 1); fft_delta_spect[index][u] = fft_out[index][u] * (mag_factor - 1);
} }
}
const int d = mix_entries[b].down; const int d = mix_entries[b].down;
{ {
const float mag_factor = pow (abs (fft_out[index][d]), Params::water_delta * data_bit_sign); const float mag = abs (fft_out[index][d]);
if (mag > min_mag)
{
const float mag_factor = pow (mag, Params::water_delta * data_bit_sign);
fft_delta_spect[index][d] = fft_out[index][d] * (mag_factor - 1); fft_delta_spect[index][d] = fft_out[index][d] * (mag_factor - 1);
} }
...@@ -445,6 +462,7 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex ...@@ -445,6 +462,7 @@ mark_data (const WavData& wav_data, int start_frame, const vector<vector<complex
} }
} }
} }
}
else else
{ {
for (int f = 0; f < frame_count; f++) for (int f = 0; f < frame_count; f++)
......
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