Refactoring of the noise suppressor and adding true multichannel support

This CL adds proper multichannel support to the noise suppressor.
To accomplish that in a safe way, a full refactoring of the noise
suppressor code has been done.

Due to floating point precision, the changes made are not entirely
bitexact. They are, however, very close to being bitexact.

As a safety measure, the former noise suppressor code is preserved
and a kill-switch is added to allow revering to the legacy noise
suppressor in case issues arise.

Bug: webrtc:10895, b/143344262
Change-Id: I0b071011b23265ac12e6d4b3956499d122286657
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158407
Commit-Queue: Per Åhgren <peah@webrtc.org>
Reviewed-by: Gustaf Ullberg <gustaf@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29646}
This commit is contained in:
Per Åhgren 2019-10-29 22:59:44 +01:00 committed by Commit Bot
parent c6c3f862e2
commit 87a7b82520
61 changed files with 4019 additions and 1440 deletions

View file

@ -229,6 +229,7 @@ if (rtc_include_tests) {
"audio_mixer:audio_mixer_unittests", "audio_mixer:audio_mixer_unittests",
"audio_processing:audio_processing_unittests", "audio_processing:audio_processing_unittests",
"audio_processing/aec3:aec3_unittests", "audio_processing/aec3:aec3_unittests",
"audio_processing/ns:ns_unittests",
"congestion_controller:congestion_controller_unittests", "congestion_controller:congestion_controller_unittests",
"pacing:pacing_unittests", "pacing:pacing_unittests",
"remote_bitrate_estimator:remote_bitrate_estimator_unittests", "remote_bitrate_estimator:remote_bitrate_estimator_unittests",

View file

@ -132,10 +132,10 @@ rtc_library("audio_processing") {
"gain_controller2.h", "gain_controller2.h",
"include/aec_dump.cc", "include/aec_dump.cc",
"include/aec_dump.h", "include/aec_dump.h",
"legacy_noise_suppression.cc",
"legacy_noise_suppression.h",
"level_estimator.cc", "level_estimator.cc",
"level_estimator.h", "level_estimator.h",
"noise_suppression.cc",
"noise_suppression.h",
"render_queue_item_verifier.h", "render_queue_item_verifier.h",
"residual_echo_detector.cc", "residual_echo_detector.cc",
"residual_echo_detector.h", "residual_echo_detector.h",
@ -199,6 +199,7 @@ rtc_library("audio_processing") {
"agc2:adaptive_digital", "agc2:adaptive_digital",
"agc2:fixed_digital", "agc2:fixed_digital",
"agc2:gain_applier", "agc2:gain_applier",
"ns",
"vad", "vad",
"//third_party/abseil-cpp/absl/types:optional", "//third_party/abseil-cpp/absl/types:optional",
] ]
@ -287,29 +288,29 @@ rtc_library("file_audio_generator") {
rtc_source_set("audio_processing_c") { rtc_source_set("audio_processing_c") {
visibility = [ ":*" ] # Only targets in this file can depend on this. visibility = [ ":*" ] # Only targets in this file can depend on this.
sources = [ sources = [
"ns/windows_private.h", "legacy_ns/windows_private.h",
] ]
if (rtc_prefer_fixed_point) { if (rtc_prefer_fixed_point) {
sources += [ sources += [
"ns/noise_suppression_x.c", "legacy_ns/noise_suppression_x.c",
"ns/noise_suppression_x.h", "legacy_ns/noise_suppression_x.h",
"ns/nsx_core.c", "legacy_ns/nsx_core.c",
"ns/nsx_core.h", "legacy_ns/nsx_core.h",
"ns/nsx_defines.h", "legacy_ns/nsx_defines.h",
] ]
if (current_cpu == "mipsel") { if (current_cpu == "mipsel") {
sources += [ "ns/nsx_core_mips.c" ] sources += [ "legacy_ns/nsx_core_mips.c" ]
} else { } else {
sources += [ "ns/nsx_core_c.c" ] sources += [ "legacy_ns/nsx_core_c.c" ]
} }
} else { } else {
sources += [ sources += [
"ns/defines.h", "legacy_ns/defines.h",
"ns/noise_suppression.c", "legacy_ns/noise_suppression.c",
"ns/noise_suppression.h", "legacy_ns/noise_suppression.h",
"ns/ns_core.c", "legacy_ns/ns_core.c",
"ns/ns_core.h", "legacy_ns/ns_core.h",
] ]
} }
@ -324,7 +325,7 @@ rtc_source_set("audio_processing_c") {
] ]
if (rtc_build_with_neon) { if (rtc_build_with_neon) {
sources += [ "ns/nsx_core_neon.c" ] sources += [ "legacy_ns/nsx_core_neon.c" ]
if (current_cpu != "arm64") { if (current_cpu != "arm64") {
# Enable compilation for the NEON instruction set. # Enable compilation for the NEON instruction set.
@ -507,8 +508,8 @@ if (rtc_include_tests) {
"echo_detector/normalized_covariance_estimator_unittest.cc", "echo_detector/normalized_covariance_estimator_unittest.cc",
"gain_control_unittest.cc", "gain_control_unittest.cc",
"high_pass_filter_unittest.cc", "high_pass_filter_unittest.cc",
"legacy_noise_suppression_unittest.cc",
"level_estimator_unittest.cc", "level_estimator_unittest.cc",
"noise_suppression_unittest.cc",
"residual_echo_detector_unittest.cc", "residual_echo_detector_unittest.cc",
"rms_level_unittest.cc", "rms_level_unittest.cc",
"test/debug_dump_replayer.cc", "test/debug_dump_replayer.cc",

View file

@ -70,6 +70,11 @@ bool SampleRateSupportsMultiBand(int sample_rate_hz) {
sample_rate_hz == AudioProcessing::kSampleRate48kHz; sample_rate_hz == AudioProcessing::kSampleRate48kHz;
} }
// Checks whether the legacy ns functionality should be enforced.
bool DetectLegacyNsEnforcement() {
return field_trial::IsEnabled("WebRTC-NewNoiseSuppressionKillSwitch");
}
// Identify the native processing rate that best handles a sample rate. // Identify the native processing rate that best handles a sample rate.
int SuitableProcessRate(int minimum_rate, int SuitableProcessRate(int minimum_rate,
int max_splitting_rate, int max_splitting_rate,
@ -306,6 +311,7 @@ AudioProcessingImpl::AudioProcessingImpl(
std::unique_ptr<CustomAudioAnalyzer> capture_analyzer) std::unique_ptr<CustomAudioAnalyzer> capture_analyzer)
: data_dumper_( : data_dumper_(
new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))), new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
enforced_usage_of_legacy_ns_(DetectLegacyNsEnforcement()),
capture_runtime_settings_(kRuntimeSettingQueueSize), capture_runtime_settings_(kRuntimeSettingQueueSize),
render_runtime_settings_(kRuntimeSettingQueueSize), render_runtime_settings_(kRuntimeSettingQueueSize),
capture_runtime_settings_enqueuer_(&capture_runtime_settings_), capture_runtime_settings_enqueuer_(&capture_runtime_settings_),
@ -1303,9 +1309,14 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
if (submodules_.high_pass_filter) { if (submodules_.high_pass_filter) {
submodules_.high_pass_filter->Process(capture_buffer); submodules_.high_pass_filter->Process(capture_buffer);
} }
RETURN_ON_ERR(submodules_.gain_control->AnalyzeCaptureAudio(capture_buffer)); RETURN_ON_ERR(submodules_.gain_control->AnalyzeCaptureAudio(capture_buffer));
RTC_DCHECK(
!(submodules_.legacy_noise_suppressor && submodules_.noise_suppressor));
if (submodules_.noise_suppressor) { if (submodules_.noise_suppressor) {
submodules_.noise_suppressor->AnalyzeCaptureAudio(capture_buffer); submodules_.noise_suppressor->Analyze(*capture_buffer);
} else if (submodules_.legacy_noise_suppressor) {
submodules_.legacy_noise_suppressor->AnalyzeCaptureAudio(capture_buffer);
} }
if (submodules_.echo_control_mobile) { if (submodules_.echo_control_mobile) {
@ -1316,8 +1327,10 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
} }
if (submodules_.noise_suppressor) { if (submodules_.noise_suppressor) {
submodules_.noise_suppressor->Process(capture_buffer);
} else if (submodules_.legacy_noise_suppressor) {
submodules_.echo_control_mobile->CopyLowPassReference(capture_buffer); submodules_.echo_control_mobile->CopyLowPassReference(capture_buffer);
submodules_.noise_suppressor->ProcessCaptureAudio(capture_buffer); submodules_.legacy_noise_suppressor->ProcessCaptureAudio(capture_buffer);
} }
RETURN_ON_ERR(submodules_.echo_control_mobile->ProcessCaptureAudio( RETURN_ON_ERR(submodules_.echo_control_mobile->ProcessCaptureAudio(
@ -1344,7 +1357,9 @@ int AudioProcessingImpl::ProcessCaptureStreamLocked() {
} }
if (submodules_.noise_suppressor) { if (submodules_.noise_suppressor) {
submodules_.noise_suppressor->ProcessCaptureAudio(capture_buffer); submodules_.noise_suppressor->Process(capture_buffer);
} else if (submodules_.legacy_noise_suppressor) {
submodules_.legacy_noise_suppressor->ProcessCaptureAudio(capture_buffer);
} }
} }
@ -1726,9 +1741,9 @@ bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
return submodule_states_.Update( return submodule_states_.Update(
config_.high_pass_filter.enabled, !!submodules_.echo_cancellation, config_.high_pass_filter.enabled, !!submodules_.echo_cancellation,
!!submodules_.echo_control_mobile, config_.residual_echo_detector.enabled, !!submodules_.echo_control_mobile, config_.residual_echo_detector.enabled,
!!submodules_.noise_suppressor, submodules_.gain_control->is_enabled(), !!submodules_.legacy_noise_suppressor || !!submodules_.noise_suppressor,
config_.gain_controller2.enabled, config_.pre_amplifier.enabled, submodules_.gain_control->is_enabled(), config_.gain_controller2.enabled,
capture_nonlocked_.echo_controller_enabled, config_.pre_amplifier.enabled, capture_nonlocked_.echo_controller_enabled,
config_.voice_detection.enabled, capture_.transient_suppressor_enabled); config_.voice_detection.enabled, capture_.transient_suppressor_enabled);
} }
@ -1868,13 +1883,42 @@ void AudioProcessingImpl::InitializeGainController2() {
} }
void AudioProcessingImpl::InitializeNoiseSuppressor() { void AudioProcessingImpl::InitializeNoiseSuppressor() {
submodules_.legacy_noise_suppressor.reset();
submodules_.noise_suppressor.reset();
if (config_.noise_suppression.enabled) { if (config_.noise_suppression.enabled) {
const bool use_legacy_ns =
config_.noise_suppression.use_legacy_ns || enforced_usage_of_legacy_ns_;
if (!use_legacy_ns) {
auto map_level =
[](AudioProcessing::Config::NoiseSuppression::Level level) {
using NoiseSuppresionConfig =
AudioProcessing::Config::NoiseSuppression;
switch (level) {
case NoiseSuppresionConfig::kLow:
return NsConfig::SuppressionLevel::k6dB;
case NoiseSuppresionConfig::kModerate:
return NsConfig::SuppressionLevel::k12dB;
case NoiseSuppresionConfig::kHigh:
return NsConfig::SuppressionLevel::k18dB;
case NoiseSuppresionConfig::kVeryHigh:
return NsConfig::SuppressionLevel::k21dB;
default:
RTC_NOTREACHED();
}
};
NsConfig cfg;
cfg.target_level = map_level(config_.noise_suppression.level);
submodules_.noise_suppressor = std::make_unique<NoiseSuppressor>(
cfg, proc_sample_rate_hz(), num_proc_channels());
} else {
auto ns_level = auto ns_level =
NsConfigLevelToInterfaceLevel(config_.noise_suppression.level); NsConfigLevelToInterfaceLevel(config_.noise_suppression.level);
submodules_.noise_suppressor = std::make_unique<NoiseSuppression>( submodules_.legacy_noise_suppressor = std::make_unique<NoiseSuppression>(
num_proc_channels(), proc_sample_rate_hz(), ns_level); num_proc_channels(), proc_sample_rate_hz(), ns_level);
} else { }
submodules_.noise_suppressor.reset();
} }
} }

View file

@ -29,8 +29,9 @@
#include "modules/audio_processing/include/aec_dump.h" #include "modules/audio_processing/include/aec_dump.h"
#include "modules/audio_processing/include/audio_processing.h" #include "modules/audio_processing/include/audio_processing.h"
#include "modules/audio_processing/include/audio_processing_statistics.h" #include "modules/audio_processing/include/audio_processing_statistics.h"
#include "modules/audio_processing/legacy_noise_suppression.h"
#include "modules/audio_processing/level_estimator.h" #include "modules/audio_processing/level_estimator.h"
#include "modules/audio_processing/noise_suppression.h" #include "modules/audio_processing/ns/noise_suppressor.h"
#include "modules/audio_processing/render_queue_item_verifier.h" #include "modules/audio_processing/render_queue_item_verifier.h"
#include "modules/audio_processing/residual_echo_detector.h" #include "modules/audio_processing/residual_echo_detector.h"
#include "modules/audio_processing/rms_level.h" #include "modules/audio_processing/rms_level.h"
@ -150,6 +151,7 @@ class AudioProcessingImpl : public AudioProcessing {
std::unique_ptr<ApmDataDumper> data_dumper_; std::unique_ptr<ApmDataDumper> data_dumper_;
static int instance_count_; static int instance_count_;
const bool enforced_usage_of_legacy_ns_;
SwapQueue<RuntimeSetting> capture_runtime_settings_; SwapQueue<RuntimeSetting> capture_runtime_settings_;
SwapQueue<RuntimeSetting> render_runtime_settings_; SwapQueue<RuntimeSetting> render_runtime_settings_;
@ -343,7 +345,8 @@ class AudioProcessingImpl : public AudioProcessing {
std::unique_ptr<EchoCancellationImpl> echo_cancellation; std::unique_ptr<EchoCancellationImpl> echo_cancellation;
std::unique_ptr<EchoControl> echo_controller; std::unique_ptr<EchoControl> echo_controller;
std::unique_ptr<EchoControlMobileImpl> echo_control_mobile; std::unique_ptr<EchoControlMobileImpl> echo_control_mobile;
std::unique_ptr<NoiseSuppression> noise_suppressor; std::unique_ptr<NoiseSuppression> legacy_noise_suppressor;
std::unique_ptr<NoiseSuppressor> noise_suppressor;
std::unique_ptr<TransientSuppressor> transient_suppressor; std::unique_ptr<TransientSuppressor> transient_suppressor;
std::unique_ptr<CustomProcessing> capture_post_processor; std::unique_ptr<CustomProcessing> capture_post_processor;
std::unique_ptr<CustomProcessing> render_pre_processor; std::unique_ptr<CustomProcessing> render_pre_processor;

View file

@ -2145,30 +2145,30 @@ INSTANTIATE_TEST_SUITE_P(
std::make_tuple(44100, 16000, 32000, 16000, 19, 20), std::make_tuple(44100, 16000, 32000, 16000, 19, 20),
std::make_tuple(44100, 16000, 16000, 16000, 19, 0), std::make_tuple(44100, 16000, 16000, 16000, 19, 0),
std::make_tuple(32000, 48000, 48000, 48000, 35, 0), std::make_tuple(32000, 48000, 48000, 48000, 28, 0),
std::make_tuple(32000, 48000, 32000, 48000, 65, 30), std::make_tuple(32000, 48000, 32000, 48000, 65, 30),
std::make_tuple(32000, 48000, 16000, 48000, 40, 20), std::make_tuple(32000, 48000, 16000, 48000, 30, 20),
std::make_tuple(32000, 44100, 48000, 44100, 20, 20), std::make_tuple(32000, 44100, 48000, 44100, 20, 20),
std::make_tuple(32000, 44100, 32000, 44100, 20, 15), std::make_tuple(32000, 44100, 32000, 44100, 20, 15),
std::make_tuple(32000, 44100, 16000, 44100, 20, 15), std::make_tuple(32000, 44100, 16000, 44100, 20, 15),
std::make_tuple(32000, 32000, 48000, 32000, 35, 35), std::make_tuple(32000, 32000, 48000, 32000, 29, 35),
std::make_tuple(32000, 32000, 32000, 32000, 0, 0), std::make_tuple(32000, 32000, 32000, 32000, 0, 0),
std::make_tuple(32000, 32000, 16000, 32000, 40, 20), std::make_tuple(32000, 32000, 16000, 32000, 32, 20),
std::make_tuple(32000, 16000, 48000, 16000, 20, 20), std::make_tuple(32000, 16000, 48000, 16000, 20, 20),
std::make_tuple(32000, 16000, 32000, 16000, 20, 20), std::make_tuple(32000, 16000, 32000, 16000, 20, 20),
std::make_tuple(32000, 16000, 16000, 16000, 20, 0), std::make_tuple(32000, 16000, 16000, 16000, 20, 0),
std::make_tuple(16000, 48000, 48000, 48000, 25, 0), std::make_tuple(16000, 48000, 48000, 48000, 24, 0),
std::make_tuple(16000, 48000, 32000, 48000, 25, 30), std::make_tuple(16000, 48000, 32000, 48000, 25, 30),
std::make_tuple(16000, 48000, 16000, 48000, 25, 20), std::make_tuple(16000, 48000, 16000, 48000, 25, 20),
std::make_tuple(16000, 44100, 48000, 44100, 15, 20), std::make_tuple(16000, 44100, 48000, 44100, 15, 20),
std::make_tuple(16000, 44100, 32000, 44100, 15, 15), std::make_tuple(16000, 44100, 32000, 44100, 15, 15),
std::make_tuple(16000, 44100, 16000, 44100, 15, 15), std::make_tuple(16000, 44100, 16000, 44100, 15, 15),
std::make_tuple(16000, 32000, 48000, 32000, 25, 35), std::make_tuple(16000, 32000, 48000, 32000, 24, 35),
std::make_tuple(16000, 32000, 32000, 32000, 25, 0), std::make_tuple(16000, 32000, 32000, 32000, 25, 0),
std::make_tuple(16000, 32000, 16000, 32000, 25, 20), std::make_tuple(16000, 32000, 16000, 32000, 25, 20),
std::make_tuple(16000, 16000, 48000, 16000, 35, 20), std::make_tuple(16000, 16000, 48000, 16000, 30, 20),
std::make_tuple(16000, 16000, 32000, 16000, 35, 20), std::make_tuple(16000, 16000, 32000, 16000, 30, 20),
std::make_tuple(16000, 16000, 16000, 16000, 0, 0))); std::make_tuple(16000, 16000, 16000, 16000, 0, 0)));
#endif #endif

View file

@ -285,6 +285,8 @@ class RTC_EXPORT AudioProcessing : public rtc::RefCountInterface {
bool enabled = false; bool enabled = false;
enum Level { kLow, kModerate, kHigh, kVeryHigh }; enum Level { kLow, kModerate, kHigh, kVeryHigh };
Level level = kModerate; Level level = kModerate;
// Recommended not to use. Will be removed in the future.
bool use_legacy_ns = false;
} noise_suppression; } noise_suppression;
// Enables reporting of |voice_detected| in webrtc::AudioProcessingStats. // Enables reporting of |voice_detected| in webrtc::AudioProcessingStats.

View file

@ -8,12 +8,12 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "modules/audio_processing/noise_suppression.h" #include "modules/audio_processing/legacy_noise_suppression.h"
#include "modules/audio_processing/audio_buffer.h" #include "modules/audio_processing/audio_buffer.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#if defined(WEBRTC_NS_FLOAT) #if defined(WEBRTC_NS_FLOAT)
#include "modules/audio_processing/ns/noise_suppression.h" #include "modules/audio_processing/legacy_ns/noise_suppression.h"
#define NS_CREATE WebRtcNs_Create #define NS_CREATE WebRtcNs_Create
#define NS_FREE WebRtcNs_Free #define NS_FREE WebRtcNs_Free
@ -21,7 +21,7 @@
#define NS_SET_POLICY WebRtcNs_set_policy #define NS_SET_POLICY WebRtcNs_set_policy
typedef NsHandle NsState; typedef NsHandle NsState;
#elif defined(WEBRTC_NS_FIXED) #elif defined(WEBRTC_NS_FIXED)
#include "modules/audio_processing/ns/noise_suppression_x.h" #include "modules/audio_processing/legacy_ns/noise_suppression_x.h"
#define NS_CREATE WebRtcNsx_Create #define NS_CREATE WebRtcNsx_Create
#define NS_FREE WebRtcNsx_Free #define NS_FREE WebRtcNsx_Free

View file

@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NOISE_SUPPRESSION_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_
#define MODULES_AUDIO_PROCESSING_NOISE_SUPPRESSION_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_
#include <memory> #include <memory>
#include <vector> #include <vector>
@ -54,4 +54,4 @@ class NoiseSuppression {
}; };
} // namespace webrtc } // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NOISE_SUPPRESSION_H_ #endif // MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_

View file

@ -11,7 +11,7 @@
#include "api/array_view.h" #include "api/array_view.h"
#include "modules/audio_processing/audio_buffer.h" #include "modules/audio_processing/audio_buffer.h"
#include "modules/audio_processing/noise_suppression.h" #include "modules/audio_processing/legacy_noise_suppression.h"
#include "modules/audio_processing/test/audio_buffer_tools.h" #include "modules/audio_processing/test/audio_buffer_tools.h"
#include "modules/audio_processing/test/bitexactness_tools.h" #include "modules/audio_processing/test/bitexactness_tools.h"
#include "test/gtest.h" #include "test/gtest.h"
@ -90,7 +90,7 @@ void RunBitexactnessTest(int sample_rate_hz,
} // namespace } // namespace
TEST(NoiseSuppresionBitExactnessTest, Mono8kHzLow) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono8kHzLow) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {1432.341431f, 3321.919922f, const float kNoiseEstimateReference[] = {1432.341431f, 3321.919922f,
@ -113,7 +113,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono8kHzLow) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono16kHzLow) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono16kHzLow) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2534.461914f, 6277.638672f, const float kNoiseEstimateReference[] = {2534.461914f, 6277.638672f,
@ -136,7 +136,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono16kHzLow) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono32kHzLow) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono32kHzLow) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2540.059082f, 6317.822754f, const float kNoiseEstimateReference[] = {2540.059082f, 6317.822754f,
@ -159,7 +159,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono32kHzLow) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono48kHzLow) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono48kHzLow) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2135.292480f, 6692.695801f, const float kNoiseEstimateReference[] = {2135.292480f, 6692.695801f,
@ -182,7 +182,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono48kHzLow) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Stereo16kHzLow) { TEST(LegacyNoiseSuppresionBitExactnessTest, Stereo16kHzLow) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {9992.127930f, 12689.569336f, const float kNoiseEstimateReference[] = {9992.127930f, 12689.569336f,
@ -208,7 +208,7 @@ TEST(NoiseSuppresionBitExactnessTest, Stereo16kHzLow) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono16kHzModerate) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono16kHzModerate) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2057.085938f, 7601.055176f, const float kNoiseEstimateReference[] = {2057.085938f, 7601.055176f,
@ -231,7 +231,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono16kHzModerate) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono16kHzHigh) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono16kHzHigh) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2095.148193f, 7698.553711f, const float kNoiseEstimateReference[] = {2095.148193f, 7698.553711f,
@ -254,7 +254,7 @@ TEST(NoiseSuppresionBitExactnessTest, Mono16kHzHigh) {
kOutputReference); kOutputReference);
} }
TEST(NoiseSuppresionBitExactnessTest, Mono16kHzVeryHigh) { TEST(LegacyNoiseSuppresionBitExactnessTest, Mono16kHzVeryHigh) {
#if defined(WEBRTC_ARCH_ARM64) #if defined(WEBRTC_ARCH_ARM64)
const float kSpeechProbabilityReference = -4.0f; const float kSpeechProbabilityReference = -4.0f;
const float kNoiseEstimateReference[] = {2677.733398f, 6186.987305f, const float kNoiseEstimateReference[] = {2677.733398f, 6186.987305f,

View file

@ -0,0 +1,52 @@
/*
* Copyright (c) 2011 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_DEFINES_H_
#define MODULES_AUDIO_PROCESSING_LEGACY_NS_DEFINES_H_
#define BLOCKL_MAX 160 // max processing block length: 160
#define ANAL_BLOCKL_MAX 256 // max analysis block length: 256
#define HALF_ANAL_BLOCKL 129 // half max analysis block length + 1
#define NUM_HIGH_BANDS_MAX 2 // max number of high bands: 2
#define QUANTILE 0.25f
#define SIMULT 3
#define END_STARTUP_LONG 200
#define END_STARTUP_SHORT 50
#define FACTOR 40.f
#define WIDTH 0.01f
// Length of fft work arrays.
#define IP_LENGTH \
(ANAL_BLOCKL_MAX >> 1) // must be at least ceil(2 + sqrt(ANAL_BLOCKL_MAX/2))
#define W_LENGTH (ANAL_BLOCKL_MAX >> 1)
// PARAMETERS FOR NEW METHOD
#define DD_PR_SNR 0.98f // DD update of prior SNR
#define LRT_TAVG 0.5f // tavg parameter for LRT (previously 0.90)
#define SPECT_FL_TAVG 0.30f // tavg parameter for spectral flatness measure
#define SPECT_DIFF_TAVG 0.30f // tavg parameter for spectral difference measure
#define PRIOR_UPDATE 0.1f // update parameter of prior model
#define NOISE_UPDATE 0.9f // update parameter for noise
#define SPEECH_UPDATE 0.99f // update parameter when likely speech
#define WIDTH_PR_MAP 4.0f // width parameter in sigmoid map for prior model
#define LRT_FEATURE_THR 0.5f // default threshold for LRT feature
#define SF_FEATURE_THR 0.5f // default threshold for Spectral Flatness feature
#define SD_FEATURE_THR \
0.5f // default threshold for Spectral Difference feature
#define PROB_RANGE \
0.2f // probability threshold for noise state in
// speech/noise likelihood
#define HIST_PAR_EST 1000 // histogram size for estimation of parameters
#define GAMMA_PAUSE 0.05f // update for conservative noise estimate
//
#define B_LIM 0.5f // threshold in final energy gain factor calculation
#endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_DEFINES_H_

View file

@ -8,14 +8,14 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "modules/audio_processing/ns/noise_suppression.h" #include "modules/audio_processing/legacy_ns/noise_suppression.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "common_audio/signal_processing/include/signal_processing_library.h" #include "common_audio/signal_processing/include/signal_processing_library.h"
#include "modules/audio_processing/ns/defines.h" #include "modules/audio_processing/legacy_ns/defines.h"
#include "modules/audio_processing/ns/ns_core.h" #include "modules/audio_processing/legacy_ns/ns_core.h"
NsHandle* WebRtcNs_Create() { NsHandle* WebRtcNs_Create() {
NoiseSuppressionC* self = malloc(sizeof(NoiseSuppressionC)); NoiseSuppressionC* self = malloc(sizeof(NoiseSuppressionC));

View file

@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_H_
#define MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_H_
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@ -131,4 +131,4 @@ size_t WebRtcNs_num_freq(void);
} }
#endif #endif
#endif // MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_H_ #endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_H_

View file

@ -8,13 +8,13 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "modules/audio_processing/ns/noise_suppression_x.h" #include "modules/audio_processing/legacy_ns/noise_suppression_x.h"
#include <stdlib.h> #include <stdlib.h>
#include "common_audio/signal_processing/include/real_fft.h" #include "common_audio/signal_processing/include/real_fft.h"
#include "modules/audio_processing/ns/nsx_core.h" #include "modules/audio_processing/legacy_ns/nsx_core.h"
#include "modules/audio_processing/ns/nsx_defines.h" #include "modules/audio_processing/legacy_ns/nsx_defines.h"
NsxHandle* WebRtcNsx_Create() { NsxHandle* WebRtcNsx_Create() {
NoiseSuppressionFixedC* self = malloc(sizeof(NoiseSuppressionFixedC)); NoiseSuppressionFixedC* self = malloc(sizeof(NoiseSuppressionFixedC));
@ -37,9 +37,9 @@ int WebRtcNsx_set_policy(NsxHandle* nsxInst, int mode) {
} }
void WebRtcNsx_Process(NsxHandle* nsxInst, void WebRtcNsx_Process(NsxHandle* nsxInst,
const short* const* speechFrame, const int16_t* const* speechFrame,
int num_bands, int num_bands,
short* const* outFrame) { int16_t* const* outFrame) {
WebRtcNsx_ProcessCore((NoiseSuppressionFixedC*)nsxInst, speechFrame, WebRtcNsx_ProcessCore((NoiseSuppressionFixedC*)nsxInst, speechFrame,
num_bands, outFrame); num_bands, outFrame);
} }

View file

@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_X_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_X_H_
#define MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_X_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_X_H_
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
@ -78,9 +78,9 @@ int WebRtcNsx_set_policy(NsxHandle* nsxInst, int mode);
* - outFrame : Pointer to output frame for each band * - outFrame : Pointer to output frame for each band
*/ */
void WebRtcNsx_Process(NsxHandle* nsxInst, void WebRtcNsx_Process(NsxHandle* nsxInst,
const short* const* speechFrame, const int16_t* const* speechFrame,
int num_bands, int num_bands,
short* const* outFrame); int16_t* const* outFrame);
/* Returns a pointer to the noise estimate per frequency bin. The number of /* Returns a pointer to the noise estimate per frequency bin. The number of
* frequency bins can be provided using WebRtcNsx_num_freq(). * frequency bins can be provided using WebRtcNsx_num_freq().
@ -109,4 +109,4 @@ size_t WebRtcNsx_num_freq(void);
} }
#endif #endif
#endif // MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_X_H_ #endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_NOISE_SUPPRESSION_X_H_

View file

@ -15,9 +15,9 @@
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "common_audio/signal_processing/include/signal_processing_library.h" #include "common_audio/signal_processing/include/signal_processing_library.h"
#include "common_audio/third_party/fft4g/fft4g.h" #include "common_audio/third_party/fft4g/fft4g.h"
#include "modules/audio_processing/ns/noise_suppression.h" #include "modules/audio_processing/legacy_ns/noise_suppression.h"
#include "modules/audio_processing/ns/ns_core.h" #include "modules/audio_processing/legacy_ns/ns_core.h"
#include "modules/audio_processing/ns/windows_private.h" #include "modules/audio_processing/legacy_ns/windows_private.h"
// Set Feature Extraction Parameters. // Set Feature Extraction Parameters.
static void set_feature_extraction_parameters(NoiseSuppressionC* self) { static void set_feature_extraction_parameters(NoiseSuppressionC* self) {

View file

@ -8,10 +8,10 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_NS_CORE_H_
#define MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NS_NS_CORE_H_
#include "modules/audio_processing/ns/defines.h" #include "modules/audio_processing/legacy_ns/defines.h"
typedef struct NSParaExtract_ { typedef struct NSParaExtract_ {
// Bin size of histogram. // Bin size of histogram.
@ -46,7 +46,6 @@ typedef struct NSParaExtract_ {
// Criteria of weight of histogram peak to accept/reject feature. // Criteria of weight of histogram peak to accept/reject feature.
int thresWeightSpecFlat; int thresWeightSpecFlat;
int thresWeightSpecDiff; int thresWeightSpecDiff;
} NSParaExtract; } NSParaExtract;
typedef struct NoiseSuppressionC_ { typedef struct NoiseSuppressionC_ {
@ -186,4 +185,4 @@ void WebRtcNs_ProcessCore(NoiseSuppressionC* self,
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
#endif // MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_ #endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_NS_CORE_H_

View file

@ -8,15 +8,15 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_CORE_H_
#define MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_CORE_H_
#ifdef NS_FILEDEBUG #ifdef NS_FILEDEBUG
#include <stdio.h> #include <stdio.h>
#endif #endif
#include "common_audio/signal_processing/include/signal_processing_library.h" #include "common_audio/signal_processing/include/signal_processing_library.h"
#include "modules/audio_processing/ns/nsx_defines.h" #include "modules/audio_processing/legacy_ns/nsx_defines.h"
typedef struct NoiseSuppressionFixedC_ { typedef struct NoiseSuppressionFixedC_ {
uint32_t fs; uint32_t fs;
@ -161,9 +161,9 @@ int WebRtcNsx_set_policy_core(NoiseSuppressionFixedC* inst, int mode);
* - outFrame : Output speech frame for each band * - outFrame : Output speech frame for each band
*/ */
void WebRtcNsx_ProcessCore(NoiseSuppressionFixedC* inst, void WebRtcNsx_ProcessCore(NoiseSuppressionFixedC* inst,
const short* const* inFrame, const int16_t* const* inFrame,
int num_bands, int num_bands,
short* const* outFrame); int16_t* const* outFrame);
/**************************************************************************** /****************************************************************************
* Some function pointers, for internal functions shared by ARM NEON and * Some function pointers, for internal functions shared by ARM NEON and
@ -258,4 +258,4 @@ void WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst,
} }
#endif #endif
#endif // MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ #endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_CORE_H_

View file

@ -9,9 +9,9 @@
*/ */
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "modules/audio_processing/ns/noise_suppression_x.h" #include "modules/audio_processing/legacy_ns/noise_suppression_x.h"
#include "modules/audio_processing/ns/nsx_core.h" #include "modules/audio_processing/legacy_ns/nsx_core.h"
#include "modules/audio_processing/ns/nsx_defines.h" #include "modules/audio_processing/legacy_ns/nsx_defines.h"
static const int16_t kIndicatorTable[17] = { static const int16_t kIndicatorTable[17] = {
0, 2017, 3809, 5227, 6258, 6963, 7424, 7718, 0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
@ -257,4 +257,3 @@ void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
} }
} }
} }

