/* * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_ #define MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_ #include #include #include "array_view.h" #include "audio_buffer.h" #include "noise_estimator.h" #include "ns_common.h" #include "ns_config.h" #include "ns_fft.h" #include "speech_probability_estimator.h" #include "wiener_filter.h" namespace webrtc { // Class for suppressing noise in a signal. class NoiseSuppressor { public: NoiseSuppressor(const NsConfig &config, size_t sample_rate_hz, size_t num_channels); NoiseSuppressor(const NoiseSuppressor &) = delete; NoiseSuppressor &operator=(const NoiseSuppressor &) = delete; // Analyses the signal (typically applied before the AEC to avoid analyzing // any comfort noise signal). void Analyze(const AudioBuffer &audio); // Applies noise suppression. void Process(AudioBuffer *audio); private: const size_t num_bands_; const size_t num_channels_; const SuppressionParams suppression_params_; int32_t num_analyzed_frames_ = -1; NrFft fft_; struct ChannelState { ChannelState(const SuppressionParams &suppression_params, size_t num_bands); SpeechProbabilityEstimator speech_probability_estimator; WienerFilter wiener_filter; NoiseEstimator noise_estimator; std::array prev_analysis_signal_spectrum{}; std::array analyze_analysis_memory{}; std::array process_analysis_memory{}; std::array process_synthesis_memory{}; std::vector> process_delay_memory; }; struct FilterBankState { std::array real; std::array imag; std::array extended_frame; }; std::vector filter_bank_states_heap_; std::vector upper_band_gains_heap_; std::vector energies_before_filtering_heap_; std::vector gain_adjustments_heap_; std::vector> channels_; // Aggregates the Wiener filters into a single filter to use. void AggregateWienerFilters( rtc::ArrayView filter) const; }; } // namespace webrtc #endif // MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_