Index: webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
diff --git a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
index 46c68bf808cc111e77d737e26b067c778dc3953a..4ff0b480936d9f7618d85ebcb73bc2e4947377ea 100644 |
--- a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
+++ b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
@@ -17,6 +17,7 @@ |
#include "webrtc/common_audio/channel_buffer.h" |
#include "webrtc/modules/audio_processing/beamformer/beamformer.h" |
#include "webrtc/modules/audio_processing/beamformer/complex_matrix.h" |
+#include "webrtc/system_wrappers/interface/scoped_vector.h" |
namespace webrtc { |
@@ -26,14 +27,10 @@ namespace webrtc { |
// |
// The implemented nonlinear postfilter algorithm taken from "A Robust Nonlinear |
// Beamforming Postprocessor" by Bastiaan Kleijn. |
-// |
-// TODO(aluebs): Target angle assumed to be 0. Parameterize target angle. |
class NonlinearBeamformer |
: public Beamformer<float>, |
public LappedTransform::Callback { |
public: |
- // At the moment it only accepts uniform linear microphone arrays. Using the |
- // first microphone as a reference position [0, 0, 0] is a natural choice. |
explicit NonlinearBeamformer(const std::vector<Point>& array_geometry); |
// Sample rate corresponds to the lower band. |
@@ -69,19 +66,17 @@ class NonlinearBeamformer |
typedef ComplexMatrix<float> ComplexMatrixF; |
typedef complex<float> complex_f; |
+ void InitInterfAngles(); |
void InitDelaySumMasks(); |
- void InitTargetCovMats(); // TODO(aluebs): Make this depend on target angle. |
+ void InitTargetCovMats(); |
void InitInterfCovMats(); |
- // An implementation of equation 18, which calculates postfilter masks that, |
- // when applied, minimize the mean-square error of our estimation of the |
- // desired signal. A sub-task is to calculate lambda, which is solved via |
- // equation 13. |
+ // Calculates postfilter masks that minimize the mean squared error of our |
+ // estimation of the desired signal. |
float CalculatePostfilterMask(const ComplexMatrixF& interf_cov_mat, |
float rpsiw, |
float ratio_rxiw_rxim, |
- float rmxi_r, |
- float mask_threshold); |
+ float rmxi_r); |
// Prevents the postfilter masks from degenerating too quickly (a cause of |
// musical noise). |
@@ -134,6 +129,9 @@ class NonlinearBeamformer |
// Time and frequency smoothed mask. |
float final_mask_[kNumFreqBins]; |
+ // Angles of the interferer scenarios. |
+ std::vector<float> interf_angles_radians_; |
+ |
// Array of length |kNumFreqBins|, Matrix of size |1| x |num_channels_|. |
ComplexMatrixF delay_sum_masks_[kNumFreqBins]; |
ComplexMatrixF normalized_delay_sum_masks_[kNumFreqBins]; |
@@ -143,19 +141,18 @@ class NonlinearBeamformer |
ComplexMatrixF target_cov_mats_[kNumFreqBins]; |
// Array of length |kNumFreqBins|, Matrix of size |num_input_channels_| x |
- // |num_input_channels_|. |
- ComplexMatrixF interf_cov_mats_[kNumFreqBins]; |
- ComplexMatrixF reflected_interf_cov_mats_[kNumFreqBins]; |
+ // |num_input_channels_|. ScopedVector has a size equal to the number of |
+ // interferer scenarios. |
+ ScopedVector<ComplexMatrixF> interf_cov_mats_[kNumFreqBins]; |
// Of length |kNumFreqBins|. |
- float mask_thresholds_[kNumFreqBins]; |
float wave_numbers_[kNumFreqBins]; |
// Preallocated for ProcessAudioBlock() |
// Of length |kNumFreqBins|. |
float rxiws_[kNumFreqBins]; |
- float rpsiws_[kNumFreqBins]; |
- float reflected_rpsiws_[kNumFreqBins]; |
+ // The vector has a size equal to the number of interferer scenarios. |
+ std::vector<float> rpsiws_[kNumFreqBins]; |
// The microphone normalization factor. |
ComplexMatrixF eig_m_; |