View file

@ -11,8 +11,8 @@
#include <string.h> #include <string.h>
#include "rtc_base/checks.h" #include "rtc_base/checks.h"
#include "modules/audio_processing/ns/noise_suppression_x.h" #include "modules/audio_processing/legacy_ns/noise_suppression_x.h"
#include "modules/audio_processing/ns/nsx_core.h" #include "modules/audio_processing/legacy_ns/nsx_core.h"
static const int16_t kIndicatorTable[17] = { static const int16_t kIndicatorTable[17] = {
0, 2017, 3809, 5227, 6258, 6963, 7424, 7718, 0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
@ -999,4 +999,3 @@ void WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst,
: "memory" : "memory"
); );
} }

View file

@ -8,7 +8,7 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#include "modules/audio_processing/ns/nsx_core.h" #include "modules/audio_processing/legacy_ns/nsx_core.h"
#include <arm_neon.h> #include <arm_neon.h>

View file

@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree. * be found in the AUTHORS file in the root of the source tree.
*/ */
#ifndef MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_ #ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_DEFINES_H_
#define MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_ #define MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_DEFINES_H_
#define ANAL_BLOCKL_MAX 256 /* Max analysis block length */ #define ANAL_BLOCKL_MAX 256 /* Max analysis block length */
#define HALF_ANAL_BLOCKL 129 /* Half max analysis block length + 1 */ #define HALF_ANAL_BLOCKL 129 /* Half max analysis block length + 1 */
@ -71,4 +71,4 @@
#define GAMMA_NOISE_TRANS_AND_SPEECH_Q8 \ #define GAMMA_NOISE_TRANS_AND_SPEECH_Q8 \
3 /* ~= Q8(0.01) Update for transition and noise region */ 3 /* ~= Q8(0.01) Update for transition and noise region */
#endif /* MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_ */ #endif /* MODULES_AUDIO_PROCESSING_LEGACY_NS_NSX_DEFINES_H_ */

View file

