Normalize delay-and-sum mask in Beamformer
This normalization is done in the Matlab Code but was never ported to the C++ version.
R=andrew@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/37919004
Cr-Commit-Position: refs/heads/master@{#8279}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8279 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/beamformer/beamformer.cc b/webrtc/modules/audio_processing/beamformer/beamformer.cc
index 8799042..09aa312 100644
--- a/webrtc/modules/audio_processing/beamformer/beamformer.cc
+++ b/webrtc/modules/audio_processing/beamformer/beamformer.cc
@@ -123,6 +123,18 @@
return std::floor(x + 0.5f);
}
+// Calculates the sum of absolute values of a complex matrix.
+float SumAbs(const ComplexMatrix<float>& mat) {
+ float sum_abs = 0.f;
+ const complex<float>* 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<Point>& array_geometry)
@@ -205,6 +217,9 @@
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 @@
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 4094571..ef25088 100644
--- a/webrtc/modules/audio_processing/beamformer/beamformer.h
+++ b/webrtc/modules/audio_processing/beamformer/beamformer.h
@@ -136,6 +136,7 @@
// 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 3b4afdb..8d592a5 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 @@
complex<float>* 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;