Chromium Code Reviews| Index: webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc |
| diff --git a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc |
| index 6a30cbfbb3272a014f063ca07a7eb4d0c9949357..fec93778d872a6c4b53a0f98de45d0b3095f42d5 100644 |
| --- a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc |
| +++ b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.cc |
| @@ -36,6 +36,14 @@ const float kSpeedOfSoundMeterSeconds = 343; |
| // TODO(aluebs): Make the target angle dynamically settable. |
| const float kTargetAngleRadians = static_cast<float>(M_PI) / 2.f; |
| +// The minimum separation in radians between the target direction and a |
|
Andrew MacDonald
2015/10/14 23:38:53
and an interferer
aluebs-webrtc
2015/10/17 00:54:49
Done.
|
| +// interferer scenario. |
| +const float kMinAwayRadians = 0.2f; |
| + |
| +// The separation between the target direction and the closest interferer |
| +// scenario is proportional to this constant. |
| +const float kAwaySlope = 0.008f; |
| + |
| // When calculating the interference covariance matrix, this is the weight for |
| // the weighted average between the uniform covariance matrix and the angled |
| // covariance matrix. |
| @@ -183,6 +191,19 @@ std::vector<Point> GetCenteredArray(std::vector<Point> array_geometry) { |
| return array_geometry; |
| } |
| +float GetMinimumSpacing(std::vector<Point> array_geometry) { |
|
Andrew MacDonald
2015/10/14 23:38:53
const reference
aluebs-webrtc
2015/10/17 00:54:50
Done.
|
| + float mic_spacing = Distance(array_geometry[0], array_geometry[1]); |
| + for (size_t i = 0; i < (array_geometry.size() - 1); ++i) { |
| + for (size_t j = i + 1; j < array_geometry.size(); ++j) { |
| + float distance = Distance(array_geometry[i], array_geometry[j]); |
|
Andrew MacDonald
2015/10/14 23:38:53
Not a big deal, but you're computing the first dis
aluebs-webrtc
2015/10/17 00:54:49
Good suggestion. Done.
|
| + if (distance < mic_spacing) { |
| + mic_spacing = distance; |
| + } |
| + } |
| + } |
| + return mic_spacing; |
| +} |
| + |
| } // namespace |
| // static |
| @@ -190,8 +211,9 @@ const size_t NonlinearBeamformer::kNumFreqBins; |
| NonlinearBeamformer::NonlinearBeamformer( |
| const std::vector<Point>& array_geometry) |
| - : num_input_channels_(array_geometry.size()), |
| - array_geometry_(GetCenteredArray(array_geometry)) { |
| + : num_input_channels_(array_geometry.size()), |
| + array_geometry_(GetCenteredArray(array_geometry)), |
| + mic_spacing_(GetMinimumSpacing(array_geometry)) { |
| WindowGenerator::KaiserBesselDerived(kKbdAlpha, kFftSize, window_); |
| } |
| @@ -254,8 +276,10 @@ void NonlinearBeamformer::Initialize(int chunk_size_ms, int sample_rate_hz) { |
| } |
| void NonlinearBeamformer::InitInterfAngles() { |
| - // TODO(aluebs): Make kAway dependent on the mic spacing. |
| - const float kAway = 0.5; |
| + const float kAway = |
| + std::min(static_cast<float>(M_PI), |
| + std::max(kMinAwayRadians, |
| + kAwaySlope * static_cast<float>(M_PI) / mic_spacing_)); |
| interf_angles_radians_.clear(); |
| // TODO(aluebs): When the target angle is settable, make sure the interferer |