@ -0,0 +1,553 @@
/*
* Copyright (c) 2011 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_WINDOWS_PRIVATE_H_
#define MODULES_AUDIO_PROCESSING_LEGACY_NS_WINDOWS_PRIVATE_H_
// Hanning window for 4ms 16kHz
static const float kHanning64w128[128] = {
0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f,
0.09801714032956f, 0.12241067519922f, 0.14673047445536f, 0.17096188876030f,
0.19509032201613f, 0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
0.29028467725446f, 0.31368174039889f, 0.33688985339222f, 0.35989503653499f,
0.38268343236509f, 0.40524131400499f, 0.42755509343028f, 0.44961132965461f,
0.47139673682600f, 0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
0.55557023301960f, 0.57580819141785f, 0.59569930449243f, 0.61523159058063f,
0.63439328416365f, 0.65317284295378f, 0.67155895484702f, 0.68954054473707f,
0.70710678118655f, 0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
0.77301045336274f, 0.78834642762661f, 0.80320753148064f, 0.81758481315158f,
0.83146961230255f, 0.84485356524971f, 0.85772861000027f, 0.87008699110871f,
0.88192126434835f, 0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
0.92387953251129f, 0.93299279883474f, 0.94154406518302f, 0.94952818059304f,
0.95694033573221f, 0.96377606579544f, 0.97003125319454f, 0.97570213003853f,
0.98078528040323f, 0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
0.99518472667220f, 0.99729045667869f, 0.99879545620517f, 0.99969881869620f,
1.00000000000000f, 0.99969881869620f, 0.99879545620517f, 0.99729045667869f,
0.99518472667220f, 0.99247953459871f, 0.98917650996478f, 0.98527764238894f,
0.98078528040323f, 0.97570213003853f, 0.97003125319454f, 0.96377606579544f,
0.95694033573221f, 0.94952818059304f, 0.94154406518302f, 0.93299279883474f,
0.92387953251129f, 0.91420975570353f, 0.90398929312344f, 0.89322430119552f,
0.88192126434835f, 0.87008699110871f, 0.85772861000027f, 0.84485356524971f,
0.83146961230255f, 0.81758481315158f, 0.80320753148064f, 0.78834642762661f,
0.77301045336274f, 0.75720884650648f, 0.74095112535496f, 0.72424708295147f,
0.70710678118655f, 0.68954054473707f, 0.67155895484702f, 0.65317284295378f,
0.63439328416365f, 0.61523159058063f, 0.59569930449243f, 0.57580819141785f,
0.55557023301960f, 0.53499761988710f, 0.51410274419322f, 0.49289819222978f,
0.47139673682600f, 0.44961132965461f, 0.42755509343028f, 0.40524131400499f,
0.38268343236509f, 0.35989503653499f, 0.33688985339222f, 0.31368174039889f,
0.29028467725446f, 0.26671275747490f, 0.24298017990326f, 0.21910124015687f,
0.19509032201613f, 0.17096188876030f, 0.14673047445536f, 0.12241067519922f,
0.09801714032956f, 0.07356456359967f, 0.04906767432742f, 0.02454122852291f};
// hybrib Hanning & flat window
static const float kBlocks80w128[128] = {
0.00000000f, 0.03271908f, 0.06540313f, 0.09801714f, 0.13052619f,
0.16289547f, 0.19509032f, 0.22707626f, 0.25881905f, 0.29028468f,
0.32143947f, 0.35225005f, 0.38268343f, 0.41270703f, 0.44228869f,
0.47139674f, 0.50000000f, 0.52806785f, 0.55557023f, 0.58247770f,
0.60876143f, 0.63439328f, 0.65934582f, 0.68359230f, 0.70710678f,
0.72986407f, 0.75183981f, 0.77301045f, 0.79335334f, 0.81284668f,
0.83146961f, 0.84920218f, 0.86602540f, 0.88192126f, 0.89687274f,
0.91086382f, 0.92387953f, 0.93590593f, 0.94693013f, 0.95694034f,
0.96592583f, 0.97387698f, 0.98078528f, 0.98664333f, 0.99144486f,
0.99518473f, 0.99785892f, 0.99946459f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 0.99946459f, 0.99785892f, 0.99518473f, 0.99144486f,
0.98664333f, 0.98078528f, 0.97387698f, 0.96592583f, 0.95694034f,
0.94693013f, 0.93590593f, 0.92387953f, 0.91086382f, 0.89687274f,
0.88192126f, 0.86602540f, 0.84920218f, 0.83146961f, 0.81284668f,
0.79335334f, 0.77301045f, 0.75183981f, 0.72986407f, 0.70710678f,
0.68359230f, 0.65934582f, 0.63439328f, 0.60876143f, 0.58247770f,
0.55557023f, 0.52806785f, 0.50000000f, 0.47139674f, 0.44228869f,
0.41270703f, 0.38268343f, 0.35225005f, 0.32143947f, 0.29028468f,
0.25881905f, 0.22707626f, 0.19509032f, 0.16289547f, 0.13052619f,
0.09801714f, 0.06540313f, 0.03271908f};
// hybrib Hanning & flat window
static const float kBlocks160w256[256] = {
0.00000000f, 0.01636173f, 0.03271908f, 0.04906767f, 0.06540313f,
0.08172107f, 0.09801714f, 0.11428696f, 0.13052619f, 0.14673047f,
0.16289547f, 0.17901686f, 0.19509032f, 0.21111155f, 0.22707626f,
0.24298018f, 0.25881905f, 0.27458862f, 0.29028468f, 0.30590302f,
0.32143947f, 0.33688985f, 0.35225005f, 0.36751594f, 0.38268343f,
0.39774847f, 0.41270703f, 0.42755509f, 0.44228869f, 0.45690388f,
0.47139674f, 0.48576339f, 0.50000000f, 0.51410274f, 0.52806785f,
0.54189158f, 0.55557023f, 0.56910015f, 0.58247770f, 0.59569930f,
0.60876143f, 0.62166057f, 0.63439328f, 0.64695615f, 0.65934582f,
0.67155895f, 0.68359230f, 0.69544264f, 0.70710678f, 0.71858162f,
0.72986407f, 0.74095113f, 0.75183981f, 0.76252720f, 0.77301045f,
0.78328675f, 0.79335334f, 0.80320753f, 0.81284668f, 0.82226822f,
0.83146961f, 0.84044840f, 0.84920218f, 0.85772861f, 0.86602540f,
0.87409034f, 0.88192126f, 0.88951608f, 0.89687274f, 0.90398929f,
0.91086382f, 0.91749450f, 0.92387953f, 0.93001722f, 0.93590593f,
0.94154407f, 0.94693013f, 0.95206268f, 0.95694034f, 0.96156180f,
0.96592583f, 0.97003125f, 0.97387698f, 0.97746197f, 0.98078528f,
0.98384601f, 0.98664333f, 0.98917651f, 0.99144486f, 0.99344778f,
0.99518473f, 0.99665524f, 0.99785892f, 0.99879546f, 0.99946459f,
0.99986614f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 0.99986614f, 0.99946459f, 0.99879546f, 0.99785892f,
0.99665524f, 0.99518473f, 0.99344778f, 0.99144486f, 0.98917651f,
0.98664333f, 0.98384601f, 0.98078528f, 0.97746197f, 0.97387698f,
0.97003125f, 0.96592583f, 0.96156180f, 0.95694034f, 0.95206268f,
0.94693013f, 0.94154407f, 0.93590593f, 0.93001722f, 0.92387953f,
0.91749450f, 0.91086382f, 0.90398929f, 0.89687274f, 0.88951608f,
0.88192126f, 0.87409034f, 0.86602540f, 0.85772861f, 0.84920218f,
0.84044840f, 0.83146961f, 0.82226822f, 0.81284668f, 0.80320753f,
0.79335334f, 0.78328675f, 0.77301045f, 0.76252720f, 0.75183981f,
0.74095113f, 0.72986407f, 0.71858162f, 0.70710678f, 0.69544264f,
0.68359230f, 0.67155895f, 0.65934582f, 0.64695615f, 0.63439328f,
0.62166057f, 0.60876143f, 0.59569930f, 0.58247770f, 0.56910015f,
0.55557023f, 0.54189158f, 0.52806785f, 0.51410274f, 0.50000000f,
0.48576339f, 0.47139674f, 0.45690388f, 0.44228869f, 0.42755509f,
0.41270703f, 0.39774847f, 0.38268343f, 0.36751594f, 0.35225005f,
0.33688985f, 0.32143947f, 0.30590302f, 0.29028468f, 0.27458862f,
0.25881905f, 0.24298018f, 0.22707626f, 0.21111155f, 0.19509032f,
0.17901686f, 0.16289547f, 0.14673047f, 0.13052619f, 0.11428696f,
0.09801714f, 0.08172107f, 0.06540313f, 0.04906767f, 0.03271908f,
0.01636173f};
// hybrib Hanning & flat window: for 20ms
static const float kBlocks320w512[512] = {
0.00000000f, 0.00818114f, 0.01636173f, 0.02454123f, 0.03271908f,
0.04089475f, 0.04906767f, 0.05723732f, 0.06540313f, 0.07356456f,
0.08172107f, 0.08987211f, 0.09801714f, 0.10615561f, 0.11428696f,
0.12241068f, 0.13052619f, 0.13863297f, 0.14673047f, 0.15481816f,
0.16289547f, 0.17096189f, 0.17901686f, 0.18705985f, 0.19509032f,
0.20310773f, 0.21111155f, 0.21910124f, 0.22707626f, 0.23503609f,
0.24298018f, 0.25090801f, 0.25881905f, 0.26671276f, 0.27458862f,
0.28244610f, 0.29028468f, 0.29810383f, 0.30590302f, 0.31368174f,
0.32143947f, 0.32917568f, 0.33688985f, 0.34458148f, 0.35225005f,
0.35989504f, 0.36751594f, 0.37511224f, 0.38268343f, 0.39022901f,
0.39774847f, 0.40524131f, 0.41270703f, 0.42014512f, 0.42755509f,
0.43493645f, 0.44228869f, 0.44961133f, 0.45690388f, 0.46416584f,
0.47139674f, 0.47859608f, 0.48576339f, 0.49289819f, 0.50000000f,
0.50706834f, 0.51410274f, 0.52110274f, 0.52806785f, 0.53499762f,
0.54189158f, 0.54874927f, 0.55557023f, 0.56235401f, 0.56910015f,
0.57580819f, 0.58247770f, 0.58910822f, 0.59569930f, 0.60225052f,
0.60876143f, 0.61523159f, 0.62166057f, 0.62804795f, 0.63439328f,
0.64069616f, 0.64695615f, 0.65317284f, 0.65934582f, 0.66547466f,
0.67155895f, 0.67759830f, 0.68359230f, 0.68954054f, 0.69544264f,
0.70129818f, 0.70710678f, 0.71286806f, 0.71858162f, 0.72424708f,
0.72986407f, 0.73543221f, 0.74095113f, 0.74642045f, 0.75183981f,
0.75720885f, 0.76252720f, 0.76779452f, 0.77301045f, 0.77817464f,
0.78328675f, 0.78834643f, 0.79335334f, 0.79830715f, 0.80320753f,
0.80805415f, 0.81284668f, 0.81758481f, 0.82226822f, 0.82689659f,
0.83146961f, 0.83598698f, 0.84044840f, 0.84485357f, 0.84920218f,
0.85349396f, 0.85772861f, 0.86190585f, 0.86602540f, 0.87008699f,
0.87409034f, 0.87803519f, 0.88192126f, 0.88574831f, 0.88951608f,
0.89322430f, 0.89687274f, 0.90046115f, 0.90398929f, 0.90745693f,
0.91086382f, 0.91420976f, 0.91749450f, 0.92071783f, 0.92387953f,
0.92697940f, 0.93001722f, 0.93299280f, 0.93590593f, 0.93875641f,
0.94154407f, 0.94426870f, 0.94693013f, 0.94952818f, 0.95206268f,
0.95453345f, 0.95694034f, 0.95928317f, 0.96156180f, 0.96377607f,
0.96592583f, 0.96801094f, 0.97003125f, 0.97198664f, 0.97387698f,
0.97570213f, 0.97746197f, 0.97915640f, 0.98078528f, 0.98234852f,
0.98384601f, 0.98527764f, 0.98664333f, 0.98794298f, 0.98917651f,
0.99034383f, 0.99144486f, 0.99247953f, 0.99344778f, 0.99434953f,
0.99518473f, 0.99595331f, 0.99665524f, 0.99729046f, 0.99785892f,
0.99836060f, 0.99879546f, 0.99916346f, 0.99946459f, 0.99969882f,
0.99986614f, 0.99996653f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f, 1.00000000f,
1.00000000f, 0.99996653f, 0.99986614f, 0.99969882f, 0.99946459f,
0.99916346f, 0.99879546f, 0.99836060f, 0.99785892f, 0.99729046f,
0.99665524f, 0.99595331f, 0.99518473f, 0.99434953f, 0.99344778f,
0.99247953f, 0.99144486f, 0.99034383f, 0.98917651f, 0.98794298f,
0.98664333f, 0.98527764f, 0.98384601f, 0.98234852f, 0.98078528f,
0.97915640f, 0.97746197f, 0.97570213f, 0.97387698f, 0.97198664f,
0.97003125f, 0.96801094f, 0.96592583f, 0.96377607f, 0.96156180f,
0.95928317f, 0.95694034f, 0.95453345f, 0.95206268f, 0.94952818f,
0.94693013f, 0.94426870f, 0.94154407f, 0.93875641f, 0.93590593f,
0.93299280f, 0.93001722f, 0.92697940f, 0.92387953f, 0.92071783f,
0.91749450f, 0.91420976f, 0.91086382f, 0.90745693f, 0.90398929f,
0.90046115f, 0.89687274f, 0.89322430f, 0.88951608f, 0.88574831f,
0.88192126f, 0.87803519f, 0.87409034f, 0.87008699f, 0.86602540f,
0.86190585f, 0.85772861f, 0.85349396f, 0.84920218f, 0.84485357f,
0.84044840f, 0.83598698f, 0.83146961f, 0.82689659f, 0.82226822f,
0.81758481f, 0.81284668f, 0.80805415f, 0.80320753f, 0.79830715f,
0.79335334f, 0.78834643f, 0.78328675f, 0.77817464f, 0.77301045f,
0.76779452f, 0.76252720f, 0.75720885f, 0.75183981f, 0.74642045f,
0.74095113f, 0.73543221f, 0.72986407f, 0.72424708f, 0.71858162f,
0.71286806f, 0.70710678f, 0.70129818f, 0.69544264f, 0.68954054f,
0.68359230f, 0.67759830f, 0.67155895f, 0.66547466f, 0.65934582f,
0.65317284f, 0.64695615f, 0.64069616f, 0.63439328f, 0.62804795f,
0.62166057f, 0.61523159f, 0.60876143f, 0.60225052f, 0.59569930f,
0.58910822f, 0.58247770f, 0.57580819f, 0.56910015f, 0.56235401f,
0.55557023f, 0.54874927f, 0.54189158f, 0.53499762f, 0.52806785f,
0.52110274f, 0.51410274f, 0.50706834f, 0.50000000f, 0.49289819f,
0.48576339f, 0.47859608f, 0.47139674f, 0.46416584f, 0.45690388f,
0.44961133f, 0.44228869f, 0.43493645f, 0.42755509f, 0.42014512f,
0.41270703f, 0.40524131f, 0.39774847f, 0.39022901f, 0.38268343f,
0.37511224f, 0.36751594f, 0.35989504f, 0.35225005f, 0.34458148f,
0.33688985f, 0.32917568f, 0.32143947f, 0.31368174f, 0.30590302f,
0.29810383f, 0.29028468f, 0.28244610f, 0.27458862f, 0.26671276f,
0.25881905f, 0.25090801f, 0.24298018f, 0.23503609f, 0.22707626f,
0.21910124f, 0.21111155f, 0.20310773f, 0.19509032f, 0.18705985f,
0.17901686f, 0.17096189f, 0.16289547f, 0.15481816f, 0.14673047f,
0.13863297f, 0.13052619f, 0.12241068f, 0.11428696f, 0.10615561f,
0.09801714f, 0.08987211f, 0.08172107f, 0.07356456f, 0.06540313f,
0.05723732f, 0.04906767f, 0.04089475f, 0.03271908f, 0.02454123f,
0.01636173f, 0.00818114f};
// Hanning window: for 15ms at 16kHz with symmetric zeros
static const float kBlocks240w512[512] = {
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00654494f, 0.01308960f, 0.01963369f,
0.02617695f, 0.03271908f, 0.03925982f, 0.04579887f, 0.05233596f,
0.05887080f, 0.06540313f, 0.07193266f, 0.07845910f, 0.08498218f,
0.09150162f, 0.09801714f, 0.10452846f, 0.11103531f, 0.11753740f,
0.12403446f, 0.13052620f, 0.13701233f, 0.14349262f, 0.14996676f,
0.15643448f, 0.16289547f, 0.16934951f, 0.17579629f, 0.18223552f,
0.18866697f, 0.19509032f, 0.20150533f, 0.20791170f, 0.21430916f,
0.22069745f, 0.22707628f, 0.23344538f, 0.23980446f, 0.24615330f,
0.25249159f, 0.25881904f, 0.26513544f, 0.27144045f, 0.27773386f,
0.28401536f, 0.29028466f, 0.29654160f, 0.30278578f, 0.30901700f,
0.31523499f, 0.32143945f, 0.32763019f, 0.33380687f, 0.33996925f,
0.34611708f, 0.35225007f, 0.35836795f, 0.36447051f, 0.37055743f,
0.37662852f, 0.38268346f, 0.38872197f, 0.39474389f, 0.40074885f,
0.40673664f, 0.41270703f, 0.41865975f, 0.42459452f, 0.43051112f,
0.43640924f, 0.44228873f, 0.44814920f, 0.45399052f, 0.45981237f,
0.46561453f, 0.47139674f, 0.47715878f, 0.48290035f, 0.48862126f,
0.49432120f, 0.50000000f, 0.50565743f, 0.51129311f, 0.51690692f,
0.52249855f, 0.52806789f, 0.53361452f, 0.53913832f, 0.54463905f,
0.55011642f, 0.55557024f, 0.56100029f, 0.56640625f, 0.57178795f,
0.57714522f, 0.58247769f, 0.58778524f, 0.59306765f, 0.59832460f,
0.60355598f, 0.60876143f, 0.61394083f, 0.61909395f, 0.62422055f,
0.62932038f, 0.63439333f, 0.63943899f, 0.64445734f, 0.64944810f,
0.65441096f, 0.65934587f, 0.66425246f, 0.66913062f, 0.67398012f,
0.67880076f, 0.68359232f, 0.68835455f, 0.69308740f, 0.69779050f,
0.70246369f, 0.70710677f, 0.71171963f, 0.71630198f, 0.72085363f,
0.72537440f, 0.72986406f, 0.73432255f, 0.73874950f, 0.74314487f,
0.74750835f, 0.75183982f, 0.75613910f, 0.76040596f, 0.76464027f,
0.76884186f, 0.77301043f, 0.77714598f, 0.78124821f, 0.78531694f,
0.78935206f, 0.79335338f, 0.79732066f, 0.80125386f, 0.80515265f,
0.80901700f, 0.81284672f, 0.81664157f, 0.82040149f, 0.82412618f,
0.82781565f, 0.83146966f, 0.83508795f, 0.83867061f, 0.84221727f,
0.84572780f, 0.84920216f, 0.85264021f, 0.85604161f, 0.85940641f,
0.86273444f, 0.86602545f, 0.86927933f, 0.87249607f, 0.87567532f,
0.87881714f, 0.88192129f, 0.88498765f, 0.88801610f, 0.89100653f,
0.89395881f, 0.89687276f, 0.89974827f, 0.90258533f, 0.90538365f,
0.90814316f, 0.91086388f, 0.91354549f, 0.91618794f, 0.91879123f,
0.92135513f, 0.92387950f, 0.92636442f, 0.92880958f, 0.93121493f,
0.93358046f, 0.93590593f, 0.93819135f, 0.94043654f, 0.94264150f,
0.94480604f, 0.94693011f, 0.94901365f, 0.95105654f, 0.95305866f,
0.95501995f, 0.95694035f, 0.95881975f, 0.96065807f, 0.96245527f,
0.96421117f, 0.96592581f, 0.96759909f, 0.96923089f, 0.97082120f,
0.97236991f, 0.97387701f, 0.97534233f, 0.97676587f, 0.97814763f,
0.97948742f, 0.98078531f, 0.98204112f, 0.98325491f, 0.98442656f,
0.98555607f, 0.98664331f, 0.98768836f, 0.98869103f, 0.98965138f,
0.99056935f, 0.99144489f, 0.99227792f, 0.99306846f, 0.99381649f,
0.99452192f, 0.99518472f, 0.99580491f, 0.99638247f, 0.99691731f,
0.99740952f, 0.99785894f, 0.99826562f, 0.99862951f, 0.99895066f,
0.99922901f, 0.99946457f, 0.99965733f, 0.99980724f, 0.99991435f,
0.99997860f, 1.00000000f, 0.99997860f, 0.99991435f, 0.99980724f,
0.99965733f, 0.99946457f, 0.99922901f, 0.99895066f, 0.99862951f,
0.99826562f, 0.99785894f, 0.99740946f, 0.99691731f, 0.99638247f,
0.99580491f, 0.99518472f, 0.99452192f, 0.99381644f, 0.99306846f,
0.99227792f, 0.99144489f, 0.99056935f, 0.98965138f, 0.98869103f,
0.98768836f, 0.98664331f, 0.98555607f, 0.98442656f, 0.98325491f,
0.98204112f, 0.98078525f, 0.97948742f, 0.97814757f, 0.97676587f,
0.97534227f, 0.97387695f, 0.97236991f, 0.97082120f, 0.96923089f,
0.96759909f, 0.96592581f, 0.96421117f, 0.96245521f, 0.96065807f,
0.95881969f, 0.95694029f, 0.95501995f, 0.95305860f, 0.95105648f,
0.94901365f, 0.94693011f, 0.94480604f, 0.94264150f, 0.94043654f,
0.93819129f, 0.93590593f, 0.93358046f, 0.93121493f, 0.92880952f,
0.92636436f, 0.92387950f, 0.92135507f, 0.91879123f, 0.91618794f,
0.91354543f, 0.91086382f, 0.90814310f, 0.90538365f, 0.90258527f,
0.89974827f, 0.89687276f, 0.89395875f, 0.89100647f, 0.88801610f,
0.88498759f, 0.88192123f, 0.87881714f, 0.87567532f, 0.87249595f,
0.86927933f, 0.86602539f, 0.86273432f, 0.85940641f, 0.85604161f,
0.85264009f, 0.84920216f, 0.84572780f, 0.84221715f, 0.83867055f,
0.83508795f, 0.83146954f, 0.82781565f, 0.82412612f, 0.82040137f,
0.81664157f, 0.81284660f, 0.80901700f, 0.80515265f, 0.80125374f,
0.79732066f, 0.79335332f, 0.78935200f, 0.78531694f, 0.78124815f,
0.77714586f, 0.77301049f, 0.76884180f, 0.76464021f, 0.76040596f,
0.75613904f, 0.75183970f, 0.74750835f, 0.74314481f, 0.73874938f,
0.73432249f, 0.72986400f, 0.72537428f, 0.72085363f, 0.71630186f,
0.71171951f, 0.70710677f, 0.70246363f, 0.69779032f, 0.69308734f,
0.68835449f, 0.68359220f, 0.67880070f, 0.67398006f, 0.66913044f,
0.66425240f, 0.65934575f, 0.65441096f, 0.64944804f, 0.64445722f,
0.63943905f, 0.63439327f, 0.62932026f, 0.62422055f, 0.61909389f,
0.61394072f, 0.60876143f, 0.60355592f, 0.59832448f, 0.59306765f,
0.58778518f, 0.58247757f, 0.57714522f, 0.57178789f, 0.56640613f,
0.56100023f, 0.55557019f, 0.55011630f, 0.54463905f, 0.53913826f,
0.53361434f, 0.52806783f, 0.52249849f, 0.51690674f, 0.51129305f,
0.50565726f, 0.50000006f, 0.49432117f, 0.48862115f, 0.48290038f,
0.47715873f, 0.47139663f, 0.46561456f, 0.45981231f, 0.45399037f,
0.44814920f, 0.44228864f, 0.43640912f, 0.43051112f, 0.42459446f,
0.41865960f, 0.41270703f, 0.40673658f, 0.40074870f, 0.39474386f,
0.38872188f, 0.38268328f, 0.37662849f, 0.37055734f, 0.36447033f,
0.35836792f, 0.35224995f, 0.34611690f, 0.33996922f, 0.33380675f,
0.32763001f, 0.32143945f, 0.31523487f, 0.30901679f, 0.30278572f,
0.29654145f, 0.29028472f, 0.28401530f, 0.27773371f, 0.27144048f,
0.26513538f, 0.25881892f, 0.25249159f, 0.24615324f, 0.23980433f,
0.23344538f, 0.22707619f, 0.22069728f, 0.21430916f, 0.20791161f,
0.20150517f, 0.19509031f, 0.18866688f, 0.18223536f, 0.17579627f,
0.16934940f, 0.16289529f, 0.15643445f, 0.14996666f, 0.14349243f,
0.13701232f, 0.13052608f, 0.12403426f, 0.11753736f, 0.11103519f,
0.10452849f, 0.09801710f, 0.09150149f, 0.08498220f, 0.07845904f,
0.07193252f, 0.06540315f, 0.05887074f, 0.05233581f, 0.04579888f,
0.03925974f, 0.03271893f, 0.02617695f, 0.01963361f, 0.01308943f,
0.00654493f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f};
// Hanning window: for 30ms with 1024 fft with symmetric zeros at 16kHz
static const float kBlocks480w1024[1024] = {
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00327249f, 0.00654494f,
0.00981732f, 0.01308960f, 0.01636173f, 0.01963369f, 0.02290544f,
0.02617695f, 0.02944817f, 0.03271908f, 0.03598964f, 0.03925982f,
0.04252957f, 0.04579887f, 0.04906768f, 0.05233596f, 0.05560368f,
0.05887080f, 0.06213730f, 0.06540313f, 0.06866825f, 0.07193266f,
0.07519628f, 0.07845910f, 0.08172107f, 0.08498218f, 0.08824237f,
0.09150162f, 0.09475989f, 0.09801714f, 0.10127335f, 0.10452846f,
0.10778246f, 0.11103531f, 0.11428697f, 0.11753740f, 0.12078657f,
0.12403446f, 0.12728101f, 0.13052620f, 0.13376999f, 0.13701233f,
0.14025325f, 0.14349262f, 0.14673047f, 0.14996676f, 0.15320145f,
0.15643448f, 0.15966582f, 0.16289547f, 0.16612339f, 0.16934951f,
0.17257382f, 0.17579629f, 0.17901687f, 0.18223552f, 0.18545224f,
0.18866697f, 0.19187967f, 0.19509032f, 0.19829889f, 0.20150533f,
0.20470962f, 0.20791170f, 0.21111156f, 0.21430916f, 0.21750447f,
0.22069745f, 0.22388805f, 0.22707628f, 0.23026206f, 0.23344538f,
0.23662618f, 0.23980446f, 0.24298020f, 0.24615330f, 0.24932377f,
0.25249159f, 0.25565669f, 0.25881904f, 0.26197866f, 0.26513544f,
0.26828939f, 0.27144045f, 0.27458861f, 0.27773386f, 0.28087610f,
0.28401536f, 0.28715158f, 0.29028466f, 0.29341471f, 0.29654160f,
0.29966527f, 0.30278578f, 0.30590302f, 0.30901700f, 0.31212768f,
0.31523499f, 0.31833893f, 0.32143945f, 0.32453656f, 0.32763019f,
0.33072028f, 0.33380687f, 0.33688986f, 0.33996925f, 0.34304500f,
0.34611708f, 0.34918544f, 0.35225007f, 0.35531089f, 0.35836795f,
0.36142117f, 0.36447051f, 0.36751595f, 0.37055743f, 0.37359497f,
0.37662852f, 0.37965801f, 0.38268346f, 0.38570479f, 0.38872197f,
0.39173502f, 0.39474389f, 0.39774847f, 0.40074885f, 0.40374491f,
0.40673664f, 0.40972406f, 0.41270703f, 0.41568562f, 0.41865975f,
0.42162940f, 0.42459452f, 0.42755508f, 0.43051112f, 0.43346250f,
0.43640924f, 0.43935132f, 0.44228873f, 0.44522133f, 0.44814920f,
0.45107228f, 0.45399052f, 0.45690390f, 0.45981237f, 0.46271592f,
0.46561453f, 0.46850815f, 0.47139674f, 0.47428030f, 0.47715878f,
0.48003215f, 0.48290035f, 0.48576337f, 0.48862126f, 0.49147385f,
0.49432120f, 0.49716330f, 0.50000000f, 0.50283140f, 0.50565743f,
0.50847799f, 0.51129311f, 0.51410276f, 0.51690692f, 0.51970553f,
0.52249855f, 0.52528602f, 0.52806789f, 0.53084403f, 0.53361452f,
0.53637928f, 0.53913832f, 0.54189163f, 0.54463905f, 0.54738063f,
0.55011642f, 0.55284631f, 0.55557024f, 0.55828828f, 0.56100029f,
0.56370628f, 0.56640625f, 0.56910014f, 0.57178795f, 0.57446963f,
0.57714522f, 0.57981455f, 0.58247769f, 0.58513463f, 0.58778524f,
0.59042960f, 0.59306765f, 0.59569931f, 0.59832460f, 0.60094351f,
0.60355598f, 0.60616195f, 0.60876143f, 0.61135441f, 0.61394083f,
0.61652070f, 0.61909395f, 0.62166059f, 0.62422055f, 0.62677383f,
0.62932038f, 0.63186020f, 0.63439333f, 0.63691956f, 0.63943899f,
0.64195162f, 0.64445734f, 0.64695615f, 0.64944810f, 0.65193301f,
0.65441096f, 0.65688187f, 0.65934587f, 0.66180271f, 0.66425246f,
0.66669512f, 0.66913062f, 0.67155898f, 0.67398012f, 0.67639405f,
0.67880076f, 0.68120021f, 0.68359232f, 0.68597710f, 0.68835455f,
0.69072467f, 0.69308740f, 0.69544262f, 0.69779050f, 0.70013082f,
0.70246369f, 0.70478904f, 0.70710677f, 0.70941699f, 0.71171963f,
0.71401459f, 0.71630198f, 0.71858168f, 0.72085363f, 0.72311789f,
0.72537440f, 0.72762316f, 0.72986406f, 0.73209721f, 0.73432255f,
0.73653996f, 0.73874950f, 0.74095118f, 0.74314487f, 0.74533057f,
0.74750835f, 0.74967808f, 0.75183982f, 0.75399351f, 0.75613910f,
0.75827658f, 0.76040596f, 0.76252723f, 0.76464027f, 0.76674515f,
0.76884186f, 0.77093029f, 0.77301043f, 0.77508241f, 0.77714598f,
0.77920127f, 0.78124821f, 0.78328675f, 0.78531694f, 0.78733873f,
0.78935206f, 0.79135692f, 0.79335338f, 0.79534125f, 0.79732066f,
0.79929149f, 0.80125386f, 0.80320752f, 0.80515265f, 0.80708915f,
0.80901700f, 0.81093621f, 0.81284672f, 0.81474853f, 0.81664157f,
0.81852591f, 0.82040149f, 0.82226825f, 0.82412618f, 0.82597536f,
0.82781565f, 0.82964706f, 0.83146966f, 0.83328325f, 0.83508795f,
0.83688378f, 0.83867061f, 0.84044838f, 0.84221727f, 0.84397703f,
0.84572780f, 0.84746957f, 0.84920216f, 0.85092574f, 0.85264021f,
0.85434544f, 0.85604161f, 0.85772866f, 0.85940641f, 0.86107504f,
0.86273444f, 0.86438453f, 0.86602545f, 0.86765707f, 0.86927933f,
0.87089235f, 0.87249607f, 0.87409031f, 0.87567532f, 0.87725097f,
0.87881714f, 0.88037390f, 0.88192129f, 0.88345921f, 0.88498765f,
0.88650668f, 0.88801610f, 0.88951612f, 0.89100653f, 0.89248741f,
0.89395881f, 0.89542055f, 0.89687276f, 0.89831537f, 0.89974827f,
0.90117162f, 0.90258533f, 0.90398932f, 0.90538365f, 0.90676826f,
0.90814316f, 0.90950841f, 0.91086388f, 0.91220951f, 0.91354549f,
0.91487163f, 0.91618794f, 0.91749454f, 0.91879123f, 0.92007810f,
0.92135513f, 0.92262226f, 0.92387950f, 0.92512691f, 0.92636442f,
0.92759192f, 0.92880958f, 0.93001723f, 0.93121493f, 0.93240267f,
0.93358046f, 0.93474817f, 0.93590593f, 0.93705362f, 0.93819135f,
0.93931901f, 0.94043654f, 0.94154406f, 0.94264150f, 0.94372880f,
0.94480604f, 0.94587320f, 0.94693011f, 0.94797695f, 0.94901365f,
0.95004016f, 0.95105654f, 0.95206273f, 0.95305866f, 0.95404440f,
0.95501995f, 0.95598525f, 0.95694035f, 0.95788521f, 0.95881975f,
0.95974404f, 0.96065807f, 0.96156180f, 0.96245527f, 0.96333838f,
0.96421117f, 0.96507370f, 0.96592581f, 0.96676767f, 0.96759909f,
0.96842021f, 0.96923089f, 0.97003126f, 0.97082120f, 0.97160077f,
0.97236991f, 0.97312868f, 0.97387701f, 0.97461486f, 0.97534233f,
0.97605932f, 0.97676587f, 0.97746199f, 0.97814763f, 0.97882277f,
0.97948742f, 0.98014158f, 0.98078531f, 0.98141843f, 0.98204112f,
0.98265332f, 0.98325491f, 0.98384601f, 0.98442656f, 0.98499662f,
0.98555607f, 0.98610497f, 0.98664331f, 0.98717111f, 0.98768836f,
0.98819500f, 0.98869103f, 0.98917651f, 0.98965138f, 0.99011570f,
0.99056935f, 0.99101239f, 0.99144489f, 0.99186671f, 0.99227792f,
0.99267852f, 0.99306846f, 0.99344778f, 0.99381649f, 0.99417448f,
0.99452192f, 0.99485862f, 0.99518472f, 0.99550015f, 0.99580491f,
0.99609905f, 0.99638247f, 0.99665523f, 0.99691731f, 0.99716878f,
0.99740952f, 0.99763954f, 0.99785894f, 0.99806762f, 0.99826562f,
0.99845290f, 0.99862951f, 0.99879545f, 0.99895066f, 0.99909520f,
0.99922901f, 0.99935216f, 0.99946457f, 0.99956632f, 0.99965733f,
0.99973762f, 0.99980724f, 0.99986613f, 0.99991435f, 0.99995178f,
0.99997860f, 0.99999464f, 1.00000000f, 0.99999464f, 0.99997860f,
0.99995178f, 0.99991435f, 0.99986613f, 0.99980724f, 0.99973762f,
0.99965733f, 0.99956632f, 0.99946457f, 0.99935216f, 0.99922901f,
0.99909520f, 0.99895066f, 0.99879545f, 0.99862951f, 0.99845290f,
0.99826562f, 0.99806762f, 0.99785894f, 0.99763954f, 0.99740946f,
0.99716872f, 0.99691731f, 0.99665523f, 0.99638247f, 0.99609905f,
0.99580491f, 0.99550015f, 0.99518472f, 0.99485862f, 0.99452192f,
0.99417448f, 0.99381644f, 0.99344778f, 0.99306846f, 0.99267852f,
0.99227792f, 0.99186671f, 0.99144489f, 0.99101239f, 0.99056935f,
0.99011564f, 0.98965138f, 0.98917651f, 0.98869103f, 0.98819494f,
0.98768836f, 0.98717111f, 0.98664331f, 0.98610497f, 0.98555607f,
0.98499656f, 0.98442656f, 0.98384601f, 0.98325491f, 0.98265326f,
0.98204112f, 0.98141843f, 0.98078525f, 0.98014158f, 0.97948742f,
0.97882277f, 0.97814757f, 0.97746193f, 0.97676587f, 0.97605932f,
0.97534227f, 0.97461486f, 0.97387695f, 0.97312862f, 0.97236991f,
0.97160077f, 0.97082120f, 0.97003126f, 0.96923089f, 0.96842015f,
0.96759909f, 0.96676761f, 0.96592581f, 0.96507365f, 0.96421117f,
0.96333838f, 0.96245521f, 0.96156180f, 0.96065807f, 0.95974404f,
0.95881969f, 0.95788515f, 0.95694029f, 0.95598525f, 0.95501995f,
0.95404440f, 0.95305860f, 0.95206267f, 0.95105648f, 0.95004016f,
0.94901365f, 0.94797695f, 0.94693011f, 0.94587314f, 0.94480604f,
0.94372880f, 0.94264150f, 0.94154406f, 0.94043654f, 0.93931895f,
0.93819129f, 0.93705362f, 0.93590593f, 0.93474817f, 0.93358046f,
0.93240267f, 0.93121493f, 0.93001723f, 0.92880952f, 0.92759192f,
0.92636436f, 0.92512691f, 0.92387950f, 0.92262226f, 0.92135507f,
0.92007804f, 0.91879123f, 0.91749448f, 0.91618794f, 0.91487157f,
0.91354543f, 0.91220951f, 0.91086382f, 0.90950835f, 0.90814310f,
0.90676820f, 0.90538365f, 0.90398932f, 0.90258527f, 0.90117157f,
0.89974827f, 0.89831525f, 0.89687276f, 0.89542055f, 0.89395875f,
0.89248741f, 0.89100647f, 0.88951600f, 0.88801610f, 0.88650662f,
0.88498759f, 0.88345915f, 0.88192123f, 0.88037384f, 0.87881714f,
0.87725091f, 0.87567532f, 0.87409031f, 0.87249595f, 0.87089223f,
0.86927933f, 0.86765701f, 0.86602539f, 0.86438447f, 0.86273432f,
0.86107504f, 0.85940641f, 0.85772860f, 0.85604161f, 0.85434544f,
0.85264009f, 0.85092574f, 0.84920216f, 0.84746951f, 0.84572780f,
0.84397697f, 0.84221715f, 0.84044844f, 0.83867055f, 0.83688372f,
0.83508795f, 0.83328319f, 0.83146954f, 0.82964706f, 0.82781565f,
0.82597530f, 0.82412612f, 0.82226813f, 0.82040137f, 0.81852591f,
0.81664157f, 0.81474847f, 0.81284660f, 0.81093609f, 0.80901700f,
0.80708915f, 0.80515265f, 0.80320752f, 0.80125374f, 0.79929143f,
0.79732066f, 0.79534125f, 0.79335332f, 0.79135686f, 0.78935200f,
0.78733861f, 0.78531694f, 0.78328675f, 0.78124815f, 0.77920121f,
0.77714586f, 0.77508223f, 0.77301049f, 0.77093029f, 0.76884180f,
0.76674509f, 0.76464021f, 0.76252711f, 0.76040596f, 0.75827658f,
0.75613904f, 0.75399339f, 0.75183970f, 0.74967796f, 0.74750835f,
0.74533057f, 0.74314481f, 0.74095106f, 0.73874938f, 0.73653996f,
0.73432249f, 0.73209721f, 0.72986400f, 0.72762305f, 0.72537428f,
0.72311789f, 0.72085363f, 0.71858162f, 0.71630186f, 0.71401453f,
0.71171951f, 0.70941705f, 0.70710677f, 0.70478898f, 0.70246363f,
0.70013070f, 0.69779032f, 0.69544268f, 0.69308734f, 0.69072461f,
0.68835449f, 0.68597704f, 0.68359220f, 0.68120021f, 0.67880070f,
0.67639399f, 0.67398006f, 0.67155886f, 0.66913044f, 0.66669512f,
0.66425240f, 0.66180259f, 0.65934575f, 0.65688181f, 0.65441096f,
0.65193301f, 0.64944804f, 0.64695609f, 0.64445722f, 0.64195150f,
0.63943905f, 0.63691956f, 0.63439327f, 0.63186014f, 0.62932026f,
0.62677372f, 0.62422055f, 0.62166059f, 0.61909389f, 0.61652064f,
0.61394072f, 0.61135429f, 0.60876143f, 0.60616189f, 0.60355592f,
0.60094339f, 0.59832448f, 0.59569913f, 0.59306765f, 0.59042960f,
0.58778518f, 0.58513451f, 0.58247757f, 0.57981461f, 0.57714522f,
0.57446963f, 0.57178789f, 0.56910002f, 0.56640613f, 0.56370628f,
0.56100023f, 0.55828822f, 0.55557019f, 0.55284619f, 0.55011630f,
0.54738069f, 0.54463905f, 0.54189152f, 0.53913826f, 0.53637916f,
0.53361434f, 0.53084403f, 0.52806783f, 0.52528596f, 0.52249849f,
0.51970541f, 0.51690674f, 0.51410276f, 0.51129305f, 0.50847787f,
0.50565726f, 0.50283122f, 0.50000006f, 0.49716327f, 0.49432117f,
0.49147379f, 0.48862115f, 0.48576325f, 0.48290038f, 0.48003212f,
0.47715873f, 0.47428021f, 0.47139663f, 0.46850798f, 0.46561456f,
0.46271589f, 0.45981231f, 0.45690379f, 0.45399037f, 0.45107210f,
0.44814920f, 0.44522130f, 0.44228864f, 0.43935123f, 0.43640912f,
0.43346232f, 0.43051112f, 0.42755505f, 0.42459446f, 0.42162928f,
0.41865960f, 0.41568545f, 0.41270703f, 0.40972400f, 0.40673658f,
0.40374479f, 0.40074870f, 0.39774850f, 0.39474386f, 0.39173496f,
0.38872188f, 0.38570464f, 0.38268328f, 0.37965804f, 0.37662849f,
0.37359491f, 0.37055734f, 0.36751580f, 0.36447033f, 0.36142117f,
0.35836792f, 0.35531086f, 0.35224995f, 0.34918529f, 0.34611690f,
0.34304500f, 0.33996922f, 0.33688980f, 0.33380675f, 0.33072016f,
0.32763001f, 0.32453656f, 0.32143945f, 0.31833887f, 0.31523487f,
0.31212750f, 0.30901679f, 0.30590302f, 0.30278572f, 0.29966521f,
0.29654145f, 0.29341453f, 0.29028472f, 0.28715155f, 0.28401530f,
0.28087601f, 0.27773371f, 0.27458847f, 0.27144048f, 0.26828936f,
0.26513538f, 0.26197854f, 0.25881892f, 0.25565651f, 0.25249159f,
0.24932374f, 0.24615324f, 0.24298008f, 0.23980433f, 0.23662600f,
0.23344538f, 0.23026201f, 0.22707619f, 0.22388794f, 0.22069728f,
0.21750426f, 0.21430916f, 0.21111152f, 0.20791161f, 0.20470949f,
0.20150517f, 0.19829892f, 0.19509031f, 0.19187963f, 0.18866688f,
0.18545210f, 0.18223536f, 0.17901689f, 0.17579627f, 0.17257376f,
0.16934940f, 0.16612324f, 0.16289529f, 0.15966584f, 0.15643445f,
0.15320137f, 0.14996666f, 0.14673033f, 0.14349243f, 0.14025325f,
0.13701232f, 0.13376991f, 0.13052608f, 0.12728085f, 0.12403426f,
0.12078657f, 0.11753736f, 0.11428688f, 0.11103519f, 0.10778230f,
0.10452849f, 0.10127334f, 0.09801710f, 0.09475980f, 0.09150149f,
0.08824220f, 0.08498220f, 0.08172106f, 0.07845904f, 0.07519618f,
0.07193252f, 0.06866808f, 0.06540315f, 0.06213728f, 0.05887074f,
0.05560357f, 0.05233581f, 0.04906749f, 0.04579888f, 0.04252954f,
0.03925974f, 0.03598953f, 0.03271893f, 0.02944798f, 0.02617695f,
0.02290541f, 0.01963361f, 0.01636161f, 0.01308943f, 0.00981712f,
0.00654493f, 0.00327244f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f,
0.00000000f, 0.00000000f, 0.00000000f, 0.00000000f};
#endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_WINDOWS_PRIVATE_H_

View file

@ -0,0 +1,104 @@
# Copyright (c) 2019 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.
import("../../../webrtc.gni")
rtc_static_library("ns") {
visibility = [ "*" ]
configs += [ "..:apm_debug_dump" ]
sources = [
"fast_math.cc",
"fast_math.h",
"histograms.cc",
"histograms.h",
"noise_estimator.cc",
"noise_estimator.h",
"noise_suppressor.cc",
"noise_suppressor.h",
"ns_common.h",
"ns_config.h",
"ns_fft.cc",
"ns_fft.h",
"prior_signal_model.cc",
"prior_signal_model.h",
"prior_signal_model_estimator.cc",
"prior_signal_model_estimator.h",
"quantile_noise_estimator.cc",
"quantile_noise_estimator.h",
"signal_model.cc",
"signal_model.h",
"signal_model_estimator.cc",
"signal_model_estimator.h",
"speech_probability_estimator.cc",
"speech_probability_estimator.h",
"suppression_params.cc",
"suppression_params.h",
"wiener_filter.cc",
"wiener_filter.h",
]
defines = []
if (rtc_build_with_neon && current_cpu != "arm64") {
suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
cflags = [ "-mfpu=neon" ]
}
deps = [
"..:apm_logging",
"..:audio_buffer",
"..:high_pass_filter",
"../../../api:array_view",
"../../../common_audio:common_audio_c",
"../../../common_audio/third_party/fft4g",
"../../../rtc_base:checks",
"../../../rtc_base:rtc_base_approved",
"../../../rtc_base:safe_minmax",
"../../../rtc_base/system:arch",
"../../../system_wrappers:cpu_features_api",
"../../../system_wrappers:field_trial",
"../../../system_wrappers:metrics",
"../utility:cascaded_biquad_filter",
"../utility:ooura_fft",
"//third_party/abseil-cpp/absl/types:optional",
]
}
if (rtc_include_tests) {
rtc_source_set("ns_unittests") {
testonly = true
configs += [ "..:apm_debug_dump" ]
sources = [
"noise_suppressor_unittest.cc",
]
deps = [
":ns",
"..:apm_logging",
"..:audio_buffer",
"..:audio_processing",
"..:audio_processing_unittests",
"..:high_pass_filter",
"../../../api:array_view",
"../../../rtc_base:checks",
"../../../rtc_base:rtc_base_approved",
"../../../rtc_base:safe_minmax",
"../../../rtc_base/system:arch",
"../../../system_wrappers:cpu_features_api",
"../../../test:test_support",
"../utility:cascaded_biquad_filter",
"//third_party/abseil-cpp/absl/types:optional",
]
defines = []
if (rtc_enable_protobuf) {
sources += []
}
}
}

View file

@ -1,56 +0,0 @@
/*
* Copyright (c) 2011 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
#define MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
#define BLOCKL_MAX 160 // max processing block length: 160
#define ANAL_BLOCKL_MAX 256 // max analysis block length: 256
#define HALF_ANAL_BLOCKL 129 // half max analysis block length + 1
#define NUM_HIGH_BANDS_MAX 2 // max number of high bands: 2
#define QUANTILE (float)0.25
#define SIMULT 3
#define END_STARTUP_LONG 200
#define END_STARTUP_SHORT 50
#define FACTOR (float)40.0
#define WIDTH (float)0.01
// Length of fft work arrays.
#define IP_LENGTH \
(ANAL_BLOCKL_MAX >> 1) // must be at least ceil(2 + sqrt(ANAL_BLOCKL_MAX/2))
#define W_LENGTH (ANAL_BLOCKL_MAX >> 1)
// PARAMETERS FOR NEW METHOD
#define DD_PR_SNR (float)0.98 // DD update of prior SNR
#define LRT_TAVG (float)0.50 // tavg parameter for LRT (previously 0.90)
#define SPECT_FL_TAVG \
(float)0.30 // tavg parameter for spectral flatness measure
#define SPECT_DIFF_TAVG \
(float)0.30 // tavg parameter for spectral difference measure
#define PRIOR_UPDATE (float)0.10 // update parameter of prior model
#define NOISE_UPDATE (float)0.90 // update parameter for noise
#define SPEECH_UPDATE (float)0.99 // update parameter when likely speech
#define WIDTH_PR_MAP \
(float)4.0 // width parameter in sigmoid map for prior model
#define LRT_FEATURE_THR (float)0.5 // default threshold for LRT feature
#define SF_FEATURE_THR \
(float)0.5 // default threshold for Spectral Flatness feature
#define SD_FEATURE_THR \
(float)0.5 // default threshold for Spectral Difference feature
#define PROB_RANGE \
(float)0.20 // probability threshold for noise state in
// speech/noise likelihood
#define HIST_PAR_EST 1000 // histogram size for estimation of parameters
#define GAMMA_PAUSE (float)0.05 // update for conservative noise estimate
//
#define B_LIM (float)0.5 // threshold in final energy gain factor calculation
#endif // MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_

View file

@ -0,0 +1,84 @@
/*
* Copyright (c) 2019 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/fast_math.h"
#include <math.h>
#include <stdint.h>
#include "rtc_base/checks.h"
namespace webrtc {
namespace {
float FastLog2f(float in) {
RTC_DCHECK_GT(in, .0f);
// Read and interpret float as uint32_t and then cast to float.
// This is done to extract the exponent (bits 30 - 23).
// "Right shift" of the exponent is then performed by multiplying
// with the constant (1/2^23). Finally, we subtract a constant to
// remove the bias (https://en.wikipedia.org/wiki/Exponent_bias).
union {
float dummy;
uint32_t a;
} x = {in};
float out = x.a;
out *= 1.1920929e-7f; // 1/2^23
out -= 126.942695f; // Remove bias.
return out;
}
} // namespace
float SqrtFastApproximation(float f) {
// TODO(peah): Add fast approximate implementation.
return sqrtf(f);
}
float Pow2Approximation(float p) {
// TODO(peah): Add fast approximate implementation.
return powf(2.f, p);
}
float PowApproximation(float x, float p) {
return Pow2Approximation(p * FastLog2f(x));
}
float LogApproximation(float x) {
constexpr float kLogOf2 = 0.69314718056f;
return FastLog2f(x) * kLogOf2;
}
void LogApproximation(rtc::ArrayView<const float> x, rtc::ArrayView<float> y) {
for (size_t k = 0; k < x.size(); ++k) {
y[k] = LogApproximation(x[k]);
}
}
float ExpApproximation(float x) {
constexpr float kLog10Ofe = 0.4342944819f;
return PowApproximation(10.f, x * kLog10Ofe);
}
void ExpApproximation(rtc::ArrayView<const float> x, rtc::ArrayView<float> y) {
for (size_t k = 0; k < x.size(); ++k) {
y[k] = ExpApproximation(x[k]);
}
}
void ExpApproximationSignFlip(rtc::ArrayView<const float> x,
rtc::ArrayView<float> y) {
for (size_t k = 0; k < x.size(); ++k) {
y[k] = ExpApproximation(-x[k]);
}
}
} // namespace webrtc

View file

@ -0,0 +1,38 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_FAST_MATH_H_
#define MODULES_AUDIO_PROCESSING_NS_FAST_MATH_H_
#include "api/array_view.h"
namespace webrtc {
// Sqrt approximation.
float SqrtFastApproximation(float f);
// Log base conversion log(x) = log2(x)/log2(e).
float LogApproximation(float x);
void LogApproximation(rtc::ArrayView<const float> x, rtc::ArrayView<float> y);
// 2^x approximation.
float Pow2Approximation(float p);
// x^p approximation.
float PowApproximation(float x, float p);
// e^x approximation.
float ExpApproximation(float x);
void ExpApproximation(rtc::ArrayView<const float> x, rtc::ArrayView<float> y);
void ExpApproximationSignFlip(rtc::ArrayView<const float> x,
rtc::ArrayView<float> y);
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_FAST_MATH_H_

View file

@ -0,0 +1,47 @@
/*
* Copyright (c) 2019 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/histograms.h"
namespace webrtc {
Histograms::Histograms() {
Clear();
}
void Histograms::Clear() {
lrt_.fill(0);
spectral_flatness_.fill(0);
spectral_diff_.fill(0);
}
void Histograms::Update(const SignalModel& features_) {
// Update the histogram for the LRT.
constexpr float kOneByBinSizeLrt = 1.f / kBinSizeLrt;
if (features_.lrt < kHistogramSize * kBinSizeLrt && features_.lrt >= 0.f) {
++lrt_[kOneByBinSizeLrt * features_.lrt];
}
// Update histogram for the spectral flatness.
constexpr float kOneByBinSizeSpecFlat = 1.f / kBinSizeSpecFlat;
if (features_.spectral_flatness < kHistogramSize * kBinSizeSpecFlat &&
features_.spectral_flatness >= 0.f) {
++spectral_flatness_[features_.spectral_flatness * kOneByBinSizeSpecFlat];
}
// Update histogram for the spectral difference.
constexpr float kOneByBinSizeSpecDiff = 1.f / kBinSizeSpecDiff;
if (features_.spectral_diff < kHistogramSize * kBinSizeSpecDiff &&
features_.spectral_diff >= 0.f) {
++spectral_diff_[features_.spectral_diff * kOneByBinSizeSpecDiff];
}
}
} // namespace webrtc

View file

@ -0,0 +1,55 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_HISTOGRAMS_H_
#define MODULES_AUDIO_PROCESSING_NS_HISTOGRAMS_H_
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/signal_model.h"
namespace webrtc {
constexpr int kHistogramSize = 1000;
// Class for handling the updating of histograms.
class Histograms {
public:
Histograms();
Histograms(const Histograms&) = delete;
Histograms& operator=(const Histograms&) = delete;
// Clears the histograms.
void Clear();
// Extracts thresholds for feature parameters and updates the corresponding
// histogram.
void Update(const SignalModel& features_);
// Methods for accessing the histograms.
rtc::ArrayView<const int, kHistogramSize> get_lrt() const { return lrt_; }
rtc::ArrayView<const int, kHistogramSize> get_spectral_flatness() const {
return spectral_flatness_;
}
rtc::ArrayView<const int, kHistogramSize> get_spectral_diff() const {
return spectral_diff_;
}
private:
std::array<int, kHistogramSize> lrt_;
std::array<int, kHistogramSize> spectral_flatness_;
std::array<int, kHistogramSize> spectral_diff_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_HISTOGRAMS_H_

View file

@ -0,0 +1,195 @@
/*
* Copyright (c) 2019 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_estimator.h"
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
#include "rtc_base/checks.h"
namespace webrtc {
namespace {
// Log(i).
constexpr std::array<float, 129> log_table = {
0.f, 0.f, 0.f, 0.f, 0.f, 1.609438f, 1.791759f,
1.945910f, 2.079442f, 2.197225f, 2.302585f, 2.397895f, 2.484907f, 2.564949f,
2.639057f, 2.708050f, 2.772589f, 2.833213f, 2.890372f, 2.944439f, 2.995732f,
3.044522f, 3.091043f, 3.135494f, 3.178054f, 3.218876f, 3.258097f, 3.295837f,
3.332205f, 3.367296f, 3.401197f, 3.433987f, 3.465736f, 3.496507f, 3.526361f,
3.555348f, 3.583519f, 3.610918f, 3.637586f, 3.663562f, 3.688879f, 3.713572f,
3.737669f, 3.761200f, 3.784190f, 3.806663f, 3.828641f, 3.850147f, 3.871201f,
3.891820f, 3.912023f, 3.931826f, 3.951244f, 3.970292f, 3.988984f, 4.007333f,
4.025352f, 4.043051f, 4.060443f, 4.077538f, 4.094345f, 4.110874f, 4.127134f,
4.143135f, 4.158883f, 4.174387f, 4.189655f, 4.204693f, 4.219508f, 4.234107f,
4.248495f, 4.262680f, 4.276666f, 4.290460f, 4.304065f, 4.317488f, 4.330733f,
4.343805f, 4.356709f, 4.369448f, 4.382027f, 4.394449f, 4.406719f, 4.418841f,
4.430817f, 4.442651f, 4.454347f, 4.465908f, 4.477337f, 4.488636f, 4.499810f,
4.510859f, 4.521789f, 4.532599f, 4.543295f, 4.553877f, 4.564348f, 4.574711f,
4.584968f, 4.595119f, 4.605170f, 4.615121f, 4.624973f, 4.634729f, 4.644391f,
4.653960f, 4.663439f, 4.672829f, 4.682131f, 4.691348f, 4.700480f, 4.709530f,
4.718499f, 4.727388f, 4.736198f, 4.744932f, 4.753591f, 4.762174f, 4.770685f,
4.779124f, 4.787492f, 4.795791f, 4.804021f, 4.812184f, 4.820282f, 4.828314f,
4.836282f, 4.844187f, 4.852030f};
} // namespace
NoiseEstimator::NoiseEstimator(const SuppressionParams& suppression_params)
: suppression_params_(suppression_params) {
noise_spectrum_.fill(0.f);
prev_noise_spectrum_.fill(0.f);
conservative_noise_spectrum_.fill(0.f);
parametric_noise_spectrum_.fill(0.f);
}
void NoiseEstimator::PrepareAnalysis() {
std::copy(noise_spectrum_.begin(), noise_spectrum_.end(),
prev_noise_spectrum_.begin());
}
void NoiseEstimator::PreUpdate(
int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum) {
quantile_noise_estimator_.Estimate(signal_spectrum, noise_spectrum_);
if (num_analyzed_frames < kShortStartupPhaseBlocks) {
// Compute simplified noise model during startup.
const size_t kStartBand = 5;
float sum_log_i_log_magn = 0.f;
float sum_log_i = 0.f;
float sum_log_i_square = 0.f;
float sum_log_magn = 0.f;
for (size_t i = kStartBand; i < kFftSizeBy2Plus1; ++i) {
float log_i = log_table[i];
sum_log_i += log_i;
sum_log_i_square += log_i * log_i;
float log_signal = LogApproximation(signal_spectrum[i]);
sum_log_magn += log_signal;
sum_log_i_log_magn += log_i * log_signal;
}
// Estimate the parameter for the level of the white noise.
constexpr float kOneByFftSizeBy2Plus1 = 1.f / kFftSizeBy2Plus1;
white_noise_level_ += signal_spectral_sum * kOneByFftSizeBy2Plus1 *
suppression_params_.over_subtraction_factor;
// Estimate pink noise parameters.
float denom = sum_log_i_square * (kFftSizeBy2Plus1 - kStartBand) -
sum_log_i * sum_log_i;
float num =
sum_log_i_square * sum_log_magn - sum_log_i * sum_log_i_log_magn;
RTC_DCHECK_NE(denom, 0.f);
float pink_noise_adjustment = num / denom;
// Constrain the estimated spectrum to be positive.
pink_noise_adjustment = std::max(pink_noise_adjustment, 0.f);
pink_noise_numerator_ += pink_noise_adjustment;
num = sum_log_i * sum_log_magn -
(kFftSizeBy2Plus1 - kStartBand) * sum_log_i_log_magn;
RTC_DCHECK_NE(denom, 0.f);
pink_noise_adjustment = num / denom;
// Constrain the pink noise power to be in the interval [0, 1].
pink_noise_adjustment = std::max(std::min(pink_noise_adjustment, 1.f), 0.f);
pink_noise_exp_ += pink_noise_adjustment;
const float one_by_num_analyzed_frames_plus_1 =
1.f / (num_analyzed_frames + 1.f);
// Calculate the frequency-independent parts of parametric noise estimate.
float parametric_exp = 0.f;
float parametric_num = 0.f;
if (pink_noise_exp_ > 0.f) {
// Use pink noise estimate.
parametric_num = ExpApproximation(pink_noise_numerator_ *
one_by_num_analyzed_frames_plus_1);
parametric_num *= num_analyzed_frames + 1.f;
parametric_exp = pink_noise_exp_ * one_by_num_analyzed_frames_plus_1;
}
constexpr float kOneByShortStartupPhaseBlocks =
1.f / kShortStartupPhaseBlocks;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
// Estimate the background noise using the white and pink noise
// parameters.
if (pink_noise_exp_ == 0.f) {
// Use white noise estimate.
parametric_noise_spectrum_[i] = white_noise_level_;
} else {
// Use pink noise estimate.
float use_band = i < kStartBand ? kStartBand : i;
float denom = PowApproximation(use_band, parametric_exp);
RTC_DCHECK_NE(denom, 0.f);
parametric_noise_spectrum_[i] = parametric_num / denom;
}
}
// Weight quantile noise with modeled noise.
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
noise_spectrum_[i] *= num_analyzed_frames;
float tmp = parametric_noise_spectrum_[i] *
(kShortStartupPhaseBlocks - num_analyzed_frames);
noise_spectrum_[i] += tmp * one_by_num_analyzed_frames_plus_1;
noise_spectrum_[i] *= kOneByShortStartupPhaseBlocks;
}
}
}
void NoiseEstimator::PostUpdate(
rtc::ArrayView<const float> speech_probability,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum) {
// Time-avg parameter for noise_spectrum update.
constexpr float kNoiseUpdate = 0.9f;
float gamma = kNoiseUpdate;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
const float prob_speech = speech_probability[i];
const float prob_non_speech = 1.f - prob_speech;
// Temporary noise update used for speech frames if update value is less
// than previous.
float noise_update_tmp =
gamma * prev_noise_spectrum_[i] +
(1.f - gamma) * (prob_non_speech * signal_spectrum[i] +
prob_speech * prev_noise_spectrum_[i]);
// Time-constant based on speech/noise_spectrum state.
float gamma_old = gamma;
// Increase gamma for frame likely to be seech.
constexpr float kProbRange = .2f;
gamma = prob_speech > kProbRange ? .99f : kNoiseUpdate;
// Conservative noise_spectrum update.
if (prob_speech < kProbRange) {
conservative_noise_spectrum_[i] +=
0.05f * (signal_spectrum[i] - conservative_noise_spectrum_[i]);
}
// Noise_spectrum update.
if (gamma == gamma_old) {
noise_spectrum_[i] = noise_update_tmp;
} else {
noise_spectrum_[i] =
gamma * prev_noise_spectrum_[i] +
(1.f - gamma) * (prob_non_speech * signal_spectrum[i] +
prob_speech * prev_noise_spectrum_[i]);
// Allow for noise_spectrum update downwards: If noise_spectrum update
// decreases the noise_spectrum, it is safe, so allow it to happen.
noise_spectrum_[i] = std::min(noise_spectrum_[i], noise_update_tmp);
}
}
}
} // namespace webrtc

View file

@ -0,0 +1,77 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_NOISE_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_NS_NOISE_ESTIMATOR_H_
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/quantile_noise_estimator.h"
#include "modules/audio_processing/ns/suppression_params.h"
namespace webrtc {
// Class for estimating the spectral characteristics of the noise in an incoming
// signal.
class NoiseEstimator {
public:
explicit NoiseEstimator(const SuppressionParams& suppression_params);
// Prepare the estimator for analysis of a new frame.
void PrepareAnalysis();
// Performs the first step of the estimator update.
void PreUpdate(int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum);
// Performs the second step of the estimator update.
void PostUpdate(
rtc::ArrayView<const float> speech_probability,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum);
// Returns the noise spectral estimate.
rtc::ArrayView<const float, kFftSizeBy2Plus1> get_noise_spectrum() const {
return noise_spectrum_;
}
// Returns the noise from the previous frame.
rtc::ArrayView<const float, kFftSizeBy2Plus1> get_prev_noise_spectrum()
const {
return prev_noise_spectrum_;
}
// Returns a noise spectral estimate based on white and pink noise parameters.
rtc::ArrayView<const float, kFftSizeBy2Plus1> get_parametric_noise_spectrum()
const {
return parametric_noise_spectrum_;
}
rtc::ArrayView<const float, kFftSizeBy2Plus1>
get_conservative_noise_spectrum() const {
return conservative_noise_spectrum_;
}
private:
const SuppressionParams& suppression_params_;
float white_noise_level_ = 0.f;
float pink_noise_numerator_ = 0.f;
float pink_noise_exp_ = 0.f;
std::array<float, kFftSizeBy2Plus1> prev_noise_spectrum_;
std::array<float, kFftSizeBy2Plus1> conservative_noise_spectrum_;
std::array<float, kFftSizeBy2Plus1> parametric_noise_spectrum_;
std::array<float, kFftSizeBy2Plus1> noise_spectrum_;
QuantileNoiseEstimator quantile_noise_estimator_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_NOISE_ESTIMATOR_H_

View file

@ -0,0 +1,549 @@
/*
* Copyright (c) 2012 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 <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
#include "rtc_base/checks.h"
namespace webrtc {
namespace {
// Maps sample rate to number of bands.
size_t NumBandsForRate(size_t sample_rate_hz) {
RTC_DCHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000 ||
sample_rate_hz == 48000);
return sample_rate_hz / 16000;
}
// Maximum number of channels for which the channel data is stored on
// the stack. If the number of channels are larger than this, they are stored
// using scratch memory that is pre-allocated on the heap. The reason for this
// partitioning is not to waste heap space for handling the more common numbers
// of channels, while at the same time not limiting the support for higher
// numbers of channels by enforcing the channel data to be stored on the
// stack using a fixed maximum value.
constexpr size_t kMaxNumChannelsOnStack = 2;
// Chooses the number of channels to store on the heap when that is required due
// to the number of channels being larger than the pre-defined number
// of channels to store on the stack.
size_t NumChannelsOnHeap(size_t num_channels) {
return num_channels > kMaxNumChannelsOnStack ? num_channels : 0;
}
// Hybrib Hanning and flat window for the filterbank.
constexpr std::array<float, 96> kBlocks160w256FirstHalf = {
0.00000000f, 0.01636173f, 0.03271908f, 0.04906767f, 0.06540313f,
0.08172107f, 0.09801714f, 0.11428696f, 0.13052619f, 0.14673047f,
0.16289547f, 0.17901686f, 0.19509032f, 0.21111155f, 0.22707626f,
0.24298018f, 0.25881905f, 0.27458862f, 0.29028468f, 0.30590302f,
0.32143947f, 0.33688985f, 0.35225005f, 0.36751594f, 0.38268343f,
0.39774847f, 0.41270703f, 0.42755509f, 0.44228869f, 0.45690388f,
0.47139674f, 0.48576339f, 0.50000000f, 0.51410274f, 0.52806785f,
0.54189158f, 0.55557023f, 0.56910015f, 0.58247770f, 0.59569930f,
0.60876143f, 0.62166057f, 0.63439328f, 0.64695615f, 0.65934582f,
0.67155895f, 0.68359230f, 0.69544264f, 0.70710678f, 0.71858162f,
0.72986407f, 0.74095113f, 0.75183981f, 0.76252720f, 0.77301045f,
0.78328675f, 0.79335334f, 0.80320753f, 0.81284668f, 0.82226822f,
0.83146961f, 0.84044840f, 0.84920218f, 0.85772861f, 0.86602540f,
0.87409034f, 0.88192126f, 0.88951608f, 0.89687274f, 0.90398929f,
0.91086382f, 0.91749450f, 0.92387953f, 0.93001722f, 0.93590593f,
0.94154407f, 0.94693013f, 0.95206268f, 0.95694034f, 0.96156180f,
0.96592583f, 0.97003125f, 0.97387698f, 0.97746197f, 0.98078528f,
0.98384601f, 0.98664333f, 0.98917651f, 0.99144486f, 0.99344778f,
0.99518473f, 0.99665524f, 0.99785892f, 0.99879546f, 0.99946459f,
0.99986614f};
// Applies the filterbank window to a buffer.
void ApplyFilterBankWindow(rtc::ArrayView<float, kFftSize> x) {
for (size_t i = 0; i < 96; ++i) {
x[i] = kBlocks160w256FirstHalf[i] * x[i];
}
for (size_t i = 161, k = 95; i < kFftSize; ++i, --k) {
RTC_DCHECK_NE(0, k);
x[i] = kBlocks160w256FirstHalf[k] * x[i];
}
}
// Extends a frame with previous data.
void FormExtendedFrame(rtc::ArrayView<const float, kNsFrameSize> frame,
rtc::ArrayView<float, kFftSize - kNsFrameSize> old_data,
rtc::ArrayView<float, kFftSize> extended_frame) {
std::copy(old_data.begin(), old_data.end(), extended_frame.begin());
std::copy(frame.begin(), frame.end(),
extended_frame.begin() + old_data.size());
std::copy(extended_frame.end() - old_data.size(), extended_frame.end(),
old_data.begin());
}
// Uses overlap-and-add to produce an output frame.
void OverlapAndAdd(rtc::ArrayView<const float, kFftSize> extended_frame,
rtc::ArrayView<float, kOverlapSize> overlap_memory,
rtc::ArrayView<float, kNsFrameSize> output_frame) {
for (size_t i = 0; i < kOverlapSize; ++i) {
output_frame[i] = overlap_memory[i] + extended_frame[i];
}
std::copy(extended_frame.begin() + kOverlapSize,
extended_frame.begin() + kNsFrameSize,
output_frame.begin() + kOverlapSize);
std::copy(extended_frame.begin() + kNsFrameSize, extended_frame.end(),
overlap_memory.begin());
}
// Produces a delayed frame.
void DelaySignal(rtc::ArrayView<const float, kNsFrameSize> frame,
rtc::ArrayView<float, kFftSize - kNsFrameSize> delay_buffer,
rtc::ArrayView<float, kNsFrameSize> delayed_frame) {
constexpr size_t kSamplesFromFrame = kNsFrameSize - (kFftSize - kNsFrameSize);
std::copy(delay_buffer.begin(), delay_buffer.end(), delayed_frame.begin());
std::copy(frame.begin(), frame.begin() + kSamplesFromFrame,
delayed_frame.begin() + delay_buffer.size());
std::copy(frame.begin() + kSamplesFromFrame, frame.end(),
delay_buffer.begin());
}
// Computes the energy of an extended frame.
float ComputeEnergyOfExtendedFrame(rtc::ArrayView<const float, kFftSize> x) {
float energy = 0.f;
for (float x_k : x) {
energy += x_k * x_k;
}
return energy;
}
// Computes the energy of an extended frame based on its subcomponents.
float ComputeEnergyOfExtendedFrame(
rtc::ArrayView<const float, kNsFrameSize> frame,
rtc::ArrayView<float, kFftSize - kNsFrameSize> old_data) {
float energy = 0.f;
for (float v : old_data) {
energy += v * v;
}
for (float v : frame) {
energy += v * v;
}
return energy;
}
// Computes the magnitude spectrum based on an FFT output.
void ComputeMagnitudeSpectrum(
rtc::ArrayView<const float, kFftSize> real,
rtc::ArrayView<const float, kFftSize> imag,
rtc::ArrayView<float, kFftSizeBy2Plus1> signal_spectrum) {
signal_spectrum[0] = fabsf(real[0]) + 1.f;
signal_spectrum[kFftSizeBy2Plus1 - 1] =
fabsf(real[kFftSizeBy2Plus1 - 1]) + 1.f;
for (size_t i = 1; i < kFftSizeBy2Plus1 - 1; ++i) {
signal_spectrum[i] =
SqrtFastApproximation(real[i] * real[i] + imag[i] * imag[i]) + 1.f;
}
}
// Compute prior and post SNR.
void ComputeSnr(rtc::ArrayView<const float, kFftSizeBy2Plus1> filter,
rtc::ArrayView<const float> prev_signal_spectrum,
rtc::ArrayView<const float> signal_spectrum,
rtc::ArrayView<const float> prev_noise_spectrum,
rtc::ArrayView<const float> noise_spectrum,
rtc::ArrayView<float> prior_snr,
rtc::ArrayView<float> post_snr) {
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
// Previous post SNR.
// Previous estimate: based on previous frame with gain filter.
float prev_estimate = prev_signal_spectrum[i] /
(prev_noise_spectrum[i] + 0.0001f) * filter[i];
// Post SNR.
if (signal_spectrum[i] > noise_spectrum[i]) {
post_snr[i] = signal_spectrum[i] / (noise_spectrum[i] + 0.0001f) - 1.f;
} else {
post_snr[i] = 0.f;
}
// The directed decision estimate of the prior SNR is a sum the current and
// previous estimates.
prior_snr[i] = 0.98f * prev_estimate + (1.f - 0.98f) * post_snr[i];
}
}
// Computes the attenuating gain for the noise suppression of the upper bands.
float ComputeUpperBandsGain(
float minimum_attenuating_gain,
rtc::ArrayView<const float, kFftSizeBy2Plus1> filter,
rtc::ArrayView<const float> speech_probability,
rtc::ArrayView<const float, kFftSizeBy2Plus1> prev_analysis_signal_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum) {
// Average speech prob and filter gain for the end of the lowest band.
constexpr int kNumAvgBins = 32;
constexpr float kOneByNumAvgBins = 1.f / kNumAvgBins;
float avg_prob_speech = 0.f;
float avg_filter_gain = 0.f;
for (size_t i = kFftSizeBy2Plus1 - kNumAvgBins - 1; i < kFftSizeBy2Plus1 - 1;
i++) {
avg_prob_speech += speech_probability[i];
avg_filter_gain += filter[i];
}
avg_prob_speech = avg_prob_speech * kOneByNumAvgBins;
avg_filter_gain = avg_filter_gain * kOneByNumAvgBins;
// If the speech was suppressed by a component between Analyze and Process, an
// example being by an AEC, it should not be considered speech for the purpose
// of high band suppression. To that end, the speech probability is scaled
// accordingly.
float sum_analysis_spectrum = 0.f;
float sum_processing_spectrum = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
sum_analysis_spectrum += prev_analysis_signal_spectrum[i];
sum_processing_spectrum += signal_spectrum[i];
}
// The magnitude spectrum computation enforces the spectrum to be strictly
// positive.
RTC_DCHECK_GT(sum_analysis_spectrum, 0.f);
avg_prob_speech *= sum_processing_spectrum / sum_analysis_spectrum;
// Compute gain based on speech probability.
float gain =
0.5f * (1.f + static_cast<float>(tanh(2.f * avg_prob_speech - 1.f)));
// Combine gain with low band gain.
if (avg_prob_speech >= 0.5f) {
gain = 0.25f * gain + 0.75f * avg_filter_gain;
} else {
gain = 0.5f * gain + 0.5f * avg_filter_gain;
}
// Make sure gain is within flooring range.
return std::min(std::max(gain, minimum_attenuating_gain), 1.f);
}
} // namespace
NoiseSuppressor::ChannelState::ChannelState(
const SuppressionParams& suppression_params,
size_t num_bands)
: wiener_filter(suppression_params),
noise_estimator(suppression_params),
process_delay_memory(num_bands > 1 ? num_bands - 1 : 0) {
analyze_analysis_memory.fill(0.f);
prev_analysis_signal_spectrum.fill(1.f);
process_analysis_memory.fill(0.f);
process_synthesis_memory.fill(0.f);
for (auto& d : process_delay_memory) {
d.fill(0.f);
}
}
NoiseSuppressor::NoiseSuppressor(const NsConfig& config,
size_t sample_rate_hz,
size_t num_channels)
: num_bands_(NumBandsForRate(sample_rate_hz)),
num_channels_(num_channels),
suppression_params_(config.target_level),
filter_bank_states_heap_(NumChannelsOnHeap(num_channels_)),
upper_band_gains_heap_(NumChannelsOnHeap(num_channels_)),
energies_before_filtering_heap_(NumChannelsOnHeap(num_channels_)),
gain_adjustments_heap_(NumChannelsOnHeap(num_channels_)),
channels_(num_channels_) {
for (size_t ch = 0; ch < num_channels_; ++ch) {
channels_[ch] =
std::make_unique<ChannelState>(suppression_params_, num_bands_);
}
}
void NoiseSuppressor::AggregateWienerFilters(
rtc::ArrayView<float, kFftSizeBy2Plus1> filter) const {
rtc::ArrayView<const float, kFftSizeBy2Plus1> filter0 =
channels_[0]->wiener_filter.get_filter();
std::copy(filter0.begin(), filter0.end(), filter.begin());
for (size_t ch = 1; ch < num_channels_; ++ch) {
rtc::ArrayView<const float, kFftSizeBy2Plus1> filter_ch =
channels_[ch]->wiener_filter.get_filter();
for (size_t k = 0; k < kFftSizeBy2Plus1; ++k) {
filter[k] = std::min(filter[k], filter_ch[k]);
}
}
}
void NoiseSuppressor::Analyze(const AudioBuffer& audio) {
// Prepare the noise estimator for the analysis stage.
for (size_t ch = 0; ch < num_channels_; ++ch) {
channels_[ch]->noise_estimator.PrepareAnalysis();
}
// Check for zero frames.
bool zero_frame = true;
for (size_t ch = 0; ch < num_channels_; ++ch) {
rtc::ArrayView<const float, kNsFrameSize> y_band0(
&audio.split_bands_const(ch)[0][0], kNsFrameSize);
float energy = ComputeEnergyOfExtendedFrame(
y_band0, channels_[ch]->analyze_analysis_memory);
if (energy > 0.f) {
zero_frame = false;
break;
}
}
if (zero_frame) {
// We want to avoid updating statistics in this case:
// Updating feature statistics when we have zeros only will cause
// thresholds to move towards zero signal situations. This in turn has the
// effect that once the signal is "turned on" (non-zero values) everything
// will be treated as speech and there is no noise suppression effect.
// Depending on the duration of the inactive signal it takes a
// considerable amount of time for the system to learn what is noise and
// what is speech.
return;
}
// Only update analysis counter for frames that are properly analyzed.
if (++num_analyzed_frames_ < 0) {
num_analyzed_frames_ = 0;
}
// Analyze all channels.
for (size_t ch = 0; ch < num_channels_; ++ch) {
std::unique_ptr<ChannelState>& ch_p = channels_[ch];
rtc::ArrayView<const float, kNsFrameSize> y_band0(
&audio.split_bands_const(ch)[0][0], kNsFrameSize);
// Form an extended frame and apply analysis filter bank windowing.
std::array<float, kFftSize> extended_frame;
FormExtendedFrame(y_band0, ch_p->analyze_analysis_memory, extended_frame);
ApplyFilterBankWindow(extended_frame);
// Compute the magnitude spectrum.
std::array<float, kFftSize> real;
std::array<float, kFftSize> imag;
fft_.Fft(extended_frame, real, imag);
std::array<float, kFftSizeBy2Plus1> signal_spectrum;
ComputeMagnitudeSpectrum(real, imag, signal_spectrum);
// Compute energies.
float signal_energy = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
signal_energy += real[i] * real[i] + imag[i] * imag[i];
}
signal_energy /= kFftSizeBy2Plus1;
float signal_spectral_sum = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
signal_spectral_sum += signal_spectrum[i];
}
// Estimate the noise spectra and the probability estimates of speech
// presence.
ch_p->noise_estimator.PreUpdate(num_analyzed_frames_, signal_spectrum,
signal_spectral_sum);
std::array<float, kFftSizeBy2Plus1> post_snr;
std::array<float, kFftSizeBy2Plus1> prior_snr;
ComputeSnr(ch_p->wiener_filter.get_filter(),
ch_p->prev_analysis_signal_spectrum, signal_spectrum,
ch_p->noise_estimator.get_prev_noise_spectrum(),
ch_p->noise_estimator.get_noise_spectrum(), prior_snr, post_snr);
ch_p->speech_probability_estimator.Update(
num_analyzed_frames_, prior_snr, post_snr,
ch_p->noise_estimator.get_conservative_noise_spectrum(),
signal_spectrum, signal_spectral_sum, signal_energy);
ch_p->noise_estimator.PostUpdate(
ch_p->speech_probability_estimator.get_probability(), signal_spectrum);
// Store the magnitude spectrum to make it avalilable for the process
// method.
std::copy(signal_spectrum.begin(), signal_spectrum.end(),
ch_p->prev_analysis_signal_spectrum.begin());
}
}
void NoiseSuppressor::Process(AudioBuffer* audio) {
// Select the space for storing data during the processing.
std::array<FilterBankState, kMaxNumChannelsOnStack> filter_bank_states_stack;
rtc::ArrayView<FilterBankState> filter_bank_states(
filter_bank_states_stack.data(), num_channels_);
std::array<float, kMaxNumChannelsOnStack> upper_band_gains_stack;
rtc::ArrayView<float> upper_band_gains(upper_band_gains_stack.data(),
num_channels_);
std::array<float, kMaxNumChannelsOnStack> energies_before_filtering_stack;
rtc::ArrayView<float> energies_before_filtering(
energies_before_filtering_stack.data(), num_channels_);
std::array<float, kMaxNumChannelsOnStack> gain_adjustments_stack;
rtc::ArrayView<float> gain_adjustments(gain_adjustments_stack.data(),
num_channels_);
if (NumChannelsOnHeap(num_channels_) > 0) {
// If the stack-allocated space is too small, use the heap for storing the
// data.
filter_bank_states = rtc::ArrayView<FilterBankState>(
filter_bank_states_heap_.data(), num_channels_);
upper_band_gains =
rtc::ArrayView<float>(upper_band_gains_heap_.data(), num_channels_);
energies_before_filtering = rtc::ArrayView<float>(
energies_before_filtering_heap_.data(), num_channels_);
gain_adjustments =
rtc::ArrayView<float>(gain_adjustments_heap_.data(), num_channels_);
}
// Compute the suppression filters for all channels.
for (size_t ch = 0; ch < num_channels_; ++ch) {
// Form an extended frame and apply analysis filter bank windowing.
rtc::ArrayView<float, kNsFrameSize> y_band0(&audio->split_bands(ch)[0][0],
kNsFrameSize);
FormExtendedFrame(y_band0, channels_[ch]->process_analysis_memory,
filter_bank_states[ch].extended_frame);
ApplyFilterBankWindow(filter_bank_states[ch].extended_frame);
energies_before_filtering[ch] =
ComputeEnergyOfExtendedFrame(filter_bank_states[ch].extended_frame);
// Perform filter bank analysis and compute the magnitude spectrum.
fft_.Fft(filter_bank_states[ch].extended_frame, filter_bank_states[ch].real,
filter_bank_states[ch].imag);
std::array<float, kFftSizeBy2Plus1> signal_spectrum;
ComputeMagnitudeSpectrum(filter_bank_states[ch].real,
filter_bank_states[ch].imag, signal_spectrum);
// Compute the frequency domain gain filter for noise attenuation.
channels_[ch]->wiener_filter.Update(
num_analyzed_frames_,
channels_[ch]->noise_estimator.get_noise_spectrum(),
channels_[ch]->noise_estimator.get_prev_noise_spectrum(),
channels_[ch]->noise_estimator.get_parametric_noise_spectrum(),
signal_spectrum);
if (num_bands_ > 1) {
// Compute the time-domain gain for attenuating the noise in the upper
// bands.
upper_band_gains[ch] = ComputeUpperBandsGain(
suppression_params_.minimum_attenuating_gain,
channels_[ch]->wiener_filter.get_filter(),
channels_[ch]->speech_probability_estimator.get_probability(),
channels_[ch]->prev_analysis_signal_spectrum, signal_spectrum);
}
}
// Aggregate the Wiener filters for all channels.
std::array<float, kFftSizeBy2Plus1> filter_data;
rtc::ArrayView<const float, kFftSizeBy2Plus1> filter = filter_data;
if (num_channels_ == 1) {
filter = channels_[0]->wiener_filter.get_filter();
} else {
AggregateWienerFilters(filter_data);
}
for (size_t ch = 0; ch < num_channels_; ++ch) {
// Apply the filter to the lower band.
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
filter_bank_states[ch].real[i] *= filter[i];
filter_bank_states[ch].imag[i] *= filter[i];
}
}
// Perform filter bank synthesis
for (size_t ch = 0; ch < num_channels_; ++ch) {
fft_.Ifft(filter_bank_states[ch].real, filter_bank_states[ch].imag,
filter_bank_states[ch].extended_frame);
}
for (size_t ch = 0; ch < num_channels_; ++ch) {
const float energy_after_filtering =
ComputeEnergyOfExtendedFrame(filter_bank_states[ch].extended_frame);
// Apply synthesis window.
ApplyFilterBankWindow(filter_bank_states[ch].extended_frame);
// Compute the adjustment of the noise attenuation filter based on the
// effect of the attenuation.
gain_adjustments[ch] =
channels_[ch]->wiener_filter.ComputeOverallScalingFactor(
num_analyzed_frames_,
channels_[ch]->speech_probability_estimator.get_prior_probability(),
energies_before_filtering[ch], energy_after_filtering);
}
// Select and apply adjustment of the noise attenuation filter based on the
// effect of the attenuation.
float gain_adjustment = gain_adjustments[0];
for (size_t ch = 1; ch < num_channels_; ++ch) {
gain_adjustment = std::min(gain_adjustment, gain_adjustments[ch]);
}
for (size_t ch = 0; ch < num_channels_; ++ch) {
for (size_t i = 0; i < kFftSize; ++i) {
filter_bank_states[ch].extended_frame[i] =
gain_adjustment * filter_bank_states[ch].extended_frame[i];
}
}
// Use overlap-and-add to form the output frame of the lowest band.
for (size_t ch = 0; ch < num_channels_; ++ch) {
rtc::ArrayView<float, kNsFrameSize> y_band0(&audio->split_bands(ch)[0][0],
kNsFrameSize);
OverlapAndAdd(filter_bank_states[ch].extended_frame,
channels_[ch]->process_synthesis_memory, y_band0);
}
if (num_bands_ > 1) {
// Select the noise attenuating gain to apply to the upper band.
float upper_band_gain = upper_band_gains[0];
for (size_t ch = 1; ch < num_channels_; ++ch) {
upper_band_gain = std::min(upper_band_gain, upper_band_gains[ch]);
}
// Process the upper bands.
for (size_t ch = 0; ch < num_channels_; ++ch) {
for (size_t b = 1; b < num_bands_; ++b) {
// Delay the upper bands to match the delay of the filterbank applied to
// the lowest band.
rtc::ArrayView<float, kNsFrameSize> y_band(
&audio->split_bands(ch)[b][0], kNsFrameSize);
std::array<float, kNsFrameSize> delayed_frame;
DelaySignal(y_band, channels_[ch]->process_delay_memory[b - 1],
delayed_frame);
// Apply the time-domain noise-attenuating gain.
for (size_t j = 0; j < kNsFrameSize; j++) {
y_band[j] = upper_band_gain * delayed_frame[j];
}
}
}
}
// Limit the output the allowed range.
for (size_t ch = 0; ch < num_channels_; ++ch) {
for (size_t b = 0; b < num_bands_; ++b) {
rtc::ArrayView<float, kNsFrameSize> y_band(&audio->split_bands(ch)[b][0],
kNsFrameSize);
for (size_t j = 0; j < kNsFrameSize; j++) {
y_band[j] = std::min(std::max(y_band[j], -32768.f), 32767.f);
}
}
}
}
} // namespace webrtc

View file

@ -0,0 +1,83 @@
/*
* Copyright (c) 2012 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_
#define MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_
#include <memory>
#include <vector>
#include "api/array_view.h"
#include "modules/audio_processing/audio_buffer.h"
#include "modules/audio_processing/ns/noise_estimator.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/ns_config.h"
#include "modules/audio_processing/ns/ns_fft.h"
#include "modules/audio_processing/ns/speech_probability_estimator.h"
#include "modules/audio_processing/ns/wiener_filter.h"
namespace webrtc {
// Class for suppressing noise in a signal.
class NoiseSuppressor {
public:
NoiseSuppressor(const NsConfig& config,
size_t sample_rate_hz,
size_t num_channels);
NoiseSuppressor(const NoiseSuppressor&) = delete;
NoiseSuppressor& operator=(const NoiseSuppressor&) = delete;
// Analyses the signal (typically applied before the AEC to avoid analyzing
// any comfort noise signal).
void Analyze(const AudioBuffer& audio);
// Applies noise suppression.
void Process(AudioBuffer* audio);
private:
const size_t num_bands_;
const size_t num_channels_;
const SuppressionParams suppression_params_;
int32_t num_analyzed_frames_ = -1;
NrFft fft_;
struct ChannelState {
ChannelState(const SuppressionParams& suppression_params, size_t num_bands);
SpeechProbabilityEstimator speech_probability_estimator;
WienerFilter wiener_filter;
NoiseEstimator noise_estimator;
std::array<float, kFftSizeBy2Plus1> prev_analysis_signal_spectrum;
std::array<float, kFftSize - kNsFrameSize> analyze_analysis_memory;
std::array<float, kOverlapSize> process_analysis_memory;
std::array<float, kOverlapSize> process_synthesis_memory;
std::vector<std::array<float, kOverlapSize>> process_delay_memory;
};
struct FilterBankState {
std::array<float, kFftSize> real;
std::array<float, kFftSize> imag;
std::array<float, kFftSize> extended_frame;
};
std::vector<FilterBankState> filter_bank_states_heap_;
std::vector<float> upper_band_gains_heap_;
std::vector<float> energies_before_filtering_heap_;
std::vector<float> gain_adjustments_heap_;
std::vector<std::unique_ptr<ChannelState>> channels_;
// Aggregates the Wiener filters into a single filter to use.
void AggregateWienerFilters(
rtc::ArrayView<float, kFftSizeBy2Plus1> filter) const;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSOR_H_

View file

@ -0,0 +1,102 @@
/*
* 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 <deque>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#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<int>(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<int>(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

View file

@ -0,0 +1,34 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_NS_COMMON_H_
#define MODULES_AUDIO_PROCESSING_NS_NS_COMMON_H_
#include <cstddef>
namespace webrtc {
constexpr size_t kFftSize = 256;
constexpr size_t kFftSizeBy2Plus1 = kFftSize / 2 + 1;
constexpr size_t kNsFrameSize = 160;
constexpr size_t kOverlapSize = kFftSize - kNsFrameSize;
constexpr int kShortStartupPhaseBlocks = 50;
constexpr int kLongStartupPhaseBlocks = 200;
constexpr int kFeatureUpdateWindowSize = 500;
constexpr float kLtrFeatureThr = 0.5f;
constexpr float kBinSizeLrt = 0.1f;
constexpr float kBinSizeSpecFlat = 0.05f;
constexpr float kBinSizeSpecDiff = 0.1f;
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_NS_COMMON_H_

View file

@ -0,0 +1,24 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_NS_CONFIG_H_
#define MODULES_AUDIO_PROCESSING_NS_NS_CONFIG_H_
namespace webrtc {
// Config struct for the noise suppressor
struct NsConfig {
enum class SuppressionLevel { k6dB, k12dB, k18dB, k21dB };
SuppressionLevel target_level = SuppressionLevel::k12dB;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_NS_CONFIG_H_

View file

@ -0,0 +1,64 @@
/*
* Copyright (c) 2019 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/ns_fft.h"
#include "common_audio/third_party/fft4g/fft4g.h"
namespace webrtc {
NrFft::NrFft() : bit_reversal_state_(kFftSize / 2), tables_(kFftSize / 2) {
// Initialize WebRtc_rdt (setting (bit_reversal_state_[0] to 0 triggers
// initialization)
bit_reversal_state_[0] = 0.f;
std::array<float, kFftSize> tmp_buffer;
tmp_buffer.fill(0.f);
WebRtc_rdft(kFftSize, 1, tmp_buffer.data(), bit_reversal_state_.data(),
tables_.data());
}
void NrFft::Fft(rtc::ArrayView<float, kFftSize> time_data,
rtc::ArrayView<float, kFftSize> real,
rtc::ArrayView<float, kFftSize> imag) {
WebRtc_rdft(kFftSize, 1, time_data.data(), bit_reversal_state_.data(),
tables_.data());
imag[0] = 0;
real[0] = time_data[0];
imag[kFftSizeBy2Plus1 - 1] = 0;
real[kFftSizeBy2Plus1 - 1] = time_data[1];
for (size_t i = 1; i < kFftSizeBy2Plus1 - 1; ++i) {
real[i] = time_data[2 * i];
imag[i] = time_data[2 * i + 1];
}
}
void NrFft::Ifft(rtc::ArrayView<const float> real,
rtc::ArrayView<const float> imag,
rtc::ArrayView<float> time_data) {
time_data[0] = real[0];
time_data[1] = real[kFftSizeBy2Plus1 - 1];
for (size_t i = 1; i < kFftSizeBy2Plus1 - 1; ++i) {
time_data[2 * i] = real[i];
time_data[2 * i + 1] = imag[i];
}
WebRtc_rdft(kFftSize, -1, time_data.data(), bit_reversal_state_.data(),
tables_.data());
// Scale the output
constexpr float kScaling = 2.f / kFftSize;
for (float& d : time_data) {
d *= kScaling;
}
}
} // namespace webrtc

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_NS_FFT_H_
#define MODULES_AUDIO_PROCESSING_NS_NS_FFT_H_
#include <vector>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
namespace webrtc {
// Wrapper class providing 256 point FFT functionality.
class NrFft {
public:
NrFft();
NrFft(const NrFft&) = delete;
NrFft& operator=(const NrFft&) = delete;
// Transforms the signal from time to frequency domain.
void Fft(rtc::ArrayView<float, kFftSize> time_data,
rtc::ArrayView<float, kFftSize> real,
rtc::ArrayView<float, kFftSize> imag);
// Transforms the signal from frequency to time domain.
void Ifft(rtc::ArrayView<const float> real,
rtc::ArrayView<const float> imag,
rtc::ArrayView<float> time_data);
private:
std::vector<size_t> bit_reversal_state_;
std::vector<float> tables_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_NS_FFT_H_

View file

@ -0,0 +1,18 @@
/*
* Copyright (c) 2019 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/prior_signal_model.h"
namespace webrtc {
PriorSignalModel::PriorSignalModel(float lrt_initial_value)
: lrt(lrt_initial_value) {}
} // namespace webrtc

View file

@ -0,0 +1,32 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_H_
#define MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_H_
namespace webrtc {
// Struct for storing the prior signal model parameters.
struct PriorSignalModel {
explicit PriorSignalModel(float lrt_initial_value);
PriorSignalModel(const PriorSignalModel&) = delete;
PriorSignalModel& operator=(const PriorSignalModel&) = delete;
float lrt;
float flatness_threshold = .5f;
float template_diff_threshold = .5f;
float lrt_weighting = 1.f;
float flatness_weighting = 0.f;
float difference_weighting = 0.f;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_H_

View file

@ -0,0 +1,170 @@
/*
* Copyright (c) 2019 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/prior_signal_model_estimator.h"
#include <math.h>
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
#include "rtc_base/checks.h"
namespace webrtc {
namespace {
// Identifies the first of the two largest peaks in the histogram.
void FindFirstOfTwoLargestPeaks(
float bin_size,
rtc::ArrayView<const int, kHistogramSize> spectral_flatness,
float* peak_position,
int* peak_weight) {
RTC_DCHECK(peak_position);
RTC_DCHECK(peak_weight);
int peak_value = 0;
int secondary_peak_value = 0;
*peak_position = 0.f;
float secondary_peak_position = 0.f;
*peak_weight = 0;
int secondary_peak_weight = 0;
// Identify the two largest peaks.
for (int i = 0; i < kHistogramSize; ++i) {
const float bin_mid = (i + 0.5f) * bin_size;
if (spectral_flatness[i] > peak_value) {
// Found new "first" peak candidate.
secondary_peak_value = peak_value;
secondary_peak_weight = *peak_weight;
secondary_peak_position = *peak_position;
peak_value = spectral_flatness[i];
*peak_weight = spectral_flatness[i];
*peak_position = bin_mid;
} else if (spectral_flatness[i] > secondary_peak_value) {
// Found new "second" peak candidate.
secondary_peak_value = spectral_flatness[i];
secondary_peak_weight = spectral_flatness[i];
secondary_peak_position = bin_mid;
}
}
// Merge the peaks if they are close.
if ((fabs(secondary_peak_position - *peak_position) < 2 * bin_size) &&
(secondary_peak_weight > 0.5f * (*peak_weight))) {
*peak_weight += secondary_peak_weight;
*peak_position = 0.5f * (*peak_position + secondary_peak_position);
}
}
void UpdateLrt(rtc::ArrayView<const int, kHistogramSize> lrt_histogram,
float* prior_model_lrt,
bool* low_lrt_fluctuations) {
RTC_DCHECK(prior_model_lrt);
RTC_DCHECK(low_lrt_fluctuations);
float average = 0.f;
float average_compl = 0.f;
float average_squared = 0.f;
int count = 0;
for (int i = 0; i < 10; ++i) {
float bin_mid = (i + 0.5f) * kBinSizeLrt;
average += lrt_histogram[i] * bin_mid;
count += lrt_histogram[i];
}
if (count > 0) {
average = average / count;
}
for (int i = 0; i < kHistogramSize; ++i) {
float bin_mid = (i + 0.5f) * kBinSizeLrt;
average_squared += lrt_histogram[i] * bin_mid * bin_mid;
average_compl += lrt_histogram[i] * bin_mid;
}
constexpr float kOneFeatureUpdateWindowSize = 1.f / kFeatureUpdateWindowSize;
average_squared = average_squared * kOneFeatureUpdateWindowSize;
average_compl = average_compl * kOneFeatureUpdateWindowSize;
// Fluctuation limit of LRT feature.
*low_lrt_fluctuations = average_squared - average * average_compl < 0.05f;
// Get threshold for LRT feature.
constexpr float kMaxLrt = 1.f;
constexpr float kMinLrt = .2f;
if (*low_lrt_fluctuations) {
// Very low fluctuation, so likely noise.
*prior_model_lrt = kMaxLrt;
} else {
*prior_model_lrt = std::min(kMaxLrt, std::max(kMinLrt, 1.2f * average));
}
}
} // namespace
PriorSignalModelEstimator::PriorSignalModelEstimator(float lrt_initial_value)
: prior_model_(lrt_initial_value) {}
// Extract thresholds for feature parameters and computes the threshold/weights.
void PriorSignalModelEstimator::Update(const Histograms& histograms) {
bool low_lrt_fluctuations;
UpdateLrt(histograms.get_lrt(), &prior_model_.lrt, &low_lrt_fluctuations);
// For spectral flatness and spectral difference: compute the main peaks of
// the histograms.
float spectral_flatness_peak_position;
int spectral_flatness_peak_weight;
FindFirstOfTwoLargestPeaks(
kBinSizeSpecFlat, histograms.get_spectral_flatness(),
&spectral_flatness_peak_position, &spectral_flatness_peak_weight);
float spectral_diff_peak_position = 0.f;
int spectral_diff_peak_weight = 0;
FindFirstOfTwoLargestPeaks(kBinSizeSpecDiff, histograms.get_spectral_diff(),
&spectral_diff_peak_position,
&spectral_diff_peak_weight);
// Reject if weight of peaks is not large enough, or peak value too small.
// Peak limit for spectral flatness (varies between 0 and 1).
const int use_spec_flat = spectral_flatness_peak_weight < 0.3f * 500 ||
spectral_flatness_peak_position < 0.6f
? 0
: 1;
// Reject if weight of peaks is not large enough or if fluctuation of the LRT
// feature are very low, indicating a noise state.
const int use_spec_diff =
spectral_diff_peak_weight < 0.3f * 500 || low_lrt_fluctuations ? 0 : 1;
// Update the model.
prior_model_.template_diff_threshold = 1.2f * spectral_diff_peak_position;
prior_model_.template_diff_threshold =
std::min(1.f, std::max(0.16f, prior_model_.template_diff_threshold));
float one_by_feature_sum = 1.f / (1.f + use_spec_flat + use_spec_diff);
prior_model_.lrt_weighting = one_by_feature_sum;
if (use_spec_flat == 1) {
prior_model_.flatness_threshold = 0.9f * spectral_flatness_peak_position;
prior_model_.flatness_threshold =
std::min(.95f, std::max(0.1f, prior_model_.flatness_threshold));
prior_model_.flatness_weighting = one_by_feature_sum;
} else {
prior_model_.flatness_weighting = 0.f;
}
if (use_spec_diff == 1) {
prior_model_.difference_weighting = one_by_feature_sum;
} else {
prior_model_.difference_weighting = 0.f;
}
}
} // namespace webrtc

View file

@ -0,0 +1,39 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_ESTIMATOR_H_
#include "modules/audio_processing/ns/histograms.h"
#include "modules/audio_processing/ns/prior_signal_model.h"
namespace webrtc {
// Estimator of the prior signal model parameters.
class PriorSignalModelEstimator {
public:
explicit PriorSignalModelEstimator(float lrt_initial_value);
PriorSignalModelEstimator(const PriorSignalModelEstimator&) = delete;
PriorSignalModelEstimator& operator=(const PriorSignalModelEstimator&) =
delete;
// Updates the model estimate.
void Update(const Histograms& h);
// Returns the estimated model.
const PriorSignalModel& get_prior_model() const { return prior_model_; }
private:
PriorSignalModel prior_model_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_PRIOR_SIGNAL_MODEL_ESTIMATOR_H_

View file

@ -0,0 +1,88 @@
/*
* Copyright (c) 2019 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/quantile_noise_estimator.h"
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
namespace webrtc {
QuantileNoiseEstimator::QuantileNoiseEstimator() {
quantile_.fill(0.f);
density_.fill(0.3f);
log_quantile_.fill(8.f);
constexpr float kOneBySimult = 1.f / kSimult;
for (size_t i = 0; i < kSimult; ++i) {
counter_[i] = floor(kLongStartupPhaseBlocks * (i + 1.f) * kOneBySimult);
}
}
void QuantileNoiseEstimator::Estimate(
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
rtc::ArrayView<float, kFftSizeBy2Plus1> noise_spectrum) {
std::array<float, kFftSizeBy2Plus1> log_spectrum;
LogApproximation(signal_spectrum, log_spectrum);
int quantile_index_to_return = -1;
// Loop over simultaneous estimates.
for (int s = 0, k = 0; s < kSimult;
++s, k += static_cast<int>(kFftSizeBy2Plus1)) {
const float one_by_counter_plus_1 = 1.f / (counter_[s] + 1.f);
for (int i = 0, j = k; i < static_cast<int>(kFftSizeBy2Plus1); ++i, ++j) {
// Update log quantile estimate.
const float delta = density_[j] > 1.f ? 40.f / density_[j] : 40.f;
const float multiplier = delta * one_by_counter_plus_1;
if (log_spectrum[i] > log_quantile_[j]) {
log_quantile_[j] += 0.25f * multiplier;
} else {
log_quantile_[j] -= 0.75f * multiplier;
}
// Update density estimate.
constexpr float kWidth = 0.01f;
constexpr float kOneByWidthPlus2 = 1.f / (2.f * kWidth);
if (fabs(log_spectrum[i] - log_quantile_[j]) < kWidth) {
density_[j] = (counter_[s] * density_[j] + kOneByWidthPlus2) *
one_by_counter_plus_1;
}
}
if (counter_[s] >= kLongStartupPhaseBlocks) {
counter_[s] = 0;
if (num_updates_ >= kLongStartupPhaseBlocks) {
quantile_index_to_return = k;
}
}
++counter_[s];
}
// Sequentially update the noise during startup.
if (num_updates_ < kLongStartupPhaseBlocks) {
// Use the last "s" to get noise during startup that differ from zero.
quantile_index_to_return = kFftSizeBy2Plus1 * (kSimult - 1);
++num_updates_;
}
if (quantile_index_to_return >= 0) {
ExpApproximation(
rtc::ArrayView<const float>(&log_quantile_[quantile_index_to_return],
kFftSizeBy2Plus1),
quantile_);
}
std::copy(quantile_.begin(), quantile_.end(), noise_spectrum.begin());
}
} // namespace webrtc

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_QUANTILE_NOISE_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_NS_QUANTILE_NOISE_ESTIMATOR_H_
#include <math.h>
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
namespace webrtc {
constexpr int kSimult = 3;
// For quantile noise estimation.
class QuantileNoiseEstimator {
public:
QuantileNoiseEstimator();
QuantileNoiseEstimator(const QuantileNoiseEstimator&) = delete;
QuantileNoiseEstimator& operator=(const QuantileNoiseEstimator&) = delete;
// Estimate noise.
void Estimate(rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
rtc::ArrayView<float, kFftSizeBy2Plus1> noise_spectrum);
private:
std::array<float, kSimult * kFftSizeBy2Plus1> density_;
std::array<float, kSimult * kFftSizeBy2Plus1> log_quantile_;
std::array<float, kFftSizeBy2Plus1> quantile_;
std::array<int, kSimult> counter_;
int num_updates_ = 1;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_QUANTILE_NOISE_ESTIMATOR_H_

View file

@ -0,0 +1,24 @@
/*
* Copyright (c) 2019 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/signal_model.h"
namespace webrtc {
SignalModel::SignalModel() {
constexpr float kSfFeatureThr = 0.5f;
lrt = kLtrFeatureThr;
spectral_flatness = kSfFeatureThr;
spectral_diff = kSfFeatureThr;
avg_log_lrt.fill(kLtrFeatureThr);
}
} // namespace webrtc

View file

@ -0,0 +1,34 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_H_
#define MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_H_
#include <array>
#include "modules/audio_processing/ns/ns_common.h"
namespace webrtc {
struct SignalModel {
SignalModel();
SignalModel(const SignalModel&) = delete;
SignalModel& operator=(const SignalModel&) = delete;
float lrt;
float spectral_diff;
float spectral_flatness;
// Log LRT factor with time-smoothing.
std::array<float, kFftSizeBy2Plus1> avg_log_lrt;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_H_

View file

@ -0,0 +1,175 @@
/*
* Copyright (c) 2019 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/signal_model_estimator.h"
#include "modules/audio_processing/ns/fast_math.h"
namespace webrtc {
namespace {
constexpr float kOneByFftSizeBy2Plus1 = 1.f / kFftSizeBy2Plus1;
// Computes the difference measure between input spectrum and a template/learned
// noise spectrum.
float ComputeSpectralDiff(
rtc::ArrayView<const float, kFftSizeBy2Plus1> conservative_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float diff_normalization) {
// spectral_diff = var(signal_spectrum) - cov(signal_spectrum, magnAvgPause)^2
// / var(magnAvgPause)
// Compute average quantities.
float noise_average = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
// Conservative smooth noise spectrum from pause frames.
noise_average += conservative_noise_spectrum[i];
}
noise_average = noise_average * kOneByFftSizeBy2Plus1;
float signal_average = signal_spectral_sum * kOneByFftSizeBy2Plus1;
// Compute variance and covariance quantities.
float covariance = 0.f;
float noise_variance = 0.f;
float signal_variance = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
float signal_diff = signal_spectrum[i] - signal_average;
float noise_diff = conservative_noise_spectrum[i] - noise_average;
covariance += signal_diff * noise_diff;
noise_variance += noise_diff * noise_diff;
signal_variance += signal_diff * signal_diff;
}
covariance *= kOneByFftSizeBy2Plus1;
noise_variance *= kOneByFftSizeBy2Plus1;
signal_variance *= kOneByFftSizeBy2Plus1;
// Update of average magnitude spectrum.
float spectral_diff =
signal_variance - (covariance * covariance) / (noise_variance + 0.0001f);
// Normalize.
return spectral_diff / (diff_normalization + 0.0001f);
}
// Updates the spectral flatness based on the input spectrum.
void UpdateSpectralFlatness(
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float* spectral_flatness) {
RTC_DCHECK(spectral_flatness);
// Compute log of ratio of the geometric to arithmetic mean (handle the log(0)
// separately).
constexpr float kAveraging = 0.3f;
float avg_spect_flatness_num = 0.f;
for (size_t i = 1; i < kFftSizeBy2Plus1; ++i) {
if (signal_spectrum[i] == 0.f) {
*spectral_flatness -= kAveraging * (*spectral_flatness);
return;
}
}
for (size_t i = 1; i < kFftSizeBy2Plus1; ++i) {
avg_spect_flatness_num += LogApproximation(signal_spectrum[i]);
}
float avg_spect_flatness_denom = signal_spectral_sum - signal_spectrum[0];
avg_spect_flatness_denom = avg_spect_flatness_denom * kOneByFftSizeBy2Plus1;
avg_spect_flatness_num = avg_spect_flatness_num * kOneByFftSizeBy2Plus1;
float spectral_tmp =
ExpApproximation(avg_spect_flatness_num) / avg_spect_flatness_denom;
// Time-avg update of spectral flatness feature.
*spectral_flatness += kAveraging * (spectral_tmp - *spectral_flatness);
}
// Updates the log LRT measures.
void UpdateSpectralLrt(rtc::ArrayView<const float, kFftSizeBy2Plus1> prior_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> post_snr,
rtc::ArrayView<float, kFftSizeBy2Plus1> avg_log_lrt,
float* lrt) {
RTC_DCHECK(lrt);
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
float tmp1 = 1.f + 2.f * prior_snr[i];
float tmp2 = 2.f * prior_snr[i] / (tmp1 + 0.0001f);
float bessel_tmp = (post_snr[i] + 1.f) * tmp2;
avg_log_lrt[i] +=
.5f * (bessel_tmp - LogApproximation(tmp1) - avg_log_lrt[i]);
}
float log_lrt_time_avg_k_sum = 0.f;
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
log_lrt_time_avg_k_sum += avg_log_lrt[i];
}
*lrt = log_lrt_time_avg_k_sum * kOneByFftSizeBy2Plus1;
}
} // namespace
SignalModelEstimator::SignalModelEstimator()
: prior_model_estimator_(kLtrFeatureThr) {}
void SignalModelEstimator::AdjustNormalization(int32_t num_analyzed_frames,
float signal_energy) {
diff_normalization_ *= num_analyzed_frames;
diff_normalization_ += signal_energy;
diff_normalization_ /= (num_analyzed_frames + 1);
}
// Update the noise features.
void SignalModelEstimator::Update(
rtc::ArrayView<const float, kFftSizeBy2Plus1> prior_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> post_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> conservative_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float signal_energy) {
// Compute spectral flatness on input spectrum.
UpdateSpectralFlatness(signal_spectrum, signal_spectral_sum,
&features_.spectral_flatness);
// Compute difference of input spectrum with learned/estimated noise spectrum.
float spectral_diff =
ComputeSpectralDiff(conservative_noise_spectrum, signal_spectrum,
signal_spectral_sum, diff_normalization_);
// Compute time-avg update of difference feature.
features_.spectral_diff += 0.3f * (spectral_diff - features_.spectral_diff);
signal_energy_sum_ += signal_energy;
// Compute histograms for parameter decisions (thresholds and weights for
// features). Parameters are extracted periodically.
if (--histogram_analysis_counter_ > 0) {
histograms_.Update(features_);
} else {
// Compute model parameters.
prior_model_estimator_.Update(histograms_);
// Clear histograms for next update.
histograms_.Clear();
histogram_analysis_counter_ = kFeatureUpdateWindowSize;
// Update every window:
// Compute normalization for the spectral difference for next estimation.
signal_energy_sum_ = signal_energy_sum_ / kFeatureUpdateWindowSize;
diff_normalization_ = 0.5f * (signal_energy_sum_ + diff_normalization_);
signal_energy_sum_ = 0.f;
}
// Compute the LRT.
UpdateSpectralLrt(prior_snr, post_snr, features_.avg_log_lrt, &features_.lrt);
}
} // namespace webrtc

View file

@ -0,0 +1,58 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_ESTIMATOR_H_
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/histograms.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/prior_signal_model.h"
#include "modules/audio_processing/ns/prior_signal_model_estimator.h"
#include "modules/audio_processing/ns/signal_model.h"
namespace webrtc {
class SignalModelEstimator {
public:
SignalModelEstimator();
SignalModelEstimator(const SignalModelEstimator&) = delete;
SignalModelEstimator& operator=(const SignalModelEstimator&) = delete;
// Compute signal normalization during the initial startup phase.
void AdjustNormalization(int32_t num_analyzed_frames, float signal_energy);
void Update(
rtc::ArrayView<const float, kFftSizeBy2Plus1> prior_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> post_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> conservative_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float signal_energy);
const PriorSignalModel& get_prior_model() const {
return prior_model_estimator_.get_prior_model();
}
const SignalModel& get_model() { return features_; }
private:
float diff_normalization_ = 0.f;
float signal_energy_sum_ = 0.f;
Histograms histograms_;
int histogram_analysis_counter_ = 500;
PriorSignalModelEstimator prior_model_estimator_;
SignalModel features_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_SIGNAL_MODEL_ESTIMATOR_H_

View file

@ -0,0 +1,103 @@
/*
* Copyright (c) 2019 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/speech_probability_estimator.h"
#include <math.h>
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
#include "rtc_base/checks.h"
namespace webrtc {
SpeechProbabilityEstimator::SpeechProbabilityEstimator() {
speech_probability_.fill(0.f);
}
void SpeechProbabilityEstimator::Update(
int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> prior_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> post_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> conservative_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float signal_energy) {
// Update models.
if (num_analyzed_frames < kLongStartupPhaseBlocks) {
signal_model_estimator_.AdjustNormalization(num_analyzed_frames,
signal_energy);
}
signal_model_estimator_.Update(prior_snr, post_snr,
conservative_noise_spectrum, signal_spectrum,
signal_spectral_sum, signal_energy);
const SignalModel& model = signal_model_estimator_.get_model();
const PriorSignalModel& prior_model =
signal_model_estimator_.get_prior_model();
// Width parameter in sigmoid map for prior model.
constexpr float kWidthPrior0 = 4.f;
// Width for pause region: lower range, so increase width in tanh map.
constexpr float kWidthPrior1 = 2.f * kWidthPrior0;
// Average LRT feature: use larger width in tanh map for pause regions.
float width_prior = model.lrt < prior_model.lrt ? kWidthPrior1 : kWidthPrior0;
// Compute indicator function: sigmoid map.
float indicator0 =
0.5f * (tanh(width_prior * (model.lrt - prior_model.lrt)) + 1.f);
// Spectral flatness feature: use larger width in tanh map for pause regions.
width_prior = model.spectral_flatness > prior_model.flatness_threshold
? kWidthPrior1
: kWidthPrior0;
// Compute indicator function: sigmoid map.
float indicator1 =
0.5f * (tanh(1.f * width_prior *
(prior_model.flatness_threshold - model.spectral_flatness)) +
1.f);
// For template spectrum-difference : use larger width in tanh map for pause
// regions.
width_prior = model.spectral_diff < prior_model.template_diff_threshold
? kWidthPrior1
: kWidthPrior0;
// Compute indicator function: sigmoid map.
float indicator2 =
0.5f * (tanh(width_prior * (model.spectral_diff -
prior_model.template_diff_threshold)) +
1.f);
// Combine the indicator function with the feature weights.
float ind_prior = prior_model.lrt_weighting * indicator0 +
prior_model.flatness_weighting * indicator1 +
prior_model.difference_weighting * indicator2;
// Compute the prior probability.
prior_speech_prob_ += 0.1f * (ind_prior - prior_speech_prob_);
// Make sure probabilities are within range: keep floor to 0.01.
prior_speech_prob_ = std::max(std::min(prior_speech_prob_, 1.f), 0.01f);
// Final speech probability: combine prior model with LR factor:.
float gain_prior =
(1.f - prior_speech_prob_) / (prior_speech_prob_ + 0.0001f);
std::array<float, kFftSizeBy2Plus1> inv_lrt;
ExpApproximationSignFlip(model.avg_log_lrt, inv_lrt);
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
speech_probability_[i] = 1.f / (1.f + gain_prior * inv_lrt[i]);
}
}
} // namespace webrtc

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_SPEECH_PROBABILITY_ESTIMATOR_H_
#define MODULES_AUDIO_PROCESSING_NS_SPEECH_PROBABILITY_ESTIMATOR_H_
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/signal_model_estimator.h"
namespace webrtc {
// Class for estimating the probability of speech.
class SpeechProbabilityEstimator {
public:
SpeechProbabilityEstimator();
SpeechProbabilityEstimator(const SpeechProbabilityEstimator&) = delete;
SpeechProbabilityEstimator& operator=(const SpeechProbabilityEstimator&) =
delete;
// Compute speech probability.
void Update(
int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> prior_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> post_snr,
rtc::ArrayView<const float, kFftSizeBy2Plus1> conservative_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum,
float signal_spectral_sum,
float signal_energy);
float get_prior_probability() const { return prior_speech_prob_; }
rtc::ArrayView<const float> get_probability() { return speech_probability_; }
private:
SignalModelEstimator signal_model_estimator_;
float prior_speech_prob_ = .5f;
std::array<float, kFftSizeBy2Plus1> speech_probability_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_SPEECH_PROBABILITY_ESTIMATOR_H_

View file

@ -0,0 +1,49 @@
/*
* Copyright (c) 2019 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/suppression_params.h"
#include "rtc_base/checks.h"
namespace webrtc {
SuppressionParams::SuppressionParams(
NsConfig::SuppressionLevel suppression_level) {
switch (suppression_level) {
case NsConfig::SuppressionLevel::k6dB:
over_subtraction_factor = 1.f;
// 6 dB attenuation.
minimum_attenuating_gain = 0.5f;
use_attenuation_adjustment = false;
break;
case NsConfig::SuppressionLevel::k12dB:
over_subtraction_factor = 1.f;
// 12 dB attenuation.
minimum_attenuating_gain = 0.25f;
use_attenuation_adjustment = true;
break;
case NsConfig::SuppressionLevel::k18dB:
over_subtraction_factor = 1.1f;
// 18 dB attenuation.
minimum_attenuating_gain = 0.125f;
use_attenuation_adjustment = true;
break;
case NsConfig::SuppressionLevel::k21dB:
over_subtraction_factor = 1.25f;
// 20.9 dB attenuation.
minimum_attenuating_gain = 0.09f;
use_attenuation_adjustment = true;
break;
default:
RTC_NOTREACHED();
}
}
} // namespace webrtc

View file

@ -0,0 +1,30 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_SUPPRESSION_PARAMS_H_
#define MODULES_AUDIO_PROCESSING_NS_SUPPRESSION_PARAMS_H_
#include "modules/audio_processing/ns/ns_config.h"
namespace webrtc {
struct SuppressionParams {
explicit SuppressionParams(NsConfig::SuppressionLevel suppression_level);
SuppressionParams(const SuppressionParams&) = delete;
SuppressionParams& operator=(const SuppressionParams&) = delete;
float over_subtraction_factor;
float minimum_attenuating_gain;
bool use_attenuation_adjustment;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_SUPPRESSION_PARAMS_H_

View file

@ -0,0 +1,120 @@
/*
* Copyright (c) 2019 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/wiener_filter.h"
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include "modules/audio_processing/ns/fast_math.h"
#include "rtc_base/checks.h"
namespace webrtc {
WienerFilter::WienerFilter(const SuppressionParams& suppression_params)
: suppression_params_(suppression_params) {
filter_.fill(1.f);
initial_spectral_estimate_.fill(0.f);
spectrum_prev_process_.fill(0.f);
}
void WienerFilter::Update(
int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> prev_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> parametric_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum) {
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
// Previous estimate based on previous frame with gain filter.
float prev_tsa = spectrum_prev_process_[i] /
(prev_noise_spectrum[i] + 0.0001f) * filter_[i];
// Current estimate.
float current_tsa;
if (signal_spectrum[i] > noise_spectrum[i]) {
current_tsa = signal_spectrum[i] / (noise_spectrum[i] + 0.0001f) - 1.f;
} else {
current_tsa = 0.f;
}
// Directed decision estimate is sum of two terms: current estimate and
// previous estimate.
float snr_prior = 0.98f * prev_tsa + (1.f - 0.98f) * current_tsa;
filter_[i] =
snr_prior / (suppression_params_.over_subtraction_factor + snr_prior);
filter_[i] = std::max(std::min(filter_[i], 1.f),
suppression_params_.minimum_attenuating_gain);
}
if (num_analyzed_frames < kShortStartupPhaseBlocks) {
for (size_t i = 0; i < kFftSizeBy2Plus1; ++i) {
initial_spectral_estimate_[i] += signal_spectrum[i];
float filter_initial = initial_spectral_estimate_[i] -
suppression_params_.over_subtraction_factor *
parametric_noise_spectrum[i];
filter_initial /= initial_spectral_estimate_[i] + 0.0001f;
filter_initial = std::max(std::min(filter_initial, 1.f),
suppression_params_.minimum_attenuating_gain);
// Weight the two suppression filters.
constexpr float kOnyByShortStartupPhaseBlocks =
1.f / kShortStartupPhaseBlocks;
filter_initial *= kShortStartupPhaseBlocks - num_analyzed_frames;
filter_[i] *= num_analyzed_frames;
filter_[i] += filter_initial;
filter_[i] *= kOnyByShortStartupPhaseBlocks;
}
}
std::copy(signal_spectrum.begin(), signal_spectrum.end(),
spectrum_prev_process_.begin());
}
float WienerFilter::ComputeOverallScalingFactor(
int32_t num_analyzed_frames,
float prior_speech_probability,
float energy_before_filtering,
float energy_after_filtering) const {
if (!suppression_params_.use_attenuation_adjustment ||
num_analyzed_frames <= kLongStartupPhaseBlocks) {
return 1.f;
}
float gain = SqrtFastApproximation(energy_after_filtering /
(energy_before_filtering + 1.f));
// Scaling for new version. Threshold in final energy gain factor calculation.
constexpr float kBLim = 0.5f;
float scale_factor1 = 1.f;
if (gain > kBLim) {
scale_factor1 = 1.f + 1.3f * (gain - kBLim);
if (gain * scale_factor1 > 1.f) {
scale_factor1 = 1.f / gain;
}
}
float scale_factor2 = 1.f;
if (gain < kBLim) {
// Do not reduce scale too much for pause regions: attenuation here should
// be controlled by flooring.
gain = std::max(gain, suppression_params_.minimum_attenuating_gain);
scale_factor2 = 1.f - 0.3f * (kBLim - gain);
}
// Combine both scales with speech/noise prob: note prior
// (prior_speech_probability) is not frequency dependent.
return prior_speech_probability * scale_factor1 +
(1.f - prior_speech_probability) * scale_factor2;
}
} // namespace webrtc

View file

@ -0,0 +1,57 @@
/*
* Copyright (c) 2019 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_WIENER_FILTER_H_
#define MODULES_AUDIO_PROCESSING_NS_WIENER_FILTER_H_
#include <array>
#include "api/array_view.h"
#include "modules/audio_processing/ns/ns_common.h"
#include "modules/audio_processing/ns/suppression_params.h"
namespace webrtc {
// Estimates a Wiener-filter based frequency domain noise reduction filter.
class WienerFilter {
public:
explicit WienerFilter(const SuppressionParams& suppression_params);
WienerFilter(const WienerFilter&) = delete;
WienerFilter& operator=(const WienerFilter&) = delete;
// Updates the filter estimate.
void Update(
int32_t num_analyzed_frames,
rtc::ArrayView<const float, kFftSizeBy2Plus1> noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> prev_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> parametric_noise_spectrum,
rtc::ArrayView<const float, kFftSizeBy2Plus1> signal_spectrum);
// Compute an overall gain scaling factor.
float ComputeOverallScalingFactor(int32_t num_analyzed_frames,
float prior_speech_probability,
float energy_before_filtering,
float energy_after_filtering) const;
// Returns the filter.
rtc::ArrayView<const float, kFftSizeBy2Plus1> get_filter() const {
return filter_;
}
private:
const SuppressionParams& suppression_params_;
std::array<float, kFftSizeBy2Plus1> spectrum_prev_process_;
std::array<float, kFftSizeBy2Plus1> initial_spectral_estimate_;
std::array<float, kFftSizeBy2Plus1> filter_;
};
} // namespace webrtc
#endif // MODULES_AUDIO_PROCESSING_NS_WIENER_FILTER_H_

View file

@ -1,672 +0,0 @@
/*
* Copyright (c) 2011 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.
*/
#ifndef MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
#define MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
// Hanning window for 4ms 16kHz
static const float kHanning64w128[128] = {
0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f,
0.09801714032956f, 0.12241067519922f, 0.14673047445536f, 0.17096188876030f,
0.19509032201613f, 0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
0.29028467725446f, 0.31368174039889f, 0.33688985339222f, 0.35989503653499f,
0.38268343236509f, 0.40524131400499f, 0.42755509343028f, 0.44961132965461f,
0.47139673682600f, 0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
0.55557023301960f, 0.57580819141785f, 0.59569930449243f, 0.61523159058063f,
0.63439328416365f, 0.65317284295378f, 0.67155895484702f, 0.68954054473707f,
0.70710678118655f, 0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
0.77301045336274f, 0.78834642762661f, 0.80320753148064f, 0.81758481315158f,
0.83146961230255f, 0.84485356524971f, 0.85772861000027f, 0.87008699110871f,
0.88192126434835f, 0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
0.92387953251129f, 0.93299279883474f, 0.94154406518302f, 0.94952818059304f,
0.95694033573221f, 0.96377606579544f, 0.97003125319454f, 0.97570213003853f,
0.98078528040323f, 0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
0.99518472667220f, 0.99729045667869f, 0.99879545620517f, 0.99969881869620f,
1.00000000000000f, 0.99969881869620f, 0.99879545620517f, 0.99729045667869f,
0.99518472667220f, 0.99247953459871f, 0.98917650996478f, 0.98527764238894f,
0.98078528040323f, 0.97570213003853f, 0.97003125319454f, 0.96377606579544f,
0.95694033573221f, 0.94952818059304f, 0.94154406518302f, 0.93299279883474f,
0.92387953251129f, 0.91420975570353f, 0.90398929312344f, 0.89322430119552f,
0.88192126434835f, 0.87008699110871f, 0.85772861000027f, 0.84485356524971f,
0.83146961230255f, 0.81758481315158f, 0.80320753148064f, 0.78834642762661f,
0.77301045336274f, 0.75720884650648f, 0.74095112535496f, 0.72424708295147f,
0.70710678118655f, 0.68954054473707f, 0.67155895484702f, 0.65317284295378f,
0.63439328416365f, 0.61523159058063f, 0.59569930449243f, 0.57580819141785f,
0.55557023301960f, 0.53499761988710f, 0.51410274419322f, 0.49289819222978f,
0.47139673682600f, 0.44961132965461f, 0.42755509343028f, 0.40524131400499f,
0.38268343236509f, 0.35989503653499f, 0.33688985339222f, 0.31368174039889f,
0.29028467725446f, 0.26671275747490f, 0.24298017990326f, 0.21910124015687f,
0.19509032201613f, 0.17096188876030f, 0.14673047445536f, 0.12241067519922f,
0.09801714032956f, 0.07356456359967f, 0.04906767432742f, 0.02454122852291f};
// hybrib Hanning & flat window
static const float kBlocks80w128[128] = {
(float)0.00000000, (float)0.03271908, (float)0.06540313, (float)0.09801714,
(float)0.13052619, (float)0.16289547, (float)0.19509032, (float)0.22707626,
(float)0.25881905, (float)0.29028468, (float)0.32143947, (float)0.35225005,
(float)0.38268343, (float)0.41270703, (float)0.44228869, (float)0.47139674,
(float)0.50000000, (float)0.52806785, (float)0.55557023, (float)0.58247770,
(float)0.60876143, (float)0.63439328, (float)0.65934582, (float)0.68359230,
(float)0.70710678, (float)0.72986407, (float)0.75183981, (float)0.77301045,
(float)0.79335334, (float)0.81284668, (float)0.83146961, (float)0.84920218,
(float)0.86602540, (float)0.88192126, (float)0.89687274, (float)0.91086382,
(float)0.92387953, (float)0.93590593, (float)0.94693013, (float)0.95694034,
(float)0.96592583, (float)0.97387698, (float)0.98078528, (float)0.98664333,
(float)0.99144486, (float)0.99518473, (float)0.99785892, (float)0.99946459,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)0.99946459, (float)0.99785892, (float)0.99518473,
(float)0.99144486, (float)0.98664333, (float)0.98078528, (float)0.97387698,
(float)0.96592583, (float)0.95694034, (float)0.94693013, (float)0.93590593,
(float)0.92387953, (float)0.91086382, (float)0.89687274, (float)0.88192126,
(float)0.86602540, (float)0.84920218, (float)0.83146961, (float)0.81284668,
(float)0.79335334, (float)0.77301045, (float)0.75183981, (float)0.72986407,
(float)0.70710678, (float)0.68359230, (float)0.65934582, (float)0.63439328,
(float)0.60876143, (float)0.58247770, (float)0.55557023, (float)0.52806785,
(float)0.50000000, (float)0.47139674, (float)0.44228869, (float)0.41270703,
(float)0.38268343, (float)0.35225005, (float)0.32143947, (float)0.29028468,
(float)0.25881905, (float)0.22707626, (float)0.19509032, (float)0.16289547,
(float)0.13052619, (float)0.09801714, (float)0.06540313, (float)0.03271908};
// hybrib Hanning & flat window
static const float kBlocks160w256[256] = {
(float)0.00000000, (float)0.01636173, (float)0.03271908, (float)0.04906767,
(float)0.06540313, (float)0.08172107, (float)0.09801714, (float)0.11428696,
(float)0.13052619, (float)0.14673047, (float)0.16289547, (float)0.17901686,
(float)0.19509032, (float)0.21111155, (float)0.22707626, (float)0.24298018,
(float)0.25881905, (float)0.27458862, (float)0.29028468, (float)0.30590302,
(float)0.32143947, (float)0.33688985, (float)0.35225005, (float)0.36751594,
(float)0.38268343, (float)0.39774847, (float)0.41270703, (float)0.42755509,
(float)0.44228869, (float)0.45690388, (float)0.47139674, (float)0.48576339,
(float)0.50000000, (float)0.51410274, (float)0.52806785, (float)0.54189158,
(float)0.55557023, (float)0.56910015, (float)0.58247770, (float)0.59569930,
(float)0.60876143, (float)0.62166057, (float)0.63439328, (float)0.64695615,
(float)0.65934582, (float)0.67155895, (float)0.68359230, (float)0.69544264,
(float)0.70710678, (float)0.71858162, (float)0.72986407, (float)0.74095113,
(float)0.75183981, (float)0.76252720, (float)0.77301045, (float)0.78328675,
(float)0.79335334, (float)0.80320753, (float)0.81284668, (float)0.82226822,
(float)0.83146961, (float)0.84044840, (float)0.84920218, (float)0.85772861,
(float)0.86602540, (float)0.87409034, (float)0.88192126, (float)0.88951608,
(float)0.89687274, (float)0.90398929, (float)0.91086382, (float)0.91749450,
(float)0.92387953, (float)0.93001722, (float)0.93590593, (float)0.94154407,
(float)0.94693013, (float)0.95206268, (float)0.95694034, (float)0.96156180,
(float)0.96592583, (float)0.97003125, (float)0.97387698, (float)0.97746197,
(float)0.98078528, (float)0.98384601, (float)0.98664333, (float)0.98917651,
(float)0.99144486, (float)0.99344778, (float)0.99518473, (float)0.99665524,
(float)0.99785892, (float)0.99879546, (float)0.99946459, (float)0.99986614,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)0.99986614, (float)0.99946459, (float)0.99879546,
(float)0.99785892, (float)0.99665524, (float)0.99518473, (float)0.99344778,
(float)0.99144486, (float)0.98917651, (float)0.98664333, (float)0.98384601,
(float)0.98078528, (float)0.97746197, (float)0.97387698, (float)0.97003125,
(float)0.96592583, (float)0.96156180, (float)0.95694034, (float)0.95206268,
(float)0.94693013, (float)0.94154407, (float)0.93590593, (float)0.93001722,
(float)0.92387953, (float)0.91749450, (float)0.91086382, (float)0.90398929,
(float)0.89687274, (float)0.88951608, (float)0.88192126, (float)0.87409034,
(float)0.86602540, (float)0.85772861, (float)0.84920218, (float)0.84044840,
(float)0.83146961, (float)0.82226822, (float)0.81284668, (float)0.80320753,
(float)0.79335334, (float)0.78328675, (float)0.77301045, (float)0.76252720,
(float)0.75183981, (float)0.74095113, (float)0.72986407, (float)0.71858162,
(float)0.70710678, (float)0.69544264, (float)0.68359230, (float)0.67155895,
(float)0.65934582, (float)0.64695615, (float)0.63439328, (float)0.62166057,
(float)0.60876143, (float)0.59569930, (float)0.58247770, (float)0.56910015,
(float)0.55557023, (float)0.54189158, (float)0.52806785, (float)0.51410274,
(float)0.50000000, (float)0.48576339, (float)0.47139674, (float)0.45690388,
(float)0.44228869, (float)0.42755509, (float)0.41270703, (float)0.39774847,
(float)0.38268343, (float)0.36751594, (float)0.35225005, (float)0.33688985,
(float)0.32143947, (float)0.30590302, (float)0.29028468, (float)0.27458862,
(float)0.25881905, (float)0.24298018, (float)0.22707626, (float)0.21111155,
(float)0.19509032, (float)0.17901686, (float)0.16289547, (float)0.14673047,
(float)0.13052619, (float)0.11428696, (float)0.09801714, (float)0.08172107,
(float)0.06540313, (float)0.04906767, (float)0.03271908, (float)0.01636173};
// hybrib Hanning & flat window: for 20ms
static const float kBlocks320w512[512] = {
(float)0.00000000, (float)0.00818114, (float)0.01636173, (float)0.02454123,
(float)0.03271908, (float)0.04089475, (float)0.04906767, (float)0.05723732,
(float)0.06540313, (float)0.07356456, (float)0.08172107, (float)0.08987211,
(float)0.09801714, (float)0.10615561, (float)0.11428696, (float)0.12241068,
(float)0.13052619, (float)0.13863297, (float)0.14673047, (float)0.15481816,
(float)0.16289547, (float)0.17096189, (float)0.17901686, (float)0.18705985,
(float)0.19509032, (float)0.20310773, (float)0.21111155, (float)0.21910124,
(float)0.22707626, (float)0.23503609, (float)0.24298018, (float)0.25090801,
(float)0.25881905, (float)0.26671276, (float)0.27458862, (float)0.28244610,
(float)0.29028468, (float)0.29810383, (float)0.30590302, (float)0.31368174,
(float)0.32143947, (float)0.32917568, (float)0.33688985, (float)0.34458148,
(float)0.35225005, (float)0.35989504, (float)0.36751594, (float)0.37511224,
(float)0.38268343, (float)0.39022901, (float)0.39774847, (float)0.40524131,
(float)0.41270703, (float)0.42014512, (float)0.42755509, (float)0.43493645,
(float)0.44228869, (float)0.44961133, (float)0.45690388, (float)0.46416584,
(float)0.47139674, (float)0.47859608, (float)0.48576339, (float)0.49289819,
(float)0.50000000, (float)0.50706834, (float)0.51410274, (float)0.52110274,
(float)0.52806785, (float)0.53499762, (float)0.54189158, (float)0.54874927,
(float)0.55557023, (float)0.56235401, (float)0.56910015, (float)0.57580819,
(float)0.58247770, (float)0.58910822, (float)0.59569930, (float)0.60225052,
(float)0.60876143, (float)0.61523159, (float)0.62166057, (float)0.62804795,
(float)0.63439328, (float)0.64069616, (float)0.64695615, (float)0.65317284,
(float)0.65934582, (float)0.66547466, (float)0.67155895, (float)0.67759830,
(float)0.68359230, (float)0.68954054, (float)0.69544264, (float)0.70129818,
(float)0.70710678, (float)0.71286806, (float)0.71858162, (float)0.72424708,
(float)0.72986407, (float)0.73543221, (float)0.74095113, (float)0.74642045,
(float)0.75183981, (float)0.75720885, (float)0.76252720, (float)0.76779452,
(float)0.77301045, (float)0.77817464, (float)0.78328675, (float)0.78834643,
(float)0.79335334, (float)0.79830715, (float)0.80320753, (float)0.80805415,
(float)0.81284668, (float)0.81758481, (float)0.82226822, (float)0.82689659,
(float)0.83146961, (float)0.83598698, (float)0.84044840, (float)0.84485357,
(float)0.84920218, (float)0.85349396, (float)0.85772861, (float)0.86190585,
(float)0.86602540, (float)0.87008699, (float)0.87409034, (float)0.87803519,
(float)0.88192126, (float)0.88574831, (float)0.88951608, (float)0.89322430,
(float)0.89687274, (float)0.90046115, (float)0.90398929, (float)0.90745693,
(float)0.91086382, (float)0.91420976, (float)0.91749450, (float)0.92071783,
(float)0.92387953, (float)0.92697940, (float)0.93001722, (float)0.93299280,
(float)0.93590593, (float)0.93875641, (float)0.94154407, (float)0.94426870,
(float)0.94693013, (float)0.94952818, (float)0.95206268, (float)0.95453345,
(float)0.95694034, (float)0.95928317, (float)0.96156180, (float)0.96377607,
(float)0.96592583, (float)0.96801094, (float)0.97003125, (float)0.97198664,
(float)0.97387698, (float)0.97570213, (float)0.97746197, (float)0.97915640,
(float)0.98078528, (float)0.98234852, (float)0.98384601, (float)0.98527764,
(float)0.98664333, (float)0.98794298, (float)0.98917651, (float)0.99034383,
(float)0.99144486, (float)0.99247953, (float)0.99344778, (float)0.99434953,
(float)0.99518473, (float)0.99595331, (float)0.99665524, (float)0.99729046,
(float)0.99785892, (float)0.99836060, (float)0.99879546, (float)0.99916346,
(float)0.99946459, (float)0.99969882, (float)0.99986614, (float)0.99996653,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
(float)1.00000000, (float)0.99996653, (float)0.99986614, (float)0.99969882,
(float)0.99946459, (float)0.99916346, (float)0.99879546, (float)0.99836060,
(float)0.99785892, (float)0.99729046, (float)0.99665524, (float)0.99595331,
(float)0.99518473, (float)0.99434953, (float)0.99344778, (float)0.99247953,
(float)0.99144486, (float)0.99034383, (float)0.98917651, (float)0.98794298,
(float)0.98664333, (float)0.98527764, (float)0.98384601, (float)0.98234852,
(float)0.98078528, (float)0.97915640, (float)0.97746197, (float)0.97570213,
(float)0.97387698, (float)0.97198664, (float)0.97003125, (float)0.96801094,
(float)0.96592583, (float)0.96377607, (float)0.96156180, (float)0.95928317,
(float)0.95694034, (float)0.95453345, (float)0.95206268, (float)0.94952818,
(float)0.94693013, (float)0.94426870, (float)0.94154407, (float)0.93875641,
(float)0.93590593, (float)0.93299280, (float)0.93001722, (float)0.92697940,
(float)0.92387953, (float)0.92071783, (float)0.91749450, (float)0.91420976,
(float)0.91086382, (float)0.90745693, (float)0.90398929, (float)0.90046115,
(float)0.89687274, (float)0.89322430, (float)0.88951608, (float)0.88574831,
(float)0.88192126, (float)0.87803519, (float)0.87409034, (float)0.87008699,
(float)0.86602540, (float)0.86190585, (float)0.85772861, (float)0.85349396,
(float)0.84920218, (float)0.84485357, (float)0.84044840, (float)0.83598698,
(float)0.83146961, (float)0.82689659, (float)0.82226822, (float)0.81758481,
(float)0.81284668, (float)0.80805415, (float)0.80320753, (float)0.79830715,
(float)0.79335334, (float)0.78834643, (float)0.78328675, (float)0.77817464,
(float)0.77301045, (float)0.76779452, (float)0.76252720, (float)0.75720885,
(float)0.75183981, (float)0.74642045, (float)0.74095113, (float)0.73543221,
(float)0.72986407, (float)0.72424708, (float)0.71858162, (float)0.71286806,
(float)0.70710678, (float)0.70129818, (float)0.69544264, (float)0.68954054,
(float)0.68359230, (float)0.67759830, (float)0.67155895, (float)0.66547466,
(float)0.65934582, (float)0.65317284, (float)0.64695615, (float)0.64069616,
(float)0.63439328, (float)0.62804795, (float)0.62166057, (float)0.61523159,
(float)0.60876143, (float)0.60225052, (float)0.59569930, (float)0.58910822,
(float)0.58247770, (float)0.57580819, (float)0.56910015, (float)0.56235401,
(float)0.55557023, (float)0.54874927, (float)0.54189158, (float)0.53499762,
(float)0.52806785, (float)0.52110274, (float)0.51410274, (float)0.50706834,
(float)0.50000000, (float)0.49289819, (float)0.48576339, (float)0.47859608,
(float)0.47139674, (float)0.46416584, (float)0.45690388, (float)0.44961133,
(float)0.44228869, (float)0.43493645, (float)0.42755509, (float)0.42014512,
(float)0.41270703, (float)0.40524131, (float)0.39774847, (float)0.39022901,
(float)0.38268343, (float)0.37511224, (float)0.36751594, (float)0.35989504,
(float)0.35225005, (float)0.34458148, (float)0.33688985, (float)0.32917568,
(float)0.32143947, (float)0.31368174, (float)0.30590302, (float)0.29810383,
(float)0.29028468, (float)0.28244610, (float)0.27458862, (float)0.26671276,
(float)0.25881905, (float)0.25090801, (float)0.24298018, (float)0.23503609,
(float)0.22707626, (float)0.21910124, (float)0.21111155, (float)0.20310773,
(float)0.19509032, (float)0.18705985, (float)0.17901686, (float)0.17096189,
(float)0.16289547, (float)0.15481816, (float)0.14673047, (float)0.13863297,
(float)0.13052619, (float)0.12241068, (float)0.11428696, (float)0.10615561,
(float)0.09801714, (float)0.08987211, (float)0.08172107, (float)0.07356456,
(float)0.06540313, (float)0.05723732, (float)0.04906767, (float)0.04089475,
(float)0.03271908, (float)0.02454123, (float)0.01636173, (float)0.00818114};
// Hanning window: for 15ms at 16kHz with symmetric zeros
static const float kBlocks240w512[512] = {
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00654494, (float)0.01308960, (float)0.01963369,
(float)0.02617695, (float)0.03271908, (float)0.03925982, (float)0.04579887,
(float)0.05233596, (float)0.05887080, (float)0.06540313, (float)0.07193266,
(float)0.07845910, (float)0.08498218, (float)0.09150162, (float)0.09801714,
(float)0.10452846, (float)0.11103531, (float)0.11753740, (float)0.12403446,
(float)0.13052620, (float)0.13701233, (float)0.14349262, (float)0.14996676,
(float)0.15643448, (float)0.16289547, (float)0.16934951, (float)0.17579629,
(float)0.18223552, (float)0.18866697, (float)0.19509032, (float)0.20150533,
(float)0.20791170, (float)0.21430916, (float)0.22069745, (float)0.22707628,
(float)0.23344538, (float)0.23980446, (float)0.24615330, (float)0.25249159,
(float)0.25881904, (float)0.26513544, (float)0.27144045, (float)0.27773386,
(float)0.28401536, (float)0.29028466, (float)0.29654160, (float)0.30278578,
(float)0.30901700, (float)0.31523499, (float)0.32143945, (float)0.32763019,
(float)0.33380687, (float)0.33996925, (float)0.34611708, (float)0.35225007,
(float)0.35836795, (float)0.36447051, (float)0.37055743, (float)0.37662852,
(float)0.38268346, (float)0.38872197, (float)0.39474389, (float)0.40074885,
(float)0.40673664, (float)0.41270703, (float)0.41865975, (float)0.42459452,
(float)0.43051112, (float)0.43640924, (float)0.44228873, (float)0.44814920,
(float)0.45399052, (float)0.45981237, (float)0.46561453, (float)0.47139674,
(float)0.47715878, (float)0.48290035, (float)0.48862126, (float)0.49432120,
(float)0.50000000, (float)0.50565743, (float)0.51129311, (float)0.51690692,
(float)0.52249855, (float)0.52806789, (float)0.53361452, (float)0.53913832,
(float)0.54463905, (float)0.55011642, (float)0.55557024, (float)0.56100029,
(float)0.56640625, (float)0.57178795, (float)0.57714522, (float)0.58247769,
(float)0.58778524, (float)0.59306765, (float)0.59832460, (float)0.60355598,
(float)0.60876143, (float)0.61394083, (float)0.61909395, (float)0.62422055,
(float)0.62932038, (float)0.63439333, (float)0.63943899, (float)0.64445734,
(float)0.64944810, (float)0.65441096, (float)0.65934587, (float)0.66425246,
(float)0.66913062, (float)0.67398012, (float)0.67880076, (float)0.68359232,
(float)0.68835455, (float)0.69308740, (float)0.69779050, (float)0.70246369,
(float)0.70710677, (float)0.71171963, (float)0.71630198, (float)0.72085363,
(float)0.72537440, (float)0.72986406, (float)0.73432255, (float)0.73874950,
(float)0.74314487, (float)0.74750835, (float)0.75183982, (float)0.75613910,
(float)0.76040596, (float)0.76464027, (float)0.76884186, (float)0.77301043,
(float)0.77714598, (float)0.78124821, (float)0.78531694, (float)0.78935206,
(float)0.79335338, (float)0.79732066, (float)0.80125386, (float)0.80515265,
(float)0.80901700, (float)0.81284672, (float)0.81664157, (float)0.82040149,
(float)0.82412618, (float)0.82781565, (float)0.83146966, (float)0.83508795,
(float)0.83867061, (float)0.84221727, (float)0.84572780, (float)0.84920216,
(float)0.85264021, (float)0.85604161, (float)0.85940641, (float)0.86273444,
(float)0.86602545, (float)0.86927933, (float)0.87249607, (float)0.87567532,
(float)0.87881714, (float)0.88192129, (float)0.88498765, (float)0.88801610,
(float)0.89100653, (float)0.89395881, (float)0.89687276, (float)0.89974827,
(float)0.90258533, (float)0.90538365, (float)0.90814316, (float)0.91086388,
(float)0.91354549, (float)0.91618794, (float)0.91879123, (float)0.92135513,
(float)0.92387950, (float)0.92636442, (float)0.92880958, (float)0.93121493,
(float)0.93358046, (float)0.93590593, (float)0.93819135, (float)0.94043654,
(float)0.94264150, (float)0.94480604, (float)0.94693011, (float)0.94901365,
(float)0.95105654, (float)0.95305866, (float)0.95501995, (float)0.95694035,
(float)0.95881975, (float)0.96065807, (float)0.96245527, (float)0.96421117,
(float)0.96592581, (float)0.96759909, (float)0.96923089, (float)0.97082120,
(float)0.97236991, (float)0.97387701, (float)0.97534233, (float)0.97676587,
(float)0.97814763, (float)0.97948742, (float)0.98078531, (float)0.98204112,
(float)0.98325491, (float)0.98442656, (float)0.98555607, (float)0.98664331,
(float)0.98768836, (float)0.98869103, (float)0.98965138, (float)0.99056935,
(float)0.99144489, (float)0.99227792, (float)0.99306846, (float)0.99381649,
(float)0.99452192, (float)0.99518472, (float)0.99580491, (float)0.99638247,
(float)0.99691731, (float)0.99740952, (float)0.99785894, (float)0.99826562,
(float)0.99862951, (float)0.99895066, (float)0.99922901, (float)0.99946457,
(float)0.99965733, (float)0.99980724, (float)0.99991435, (float)0.99997860,
(float)1.00000000, (float)0.99997860, (float)0.99991435, (float)0.99980724,
(float)0.99965733, (float)0.99946457, (float)0.99922901, (float)0.99895066,
(float)0.99862951, (float)0.99826562, (float)0.99785894, (float)0.99740946,
(float)0.99691731, (float)0.99638247, (float)0.99580491, (float)0.99518472,
(float)0.99452192, (float)0.99381644, (float)0.99306846, (float)0.99227792,
(float)0.99144489, (float)0.99056935, (float)0.98965138, (float)0.98869103,
(float)0.98768836, (float)0.98664331, (float)0.98555607, (float)0.98442656,
(float)0.98325491, (float)0.98204112, (float)0.98078525, (float)0.97948742,
(float)0.97814757, (float)0.97676587, (float)0.97534227, (float)0.97387695,
(float)0.97236991, (float)0.97082120, (float)0.96923089, (float)0.96759909,
(float)0.96592581, (float)0.96421117, (float)0.96245521, (float)0.96065807,
(float)0.95881969, (float)0.95694029, (float)0.95501995, (float)0.95305860,
(float)0.95105648, (float)0.94901365, (float)0.94693011, (float)0.94480604,
(float)0.94264150, (float)0.94043654, (float)0.93819129, (float)0.93590593,
(float)0.93358046, (float)0.93121493, (float)0.92880952, (float)0.92636436,
(float)0.92387950, (float)0.92135507, (float)0.91879123, (float)0.91618794,
(float)0.91354543, (float)0.91086382, (float)0.90814310, (float)0.90538365,
(float)0.90258527, (float)0.89974827, (float)0.89687276, (float)0.89395875,
(float)0.89100647, (float)0.88801610, (float)0.88498759, (float)0.88192123,
(float)0.87881714, (float)0.87567532, (float)0.87249595, (float)0.86927933,
(float)0.86602539, (float)0.86273432, (float)0.85940641, (float)0.85604161,
(float)0.85264009, (float)0.84920216, (float)0.84572780, (float)0.84221715,
(float)0.83867055, (float)0.83508795, (float)0.83146954, (float)0.82781565,
(float)0.82412612, (float)0.82040137, (float)0.81664157, (float)0.81284660,
(float)0.80901700, (float)0.80515265, (float)0.80125374, (float)0.79732066,
(float)0.79335332, (float)0.78935200, (float)0.78531694, (float)0.78124815,
(float)0.77714586, (float)0.77301049, (float)0.76884180, (float)0.76464021,
(float)0.76040596, (float)0.75613904, (float)0.75183970, (float)0.74750835,
(float)0.74314481, (float)0.73874938, (float)0.73432249, (float)0.72986400,
(float)0.72537428, (float)0.72085363, (float)0.71630186, (float)0.71171951,
(float)0.70710677, (float)0.70246363, (float)0.69779032, (float)0.69308734,
(float)0.68835449, (float)0.68359220, (float)0.67880070, (float)0.67398006,
(float)0.66913044, (float)0.66425240, (float)0.65934575, (float)0.65441096,
(float)0.64944804, (float)0.64445722, (float)0.63943905, (float)0.63439327,
(float)0.62932026, (float)0.62422055, (float)0.61909389, (float)0.61394072,
(float)0.60876143, (float)0.60355592, (float)0.59832448, (float)0.59306765,
(float)0.58778518, (float)0.58247757, (float)0.57714522, (float)0.57178789,
(float)0.56640613, (float)0.56100023, (float)0.55557019, (float)0.55011630,
(float)0.54463905, (float)0.53913826, (float)0.53361434, (float)0.52806783,
(float)0.52249849, (float)0.51690674, (float)0.51129305, (float)0.50565726,
(float)0.50000006, (float)0.49432117, (float)0.48862115, (float)0.48290038,
(float)0.47715873, (float)0.47139663, (float)0.46561456, (float)0.45981231,
(float)0.45399037, (float)0.44814920, (float)0.44228864, (float)0.43640912,
(float)0.43051112, (float)0.42459446, (float)0.41865960, (float)0.41270703,
(float)0.40673658, (float)0.40074870, (float)0.39474386, (float)0.38872188,
(float)0.38268328, (float)0.37662849, (float)0.37055734, (float)0.36447033,
(float)0.35836792, (float)0.35224995, (float)0.34611690, (float)0.33996922,
(float)0.33380675, (float)0.32763001, (float)0.32143945, (float)0.31523487,
(float)0.30901679, (float)0.30278572, (float)0.29654145, (float)0.29028472,
(float)0.28401530, (float)0.27773371, (float)0.27144048, (float)0.26513538,
(float)0.25881892, (float)0.25249159, (float)0.24615324, (float)0.23980433,
(float)0.23344538, (float)0.22707619, (float)0.22069728, (float)0.21430916,
(float)0.20791161, (float)0.20150517, (float)0.19509031, (float)0.18866688,
(float)0.18223536, (float)0.17579627, (float)0.16934940, (float)0.16289529,
(float)0.15643445, (float)0.14996666, (float)0.14349243, (float)0.13701232,
(float)0.13052608, (float)0.12403426, (float)0.11753736, (float)0.11103519,
(float)0.10452849, (float)0.09801710, (float)0.09150149, (float)0.08498220,
(float)0.07845904, (float)0.07193252, (float)0.06540315, (float)0.05887074,
(float)0.05233581, (float)0.04579888, (float)0.03925974, (float)0.03271893,
(float)0.02617695, (float)0.01963361, (float)0.01308943, (float)0.00654493,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000};
// Hanning window: for 30ms with 1024 fft with symmetric zeros at 16kHz
static const float kBlocks480w1024[1024] = {
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00327249, (float)0.00654494, (float)0.00981732,
(float)0.01308960, (float)0.01636173, (float)0.01963369, (float)0.02290544,
(float)0.02617695, (float)0.02944817, (float)0.03271908, (float)0.03598964,
(float)0.03925982, (float)0.04252957, (float)0.04579887, (float)0.04906768,
(float)0.05233596, (float)0.05560368, (float)0.05887080, (float)0.06213730,
(float)0.06540313, (float)0.06866825, (float)0.07193266, (float)0.07519628,
(float)0.07845910, (float)0.08172107, (float)0.08498218, (float)0.08824237,
(float)0.09150162, (float)0.09475989, (float)0.09801714, (float)0.10127335,
(float)0.10452846, (float)0.10778246, (float)0.11103531, (float)0.11428697,
(float)0.11753740, (float)0.12078657, (float)0.12403446, (float)0.12728101,
(float)0.13052620, (float)0.13376999, (float)0.13701233, (float)0.14025325,
(float)0.14349262, (float)0.14673047, (float)0.14996676, (float)0.15320145,
(float)0.15643448, (float)0.15966582, (float)0.16289547, (float)0.16612339,
(float)0.16934951, (float)0.17257382, (float)0.17579629, (float)0.17901687,
(float)0.18223552, (float)0.18545224, (float)0.18866697, (float)0.19187967,
(float)0.19509032, (float)0.19829889, (float)0.20150533, (float)0.20470962,
(float)0.20791170, (float)0.21111156, (float)0.21430916, (float)0.21750447,
(float)0.22069745, (float)0.22388805, (float)0.22707628, (float)0.23026206,
(float)0.23344538, (float)0.23662618, (float)0.23980446, (float)0.24298020,
(float)0.24615330, (float)0.24932377, (float)0.25249159, (float)0.25565669,
(float)0.25881904, (float)0.26197866, (float)0.26513544, (float)0.26828939,
(float)0.27144045, (float)0.27458861, (float)0.27773386, (float)0.28087610,
(float)0.28401536, (float)0.28715158, (float)0.29028466, (float)0.29341471,
(float)0.29654160, (float)0.29966527, (float)0.30278578, (float)0.30590302,
(float)0.30901700, (float)0.31212768, (float)0.31523499, (float)0.31833893,
(float)0.32143945, (float)0.32453656, (float)0.32763019, (float)0.33072028,
(float)0.33380687, (float)0.33688986, (float)0.33996925, (float)0.34304500,
(float)0.34611708, (float)0.34918544, (float)0.35225007, (float)0.35531089,
(float)0.35836795, (float)0.36142117, (float)0.36447051, (float)0.36751595,
(float)0.37055743, (float)0.37359497, (float)0.37662852, (float)0.37965801,
(float)0.38268346, (float)0.38570479, (float)0.38872197, (float)0.39173502,
(float)0.39474389, (float)0.39774847, (float)0.40074885, (float)0.40374491,
(float)0.40673664, (float)0.40972406, (float)0.41270703, (float)0.41568562,
(float)0.41865975, (float)0.42162940, (float)0.42459452, (float)0.42755508,
(float)0.43051112, (float)0.43346250, (float)0.43640924, (float)0.43935132,
(float)0.44228873, (float)0.44522133, (float)0.44814920, (float)0.45107228,
(float)0.45399052, (float)0.45690390, (float)0.45981237, (float)0.46271592,
(float)0.46561453, (float)0.46850815, (float)0.47139674, (float)0.47428030,
(float)0.47715878, (float)0.48003215, (float)0.48290035, (float)0.48576337,
(float)0.48862126, (float)0.49147385, (float)0.49432120, (float)0.49716330,
(float)0.50000000, (float)0.50283140, (float)0.50565743, (float)0.50847799,
(float)0.51129311, (float)0.51410276, (float)0.51690692, (float)0.51970553,
(float)0.52249855, (float)0.52528602, (float)0.52806789, (float)0.53084403,
(float)0.53361452, (float)0.53637928, (float)0.53913832, (float)0.54189163,
(float)0.54463905, (float)0.54738063, (float)0.55011642, (float)0.55284631,
(float)0.55557024, (float)0.55828828, (float)0.56100029, (float)0.56370628,
(float)0.56640625, (float)0.56910014, (float)0.57178795, (float)0.57446963,
(float)0.57714522, (float)0.57981455, (float)0.58247769, (float)0.58513463,
(float)0.58778524, (float)0.59042960, (float)0.59306765, (float)0.59569931,
(float)0.59832460, (float)0.60094351, (float)0.60355598, (float)0.60616195,
(float)0.60876143, (float)0.61135441, (float)0.61394083, (float)0.61652070,
(float)0.61909395, (float)0.62166059, (float)0.62422055, (float)0.62677383,
(float)0.62932038, (float)0.63186020, (float)0.63439333, (float)0.63691956,
(float)0.63943899, (float)0.64195162, (float)0.64445734, (float)0.64695615,
(float)0.64944810, (float)0.65193301, (float)0.65441096, (float)0.65688187,
(float)0.65934587, (float)0.66180271, (float)0.66425246, (float)0.66669512,
(float)0.66913062, (float)0.67155898, (float)0.67398012, (float)0.67639405,
(float)0.67880076, (float)0.68120021, (float)0.68359232, (float)0.68597710,
(float)0.68835455, (float)0.69072467, (float)0.69308740, (float)0.69544262,
(float)0.69779050, (float)0.70013082, (float)0.70246369, (float)0.70478904,
(float)0.70710677, (float)0.70941699, (float)0.71171963, (float)0.71401459,
(float)0.71630198, (float)0.71858168, (float)0.72085363, (float)0.72311789,
(float)0.72537440, (float)0.72762316, (float)0.72986406, (float)0.73209721,
(float)0.73432255, (float)0.73653996, (float)0.73874950, (float)0.74095118,
(float)0.74314487, (float)0.74533057, (float)0.74750835, (float)0.74967808,
(float)0.75183982, (float)0.75399351, (float)0.75613910, (float)0.75827658,
(float)0.76040596, (float)0.76252723, (float)0.76464027, (float)0.76674515,
(float)0.76884186, (float)0.77093029, (float)0.77301043, (float)0.77508241,
(float)0.77714598, (float)0.77920127, (float)0.78124821, (float)0.78328675,
(float)0.78531694, (float)0.78733873, (float)0.78935206, (float)0.79135692,
(float)0.79335338, (float)0.79534125, (float)0.79732066, (float)0.79929149,
(float)0.80125386, (float)0.80320752, (float)0.80515265, (float)0.80708915,
(float)0.80901700, (float)0.81093621, (float)0.81284672, (float)0.81474853,
(float)0.81664157, (float)0.81852591, (float)0.82040149, (float)0.82226825,
(float)0.82412618, (float)0.82597536, (float)0.82781565, (float)0.82964706,
(float)0.83146966, (float)0.83328325, (float)0.83508795, (float)0.83688378,
(float)0.83867061, (float)0.84044838, (float)0.84221727, (float)0.84397703,
(float)0.84572780, (float)0.84746957, (float)0.84920216, (float)0.85092574,
(float)0.85264021, (float)0.85434544, (float)0.85604161, (float)0.85772866,
(float)0.85940641, (float)0.86107504, (float)0.86273444, (float)0.86438453,
(float)0.86602545, (float)0.86765707, (float)0.86927933, (float)0.87089235,
(float)0.87249607, (float)0.87409031, (float)0.87567532, (float)0.87725097,
(float)0.87881714, (float)0.88037390, (float)0.88192129, (float)0.88345921,
(float)0.88498765, (float)0.88650668, (float)0.88801610, (float)0.88951612,
(float)0.89100653, (float)0.89248741, (float)0.89395881, (float)0.89542055,
(float)0.89687276, (float)0.89831537, (float)0.89974827, (float)0.90117162,
(float)0.90258533, (float)0.90398932, (float)0.90538365, (float)0.90676826,
(float)0.90814316, (float)0.90950841, (float)0.91086388, (float)0.91220951,
(float)0.91354549, (float)0.91487163, (float)0.91618794, (float)0.91749454,
(float)0.91879123, (float)0.92007810, (float)0.92135513, (float)0.92262226,
(float)0.92387950, (float)0.92512691, (float)0.92636442, (float)0.92759192,
(float)0.92880958, (float)0.93001723, (float)0.93121493, (float)0.93240267,
(float)0.93358046, (float)0.93474817, (float)0.93590593, (float)0.93705362,
(float)0.93819135, (float)0.93931901, (float)0.94043654, (float)0.94154406,
(float)0.94264150, (float)0.94372880, (float)0.94480604, (float)0.94587320,
(float)0.94693011, (float)0.94797695, (float)0.94901365, (float)0.95004016,
(float)0.95105654, (float)0.95206273, (float)0.95305866, (float)0.95404440,
(float)0.95501995, (float)0.95598525, (float)0.95694035, (float)0.95788521,
(float)0.95881975, (float)0.95974404, (float)0.96065807, (float)0.96156180,
(float)0.96245527, (float)0.96333838, (float)0.96421117, (float)0.96507370,
(float)0.96592581, (float)0.96676767, (float)0.96759909, (float)0.96842021,
(float)0.96923089, (float)0.97003126, (float)0.97082120, (float)0.97160077,
(float)0.97236991, (float)0.97312868, (float)0.97387701, (float)0.97461486,
(float)0.97534233, (float)0.97605932, (float)0.97676587, (float)0.97746199,
(float)0.97814763, (float)0.97882277, (float)0.97948742, (float)0.98014158,
(float)0.98078531, (float)0.98141843, (float)0.98204112, (float)0.98265332,
(float)0.98325491, (float)0.98384601, (float)0.98442656, (float)0.98499662,
(float)0.98555607, (float)0.98610497, (float)0.98664331, (float)0.98717111,
(float)0.98768836, (float)0.98819500, (float)0.98869103, (float)0.98917651,
(float)0.98965138, (float)0.99011570, (float)0.99056935, (float)0.99101239,
(float)0.99144489, (float)0.99186671, (float)0.99227792, (float)0.99267852,
(float)0.99306846, (float)0.99344778, (float)0.99381649, (float)0.99417448,
(float)0.99452192, (float)0.99485862, (float)0.99518472, (float)0.99550015,
(float)0.99580491, (float)0.99609905, (float)0.99638247, (float)0.99665523,
(float)0.99691731, (float)0.99716878, (float)0.99740952, (float)0.99763954,
(float)0.99785894, (float)0.99806762, (float)0.99826562, (float)0.99845290,
(float)0.99862951, (float)0.99879545, (float)0.99895066, (float)0.99909520,
(float)0.99922901, (float)0.99935216, (float)0.99946457, (float)0.99956632,
(float)0.99965733, (float)0.99973762, (float)0.99980724, (float)0.99986613,
(float)0.99991435, (float)0.99995178, (float)0.99997860, (float)0.99999464,
(float)1.00000000, (float)0.99999464, (float)0.99997860, (float)0.99995178,
(float)0.99991435, (float)0.99986613, (float)0.99980724, (float)0.99973762,
(float)0.99965733, (float)0.99956632, (float)0.99946457, (float)0.99935216,
(float)0.99922901, (float)0.99909520, (float)0.99895066, (float)0.99879545,
(float)0.99862951, (float)0.99845290, (float)0.99826562, (float)0.99806762,
(float)0.99785894, (float)0.99763954, (float)0.99740946, (float)0.99716872,
(float)0.99691731, (float)0.99665523, (float)0.99638247, (float)0.99609905,
(float)0.99580491, (float)0.99550015, (float)0.99518472, (float)0.99485862,
(float)0.99452192, (float)0.99417448, (float)0.99381644, (float)0.99344778,
(float)0.99306846, (float)0.99267852, (float)0.99227792, (float)0.99186671,
(float)0.99144489, (float)0.99101239, (float)0.99056935, (float)0.99011564,
(float)0.98965138, (float)0.98917651, (float)0.98869103, (float)0.98819494,
(float)0.98768836, (float)0.98717111, (float)0.98664331, (float)0.98610497,
(float)0.98555607, (float)0.98499656, (float)0.98442656, (float)0.98384601,
(float)0.98325491, (float)0.98265326, (float)0.98204112, (float)0.98141843,
(float)0.98078525, (float)0.98014158, (float)0.97948742, (float)0.97882277,
(float)0.97814757, (float)0.97746193, (float)0.97676587, (float)0.97605932,
(float)0.97534227, (float)0.97461486, (float)0.97387695, (float)0.97312862,
(float)0.97236991, (float)0.97160077, (float)0.97082120, (float)0.97003126,
(float)0.96923089, (float)0.96842015, (float)0.96759909, (float)0.96676761,
(float)0.96592581, (float)0.96507365, (float)0.96421117, (float)0.96333838,
(float)0.96245521, (float)0.96156180, (float)0.96065807, (float)0.95974404,
(float)0.95881969, (float)0.95788515, (float)0.95694029, (float)0.95598525,
(float)0.95501995, (float)0.95404440, (float)0.95305860, (float)0.95206267,
(float)0.95105648, (float)0.95004016, (float)0.94901365, (float)0.94797695,
(float)0.94693011, (float)0.94587314, (float)0.94480604, (float)0.94372880,
(float)0.94264150, (float)0.94154406, (float)0.94043654, (float)0.93931895,
(float)0.93819129, (float)0.93705362, (float)0.93590593, (float)0.93474817,
(float)0.93358046, (float)0.93240267, (float)0.93121493, (float)0.93001723,
(float)0.92880952, (float)0.92759192, (float)0.92636436, (float)0.92512691,
(float)0.92387950, (float)0.92262226, (float)0.92135507, (float)0.92007804,
(float)0.91879123, (float)0.91749448, (float)0.91618794, (float)0.91487157,
(float)0.91354543, (float)0.91220951, (float)0.91086382, (float)0.90950835,
(float)0.90814310, (float)0.90676820, (float)0.90538365, (float)0.90398932,
(float)0.90258527, (float)0.90117157, (float)0.89974827, (float)0.89831525,
(float)0.89687276, (float)0.89542055, (float)0.89395875, (float)0.89248741,
(float)0.89100647, (float)0.88951600, (float)0.88801610, (float)0.88650662,
(float)0.88498759, (float)0.88345915, (float)0.88192123, (float)0.88037384,
(float)0.87881714, (float)0.87725091, (float)0.87567532, (float)0.87409031,
(float)0.87249595, (float)0.87089223, (float)0.86927933, (float)0.86765701,
(float)0.86602539, (float)0.86438447, (float)0.86273432, (float)0.86107504,
(float)0.85940641, (float)0.85772860, (float)0.85604161, (float)0.85434544,
(float)0.85264009, (float)0.85092574, (float)0.84920216, (float)0.84746951,
(float)0.84572780, (float)0.84397697, (float)0.84221715, (float)0.84044844,
(float)0.83867055, (float)0.83688372, (float)0.83508795, (float)0.83328319,
(float)0.83146954, (float)0.82964706, (float)0.82781565, (float)0.82597530,
(float)0.82412612, (float)0.82226813, (float)0.82040137, (float)0.81852591,
(float)0.81664157, (float)0.81474847, (float)0.81284660, (float)0.81093609,
(float)0.80901700, (float)0.80708915, (float)0.80515265, (float)0.80320752,
(float)0.80125374, (float)0.79929143, (float)0.79732066, (float)0.79534125,
(float)0.79335332, (float)0.79135686, (float)0.78935200, (float)0.78733861,
(float)0.78531694, (float)0.78328675, (float)0.78124815, (float)0.77920121,
(float)0.77714586, (float)0.77508223, (float)0.77301049, (float)0.77093029,
(float)0.76884180, (float)0.76674509, (float)0.76464021, (float)0.76252711,
(float)0.76040596, (float)0.75827658, (float)0.75613904, (float)0.75399339,
(float)0.75183970, (float)0.74967796, (float)0.74750835, (float)0.74533057,
(float)0.74314481, (float)0.74095106, (float)0.73874938, (float)0.73653996,
(float)0.73432249, (float)0.73209721, (float)0.72986400, (float)0.72762305,
(float)0.72537428, (float)0.72311789, (float)0.72085363, (float)0.71858162,
(float)0.71630186, (float)0.71401453, (float)0.71171951, (float)0.70941705,
(float)0.70710677, (float)0.70478898, (float)0.70246363, (float)0.70013070,
(float)0.69779032, (float)0.69544268, (float)0.69308734, (float)0.69072461,
(float)0.68835449, (float)0.68597704, (float)0.68359220, (float)0.68120021,
(float)0.67880070, (float)0.67639399, (float)0.67398006, (float)0.67155886,
(float)0.66913044, (float)0.66669512, (float)0.66425240, (float)0.66180259,
(float)0.65934575, (float)0.65688181, (float)0.65441096, (float)0.65193301,
(float)0.64944804, (float)0.64695609, (float)0.64445722, (float)0.64195150,
(float)0.63943905, (float)0.63691956, (float)0.63439327, (float)0.63186014,
(float)0.62932026, (float)0.62677372, (float)0.62422055, (float)0.62166059,
(float)0.61909389, (float)0.61652064, (float)0.61394072, (float)0.61135429,
(float)0.60876143, (float)0.60616189, (float)0.60355592, (float)0.60094339,
(float)0.59832448, (float)0.59569913, (float)0.59306765, (float)0.59042960,
(float)0.58778518, (float)0.58513451, (float)0.58247757, (float)0.57981461,
(float)0.57714522, (float)0.57446963, (float)0.57178789, (float)0.56910002,
(float)0.56640613, (float)0.56370628, (float)0.56100023, (float)0.55828822,
(float)0.55557019, (float)0.55284619, (float)0.55011630, (float)0.54738069,
(float)0.54463905, (float)0.54189152, (float)0.53913826, (float)0.53637916,
(float)0.53361434, (float)0.53084403, (float)0.52806783, (float)0.52528596,
(float)0.52249849, (float)0.51970541, (float)0.51690674, (float)0.51410276,
(float)0.51129305, (float)0.50847787, (float)0.50565726, (float)0.50283122,
(float)0.50000006, (float)0.49716327, (float)0.49432117, (float)0.49147379,
(float)0.48862115, (float)0.48576325, (float)0.48290038, (float)0.48003212,
(float)0.47715873, (float)0.47428021, (float)0.47139663, (float)0.46850798,
(float)0.46561456, (float)0.46271589, (float)0.45981231, (float)0.45690379,
(float)0.45399037, (float)0.45107210, (float)0.44814920, (float)0.44522130,
(float)0.44228864, (float)0.43935123, (float)0.43640912, (float)0.43346232,
(float)0.43051112, (float)0.42755505, (float)0.42459446, (float)0.42162928,
(float)0.41865960, (float)0.41568545, (float)0.41270703, (float)0.40972400,
(float)0.40673658, (float)0.40374479, (float)0.40074870, (float)0.39774850,
(float)0.39474386, (float)0.39173496, (float)0.38872188, (float)0.38570464,
(float)0.38268328, (float)0.37965804, (float)0.37662849, (float)0.37359491,
(float)0.37055734, (float)0.36751580, (float)0.36447033, (float)0.36142117,
(float)0.35836792, (float)0.35531086, (float)0.35224995, (float)0.34918529,
(float)0.34611690, (float)0.34304500, (float)0.33996922, (float)0.33688980,
(float)0.33380675, (float)0.33072016, (float)0.32763001, (float)0.32453656,
(float)0.32143945, (float)0.31833887, (float)0.31523487, (float)0.31212750,
(float)0.30901679, (float)0.30590302, (float)0.30278572, (float)0.29966521,
(float)0.29654145, (float)0.29341453, (float)0.29028472, (float)0.28715155,
(float)0.28401530, (float)0.28087601, (float)0.27773371, (float)0.27458847,
(float)0.27144048, (float)0.26828936, (float)0.26513538, (float)0.26197854,
(float)0.25881892, (float)0.25565651, (float)0.25249159, (float)0.24932374,
(float)0.24615324, (float)0.24298008, (float)0.23980433, (float)0.23662600,
(float)0.23344538, (float)0.23026201, (float)0.22707619, (float)0.22388794,
(float)0.22069728, (float)0.21750426, (float)0.21430916, (float)0.21111152,
(float)0.20791161, (float)0.20470949, (float)0.20150517, (float)0.19829892,
(float)0.19509031, (float)0.19187963, (float)0.18866688, (float)0.18545210,
(float)0.18223536, (float)0.17901689, (float)0.17579627, (float)0.17257376,
(float)0.16934940, (float)0.16612324, (float)0.16289529, (float)0.15966584,
(float)0.15643445, (float)0.15320137, (float)0.14996666, (float)0.14673033,
(float)0.14349243, (float)0.14025325, (float)0.13701232, (float)0.13376991,
(float)0.13052608, (float)0.12728085, (float)0.12403426, (float)0.12078657,
(float)0.11753736, (float)0.11428688, (float)0.11103519, (float)0.10778230,
(float)0.10452849, (float)0.10127334, (float)0.09801710, (float)0.09475980,
(float)0.09150149, (float)0.08824220, (float)0.08498220, (float)0.08172106,
(float)0.07845904, (float)0.07519618, (float)0.07193252, (float)0.06866808,
(float)0.06540315, (float)0.06213728, (float)0.05887074, (float)0.05560357,
(float)0.05233581, (float)0.04906749, (float)0.04579888, (float)0.04252954,
(float)0.03925974, (float)0.03598953, (float)0.03271893, (float)0.02944798,
(float)0.02617695, (float)0.02290541, (float)0.01963361, (float)0.01636161,
(float)0.01308943, (float)0.00981712, (float)0.00654493, (float)0.00327244,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
(float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000};
#endif // MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_

View file

@ -504,6 +504,12 @@ void AudioProcessingSimulator::CreateAudioProcessor() {
*settings_.maximum_internal_processing_rate; *settings_.maximum_internal_processing_rate;
} }
const bool use_legacy_ns =
settings_.use_legacy_ns && *settings_.use_legacy_ns;
if (use_legacy_ns) {
apm_config.noise_suppression.use_legacy_ns = use_legacy_ns;
}
if (settings_.use_ns) { if (settings_.use_ns) {
apm_config.noise_suppression.enabled = *settings_.use_ns; apm_config.noise_suppression.enabled = *settings_.use_ns;
} }

