blob: fd369a284b15872e8cb9d7c2a8bbbe1ad15d349b [file] [log] [blame]
pbos@webrtc.org788acd12014-12-15 09:41:24 +00001/*
2 * Copyright (c) 2012 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 WEBRTC_MODULES_AUDIO_PROCESSING_AGC_HISTOGRAM_H_
12#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_HISTOGRAM_H_
13
14#include <string.h>
15
kwiberg88788ad2016-02-19 07:04:49 -080016#include <memory>
17
pbos@webrtc.org788acd12014-12-15 09:41:24 +000018#include "webrtc/typedefs.h"
19
20namespace webrtc {
21
22// This class implements the histogram of loudness with circular buffers so that
23// the histogram tracks the last T seconds of the loudness.
24class Histogram {
25 public:
26 // Create a non-sliding Histogram.
27 static Histogram* Create();
28
29 // Create a sliding Histogram, i.e. the histogram represents the last
30 // |window_size| samples.
31 static Histogram* Create(int window_size);
32 ~Histogram();
33
34 // Insert RMS and the corresponding activity probability.
35 void Update(double rms, double activity_probability);
36
37 // Reset the histogram, forget the past.
38 void Reset();
39
40 // Current loudness, which is actually the mean of histogram in loudness
41 // domain.
42 double CurrentRms() const;
43
44 // Sum of the histogram content.
45 double AudioContent() const;
46
47 // Number of times the histogram has been updated.
48 int num_updates() const { return num_updates_; }
49
50 private:
51 Histogram();
52 explicit Histogram(int window);
53
54 // Find the histogram bin associated with the given |rms|.
55 int GetBinIndex(double rms);
56
57 void RemoveOldestEntryAndUpdate();
58 void InsertNewestEntryAndUpdate(int activity_prob_q10, int hist_index);
59 void UpdateHist(int activity_prob_q10, int hist_index);
60 void RemoveTransient();
61
62 // Number of histogram bins.
63 static const int kHistSize = 77;
64
65 // Number of times the histogram is updated
66 int num_updates_;
67 // Audio content, this should be equal to the sum of the components of
68 // |bin_count_q10_|.
69 int64_t audio_content_q10_;
70
71 // Histogram of input RMS in Q10 with |kHistSize_| bins. In each 'Update(),'
72 // we increment the associated histogram-bin with the given probability. The
73 // increment is implemented in Q10 to avoid rounding errors.
74 int64_t bin_count_q10_[kHistSize];
75
76 // Circular buffer for probabilities
kwiberg88788ad2016-02-19 07:04:49 -080077 std::unique_ptr<int[]> activity_probability_;
pbos@webrtc.org788acd12014-12-15 09:41:24 +000078 // Circular buffer for histogram-indices of probabilities.
kwiberg88788ad2016-02-19 07:04:49 -080079 std::unique_ptr<int[]> hist_bin_index_;
pbos@webrtc.org788acd12014-12-15 09:41:24 +000080 // Current index of circular buffer, where the newest data will be written to,
81 // therefore, pointing to the oldest data if buffer is full.
82 int buffer_index_;
83 // Indicating if buffer is full and we had a wrap around.
84 int buffer_is_full_;
85 // Size of circular buffer.
86 int len_circular_buffer_;
87 int len_high_activity_;
88};
89
90} // namespace webrtc
91
92#endif // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_HISTOGRAM_H_