NetEQ: GenerateBackgroundNoise moved to BackgrounNoise
Bug: webrtc:10548 Change-Id: Ie9da0755793078b81c60c3751abcbff13da40ede Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/132788 Commit-Queue: Alessio Bazzica <alessiob@webrtc.org> Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#27619}
This commit is contained in:
committed by
Commit Bot
parent
9a2ca0a9d8
commit
7e53be0555
@ -21,9 +21,14 @@
|
||||
#include "modules/audio_coding/neteq/post_decode_vad.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace {
|
||||
|
||||
constexpr size_t kMaxSampleRate = 48000;
|
||||
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
const size_t BackgroundNoise::kMaxLpcOrder;
|
||||
constexpr size_t BackgroundNoise::kMaxLpcOrder;
|
||||
|
||||
BackgroundNoise::BackgroundNoise(size_t num_channels)
|
||||
: num_channels_(num_channels),
|
||||
@ -119,6 +124,56 @@ void BackgroundNoise::Update(const AudioMultiVector& input,
|
||||
return;
|
||||
}
|
||||
|
||||
void BackgroundNoise::GenerateBackgroundNoise(
|
||||
rtc::ArrayView<const int16_t> random_vector,
|
||||
size_t channel,
|
||||
int mute_slope,
|
||||
bool too_many_expands,
|
||||
size_t num_noise_samples,
|
||||
int16_t* buffer) {
|
||||
constexpr size_t kNoiseLpcOrder = kMaxLpcOrder;
|
||||
int16_t scaled_random_vector[kMaxSampleRate / 8000 * 125];
|
||||
assert(num_noise_samples <= (kMaxSampleRate / 8000 * 125));
|
||||
RTC_DCHECK_GE(random_vector.size(), num_noise_samples);
|
||||
int16_t* noise_samples = &buffer[kNoiseLpcOrder];
|
||||
if (initialized()) {
|
||||
// Use background noise parameters.
|
||||
memcpy(noise_samples - kNoiseLpcOrder, FilterState(channel),
|
||||
sizeof(int16_t) * kNoiseLpcOrder);
|
||||
|
||||
int dc_offset = 0;
|
||||
if (ScaleShift(channel) > 1) {
|
||||
dc_offset = 1 << (ScaleShift(channel) - 1);
|
||||
}
|
||||
|
||||
// Scale random vector to correct energy level.
|
||||
WebRtcSpl_AffineTransformVector(scaled_random_vector, random_vector.data(),
|
||||
Scale(channel), dc_offset,
|
||||
ScaleShift(channel), num_noise_samples);
|
||||
|
||||
WebRtcSpl_FilterARFastQ12(scaled_random_vector, noise_samples,
|
||||
Filter(channel), kNoiseLpcOrder + 1,
|
||||
num_noise_samples);
|
||||
|
||||
SetFilterState(
|
||||
channel,
|
||||
{&(noise_samples[num_noise_samples - kNoiseLpcOrder]), kNoiseLpcOrder});
|
||||
|
||||
// Unmute the background noise.
|
||||
int16_t bgn_mute_factor = MuteFactor(channel);
|
||||
if (bgn_mute_factor < 16384) {
|
||||
WebRtcSpl_AffineTransformVector(noise_samples, noise_samples,
|
||||
bgn_mute_factor, 8192, 14,
|
||||
num_noise_samples);
|
||||
}
|
||||
// Update mute_factor in BackgroundNoise class.
|
||||
SetMuteFactor(channel, bgn_mute_factor);
|
||||
} else {
|
||||
// BGN parameters have not been initialized; use zero noise.
|
||||
memset(noise_samples, 0, sizeof(int16_t) * num_noise_samples);
|
||||
}
|
||||
}
|
||||
|
||||
int32_t BackgroundNoise::Energy(size_t channel) const {
|
||||
assert(channel < num_channels_);
|
||||
return channel_parameters_[channel].energy;
|
||||
@ -145,11 +200,10 @@ const int16_t* BackgroundNoise::FilterState(size_t channel) const {
|
||||
}
|
||||
|
||||
void BackgroundNoise::SetFilterState(size_t channel,
|
||||
const int16_t* input,
|
||||
size_t length) {
|
||||
rtc::ArrayView<const int16_t> input) {
|
||||
assert(channel < num_channels_);
|
||||
length = std::min(length, kMaxLpcOrder);
|
||||
memcpy(channel_parameters_[channel].filter_state, input,
|
||||
size_t length = std::min(input.size(), kMaxLpcOrder);
|
||||
memcpy(channel_parameters_[channel].filter_state, input.data(),
|
||||
length * sizeof(int16_t));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user