blob: 0286320c2200ee243cba0d479da24aba288218b4 [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.
Yves Gerey665174f2018-06-19 15:03:05 +020040 void Update(const AudioMultiVector& sync_buffer, const PostDecodeVad& vad);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000041
Alessio Bazzica7e53be02019-04-15 12:32:23 +020042 // Generates background noise given a random vector and writes the output to
43 // |buffer|.
44 void GenerateBackgroundNoise(rtc::ArrayView<const int16_t> random_vector,
45 size_t channel,
46 int mute_slope,
47 bool too_many_expands,
48 size_t num_noise_samples,
49 int16_t* buffer);
50
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000051 // Returns |energy_| for |channel|.
52 int32_t Energy(size_t channel) const;
53
54 // Sets the value of |mute_factor_| for |channel| to |value|.
55 void SetMuteFactor(size_t channel, int16_t value);
56
57 // Returns |mute_factor_| for |channel|.
58 int16_t MuteFactor(size_t channel) const;
59
60 // Returns a pointer to |filter_| for |channel|.
61 const int16_t* Filter(size_t channel) const;
62
63 // Returns a pointer to |filter_state_| for |channel|.
64 const int16_t* FilterState(size_t channel) const;
65
Alessio Bazzica7e53be02019-04-15 12:32:23 +020066 // Copies |input| to the filter state. Will not copy more than |kMaxLpcOrder|
67 // elements.
68 void SetFilterState(size_t channel, rtc::ArrayView<const int16_t> input);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000069
70 // Returns |scale_| for |channel|.
71 int16_t Scale(size_t channel) const;
72
73 // Returns |scale_shift_| for |channel|.
74 int16_t ScaleShift(size_t channel) const;
75
76 // Accessors.
77 bool initialized() const { return initialized_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000078
79 private:
80 static const int kThresholdIncrement = 229; // 0.0035 in Q16.
Peter Kastingdce40cf2015-08-24 14:52:23 -070081 static const size_t kVecLen = 256;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000082 static const int kLogVecLen = 8; // log2(kVecLen).
Peter Kastingdce40cf2015-08-24 14:52:23 -070083 static const size_t kResidualLength = 64;
Peter Kastingb7e50542015-06-11 12:55:50 -070084 static const int16_t kLogResidualLength = 6; // log2(kResidualLength)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000085
86 struct ChannelParameters {
87 // Constructor.
Yves Gerey665174f2018-06-19 15:03:05 +020088 ChannelParameters() { Reset(); }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000089
90 void Reset() {
91 energy = 2500;
92 max_energy = 0;
93 energy_update_threshold = 500000;
94 low_energy_update_threshold = 0;
95 memset(filter_state, 0, sizeof(filter_state));
96 memset(filter, 0, sizeof(filter));
97 filter[0] = 4096;
Henrik Lundine5531392018-03-13 17:14:10 +010098 mute_factor = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000099 scale = 20000;
100 scale_shift = 24;
101 }
102
103 int32_t energy;
104 int32_t max_energy;
105 int32_t energy_update_threshold;
106 int32_t low_energy_update_threshold;
107 int16_t filter_state[kMaxLpcOrder];
108 int16_t filter[kMaxLpcOrder + 1];
109 int16_t mute_factor;
110 int16_t scale;
111 int16_t scale_shift;
112 };
113
114 int32_t CalculateAutoCorrelation(const int16_t* signal,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700115 size_t length,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000116 int32_t* auto_correlation) const;
117
118 // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
119 void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
120
121 // Updates the filter parameters.
122 void SaveParameters(size_t channel,
123 const int16_t* lpc_coefficients,
124 const int16_t* filter_state,
125 int32_t sample_energy,
126 int32_t residual_energy);
127
128 size_t num_channels_;
kwiberg2d0c3322016-02-14 09:28:33 -0800129 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000130 bool initialized_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000131
henrikg3c089d72015-09-16 05:37:44 -0700132 RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000133};
134
135} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200136#endif // MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_