1 /*
2  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef MODULES_AUDIO_PROCESSING_AGC2_SIGNAL_CLASSIFIER_H_
12 #define MODULES_AUDIO_PROCESSING_AGC2_SIGNAL_CLASSIFIER_H_
13 
14 #include <memory>
15 #include <vector>
16 
17 #include "api/array_view.h"
18 #include "common_audio/third_party/ooura/fft_size_128/ooura_fft.h"
19 #include "modules/audio_processing/agc2/down_sampler.h"
20 #include "modules/audio_processing/agc2/noise_spectrum_estimator.h"
21 #include "rtc_base/constructor_magic.h"
22 
23 namespace webrtc {
24 
25 class ApmDataDumper;
26 class AudioBuffer;
27 
28 class SignalClassifier {
29  public:
30   enum class SignalType { kNonStationary, kStationary };
31 
32   explicit SignalClassifier(ApmDataDumper* data_dumper);
33   ~SignalClassifier();
34 
35   void Initialize(int sample_rate_hz);
36   SignalType Analyze(rtc::ArrayView<const float> signal);
37 
38  private:
39   class FrameExtender {
40    public:
41     FrameExtender(size_t frame_size, size_t extended_frame_size);
42     ~FrameExtender();
43 
44     void ExtendFrame(rtc::ArrayView<const float> x,
45                      rtc::ArrayView<float> x_extended);
46 
47    private:
48     std::vector<float> x_old_;
49 
50     RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameExtender);
51   };
52 
53   ApmDataDumper* const data_dumper_;
54   DownSampler down_sampler_;
55   std::unique_ptr<FrameExtender> frame_extender_;
56   NoiseSpectrumEstimator noise_spectrum_estimator_;
57   int sample_rate_hz_;
58   int initialization_frames_left_;
59   int consistent_classification_counter_;
60   SignalType last_signal_type_;
61   const OouraFft ooura_fft_;
62   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SignalClassifier);
63 };
64 
65 }  // namespace webrtc
66 
67 #endif  // MODULES_AUDIO_PROCESSING_AGC2_SIGNAL_CLASSIFIER_H_
68