View file

@ -65,6 +65,7 @@ struct SimulationSettings {
absl::optional<bool> use_extended_filter; absl::optional<bool> use_extended_filter;
absl::optional<bool> use_drift_compensation; absl::optional<bool> use_drift_compensation;
absl::optional<bool> use_legacy_aec; absl::optional<bool> use_legacy_aec;
absl::optional<bool> use_legacy_ns;
absl::optional<bool> use_experimental_agc; absl::optional<bool> use_experimental_agc;
absl::optional<bool> use_experimental_agc_agc2_level_estimator; absl::optional<bool> use_experimental_agc_agc2_level_estimator;
absl::optional<bool> experimental_agc_disable_digital_adaptive; absl::optional<bool> experimental_agc_disable_digital_adaptive;

View file

@ -129,6 +129,10 @@ ABSL_FLAG(int,
use_legacy_aec, use_legacy_aec,
kParameterNotSpecifiedValue, kParameterNotSpecifiedValue,
"Activate (1) or deactivate(0) the legacy AEC"); "Activate (1) or deactivate(0) the legacy AEC");
ABSL_FLAG(int,
use_legacy_ns,
kParameterNotSpecifiedValue,
"Activate (1) or deactivate(0) the legacy AEC");
ABSL_FLAG(int, ABSL_FLAG(int,
experimental_agc, experimental_agc,
kParameterNotSpecifiedValue, kParameterNotSpecifiedValue,
@ -393,6 +397,8 @@ SimulationSettings CreateSettings() {
SetSettingIfFlagSet(absl::GetFlag(FLAGS_use_legacy_aec), SetSettingIfFlagSet(absl::GetFlag(FLAGS_use_legacy_aec),
&settings.use_legacy_aec); &settings.use_legacy_aec);
SetSettingIfFlagSet(absl::GetFlag(FLAGS_use_legacy_ns),
&settings.use_legacy_ns);
SetSettingIfFlagSet(absl::GetFlag(FLAGS_experimental_agc), SetSettingIfFlagSet(absl::GetFlag(FLAGS_experimental_agc),
&settings.use_experimental_agc); &settings.use_experimental_agc);
SetSettingIfFlagSet( SetSettingIfFlagSet(

View file

@ -20,7 +20,7 @@
#include "common_audio/include/audio_util.h" #include "common_audio/include/audio_util.h"
#include "common_audio/signal_processing/include/signal_processing_library.h" #include "common_audio/signal_processing/include/signal_processing_library.h"
#include "common_audio/third_party/fft4g/fft4g.h" #include "common_audio/third_party/fft4g/fft4g.h"
#include "modules/audio_processing/ns/windows_private.h" #include "modules/audio_processing/legacy_ns/windows_private.h"
#include "modules/audio_processing/transient/common.h" #include "modules/audio_processing/transient/common.h"
#include "modules/audio_processing/transient/transient_detector.h" #include "modules/audio_processing/transient/transient_detector.h"
#include "rtc_base/checks.h" #include "rtc_base/checks.h"

View file

@ -1 +1 @@
e9569d846d21e027bfdcae76a40146bc10d49d54 a3bf32dd233cbc5009bd4efce12a5e019771cafb

View file

@ -1 +1 @@
53dd63154cc2694a3425596d9a8300fa2c66215d d2c18cded77614146135b1fd1296c4211d22d754