Clean up Beamformer initialization

This generates bit-exact output.

R=andrew@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/37939004

Cr-Commit-Position: refs/heads/master@{#8254}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8254 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_processing/beamformer/beamformer.cc b/webrtc/modules/audio_processing/beamformer/beamformer.cc
index d76fa68..b74e9ad 100644
--- a/webrtc/modules/audio_processing/beamformer/beamformer.cc
+++ b/webrtc/modules/audio_processing/beamformer/beamformer.cc
@@ -24,12 +24,12 @@
 // Alpha for the Kaiser Bessel Derived window.
 const float kAlpha = 1.5f;
 
-// The minimum value a postprocessing mask can take.
+// The minimum value a post-processing mask can take.
 const float kMaskMinimum = 0.01f;
 
 const float kSpeedOfSoundMeterSeconds = 340;
 
-// For both target and interf angles, 0 is perpendicular to the microphone
+// For both target and interference angles, 0 is perpendicular to the microphone
 // array, facing forwards. The positive direction goes counterclockwise.
 // The angle at which we amplify sound.
 const float kTargetAngleRadians = 0.f;
@@ -40,7 +40,7 @@
 // suppress sound coming from angles near +-|kInterfAngleRadians| as well.
 const float kInterfAngleRadians = static_cast<float>(M_PI) / 4.f;
 
-// When calculating the interf covariance matrix, this is the weight for
+// When calculating the interference covariance matrix, this is the weight for
 // the weighted average between the uniform covariance matrix and the angled
 // covariance matrix.
 // Rpsi = Rpsi_angled * kBalance + Rpsi_uniform * (1 - kBalance)
@@ -171,26 +171,19 @@
   for (int i = 0; i < kNumFreqBins; ++i) {
     float freq_hz = (static_cast<float>(i) / kFftSize) * sample_rate_hz_;
     wave_numbers_[i] = 2 * M_PI * freq_hz / kSpeedOfSoundMeterSeconds;
-  }
-
-  for (int i = 0; i < kNumFreqBins; ++i) {
     mask_thresholds_[i] = num_input_channels_ * num_input_channels_ *
                           kBeamwidthConstant * wave_numbers_[i] *
                           wave_numbers_[i];
   }
 
-  // Init all nonadaptive values before looping through the frames.
+  // Initialize all nonadaptive values before looping through the frames.
   InitDelaySumMasks();
   InitTargetCovMats();
   InitInterfCovMats();
 
   for (int i = 0; i < kNumFreqBins; ++i) {
     rxiws_[i] = Norm(target_cov_mats_[i], delay_sum_masks_[i]);
-  }
-  for (int i = 0; i < kNumFreqBins; ++i) {
     rpsiws_[i] = Norm(interf_cov_mats_[i], delay_sum_masks_[i]);
-  }
-  for (int i = 0; i < kNumFreqBins; ++i) {
     reflected_rpsiws_[i] =
         Norm(reflected_interf_cov_mats_[i], delay_sum_masks_[i]);
   }
@@ -224,10 +217,8 @@
   target_cov_mats_[0].Scale(1.f / normalization_factor);
 
   for (int i = 1; i < kNumFreqBins; ++i) {
-    float wave_number = wave_numbers_[i];
-
     target_cov_mats_[i].Resize(num_input_channels_, num_input_channels_);
-    CovarianceMatrixGenerator::Boxcar(wave_number,
+    CovarianceMatrixGenerator::Boxcar(wave_numbers_[i],
                                       num_input_channels_,
                                       mic_spacing_,
                                       kBoxcarHalfWidth,
@@ -245,16 +236,14 @@
 
   complex_f normalization_factor = interf_cov_mats_[0].Trace();
   interf_cov_mats_[0].Scale(1.f / normalization_factor);
-
+  reflected_interf_cov_mats_[0].PointwiseConjugate(interf_cov_mats_[0]);
   for (int i = 1; i < kNumFreqBins; ++i) {
-    float wave_number = wave_numbers_[i];
-
     interf_cov_mats_[i].Resize(num_input_channels_, num_input_channels_);
     ComplexMatrixF uniform_cov_mat(num_input_channels_, num_input_channels_);
     ComplexMatrixF angled_cov_mat(num_input_channels_, num_input_channels_);
 
     CovarianceMatrixGenerator::GappedUniformCovarianceMatrix(
-        wave_number,
+        wave_numbers_[i],
         num_input_channels_,
         mic_spacing_,
         kCovUniformGapHalfWidth,
@@ -279,9 +268,6 @@
     uniform_cov_mat.Scale(1 - kBalance);
     angled_cov_mat.Scale(kBalance);
     interf_cov_mats_[i].Add(uniform_cov_mat, angled_cov_mat);
-  }
-
-  for (int i = 0; i < kNumFreqBins; ++i) {
     reflected_interf_cov_mats_[i].PointwiseConjugate(interf_cov_mats_[i]);
   }
 }
@@ -301,7 +287,7 @@
   high_pass_exists_ = high_pass_split_input != NULL;
   lapped_transform_->ProcessChunk(input, output);
 
-  // Apply delay and sum and postfilter in the time domain. WARNING: only works
+  // Apply delay and sum and post-filter in the time domain. WARNING: only works
   // because delay-and-sum is not frequency dependent.
   if (high_pass_exists_) {
     high_pass_postfilter_mask_ /= num_blocks_in_this_chunk_;
@@ -340,7 +326,7 @@
 
   float* mask_data = postfilter_masks_[current_block_ix_].elements()[0];
 
-  // Calculating the postfilter masks. Note that we need two for each
+  // Calculating the post-filter masks. Note that we need two for each
   // frequency bin to account for the positive and negative interferer
   // angle.
   for (int i = 0; i < kNumFreqBins; ++i) {
diff --git a/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc b/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc
index 856428e..3b4afdb 100644
--- a/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc
+++ b/webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.cc
@@ -115,7 +115,7 @@
 
   complex<float>* const* elements = mat->elements();
 
-  float diagonal_value = 1 - (2 * half_width);
+  float diagonal_value = 1.f - 2.f * half_width;
   for (int i = 0; i < num_input_channels; ++i) {
     for (int j = 0; j < num_input_channels; ++j) {
       if (i == j) {