Index: webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.cc |
diff --git a/webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.cc b/webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.cc |
index c42a1731b47266eb7e9b45d3e82796766db39baf..8aee3296d1248ae85390fea12e2d6c5dad9986ff 100644 |
--- a/webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.cc |
+++ b/webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.cc |
@@ -20,6 +20,7 @@ |
#include <math.h> |
#include <stdlib.h> |
#include <algorithm> |
+#include <limits> |
#include <numeric> |
#include "webrtc/base/checks.h" |
@@ -224,7 +225,8 @@ void IntelligibilityEnhancer::SolveForLambda(float power_target, |
const float kConvergeThresh = 0.001f; // TODO(ekmeyerson): Find best values |
const int kMaxIters = 100; // for these, based on experiments. |
- const float reciprocal_power_target = 1.f / power_target; |
+ const float reciprocal_power_target = |
+ 1.f / (power_target + std::numeric_limits<float>::epsilon()); |
float lambda_bot = kLambdaBot; |
float lambda_top = kLambdaTop; |
float power_ratio = 2.0f; // Ratio of achieved power to target power. |
@@ -306,13 +308,13 @@ std::vector<std::vector<float>> IntelligibilityEnhancer::CreateErbBank( |
float step, element; |
- step = 1.0f / (ll - lll); |
+ step = ll == lll ? 0.f : 1.f / (ll - lll); |
element = 0.0f; |
for (size_t j = lll; j <= ll; ++j) { |
filter_bank[i - 1][j] = element; |
element += step; |
} |
- step = 1.0f / (rrr - rr); |
+ step = rr == rrr ? 0.f : 1.f / (rrr - rr); |
element = 1.0f; |
for (size_t j = rr; j <= rrr; ++j) { |
filter_bank[i - 1][j] = element; |
@@ -356,7 +358,8 @@ void IntelligibilityEnhancer::SolveForGainsGivenLambda(float lambda, |
if (quadratic) { |
alpha0 = lambda * var_x0[n] * (1 - rho_[n]) * var_x0[n] * var_x0[n]; |
sols[n] = |
- (-beta0 - sqrtf(beta0 * beta0 - 4 * alpha0 * gamma0)) / (2 * alpha0); |
+ (-beta0 - sqrtf(beta0 * beta0 - 4 * alpha0 * gamma0)) / |
+ (2 * alpha0 + std::numeric_limits<float>::epsilon()); |
} else { |
sols[n] = -gamma0 / beta0; |
} |