/* * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/audio_processing/ns/noise_suppressor.h" #include #include #include #include #include #include "rtc_base/strings/string_builder.h" #include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace { std::string ProduceDebugText(int sample_rate_hz, size_t num_channels, NsConfig::SuppressionLevel level) { rtc::StringBuilder ss; ss << "Sample rate: " << sample_rate_hz << ", num_channels: " << num_channels << ", level: " << static_cast(level); return ss.Release(); } void PopulateInputFrameWithIdenticalChannels(size_t num_channels, size_t num_bands, size_t frame_index, AudioBuffer* audio) { for (size_t ch = 0; ch < num_channels; ++ch) { for (size_t b = 0; b < num_bands; ++b) { for (size_t i = 0; i < 160; ++i) { float value = static_cast(frame_index * 160 + i); audio->split_bands(ch)[b][i] = (value > 0 ? 5000 * b + value : 0); } } } } void VerifyIdenticalChannels(size_t num_channels, size_t num_bands, size_t frame_index, const AudioBuffer& audio) { EXPECT_GT(num_channels, 1u); for (size_t ch = 1; ch < num_channels; ++ch) { for (size_t b = 0; b < num_bands; ++b) { for (size_t i = 0; i < 160; ++i) { EXPECT_EQ(audio.split_bands_const(ch)[b][i], audio.split_bands_const(0)[b][i]); } } } } } // namespace // Verifies that the same noise reduction effect is applied to all channels. TEST(NoiseSuppressor, IdenticalChannelEffects) { for (auto rate : {16000, 32000, 48000}) { for (auto num_channels : {1, 4, 8}) { for (auto level : {NsConfig::SuppressionLevel::k6dB, NsConfig::SuppressionLevel::k12dB, NsConfig::SuppressionLevel::k18dB, NsConfig::SuppressionLevel::k21dB}) { SCOPED_TRACE(ProduceDebugText(rate, num_channels, level)); const size_t num_bands = rate / 16000; // const int frame_length = rtc::CheckedDivExact(rate, 100); AudioBuffer audio(rate, num_channels, rate, num_channels, rate, num_channels); NsConfig cfg; NoiseSuppressor ns(cfg, rate, num_channels); for (size_t frame_index = 0; frame_index < 1000; ++frame_index) { if (rate > 16000) { audio.SplitIntoFrequencyBands(); } PopulateInputFrameWithIdenticalChannels(num_channels, num_bands, frame_index, &audio); ns.Analyze(audio); ns.Process(&audio); if (num_channels > 1) { VerifyIdenticalChannels(num_channels, num_bands, frame_index, audio); } } } } } } } // namespace webrtc