diff --git a/webrtc/modules/audio_processing/beamformer/beamformer.cc b/webrtc/modules/audio_processing/beamformer/beamformer.cc index 8799042048..09aa312190 100644 --- a/webrtc/modules/audio_processing/beamformer/beamformer.cc +++ b/webrtc/modules/audio_processing/beamformer/beamformer.cc @@ -123,6 +123,18 @@ int Round(float x) { return std::floor(x + 0.5f); } +// Calculates the sum of absolute values of a complex matrix. +float SumAbs(const ComplexMatrix& mat) { + float sum_abs = 0.f; + const complex* const* mat_els = mat.elements(); + for (int i = 0; i < mat.num_rows(); ++i) { + for (int j = 0; j < mat.num_columns(); ++j) { + sum_abs += std::abs(mat_els[i][j]); + } + } + return sum_abs; +} + } // namespace Beamformer::Beamformer(const std::vector& array_geometry) @@ -205,6 +217,9 @@ void Beamformer::InitDelaySumMasks() { complex_f norm_factor = sqrt( ConjugateDotProduct(delay_sum_masks_[f_ix], delay_sum_masks_[f_ix])); delay_sum_masks_[f_ix].Scale(1.f / norm_factor); + normalized_delay_sum_masks_[f_ix].CopyFrom(delay_sum_masks_[f_ix]); + normalized_delay_sum_masks_[f_ix].Scale(1.f / SumAbs( + normalized_delay_sum_masks_[f_ix])); } } @@ -405,7 +420,8 @@ void Beamformer::ApplyMasks(const complex_f* const* input, for (int f_ix = 0; f_ix < kNumFreqBins; ++f_ix) { output_channel[f_ix] = complex_f(0.f, 0.f); - const complex_f* delay_sum_mask_els = delay_sum_masks_[f_ix].elements()[0]; + const complex_f* delay_sum_mask_els = + normalized_delay_sum_masks_[f_ix].elements()[0]; for (int c_ix = 0; c_ix < num_input_channels_; ++c_ix) { output_channel[f_ix] += input[c_ix][f_ix] * delay_sum_mask_els[c_ix]; } diff --git a/webrtc/modules/audio_processing/beamformer/beamformer.h b/webrtc/modules/audio_processing/beamformer/beamformer.h index 4094571454..ef25088f26 100644 --- a/webrtc/modules/audio_processing/beamformer/beamformer.h +++ b/webrtc/modules/audio_processing/beamformer/beamformer.h @@ -136,6 +136,7 @@ class Beamformer : public LappedTransform::Callback { // Array of length |kNumFreqBins|, Matrix of size |1| x |num_channels_|. ComplexMatrixF delay_sum_masks_[kNumFreqBins]; + ComplexMatrixF normalized_delay_sum_masks_[kNumFreqBins]; // Array of length |kNumFreqBins|, Matrix of size |num_input_channels_| x // |num_input_channels_|. diff --git a/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc b/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc index 3b4afdbfd2..8d592a5c22 100644 --- a/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc +++ b/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc @@ -143,6 +143,7 @@ void CovarianceMatrixGenerator::PhaseAlignmentMasks(int frequency_bin, complex* const* mat_els = mat->elements(); for (int c_ix = 0; c_ix < num_input_channels; ++c_ix) { + // TODO(aluebs): Generalize for non-uniform-linear microphone arrays. float distance = mic_spacing * c_ix * sin_angle * -1.f; float phase_shift = 2 * M_PI * distance * freq_in_hertz / sound_speed;