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 b8953b0a4f8d2d4c1e0083b8de7cba0c37e80dc5..26859ecb7bb9def780f36e902e4b8b96c7005f25 100644 |
--- a/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
+++ b/webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h |
@@ -26,6 +26,25 @@ |
namespace webrtc { |
+class PostFilterTransform : public LappedTransform::Callback { |
+ public: |
+ PostFilterTransform(size_t chunk_length, float* window, size_t fft_size); |
+ |
+ void ProcessChunk(float* const* data, float* final_mask); |
+ |
+ protected: |
+ void ProcessAudioBlock(const complex<float>* const* input, |
+ size_t num_input_channels, |
+ size_t num_freq_bins, |
+ size_t num_output_channels, |
+ complex<float>* const* output) override; |
+ |
+ private: |
+ LappedTransform transform_; |
+ const size_t num_freq_bins_; |
+ float* final_mask_; |
+}; |
+ |
// Enhances sound sources coming directly in front of a uniform linear array |
// and suppresses sound sources coming from all other directions. Operates on |
// multichannel signals and produces single-channel output. |
@@ -53,6 +72,12 @@ class NonlinearBeamformer |
// ChannelBuffer can be passed in as |input| and |output|. |
void ProcessChunk(const ChannelBuffer<float>& input, |
ChannelBuffer<float>* output) override; |
+ // Applies the postfilter mask to one chunk of audio. The audio is expected to |
+ // be split into frequency bands inside the ChannelBuffer. The number of |
+ // frames must correspond to the constructor parameters and the number of |
+ // channels is expected to be 1, since that is the output number of channels |
+ // of ProcessChunk(). |
+ void PostFilter(ChannelBuffer<float>* data) override; |
void AimAt(const SphericalPointf& target_direction) override; |
@@ -116,8 +141,8 @@ class NonlinearBeamformer |
// Compute the means needed for the above frequency correction. |
float MaskRangeMean(size_t start_bin, size_t end_bin); |
- // Applies both sets of masks to |input| and store in |output|. |
- void ApplyMasks(const complex_f* const* input, complex_f* const* output); |
+ // Applies post-filter mask to |input| and store in |output|. |
+ void ApplyPostFilter(const complex_f* input, complex_f* output); |
void EstimateTargetPresence(); |
@@ -126,7 +151,8 @@ class NonlinearBeamformer |
// Deals with the fft transform and blocking. |
size_t chunk_length_; |
- std::unique_ptr<LappedTransform> lapped_transform_; |
+ std::unique_ptr<LappedTransform> process_transform_; |
+ std::unique_ptr<PostFilterTransform> postfilter_transform_; |
float window_[kFftSize]; |
// Parameters exposed to the user. |
@@ -161,7 +187,6 @@ class NonlinearBeamformer |
// Array of length |kNumFreqBins|, Matrix of size |1| x |num_channels_|. |
ComplexMatrixF delay_sum_masks_[kNumFreqBins]; |
- ComplexMatrixF normalized_delay_sum_masks_[kNumFreqBins]; |
// Arrays of length |kNumFreqBins|, Matrix of size |num_input_channels_| x |
// |num_input_channels_|. |
@@ -186,6 +211,7 @@ class NonlinearBeamformer |
// For processing the high-frequency input signal. |
float high_pass_postfilter_mask_; |
+ float old_high_pass_mask_; |
// True when the target signal is present. |
bool is_target_present_; |