blob: 51911793c2c47cd933ec33d84afdb0aff99cf777 [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
kwiberg2d0c3322016-02-14 09:28:33 -080015#include <memory>
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000016
Alessio Bazzica7e53be02019-04-15 12:32:23 +020017#include "api/array_view.h"
Steve Anton10542f22019-01-11 09:11:00 -080018#include "rtc_base/constructor_magic.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000019
20namespace webrtc {
21
22// Forward declarations.
Yves Gerey988cc082018-10-23 12:03:01 +020023class AudioMultiVector;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000024class PostDecodeVad;
25
26// This class handles estimation of background noise parameters.
27class BackgroundNoise {
28 public:
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000029 // TODO(hlundin): For 48 kHz support, increase kMaxLpcOrder to 10.
30 // Will work anyway, but probably sound a little worse.
Alessio Bazzica7e53be02019-04-15 12:32:23 +020031 static constexpr size_t kMaxLpcOrder = 8; // 32000 / 8000 + 4.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000032
pbos@webrtc.org2d1a55c2013-07-31 15:54:00 +000033 explicit BackgroundNoise(size_t num_channels);
34 virtual ~BackgroundNoise();
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000035
36 void Reset();
37
38 // Updates the parameter estimates based on the signal currently in the
39 // |sync_buffer|, and on the latest decision in |vad| if it is running.
Alessio Bazzica60bfb3d2019-06-28 10:49:39 +020040 // Returns true if the filter parameters are updated.
41 bool Update(const AudioMultiVector& sync_buffer, const PostDecodeVad& vad);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042
Alessio Bazzica7e53be02019-04-15 12:32:23 +020043 // Generates background noise given a random vector and writes the output to
44 // |buffer|.
45 void GenerateBackgroundNoise(rtc::ArrayView<const int16_t> random_vector,
46 size_t channel,
47 int mute_slope,
48 bool too_many_expands,
49 size_t num_noise_samples,
50 int16_t* buffer);
51
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000052 // Returns |energy_| for |channel|.
53 int32_t Energy(size_t channel) const;
54
55 // Sets the value of |mute_factor_| for |channel| to |value|.
56 void SetMuteFactor(size_t channel, int16_t value);
57
58 // Returns |mute_factor_| for |channel|.
59 int16_t MuteFactor(size_t channel) const;
60
61 // Returns a pointer to |filter_| for |channel|.
62 const int16_t* Filter(size_t channel) const;
63
64 // Returns a pointer to |filter_state_| for |channel|.
65 const int16_t* FilterState(size_t channel) const;
66
Alessio Bazzica7e53be02019-04-15 12:32:23 +020067 // Copies |input| to the filter state. Will not copy more than |kMaxLpcOrder|
68 // elements.
69 void SetFilterState(size_t channel, rtc::ArrayView<const int16_t> input);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000070
71 // Returns |scale_| for |channel|.
72 int16_t Scale(size_t channel) const;
73
74 // Returns |scale_shift_| for |channel|.
75 int16_t ScaleShift(size_t channel) const;
76
77 // Accessors.
78 bool initialized() const { return initialized_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000079
80 private:
81 static const int kThresholdIncrement = 229; // 0.0035 in Q16.
Peter Kastingdce40cf2015-08-24 14:52:23 -070082 static const size_t kVecLen = 256;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000083 static const int kLogVecLen = 8; // log2(kVecLen).
Peter Kastingdce40cf2015-08-24 14:52:23 -070084 static const size_t kResidualLength = 64;
Peter Kastingb7e50542015-06-11 12:55:50 -070085 static const int16_t kLogResidualLength = 6; // log2(kResidualLength)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000086
87 struct ChannelParameters {
88 // Constructor.
Yves Gerey665174f2018-06-19 15:03:05 +020089 ChannelParameters() { Reset(); }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000090
91 void Reset() {
92 energy = 2500;
93 max_energy = 0;
94 energy_update_threshold = 500000;
95 low_energy_update_threshold = 0;
96 memset(filter_state, 0, sizeof(filter_state));
97 memset(filter, 0, sizeof(filter));
98 filter[0] = 4096;
Henrik Lundine5531392018-03-13 17:14:10 +010099 mute_factor = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000100 scale = 20000;
101 scale_shift = 24;
102 }
103
104 int32_t energy;
105 int32_t max_energy;
106 int32_t energy_update_threshold;
107 int32_t low_energy_update_threshold;
108 int16_t filter_state[kMaxLpcOrder];
109 int16_t filter[kMaxLpcOrder + 1];
110 int16_t mute_factor;
111 int16_t scale;
112 int16_t scale_shift;
113 };
114
115 int32_t CalculateAutoCorrelation(const int16_t* signal,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700116 size_t length,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000117 int32_t* auto_correlation) const;
118
119 // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
120 void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
121
122 // Updates the filter parameters.
123 void SaveParameters(size_t channel,
124 const int16_t* lpc_coefficients,
125 const int16_t* filter_state,
126 int32_t sample_energy,
127 int32_t residual_energy);
128
129 size_t num_channels_;
kwiberg2d0c3322016-02-14 09:28:33 -0800130 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000131 bool initialized_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000132
henrikg3c089d72015-09-16 05:37:44 -0700133 RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000134};
135
136} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200137#endif // MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_