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) {