From fc737e5442792d72de22d1271471b9d7a0e45c0b Mon Sep 17 00:00:00 2001 From: aluebs Date: Wed, 30 Mar 2016 09:37:43 -0700 Subject: [PATCH] Fix division by zero in NonlinearBeamformer BUG=webrtc:5703 Review URL: https://codereview.webrtc.org/1841323002 Cr-Commit-Position: refs/heads/master@{#12163} --- .../beamformer/nonlinear_beamformer.cc | 13 +++++++++-- .../nonlinear_beamformer_unittest.cc | 23 ++++++++----------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc index 6ea7234f6f..118b38d487 100644 --- a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc +++ b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc @@ -471,8 +471,17 @@ float NonlinearBeamformer::CalculatePostfilterMask( ratio = rpsiw / rpsim; } - return (1.f - std::min(kCutOffConstant, ratio / rmw_r)) / - (1.f - std::min(kCutOffConstant, ratio / ratio_rxiw_rxim)); + float numerator = 1.f - kCutOffConstant; + if (rmw_r > 0.f) { + numerator = 1.f - std::min(kCutOffConstant, ratio / rmw_r); + } + + float denominator = 1.f - kCutOffConstant; + if (ratio_rxiw_rxim > 0.f) { + denominator = 1.f - std::min(kCutOffConstant, ratio / ratio_rxiw_rxim); + } + + return numerator / denominator; } void NonlinearBeamformer::ApplyMasks(const complex_f* const* input, diff --git a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc index 66a564c32c..fbf0ec098f 100644 --- a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc +++ b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc @@ -249,9 +249,6 @@ TEST(NonlinearBeamformerTest, InterfAnglesTakeAmbiguityIntoAccount) { } } -// TODO(peah): Reenable all bitexactness tests once the division-by-zero issue -// has been resolved. - // TODO(peah): Investigate why the nonlinear_beamformer.cc causes a DCHECK in // this setup. TEST(BeamformerBitExactnessTest, @@ -264,7 +261,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo16kHz_ArrayGeometry1_TargetDirection1) { + Stereo16kHz_ArrayGeometry1_TargetDirection1) { const float kOutputReference[] = {0.000064f, 0.000211f, 0.000075f, 0.000064f, 0.000211f, 0.000075f}; @@ -273,7 +270,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo32kHz_ArrayGeometry1_TargetDirection1) { + Stereo32kHz_ArrayGeometry1_TargetDirection1) { const float kOutputReference[] = {0.000183f, 0.000183f, 0.000183f, 0.000183f, 0.000183f, 0.000183f}; @@ -282,7 +279,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo48kHz_ArrayGeometry1_TargetDirection1) { + Stereo48kHz_ArrayGeometry1_TargetDirection1) { const float kOutputReference[] = {0.000155f, 0.000152f, 0.000159f, 0.000155f, 0.000152f, 0.000159f}; @@ -302,7 +299,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo16kHz_ArrayGeometry1_TargetDirection2) { + Stereo16kHz_ArrayGeometry1_TargetDirection2) { const float kOutputReference[] = {0.001144f, -0.001026f, 0.001074f, 0.001144f, -0.001026f, 0.001074f}; @@ -311,7 +308,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo32kHz_ArrayGeometry1_TargetDirection2) { + Stereo32kHz_ArrayGeometry1_TargetDirection2) { const float kOutputReference[] = {0.000732f, -0.000397f, 0.000610f, 0.000732f, -0.000397f, 0.000610f}; @@ -320,7 +317,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo48kHz_ArrayGeometry1_TargetDirection2) { + Stereo48kHz_ArrayGeometry1_TargetDirection2) { const float kOutputReference[] = {0.000106f, -0.000464f, 0.000188f, 0.000106f, -0.000464f, 0.000188f}; @@ -329,7 +326,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo8kHz_ArrayGeometry2_TargetDirection2) { + Stereo8kHz_ArrayGeometry2_TargetDirection2) { const float kOutputReference[] = {-0.000649f, 0.000576f, -0.000148f, -0.000649f, 0.000576f, -0.000148f}; @@ -338,7 +335,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo16kHz_ArrayGeometry2_TargetDirection2) { + Stereo16kHz_ArrayGeometry2_TargetDirection2) { const float kOutputReference[] = {0.000808f, -0.000695f, 0.000739f, 0.000808f, -0.000695f, 0.000739f}; @@ -347,7 +344,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo32kHz_ArrayGeometry2_TargetDirection2) { + Stereo32kHz_ArrayGeometry2_TargetDirection2) { const float kOutputReference[] = {0.000580f, -0.000183f, 0.000458f, 0.000580f, -0.000183f, 0.000458f}; @@ -356,7 +353,7 @@ TEST(BeamformerBitExactnessTest, } TEST(BeamformerBitExactnessTest, - DISABLED_Stereo48kHz_ArrayGeometry2_TargetDirection2) { + Stereo48kHz_ArrayGeometry2_TargetDirection2) { const float kOutputReference[] = {0.000075f, -0.000288f, 0.000156f, 0.000075f, -0.000288f, 0.000156f};