blob: 26d42b50db3a326cb4bcda9ffd04b5ad6f07990f [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"
Mirko Bonadei71207422017-09-15 13:58:09 +020020#include "typedefs.h" // NOLINT(build/include)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000021
22namespace webrtc {
23
24// Forward declarations.
25class 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.
Peter Kastingdce40cf2015-08-24 14:52:23 -070032 static const 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.
Yves Gerey665174f2018-06-19 15:03:05 +020041 void Update(const AudioMultiVector& sync_buffer, const PostDecodeVad& vad);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000042
43 // Returns |energy_| for |channel|.
44 int32_t Energy(size_t channel) const;
45
46 // Sets the value of |mute_factor_| for |channel| to |value|.
47 void SetMuteFactor(size_t channel, int16_t value);
48
49 // Returns |mute_factor_| for |channel|.
50 int16_t MuteFactor(size_t channel) const;
51
52 // Returns a pointer to |filter_| for |channel|.
53 const int16_t* Filter(size_t channel) const;
54
55 // Returns a pointer to |filter_state_| for |channel|.
56 const int16_t* FilterState(size_t channel) const;
57
58 // Copies |length| elements from |input| to the filter state. Will not copy
59 // more than |kMaxLpcOrder| elements.
60 void SetFilterState(size_t channel, const int16_t* input, size_t length);
61
62 // Returns |scale_| for |channel|.
63 int16_t Scale(size_t channel) const;
64
65 // Returns |scale_shift_| for |channel|.
66 int16_t ScaleShift(size_t channel) const;
67
68 // Accessors.
69 bool initialized() const { return initialized_; }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000070
71 private:
72 static const int kThresholdIncrement = 229; // 0.0035 in Q16.
Peter Kastingdce40cf2015-08-24 14:52:23 -070073 static const size_t kVecLen = 256;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000074 static const int kLogVecLen = 8; // log2(kVecLen).
Peter Kastingdce40cf2015-08-24 14:52:23 -070075 static const size_t kResidualLength = 64;
Peter Kastingb7e50542015-06-11 12:55:50 -070076 static const int16_t kLogResidualLength = 6; // log2(kResidualLength)
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000077
78 struct ChannelParameters {
79 // Constructor.
Yves Gerey665174f2018-06-19 15:03:05 +020080 ChannelParameters() { Reset(); }
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000081
82 void Reset() {
83 energy = 2500;
84 max_energy = 0;
85 energy_update_threshold = 500000;
86 low_energy_update_threshold = 0;
87 memset(filter_state, 0, sizeof(filter_state));
88 memset(filter, 0, sizeof(filter));
89 filter[0] = 4096;
Henrik Lundine5531392018-03-13 17:14:10 +010090 mute_factor = 0;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +000091 scale = 20000;
92 scale_shift = 24;
93 }
94
95 int32_t energy;
96 int32_t max_energy;
97 int32_t energy_update_threshold;
98 int32_t low_energy_update_threshold;
99 int16_t filter_state[kMaxLpcOrder];
100 int16_t filter[kMaxLpcOrder + 1];
101 int16_t mute_factor;
102 int16_t scale;
103 int16_t scale_shift;
104 };
105
106 int32_t CalculateAutoCorrelation(const int16_t* signal,
Peter Kastingdce40cf2015-08-24 14:52:23 -0700107 size_t length,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000108 int32_t* auto_correlation) const;
109
110 // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
111 void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
112
113 // Updates the filter parameters.
114 void SaveParameters(size_t channel,
115 const int16_t* lpc_coefficients,
116 const int16_t* filter_state,
117 int32_t sample_energy,
118 int32_t residual_energy);
119
120 size_t num_channels_;
kwiberg2d0c3322016-02-14 09:28:33 -0800121 std::unique_ptr<ChannelParameters[]> channel_parameters_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000122 bool initialized_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000123
henrikg3c089d72015-09-16 05:37:44 -0700124 RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21 +0000125};
126
127} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200128#endif // MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_