blob: 58eecaa705ce8252dc87bb7754c23c7e2292ace4 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/audio_coding/neteq/audio_multi_vector.h"
18#include "modules/audio_coding/neteq/include/neteq.h"
19#include "rtc_base/constructormagic.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000020
21namespace webrtc {
22
23// Forward declarations.
24class 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.
Peter Kastingdce40cf2015-08-24 14:52:23 -070031 static const 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
42 // Returns |energy_| for |channel|.
43 int32_t Energy(size_t channel) const;
44
45 // Sets the value of |mute_factor_| for |channel| to |value|.
46 void SetMuteFactor(size_t channel, int16_t value);
47
48 // Returns |mute_factor_| for |channel|.
49 int16_t MuteFactor(size_t channel) const;
50
51 // Returns a pointer to |filter_| for |channel|.
52 const int16_t* Filter(size_t channel) const;
53
54 // Returns a pointer to |filter_state_| for |channel|.
55 const int16_t* FilterState(size_t channel) const;
56
57 // Copies |length| elements from |input| to the filter state. Will not copy
58 // more than |kMaxLpcOrder| elements.
59 void SetFilterState(size_t channel, const int16_t* input, size_t length);
60
61 // Returns |scale_| for |channel|.
62 int16_t Scale(size_t channel) const;
63
64 // Returns |scale_shift_| for |channel|.
65 int16_t ScaleShift(size_t channel) const;
66
67 // Accessors.
68 bool initialized() const { return initialized_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000069
70 private:
71 static const int kThresholdIncrement = 229; // 0.0035 in Q16.
Peter Kastingdce40cf2015-08-24 14:52:23 -070072 static const size_t kVecLen = 256;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000073 static const int kLogVecLen = 8; // log2(kVecLen).
Peter Kastingdce40cf2015-08-24 14:52:23 -070074 static const size_t kResidualLength = 64;
Peter Kastingb7e50542015-06-11 12:55:50 -070075 static const int16_t kLogResidualLength = 6; // log2(kResidualLength)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000076
77 struct ChannelParameters {
78 // Constructor.
Yves Gerey665174f2018-06-19 15:03:05 +020079 ChannelParameters() { Reset(); }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000080
81 void Reset() {
82 energy = 2500;
83 max_energy = 0;
84 energy_update_threshold = 500000;
85 low_energy_update_threshold = 0;
86 memset(filter_state, 0, sizeof(filter_state));
87 memset(filter, 0, sizeof(filter));
88 filter[0] = 4096;
Henrik Lundine5531392018-03-13 17:14:10 +010089 mute_factor = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000090 scale = 20000;
91 scale_shift = 24;
92 }
93
94 int32_t energy;
95 int32_t max_energy;
96 int32_t energy_update_threshold;
97 int32_t low_energy_update_threshold;
98 int16_t filter_state[kMaxLpcOrder];
99 int16_t filter[kMaxLpcOrder + 1];
100 int16_t mute_factor;
101 int16_t scale;
102 int16_t scale_shift;
103 };
104
105 int32_t CalculateAutoCorrelation(const int16_t* signal,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700106 size_t length,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000107 int32_t* auto_correlation) const;
108
109 // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
110 void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
111
112 // Updates the filter parameters.
113 void SaveParameters(size_t channel,
114 const int16_t* lpc_coefficients,
115 const int16_t* filter_state,
116 int32_t sample_energy,
117 int32_t residual_energy);
118
119 size_t num_channels_;
kwiberg2d0c3322016-02-14 09:28:33 -0800120 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000121 bool initialized_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000122
henrikg3c089d72015-09-16 05:37:44 -0700123 RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000124};
125
126} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200127#endif // MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_