blob: 631db0d99feb3457c0cd4d4fca710e0ff2dd5a06 [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
12#define MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000013
pbos@webrtc.org12dc1a32013-08-05 16:22:53 +000014#include <string.h> // size_t
Jonas Olssona4d87372019-07-05 19:08:33 +020015
kwiberg2d0c3322016-02-14 09:28:33 -080016#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000017
Alessio Bazzica7e53be02019-04-15 12:32:23 +020018#include "api/array_view.h"
Steve Anton10542f22019-01-11 09:11:00 -080019#include "rtc_base/constructor_magic.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000020
21namespace webrtc {
22
23// Forward declarations.
Yves Gerey988cc082018-10-23 12:03:01 +020024class AudioMultiVector;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000025class PostDecodeVad;
26
27// This class handles estimation of background noise parameters.
28class BackgroundNoise {
29 public:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000030 // TODO(hlundin): For 48 kHz support, increase kMaxLpcOrder to 10.
31 // Will work anyway, but probably sound a little worse.
Alessio Bazzica7e53be02019-04-15 12:32:23 +020032 static constexpr size_t kMaxLpcOrder = 8; // 32000 / 8000 + 4.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000033
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +000034 explicit BackgroundNoise(size_t num_channels);
35 virtual ~BackgroundNoise();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000036
37 void Reset();
38
39 // Updates the parameter estimates based on the signal currently in the
40 // |sync_buffer|, and on the latest decision in |vad| if it is running.
Alessio Bazzica60bfb3d2019-06-28 10:49:39 +020041 // Returns true if the filter parameters are updated.
42 bool Update(const AudioMultiVector& sync_buffer, const PostDecodeVad& vad);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000043
Alessio Bazzica7e53be02019-04-15 12:32:23 +020044 // Generates background noise given a random vector and writes the output to
45 // |buffer|.
46 void GenerateBackgroundNoise(rtc::ArrayView<const int16_t> random_vector,
47 size_t channel,
48 int mute_slope,
49 bool too_many_expands,
50 size_t num_noise_samples,
51 int16_t* buffer);
52
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000053 // Returns |energy_| for |channel|.
54 int32_t Energy(size_t channel) const;
55
56 // Sets the value of |mute_factor_| for |channel| to |value|.
57 void SetMuteFactor(size_t channel, int16_t value);
58
59 // Returns |mute_factor_| for |channel|.
60 int16_t MuteFactor(size_t channel) const;
61
62 // Returns a pointer to |filter_| for |channel|.
63 const int16_t* Filter(size_t channel) const;
64
65 // Returns a pointer to |filter_state_| for |channel|.
66 const int16_t* FilterState(size_t channel) const;
67
Alessio Bazzica7e53be02019-04-15 12:32:23 +020068 // Copies |input| to the filter state. Will not copy more than |kMaxLpcOrder|
69 // elements.
70 void SetFilterState(size_t channel, rtc::ArrayView<const int16_t> input);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000071
72 // Returns |scale_| for |channel|.
73 int16_t Scale(size_t channel) const;
74
75 // Returns |scale_shift_| for |channel|.
76 int16_t ScaleShift(size_t channel) const;
77
78 // Accessors.
79 bool initialized() const { return initialized_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000080
81 private:
82 static const int kThresholdIncrement = 229; // 0.0035 in Q16.
Peter Kastingdce40cf2015-08-24 14:52:23 -070083 static const size_t kVecLen = 256;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000084 static const int kLogVecLen = 8; // log2(kVecLen).
Peter Kastingdce40cf2015-08-24 14:52:23 -070085 static const size_t kResidualLength = 64;
Peter Kastingb7e50542015-06-11 12:55:50 -070086 static const int16_t kLogResidualLength = 6; // log2(kResidualLength)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000087
88 struct ChannelParameters {
89 // Constructor.
Yves Gerey665174f2018-06-19 15:03:05 +020090 ChannelParameters() { Reset(); }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000091
92 void Reset() {
93 energy = 2500;
94 max_energy = 0;
95 energy_update_threshold = 500000;
96 low_energy_update_threshold = 0;
97 memset(filter_state, 0, sizeof(filter_state));
98 memset(filter, 0, sizeof(filter));
99 filter[0] = 4096;
Henrik Lundine5531392018-03-13 17:14:10 +0100100 mute_factor = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000101 scale = 20000;
102 scale_shift = 24;
103 }
104
105 int32_t energy;
106 int32_t max_energy;
107 int32_t energy_update_threshold;
108 int32_t low_energy_update_threshold;
109 int16_t filter_state[kMaxLpcOrder];
110 int16_t filter[kMaxLpcOrder + 1];
111 int16_t mute_factor;
112 int16_t scale;
113 int16_t scale_shift;
114 };
115
116 int32_t CalculateAutoCorrelation(const int16_t* signal,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700117 size_t length,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000118 int32_t* auto_correlation) const;
119
120 // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
121 void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
122
123 // Updates the filter parameters.
124 void SaveParameters(size_t channel,
125 const int16_t* lpc_coefficients,
126 const int16_t* filter_state,
127 int32_t sample_energy,
128 int32_t residual_energy);
129
130 size_t num_channels_;
kwiberg2d0c3322016-02-14 09:28:33 -0800131 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000132 bool initialized_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000133
henrikg3c089d72015-09-16 05:37:44 -0700134 RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000135};
136
137} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200138#endif // MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_