diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn index dfbe9ff3ae..20126347b8 100644 --- a/modules/audio_processing/BUILD.gn +++ b/modules/audio_processing/BUILD.gn @@ -121,8 +121,6 @@ rtc_library("audio_processing") { "gain_controller2.h", "include/aec_dump.cc", "include/aec_dump.h", - "legacy_noise_suppression.cc", - "legacy_noise_suppression.h", "level_estimator.cc", "level_estimator.h", "render_queue_item_verifier.h", @@ -156,7 +154,6 @@ rtc_library("audio_processing") { ":audio_buffer", ":audio_frame_view", ":audio_generator_interface", - ":audio_processing_c", ":audio_processing_statistics", ":config", ":high_pass_filter", @@ -186,17 +183,13 @@ rtc_library("audio_processing") { "agc2:adaptive_digital", "agc2:fixed_digital", "agc2:gain_applier", + "legacy_ns:legacy_ns", + "legacy_ns:legacy_ns_c", "ns", "vad", "//third_party/abseil-cpp/absl/types:optional", ] - if (rtc_prefer_fixed_point) { - defines += [ "WEBRTC_NS_FIXED" ] - } else { - defines += [ "WEBRTC_NS_FLOAT" ] - } - deps += [ "../../common_audio", "../../common_audio:fir_filter", @@ -268,56 +261,6 @@ rtc_library("file_audio_generator") { ] } -rtc_source_set("audio_processing_c") { - visibility = [ ":*" ] # Only targets in this file can depend on this. - sources = [ - "legacy_ns/windows_private.h", - ] - - if (rtc_prefer_fixed_point) { - sources += [ - "legacy_ns/noise_suppression_x.c", - "legacy_ns/noise_suppression_x.h", - "legacy_ns/nsx_core.c", - "legacy_ns/nsx_core.h", - "legacy_ns/nsx_defines.h", - ] - if (current_cpu == "mipsel") { - sources += [ "legacy_ns/nsx_core_mips.c" ] - } else { - sources += [ "legacy_ns/nsx_core_c.c" ] - } - } else { - sources += [ - "legacy_ns/defines.h", - "legacy_ns/noise_suppression.c", - "legacy_ns/noise_suppression.h", - "legacy_ns/ns_core.c", - "legacy_ns/ns_core.h", - ] - } - - deps = [ - "../../common_audio", - "../../common_audio:common_audio_c", - "../../common_audio/third_party/fft4g", - "../../rtc_base:checks", - "../../rtc_base:rtc_base_approved", - "../../system_wrappers:cpu_features_api", - "agc:agc_legacy_c", - ] - - if (rtc_build_with_neon) { - sources += [ "legacy_ns/nsx_core_neon.c" ] - - if (current_cpu != "arm64") { - # Enable compilation for the NEON instruction set. - suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ] - cflags = [ "-mfpu=neon" ] - } - } -} - if (rtc_enable_protobuf) { proto_library("audioproc_debug_proto") { sources = [ @@ -443,6 +386,7 @@ if (rtc_include_tests) { "agc2:rnn_vad_with_level_unittests", "agc2:test_utils", "agc2/rnn_vad:unittests", + "legacy_ns:legacy_ns", "test/conversational_speech:unittest", "utility:legacy_delay_estimator_unittest", "utility:pffft_wrapper_unittest", @@ -486,7 +430,6 @@ if (rtc_include_tests) { "echo_detector/normalized_covariance_estimator_unittest.cc", "gain_control_unittest.cc", "high_pass_filter_unittest.cc", - "legacy_noise_suppression_unittest.cc", "level_estimator_unittest.cc", "residual_echo_detector_unittest.cc", "rms_level_unittest.cc", diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h index dcc2fa6f5f..08379ad0a3 100644 --- a/modules/audio_processing/audio_processing_impl.h +++ b/modules/audio_processing/audio_processing_impl.h @@ -27,7 +27,7 @@ #include "modules/audio_processing/include/aec_dump.h" #include "modules/audio_processing/include/audio_processing.h" #include "modules/audio_processing/include/audio_processing_statistics.h" -#include "modules/audio_processing/legacy_noise_suppression.h" +#include "modules/audio_processing/legacy_ns/legacy_noise_suppression.h" #include "modules/audio_processing/level_estimator.h" #include "modules/audio_processing/ns/noise_suppressor.h" #include "modules/audio_processing/render_queue_item_verifier.h" diff --git a/modules/audio_processing/legacy_ns/BUILD.gn b/modules/audio_processing/legacy_ns/BUILD.gn new file mode 100644 index 0000000000..649caf003d --- /dev/null +++ b/modules/audio_processing/legacy_ns/BUILD.gn @@ -0,0 +1,109 @@ +# 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_library("legacy_ns") { + visibility = [ "*" ] # Only targets in this file can depend on this. + sources = [ + "legacy_noise_suppression.cc", + "legacy_noise_suppression.h", + ] + + if (rtc_prefer_fixed_point) { + defines = [ "WEBRTC_NS_FIXED" ] + } else { + defines = [ "WEBRTC_NS_FLOAT" ] + } + + deps = [ + ":legacy_ns_c", + "..:audio_buffer", + "../../../common_audio", + "../../../common_audio:common_audio_c", + "../../../rtc_base:checks", + "../../../rtc_base:rtc_base_approved", + "../../../system_wrappers:cpu_features_api", + ] +} + +rtc_library("legacy_ns_c") { + visibility = [ "*" ] # Only targets in this file can depend on this. + sources = [ + "windows_private.h", + ] + + if (rtc_prefer_fixed_point) { + sources += [ + "noise_suppression_x.c", + "noise_suppression_x.h", + "nsx_core.c", + "nsx_core.h", + "nsx_core_c.c", + "nsx_defines.h", + ] + } else { + sources += [ + "defines.h", + "noise_suppression.c", + "noise_suppression.h", + "ns_core.c", + "ns_core.h", + ] + } + + if (rtc_prefer_fixed_point) { + defines = [ "WEBRTC_NS_FIXED" ] + } else { + defines = [ "WEBRTC_NS_FLOAT" ] + } + + deps = [ + "..:audio_buffer", + "../../../common_audio", + "../../../common_audio:common_audio_c", + "../../../common_audio/third_party/fft4g", + "../../../rtc_base:checks", + "../../../rtc_base:rtc_base_approved", + "../../../system_wrappers:cpu_features_api", + ] + + if (rtc_build_with_neon) { + sources += [ "nsx_core_neon.c" ] + + if (current_cpu != "arm64") { + # Enable compilation for the NEON instruction set. + suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ] + cflags = [ "-mfpu=neon" ] + } + } +} + +if (rtc_include_tests) { + rtc_source_set("legacy_ns_unittests") { + testonly = true + + configs += [] + sources = [ + "legacy_noise_suppression_unittest.cc", + ] + + deps = [ + "..:audio_buffer", + "..:audioproc_test_utils", + "../../../api:array_view", + "../../../test:test_support", + ] + + defines = [] + + if (rtc_enable_protobuf) { + sources += [] + } + } +} diff --git a/modules/audio_processing/legacy_noise_suppression.cc b/modules/audio_processing/legacy_ns/legacy_noise_suppression.cc similarity index 98% rename from modules/audio_processing/legacy_noise_suppression.cc rename to modules/audio_processing/legacy_ns/legacy_noise_suppression.cc index b2c88536ca..52193a93a3 100644 --- a/modules/audio_processing/legacy_noise_suppression.cc +++ b/modules/audio_processing/legacy_ns/legacy_noise_suppression.cc @@ -8,7 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "modules/audio_processing/legacy_noise_suppression.h" +#include "modules/audio_processing/legacy_ns/legacy_noise_suppression.h" #include "modules/audio_processing/audio_buffer.h" #include "rtc_base/checks.h" diff --git a/modules/audio_processing/legacy_noise_suppression.h b/modules/audio_processing/legacy_ns/legacy_noise_suppression.h similarity index 89% rename from modules/audio_processing/legacy_noise_suppression.h rename to modules/audio_processing/legacy_ns/legacy_noise_suppression.h index c2435dbc08..c599bc5823 100644 --- a/modules/audio_processing/legacy_noise_suppression.h +++ b/modules/audio_processing/legacy_ns/legacy_noise_suppression.h @@ -8,8 +8,8 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_ -#define MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_ +#ifndef MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_ +#define MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_ #include #include @@ -54,4 +54,4 @@ class NoiseSuppression { }; } // namespace webrtc -#endif // MODULES_AUDIO_PROCESSING_LEGACY_NOISE_SUPPRESSION_H_ +#endif // MODULES_AUDIO_PROCESSING_LEGACY_NS_LEGACY_NOISE_SUPPRESSION_H_ diff --git a/modules/audio_processing/legacy_noise_suppression_unittest.cc b/modules/audio_processing/legacy_ns/legacy_noise_suppression_unittest.cc similarity index 100% rename from modules/audio_processing/legacy_noise_suppression_unittest.cc rename to modules/audio_processing/legacy_ns/legacy_noise_suppression_unittest.cc diff --git a/modules/audio_processing/legacy_ns/nsx_core_mips.c b/modules/audio_processing/legacy_ns/nsx_core_mips.c deleted file mode 100644 index af4c287289..0000000000 --- a/modules/audio_processing/legacy_ns/nsx_core_mips.c +++ /dev/null @@ -1,1001 +0,0 @@ -/* - * Copyright (c) 2013 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 - -#include "rtc_base/checks.h" -#include "modules/audio_processing/legacy_ns/noise_suppression_x.h" -#include "modules/audio_processing/legacy_ns/nsx_core.h" - -static const int16_t kIndicatorTable[17] = { - 0, 2017, 3809, 5227, 6258, 6963, 7424, 7718, - 7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187 -}; - -// Compute speech/noise probability -// speech/noise probability is returned in: probSpeechFinal -//snrLocPrior is the prior SNR for each frequency (in Q11) -//snrLocPost is the post SNR for each frequency (in Q11) -void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst, - uint16_t* nonSpeechProbFinal, - uint32_t* priorLocSnr, - uint32_t* postLocSnr) { - uint32_t tmpU32no1, tmpU32no2, tmpU32no3; - int32_t indPriorFX, tmp32no1; - int32_t logLrtTimeAvgKsumFX; - int16_t indPriorFX16; - int16_t tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac; - size_t i; - int normTmp, nShifts; - - int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9; - int32_t const_max = 0x7fffffff; - int32_t const_neg43 = -43; - int32_t const_5412 = 5412; - int32_t const_11rsh12 = (11 << 12); - int32_t const_178 = 178; - - - // compute feature based on average LR factor - // this is the average over all frequencies of the smooth log LRT - logLrtTimeAvgKsumFX = 0; - for (i = 0; i < inst->magnLen; i++) { - r0 = postLocSnr[i]; // Q11 - r1 = priorLocSnr[i]; - r2 = inst->logLrtTimeAvgW32[i]; - - __asm __volatile( - ".set push \n\t" - ".set noreorder \n\t" - "clz %[r3], %[r0] \n\t" - "clz %[r5], %[r1] \n\t" - "slti %[r4], %[r3], 32 \n\t" - "slti %[r6], %[r5], 32 \n\t" - "movz %[r3], $0, %[r4] \n\t" - "movz %[r5], $0, %[r6] \n\t" - "slti %[r4], %[r3], 11 \n\t" - "addiu %[r6], %[r3], -11 \n\t" - "neg %[r7], %[r6] \n\t" - "sllv %[r6], %[r1], %[r6] \n\t" - "srav %[r7], %[r1], %[r7] \n\t" - "movn %[r6], %[r7], %[r4] \n\t" - "sllv %[r1], %[r1], %[r5] \n\t" - "and %[r1], %[r1], %[const_max] \n\t" - "sra %[r1], %[r1], 19 \n\t" - "mul %[r7], %[r1], %[r1] \n\t" - "sllv %[r3], %[r0], %[r3] \n\t" - "divu %[r8], %[r3], %[r6] \n\t" - "slti %[r6], %[r6], 1 \n\t" - "mul %[r7], %[r7], %[const_neg43] \n\t" - "sra %[r7], %[r7], 19 \n\t" - "movz %[r3], %[r8], %[r6] \n\t" - "subu %[r0], %[r0], %[r3] \n\t" - "movn %[r0], $0, %[r6] \n\t" - "mul %[r1], %[r1], %[const_5412] \n\t" - "sra %[r1], %[r1], 12 \n\t" - "addu %[r7], %[r7], %[r1] \n\t" - "addiu %[r1], %[r7], 37 \n\t" - "addiu %[r5], %[r5], -31 \n\t" - "neg %[r5], %[r5] \n\t" - "sll %[r5], %[r5], 12 \n\t" - "addu %[r5], %[r5], %[r1] \n\t" - "subu %[r7], %[r5], %[const_11rsh12] \n\t" - "mul %[r7], %[r7], %[const_178] \n\t" - "sra %[r7], %[r7], 8 \n\t" - "addu %[r7], %[r7], %[r2] \n\t" - "sra %[r7], %[r7], 1 \n\t" - "subu %[r2], %[r2], %[r7] \n\t" - "addu %[r2], %[r2], %[r0] \n\t" - ".set pop \n\t" - : [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2), - [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5), - [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8) - : [const_max] "r" (const_max), [const_neg43] "r" (const_neg43), - [const_5412] "r" (const_5412), [const_11rsh12] "r" (const_11rsh12), - [const_178] "r" (const_178) - : "hi", "lo" - ); - inst->logLrtTimeAvgW32[i] = r2; - logLrtTimeAvgKsumFX += r2; - } - - inst->featureLogLrt = (logLrtTimeAvgKsumFX * BIN_SIZE_LRT) >> - (inst->stages + 11); - - // done with computation of LR factor - - // - // compute the indicator functions - // - - // average LRT feature - // FLOAT code - // indicator0 = 0.5 * (tanh(widthPrior * - // (logLrtTimeAvgKsum - threshPrior0)) + 1.0); - tmpIndFX = 16384; // Q14(1.0) - tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12 - nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5; - //use larger width in tanh map for pause regions - if (tmp32no1 < 0) { - tmpIndFX = 0; - tmp32no1 = -tmp32no1; - //widthPrior = widthPrior * 2.0; - nShifts++; - } - tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14 - // compute indicator function: sigmoid map - if (tmp32no1 < (16 << 14) && tmp32no1 >= 0) { - tableIndex = (int16_t)(tmp32no1 >> 14); - tmp16no2 = kIndicatorTable[tableIndex]; - tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex]; - frac = (int16_t)(tmp32no1 & 0x00003fff); // Q14 - tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14); - if (tmpIndFX == 0) { - tmpIndFX = 8192 - tmp16no2; // Q14 - } else { - tmpIndFX = 8192 + tmp16no2; // Q14 - } - } - indPriorFX = inst->weightLogLrt * tmpIndFX; // 6*Q14 - - //spectral flatness feature - if (inst->weightSpecFlat) { - tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10 - tmpIndFX = 16384; // Q14(1.0) - //use larger width in tanh map for pause regions - tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10 - nShifts = 4; - if (inst->thresholdSpecFlat < tmpU32no1) { - tmpIndFX = 0; - tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat; - //widthPrior = widthPrior * 2.0; - nShifts++; - } - tmpU32no1 = WebRtcSpl_DivU32U16(tmpU32no2 << nShifts, 25); //Q14 - // compute indicator function: sigmoid map - // FLOAT code - // indicator1 = 0.5 * (tanh(sgnMap * widthPrior * - // (threshPrior1 - tmpFloat1)) + 1.0); - if (tmpU32no1 < (16 << 14)) { - tableIndex = (int16_t)(tmpU32no1 >> 14); - tmp16no2 = kIndicatorTable[tableIndex]; - tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex]; - frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14 - tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14); - if (tmpIndFX) { - tmpIndFX = 8192 + tmp16no2; // Q14 - } else { - tmpIndFX = 8192 - tmp16no2; // Q14 - } - } - indPriorFX += inst->weightSpecFlat * tmpIndFX; // 6*Q14 - } - - //for template spectral-difference - if (inst->weightSpecDiff) { - tmpU32no1 = 0; - if (inst->featureSpecDiff) { - normTmp = WEBRTC_SPL_MIN(20 - inst->stages, - WebRtcSpl_NormU32(inst->featureSpecDiff)); - RTC_DCHECK_GE(normTmp, 0); - tmpU32no1 = inst->featureSpecDiff << normTmp; // Q(normTmp-2*stages) - tmpU32no2 = inst->timeAvgMagnEnergy >> (20 - inst->stages - normTmp); - if (tmpU32no2 > 0) { - // Q(20 - inst->stages) - tmpU32no1 /= tmpU32no2; - } else { - tmpU32no1 = (uint32_t)(0x7fffffff); - } - } - tmpU32no3 = (inst->thresholdSpecDiff << 17) / 25; - tmpU32no2 = tmpU32no1 - tmpU32no3; - nShifts = 1; - tmpIndFX = 16384; // Q14(1.0) - //use larger width in tanh map for pause regions - if (tmpU32no2 & 0x80000000) { - tmpIndFX = 0; - tmpU32no2 = tmpU32no3 - tmpU32no1; - //widthPrior = widthPrior * 2.0; - nShifts--; - } - tmpU32no1 = tmpU32no2 >> nShifts; - // compute indicator function: sigmoid map - /* FLOAT code - indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0); - */ - if (tmpU32no1 < (16 << 14)) { - tableIndex = (int16_t)(tmpU32no1 >> 14); - tmp16no2 = kIndicatorTable[tableIndex]; - tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex]; - frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14 - tmp16no2 += (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND( - tmp16no1, frac, 14); - if (tmpIndFX) { - tmpIndFX = 8192 + tmp16no2; - } else { - tmpIndFX = 8192 - tmp16no2; - } - } - indPriorFX += inst->weightSpecDiff * tmpIndFX; // 6*Q14 - } - - //combine the indicator function with the feature weights - // FLOAT code - // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 * - // indicator1 + weightIndPrior2 * indicator2); - indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14 - // done with computing indicator function - - //compute the prior probability - // FLOAT code - // inst->priorNonSpeechProb += PRIOR_UPDATE * - // (indPriorNonSpeech - inst->priorNonSpeechProb); - tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14 - inst->priorNonSpeechProb += (int16_t)((PRIOR_UPDATE_Q14 * tmp16) >> 14); - - //final speech probability: combine prior model with LR factor: - - memset(nonSpeechProbFinal, 0, sizeof(uint16_t) * inst->magnLen); - - if (inst->priorNonSpeechProb > 0) { - r0 = inst->priorNonSpeechProb; - r1 = 16384 - r0; - int32_t const_23637 = 23637; - int32_t const_44 = 44; - int32_t const_84 = 84; - int32_t const_1 = 1; - int32_t const_neg8 = -8; - for (i = 0; i < inst->magnLen; i++) { - r2 = inst->logLrtTimeAvgW32[i]; - if (r2 < 65300) { - __asm __volatile( - ".set push \n\t" - ".set noreorder \n\t" - "mul %[r2], %[r2], %[const_23637] \n\t" - "sll %[r6], %[r1], 16 \n\t" - "clz %[r7], %[r6] \n\t" - "clo %[r8], %[r6] \n\t" - "slt %[r9], %[r6], $0 \n\t" - "movn %[r7], %[r8], %[r9] \n\t" - "sra %[r2], %[r2], 14 \n\t" - "andi %[r3], %[r2], 0xfff \n\t" - "mul %[r4], %[r3], %[r3] \n\t" - "mul %[r3], %[r3], %[const_84] \n\t" - "sra %[r2], %[r2], 12 \n\t" - "slt %[r5], %[r2], %[const_neg8] \n\t" - "movn %[r2], %[const_neg8], %[r5] \n\t" - "mul %[r4], %[r4], %[const_44] \n\t" - "sra %[r3], %[r3], 7 \n\t" - "addiu %[r7], %[r7], -1 \n\t" - "slti %[r9], %[r7], 31 \n\t" - "movz %[r7], $0, %[r9] \n\t" - "sra %[r4], %[r4], 19 \n\t" - "addu %[r4], %[r4], %[r3] \n\t" - "addiu %[r3], %[r2], 8 \n\t" - "addiu %[r2], %[r2], -4 \n\t" - "neg %[r5], %[r2] \n\t" - "sllv %[r6], %[r4], %[r2] \n\t" - "srav %[r5], %[r4], %[r5] \n\t" - "slt %[r2], %[r2], $0 \n\t" - "movn %[r6], %[r5], %[r2] \n\t" - "sllv %[r3], %[const_1], %[r3] \n\t" - "addu %[r2], %[r3], %[r6] \n\t" - "clz %[r4], %[r2] \n\t" - "clo %[r5], %[r2] \n\t" - "slt %[r8], %[r2], $0 \n\t" - "movn %[r4], %[r5], %[r8] \n\t" - "addiu %[r4], %[r4], -1 \n\t" - "slt %[r5], $0, %[r2] \n\t" - "or %[r5], %[r5], %[r7] \n\t" - "movz %[r4], $0, %[r5] \n\t" - "addiu %[r6], %[r7], -7 \n\t" - "addu %[r6], %[r6], %[r4] \n\t" - "bltz %[r6], 1f \n\t" - " nop \n\t" - "addiu %[r4], %[r6], -8 \n\t" - "neg %[r3], %[r4] \n\t" - "srav %[r5], %[r2], %[r3] \n\t" - "mul %[r5], %[r5], %[r1] \n\t" - "mul %[r2], %[r2], %[r1] \n\t" - "slt %[r4], %[r4], $0 \n\t" - "srav %[r5], %[r5], %[r6] \n\t" - "sra %[r2], %[r2], 8 \n\t" - "movn %[r2], %[r5], %[r4] \n\t" - "sll %[r3], %[r0], 8 \n\t" - "addu %[r2], %[r0], %[r2] \n\t" - "divu %[r3], %[r3], %[r2] \n\t" - "1: \n\t" - ".set pop \n\t" - : [r2] "+r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4), - [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7), - [r8] "=&r" (r8), [r9] "=&r" (r9) - : [r0] "r" (r0), [r1] "r" (r1), [const_23637] "r" (const_23637), - [const_neg8] "r" (const_neg8), [const_84] "r" (const_84), - [const_1] "r" (const_1), [const_44] "r" (const_44) - : "hi", "lo" - ); - nonSpeechProbFinal[i] = r3; - } - } - } -} - -// Update analysis buffer for lower band, and window data before FFT. -void WebRtcNsx_AnalysisUpdate_mips(NoiseSuppressionFixedC* inst, - int16_t* out, - int16_t* new_speech) { - int iters, after; - int anaLen = (int)inst->anaLen; - int *window = (int*)inst->window; - int *anaBuf = (int*)inst->analysisBuffer; - int *outBuf = (int*)out; - int r0, r1, r2, r3, r4, r5, r6, r7; -#if defined(MIPS_DSP_R1_LE) - int r8; -#endif - - // For lower band update analysis buffer. - memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms, - (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer)); - memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech, - inst->blockLen10ms * sizeof(*inst->analysisBuffer)); - - // Window data before FFT. -#if defined(MIPS_DSP_R1_LE) - __asm __volatile( - ".set push \n\t" - ".set noreorder \n\t" - "sra %[iters], %[anaLen], 3 \n\t" - "1: \n\t" - "blez %[iters], 2f \n\t" - " nop \n\t" - "lw %[r0], 0(%[window]) \n\t" - "lw %[r1], 0(%[anaBuf]) \n\t" - "lw %[r2], 4(%[window]) \n\t" - "lw %[r3], 4(%[anaBuf]) \n\t" - "lw %[r4], 8(%[window]) \n\t" - "lw %[r5], 8(%[anaBuf]) \n\t" - "lw %[r6], 12(%[window]) \n\t" - "lw %[r7], 12(%[anaBuf]) \n\t" - "muleq_s.w.phl %[r8], %[r0], %[r1] \n\t" - "muleq_s.w.phr %[r0], %[r0], %[r1] \n\t" - "muleq_s.w.phl %[r1], %[r2], %[r3] \n\t" - "muleq_s.w.phr %[r2], %[r2], %[r3] \n\t" - "muleq_s.w.phl %[r3], %[r4], %[r5] \n\t" - "muleq_s.w.phr %[r4], %[r4], %[r5] \n\t" - "muleq_s.w.phl %[r5], %[r6], %[r7] \n\t" - "muleq_s.w.phr %[r6], %[r6], %[r7] \n\t" -#if defined(MIPS_DSP_R2_LE) - "precr_sra_r.ph.w %[r8], %[r0], 15 \n\t" - "precr_sra_r.ph.w %[r1], %[r2], 15 \n\t" - "precr_sra_r.ph.w %[r3], %[r4], 15 \n\t" - "precr_sra_r.ph.w %[r5], %[r6], 15 \n\t" - "sw %[r8], 0(%[outBuf]) \n\t" - "sw %[r1], 4(%[outBuf]) \n\t" - "sw %[r3], 8(%[outBuf]) \n\t" - "sw %[r5], 12(%[outBuf]) \n\t" -#else - "shra_r.w %[r8], %[r8], 15 \n\t" - "shra_r.w %[r0], %[r0], 15 \n\t" - "shra_r.w %[r1], %[r1], 15 \n\t" - "shra_r.w %[r2], %[r2], 15 \n\t" - "shra_r.w %[r3], %[r3], 15 \n\t" - "shra_r.w %[r4], %[r4], 15 \n\t" - "shra_r.w %[r5], %[r5], 15 \n\t" - "shra_r.w %[r6], %[r6], 15 \n\t" - "sll %[r0], %[r0], 16 \n\t" - "sll %[r2], %[r2], 16 \n\t" - "sll %[r4], %[r4], 16 \n\t" - "sll %[r6], %[r6], 16 \n\t" - "packrl.ph %[r0], %[r8], %[r0] \n\t" - "packrl.ph %[r2], %[r1], %[r2] \n\t" - "packrl.ph %[r4], %[r3], %[r4] \n\t" - "packrl.ph %[r6], %[r5], %[r6] \n\t" - "sw %[r0], 0(%[outBuf]) \n\t" - "sw %[r2], 4(%[outBuf]) \n\t" - "sw %[r4], 8(%[outBuf]) \n\t" - "sw %[r6], 12(%[outBuf]) \n\t" -#endif - "addiu %[window], %[window], 16 \n\t" - "addiu %[anaBuf], %[anaBuf], 16 \n\t" - "addiu %[outBuf], %[outBuf], 16 \n\t" - "b 1b \n\t" - " addiu %[iters], %[iters], -1 \n\t" - "2: \n\t" - "andi %[after], %[anaLen], 7 \n\t" - "3: \n\t" - "blez %[after], 4f \n\t" - " nop \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[anaBuf]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "addiu %[window], %[window], 2 \n\t" - "addiu %[anaBuf], %[anaBuf], 2 \n\t" - "addiu %[outBuf], %[outBuf], 2 \n\t" - "shra_r.w %[r0], %[r0], 14 \n\t" - "sh %[r0], -2(%[outBuf]) \n\t" - "b 3b \n\t" - " addiu %[after], %[after], -1 \n\t" - "4: \n\t" - ".set pop \n\t" - : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), - [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5), - [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8), - [iters] "=&r" (iters), [after] "=&r" (after), - [window] "+r" (window),[anaBuf] "+r" (anaBuf), - [outBuf] "+r" (outBuf) - : [anaLen] "r" (anaLen) - : "memory", "hi", "lo" - ); -#else - __asm __volatile( - ".set push \n\t" - ".set noreorder \n\t" - "sra %[iters], %[anaLen], 2 \n\t" - "1: \n\t" - "blez %[iters], 2f \n\t" - " nop \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[anaBuf]) \n\t" - "lh %[r2], 2(%[window]) \n\t" - "lh %[r3], 2(%[anaBuf]) \n\t" - "lh %[r4], 4(%[window]) \n\t" - "lh %[r5], 4(%[anaBuf]) \n\t" - "lh %[r6], 6(%[window]) \n\t" - "lh %[r7], 6(%[anaBuf]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "mul %[r2], %[r2], %[r3] \n\t" - "mul %[r4], %[r4], %[r5] \n\t" - "mul %[r6], %[r6], %[r7] \n\t" - "addiu %[window], %[window], 8 \n\t" - "addiu %[anaBuf], %[anaBuf], 8 \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "addiu %[r2], %[r2], 0x2000 \n\t" - "addiu %[r4], %[r4], 0x2000 \n\t" - "addiu %[r6], %[r6], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "sra %[r2], %[r2], 14 \n\t" - "sra %[r4], %[r4], 14 \n\t" - "sra %[r6], %[r6], 14 \n\t" - "sh %[r0], 0(%[outBuf]) \n\t" - "sh %[r2], 2(%[outBuf]) \n\t" - "sh %[r4], 4(%[outBuf]) \n\t" - "sh %[r6], 6(%[outBuf]) \n\t" - "addiu %[outBuf], %[outBuf], 8 \n\t" - "b 1b \n\t" - " addiu %[iters], %[iters], -1 \n\t" - "2: \n\t" - "andi %[after], %[anaLen], 3 \n\t" - "3: \n\t" - "blez %[after], 4f \n\t" - " nop \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[anaBuf]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "addiu %[window], %[window], 2 \n\t" - "addiu %[anaBuf], %[anaBuf], 2 \n\t" - "addiu %[outBuf], %[outBuf], 2 \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "sh %[r0], -2(%[outBuf]) \n\t" - "b 3b \n\t" - " addiu %[after], %[after], -1 \n\t" - "4: \n\t" - ".set pop \n\t" - : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), - [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5), - [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "=&r" (iters), - [after] "=&r" (after), [window] "+r" (window), - [anaBuf] "+r" (anaBuf), [outBuf] "+r" (outBuf) - : [anaLen] "r" (anaLen) - : "memory", "hi", "lo" - ); -#endif -} - -// For the noise supression process, synthesis, read out fully processed -// segment, and update synthesis buffer. -void WebRtcNsx_SynthesisUpdate_mips(NoiseSuppressionFixedC* inst, - int16_t* out_frame, - int16_t gain_factor) { - int iters = (int)inst->blockLen10ms >> 2; - int after = inst->blockLen10ms & 3; - int r0, r1, r2, r3, r4, r5, r6, r7; - int16_t *window = (int16_t*)inst->window; - int16_t *real = inst->real; - int16_t *synthBuf = inst->synthesisBuffer; - int16_t *out = out_frame; - int sat_pos = 0x7fff; - int sat_neg = 0xffff8000; - int block10 = (int)inst->blockLen10ms; - int anaLen = (int)inst->anaLen; - - __asm __volatile( - ".set push \n\t" - ".set noreorder \n\t" - "1: \n\t" - "blez %[iters], 2f \n\t" - " nop \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[real]) \n\t" - "lh %[r2], 2(%[window]) \n\t" - "lh %[r3], 2(%[real]) \n\t" - "lh %[r4], 4(%[window]) \n\t" - "lh %[r5], 4(%[real]) \n\t" - "lh %[r6], 6(%[window]) \n\t" - "lh %[r7], 6(%[real]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "mul %[r2], %[r2], %[r3] \n\t" - "mul %[r4], %[r4], %[r5] \n\t" - "mul %[r6], %[r6], %[r7] \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "addiu %[r2], %[r2], 0x2000 \n\t" - "addiu %[r4], %[r4], 0x2000 \n\t" - "addiu %[r6], %[r6], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "sra %[r2], %[r2], 14 \n\t" - "sra %[r4], %[r4], 14 \n\t" - "sra %[r6], %[r6], 14 \n\t" - "mul %[r0], %[r0], %[gain_factor] \n\t" - "mul %[r2], %[r2], %[gain_factor] \n\t" - "mul %[r4], %[r4], %[gain_factor] \n\t" - "mul %[r6], %[r6], %[gain_factor] \n\t" - "addiu %[r0], %[r0], 0x1000 \n\t" - "addiu %[r2], %[r2], 0x1000 \n\t" - "addiu %[r4], %[r4], 0x1000 \n\t" - "addiu %[r6], %[r6], 0x1000 \n\t" - "sra %[r0], %[r0], 13 \n\t" - "sra %[r2], %[r2], 13 \n\t" - "sra %[r4], %[r4], 13 \n\t" - "sra %[r6], %[r6], 13 \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "slt %[r3], %[r2], %[sat_pos] \n\t" - "slt %[r5], %[r4], %[sat_pos] \n\t" - "slt %[r7], %[r6], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "movz %[r2], %[sat_pos], %[r3] \n\t" - "movz %[r4], %[sat_pos], %[r5] \n\t" - "movz %[r6], %[sat_pos], %[r7] \n\t" - "lh %[r1], 0(%[synthBuf]) \n\t" - "lh %[r3], 2(%[synthBuf]) \n\t" - "lh %[r5], 4(%[synthBuf]) \n\t" - "lh %[r7], 6(%[synthBuf]) \n\t" - "addu %[r0], %[r0], %[r1] \n\t" - "addu %[r2], %[r2], %[r3] \n\t" - "addu %[r4], %[r4], %[r5] \n\t" - "addu %[r6], %[r6], %[r7] \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "slt %[r3], %[r2], %[sat_pos] \n\t" - "slt %[r5], %[r4], %[sat_pos] \n\t" - "slt %[r7], %[r6], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "movz %[r2], %[sat_pos], %[r3] \n\t" - "movz %[r4], %[sat_pos], %[r5] \n\t" - "movz %[r6], %[sat_pos], %[r7] \n\t" - "slt %[r1], %[r0], %[sat_neg] \n\t" - "slt %[r3], %[r2], %[sat_neg] \n\t" - "slt %[r5], %[r4], %[sat_neg] \n\t" - "slt %[r7], %[r6], %[sat_neg] \n\t" - "movn %[r0], %[sat_neg], %[r1] \n\t" - "movn %[r2], %[sat_neg], %[r3] \n\t" - "movn %[r4], %[sat_neg], %[r5] \n\t" - "movn %[r6], %[sat_neg], %[r7] \n\t" - "sh %[r0], 0(%[synthBuf]) \n\t" - "sh %[r2], 2(%[synthBuf]) \n\t" - "sh %[r4], 4(%[synthBuf]) \n\t" - "sh %[r6], 6(%[synthBuf]) \n\t" - "sh %[r0], 0(%[out]) \n\t" - "sh %[r2], 2(%[out]) \n\t" - "sh %[r4], 4(%[out]) \n\t" - "sh %[r6], 6(%[out]) \n\t" - "addiu %[window], %[window], 8 \n\t" - "addiu %[real], %[real], 8 \n\t" - "addiu %[synthBuf],%[synthBuf], 8 \n\t" - "addiu %[out], %[out], 8 \n\t" - "b 1b \n\t" - " addiu %[iters], %[iters], -1 \n\t" - "2: \n\t" - "blez %[after], 3f \n\t" - " subu %[block10], %[anaLen], %[block10] \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[real]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "addiu %[window], %[window], 2 \n\t" - "addiu %[real], %[real], 2 \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "mul %[r0], %[r0], %[gain_factor] \n\t" - "addiu %[r0], %[r0], 0x1000 \n\t" - "sra %[r0], %[r0], 13 \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "lh %[r1], 0(%[synthBuf]) \n\t" - "addu %[r0], %[r0], %[r1] \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "slt %[r1], %[r0], %[sat_neg] \n\t" - "movn %[r0], %[sat_neg], %[r1] \n\t" - "sh %[r0], 0(%[synthBuf]) \n\t" - "sh %[r0], 0(%[out]) \n\t" - "addiu %[synthBuf],%[synthBuf], 2 \n\t" - "addiu %[out], %[out], 2 \n\t" - "b 2b \n\t" - " addiu %[after], %[after], -1 \n\t" - "3: \n\t" - "sra %[iters], %[block10], 2 \n\t" - "4: \n\t" - "blez %[iters], 5f \n\t" - " andi %[after], %[block10], 3 \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[real]) \n\t" - "lh %[r2], 2(%[window]) \n\t" - "lh %[r3], 2(%[real]) \n\t" - "lh %[r4], 4(%[window]) \n\t" - "lh %[r5], 4(%[real]) \n\t" - "lh %[r6], 6(%[window]) \n\t" - "lh %[r7], 6(%[real]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "mul %[r2], %[r2], %[r3] \n\t" - "mul %[r4], %[r4], %[r5] \n\t" - "mul %[r6], %[r6], %[r7] \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "addiu %[r2], %[r2], 0x2000 \n\t" - "addiu %[r4], %[r4], 0x2000 \n\t" - "addiu %[r6], %[r6], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "sra %[r2], %[r2], 14 \n\t" - "sra %[r4], %[r4], 14 \n\t" - "sra %[r6], %[r6], 14 \n\t" - "mul %[r0], %[r0], %[gain_factor] \n\t" - "mul %[r2], %[r2], %[gain_factor] \n\t" - "mul %[r4], %[r4], %[gain_factor] \n\t" - "mul %[r6], %[r6], %[gain_factor] \n\t" - "addiu %[r0], %[r0], 0x1000 \n\t" - "addiu %[r2], %[r2], 0x1000 \n\t" - "addiu %[r4], %[r4], 0x1000 \n\t" - "addiu %[r6], %[r6], 0x1000 \n\t" - "sra %[r0], %[r0], 13 \n\t" - "sra %[r2], %[r2], 13 \n\t" - "sra %[r4], %[r4], 13 \n\t" - "sra %[r6], %[r6], 13 \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "slt %[r3], %[r2], %[sat_pos] \n\t" - "slt %[r5], %[r4], %[sat_pos] \n\t" - "slt %[r7], %[r6], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "movz %[r2], %[sat_pos], %[r3] \n\t" - "movz %[r4], %[sat_pos], %[r5] \n\t" - "movz %[r6], %[sat_pos], %[r7] \n\t" - "lh %[r1], 0(%[synthBuf]) \n\t" - "lh %[r3], 2(%[synthBuf]) \n\t" - "lh %[r5], 4(%[synthBuf]) \n\t" - "lh %[r7], 6(%[synthBuf]) \n\t" - "addu %[r0], %[r0], %[r1] \n\t" - "addu %[r2], %[r2], %[r3] \n\t" - "addu %[r4], %[r4], %[r5] \n\t" - "addu %[r6], %[r6], %[r7] \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "slt %[r3], %[r2], %[sat_pos] \n\t" - "slt %[r5], %[r4], %[sat_pos] \n\t" - "slt %[r7], %[r6], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "movz %[r2], %[sat_pos], %[r3] \n\t" - "movz %[r4], %[sat_pos], %[r5] \n\t" - "movz %[r6], %[sat_pos], %[r7] \n\t" - "slt %[r1], %[r0], %[sat_neg] \n\t" - "slt %[r3], %[r2], %[sat_neg] \n\t" - "slt %[r5], %[r4], %[sat_neg] \n\t" - "slt %[r7], %[r6], %[sat_neg] \n\t" - "movn %[r0], %[sat_neg], %[r1] \n\t" - "movn %[r2], %[sat_neg], %[r3] \n\t" - "movn %[r4], %[sat_neg], %[r5] \n\t" - "movn %[r6], %[sat_neg], %[r7] \n\t" - "sh %[r0], 0(%[synthBuf]) \n\t" - "sh %[r2], 2(%[synthBuf]) \n\t" - "sh %[r4], 4(%[synthBuf]) \n\t" - "sh %[r6], 6(%[synthBuf]) \n\t" - "addiu %[window], %[window], 8 \n\t" - "addiu %[real], %[real], 8 \n\t" - "addiu %[synthBuf],%[synthBuf], 8 \n\t" - "b 4b \n\t" - " addiu %[iters], %[iters], -1 \n\t" - "5: \n\t" - "blez %[after], 6f \n\t" - " nop \n\t" - "lh %[r0], 0(%[window]) \n\t" - "lh %[r1], 0(%[real]) \n\t" - "mul %[r0], %[r0], %[r1] \n\t" - "addiu %[window], %[window], 2 \n\t" - "addiu %[real], %[real], 2 \n\t" - "addiu %[r0], %[r0], 0x2000 \n\t" - "sra %[r0], %[r0], 14 \n\t" - "mul %[r0], %[r0], %[gain_factor] \n\t" - "addiu %[r0], %[r0], 0x1000 \n\t" - "sra %[r0], %[r0], 13 \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "lh %[r1], 0(%[synthBuf]) \n\t" - "addu %[r0], %[r0], %[r1] \n\t" - "slt %[r1], %[r0], %[sat_pos] \n\t" - "movz %[r0], %[sat_pos], %[r1] \n\t" - "slt %[r1], %[r0], %[sat_neg] \n\t" - "movn %[r0], %[sat_neg], %[r1] \n\t" - "sh %[r0], 0(%[synthBuf]) \n\t" - "addiu %[synthBuf],%[synthBuf], 2 \n\t" - "b 2b \n\t" - " addiu %[after], %[after], -1 \n\t" - "6: \n\t" - ".set pop \n\t" - : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), - [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5), - [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "+r" (iters), - [after] "+r" (after), [block10] "+r" (block10), - [window] "+r" (window), [real] "+r" (real), - [synthBuf] "+r" (synthBuf), [out] "+r" (out) - : [gain_factor] "r" (gain_factor), [sat_pos] "r" (sat_pos), - [sat_neg] "r" (sat_neg), [anaLen] "r" (anaLen) - : "memory", "hi", "lo" - ); - - // update synthesis buffer - memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms, - (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer)); - WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer - + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms); -} - -// Filter the data in the frequency domain, and create spectrum. -void WebRtcNsx_PrepareSpectrum_mips(NoiseSuppressionFixedC* inst, - int16_t* freq_buf) { - uint16_t *noiseSupFilter = inst->noiseSupFilter; - int16_t *real = inst->real; - int16_t *imag = inst->imag; - int32_t loop_count = 2; - int16_t tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6; - int16_t tmp16 = (int16_t)(inst->anaLen << 1) - 4; - int16_t* freq_buf_f = freq_buf; - int16_t* freq_buf_s = &freq_buf[tmp16]; - - __asm __volatile ( - ".set push \n\t" - ".set noreorder \n\t" - //first sample - "lh %[tmp_1], 0(%[noiseSupFilter]) \n\t" - "lh %[tmp_2], 0(%[real]) \n\t" - "lh %[tmp_3], 0(%[imag]) \n\t" - "mul %[tmp_2], %[tmp_2], %[tmp_1] \n\t" - "mul %[tmp_3], %[tmp_3], %[tmp_1] \n\t" - "sra %[tmp_2], %[tmp_2], 14 \n\t" - "sra %[tmp_3], %[tmp_3], 14 \n\t" - "sh %[tmp_2], 0(%[real]) \n\t" - "sh %[tmp_3], 0(%[imag]) \n\t" - "negu %[tmp_3], %[tmp_3] \n\t" - "sh %[tmp_2], 0(%[freq_buf_f]) \n\t" - "sh %[tmp_3], 2(%[freq_buf_f]) \n\t" - "addiu %[real], %[real], 2 \n\t" - "addiu %[imag], %[imag], 2 \n\t" - "addiu %[noiseSupFilter], %[noiseSupFilter], 2 \n\t" - "addiu %[freq_buf_f], %[freq_buf_f], 4 \n\t" - "1: \n\t" - "lh %[tmp_1], 0(%[noiseSupFilter]) \n\t" - "lh %[tmp_2], 0(%[real]) \n\t" - "lh %[tmp_3], 0(%[imag]) \n\t" - "lh %[tmp_4], 2(%[noiseSupFilter]) \n\t" - "lh %[tmp_5], 2(%[real]) \n\t" - "lh %[tmp_6], 2(%[imag]) \n\t" - "mul %[tmp_2], %[tmp_2], %[tmp_1] \n\t" - "mul %[tmp_3], %[tmp_3], %[tmp_1] \n\t" - "mul %[tmp_5], %[tmp_5], %[tmp_4] \n\t" - "mul %[tmp_6], %[tmp_6], %[tmp_4] \n\t" - "addiu %[loop_count], %[loop_count], 2 \n\t" - "sra %[tmp_2], %[tmp_2], 14 \n\t" - "sra %[tmp_3], %[tmp_3], 14 \n\t" - "sra %[tmp_5], %[tmp_5], 14 \n\t" - "sra %[tmp_6], %[tmp_6], 14 \n\t" - "addiu %[noiseSupFilter], %[noiseSupFilter], 4 \n\t" - "sh %[tmp_2], 0(%[real]) \n\t" - "sh %[tmp_2], 4(%[freq_buf_s]) \n\t" - "sh %[tmp_3], 0(%[imag]) \n\t" - "sh %[tmp_3], 6(%[freq_buf_s]) \n\t" - "negu %[tmp_3], %[tmp_3] \n\t" - "sh %[tmp_5], 2(%[real]) \n\t" - "sh %[tmp_5], 0(%[freq_buf_s]) \n\t" - "sh %[tmp_6], 2(%[imag]) \n\t" - "sh %[tmp_6], 2(%[freq_buf_s]) \n\t" - "negu %[tmp_6], %[tmp_6] \n\t" - "addiu %[freq_buf_s], %[freq_buf_s], -8 \n\t" - "addiu %[real], %[real], 4 \n\t" - "addiu %[imag], %[imag], 4 \n\t" - "sh %[tmp_2], 0(%[freq_buf_f]) \n\t" - "sh %[tmp_3], 2(%[freq_buf_f]) \n\t" - "sh %[tmp_5], 4(%[freq_buf_f]) \n\t" - "sh %[tmp_6], 6(%[freq_buf_f]) \n\t" - "blt %[loop_count], %[loop_size], 1b \n\t" - " addiu %[freq_buf_f], %[freq_buf_f], 8 \n\t" - //last two samples: - "lh %[tmp_1], 0(%[noiseSupFilter]) \n\t" - "lh %[tmp_2], 0(%[real]) \n\t" - "lh %[tmp_3], 0(%[imag]) \n\t" - "lh %[tmp_4], 2(%[noiseSupFilter]) \n\t" - "lh %[tmp_5], 2(%[real]) \n\t" - "lh %[tmp_6], 2(%[imag]) \n\t" - "mul %[tmp_2], %[tmp_2], %[tmp_1] \n\t" - "mul %[tmp_3], %[tmp_3], %[tmp_1] \n\t" - "mul %[tmp_5], %[tmp_5], %[tmp_4] \n\t" - "mul %[tmp_6], %[tmp_6], %[tmp_4] \n\t" - "sra %[tmp_2], %[tmp_2], 14 \n\t" - "sra %[tmp_3], %[tmp_3], 14 \n\t" - "sra %[tmp_5], %[tmp_5], 14 \n\t" - "sra %[tmp_6], %[tmp_6], 14 \n\t" - "sh %[tmp_2], 0(%[real]) \n\t" - "sh %[tmp_2], 4(%[freq_buf_s]) \n\t" - "sh %[tmp_3], 0(%[imag]) \n\t" - "sh %[tmp_3], 6(%[freq_buf_s]) \n\t" - "negu %[tmp_3], %[tmp_3] \n\t" - "sh %[tmp_2], 0(%[freq_buf_f]) \n\t" - "sh %[tmp_3], 2(%[freq_buf_f]) \n\t" - "sh %[tmp_5], 4(%[freq_buf_f]) \n\t" - "sh %[tmp_6], 6(%[freq_buf_f]) \n\t" - "sh %[tmp_5], 2(%[real]) \n\t" - "sh %[tmp_6], 2(%[imag]) \n\t" - ".set pop \n\t" - : [real] "+r" (real), [imag] "+r" (imag), - [freq_buf_f] "+r" (freq_buf_f), [freq_buf_s] "+r" (freq_buf_s), - [loop_count] "+r" (loop_count), [noiseSupFilter] "+r" (noiseSupFilter), - [tmp_1] "=&r" (tmp_1), [tmp_2] "=&r" (tmp_2), [tmp_3] "=&r" (tmp_3), - [tmp_4] "=&r" (tmp_4), [tmp_5] "=&r" (tmp_5), [tmp_6] "=&r" (tmp_6) - : [loop_size] "r" (inst->anaLen2) - : "memory", "hi", "lo" - ); -} - -#if defined(MIPS_DSP_R1_LE) -// Denormalize the real-valued signal |in|, the output from inverse FFT. -void WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst, - int16_t* in, - int factor) { - int32_t r0, r1, r2, r3, t0; - int len = (int)inst->anaLen; - int16_t *out = &inst->real[0]; - int shift = factor - inst->normData; - - __asm __volatile ( - ".set push \n\t" - ".set noreorder \n\t" - "beqz %[len], 8f \n\t" - " nop \n\t" - "bltz %[shift], 4f \n\t" - " sra %[t0], %[len], 2 \n\t" - "beqz %[t0], 2f \n\t" - " andi %[len], %[len], 3 \n\t" - "1: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "lh %[r1], 2(%[in]) \n\t" - "lh %[r2], 4(%[in]) \n\t" - "lh %[r3], 6(%[in]) \n\t" - "shllv_s.ph %[r0], %[r0], %[shift] \n\t" - "shllv_s.ph %[r1], %[r1], %[shift] \n\t" - "shllv_s.ph %[r2], %[r2], %[shift] \n\t" - "shllv_s.ph %[r3], %[r3], %[shift] \n\t" - "addiu %[in], %[in], 8 \n\t" - "addiu %[t0], %[t0], -1 \n\t" - "sh %[r0], 0(%[out]) \n\t" - "sh %[r1], 2(%[out]) \n\t" - "sh %[r2], 4(%[out]) \n\t" - "sh %[r3], 6(%[out]) \n\t" - "bgtz %[t0], 1b \n\t" - " addiu %[out], %[out], 8 \n\t" - "2: \n\t" - "beqz %[len], 8f \n\t" - " nop \n\t" - "3: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "addiu %[in], %[in], 2 \n\t" - "addiu %[len], %[len], -1 \n\t" - "shllv_s.ph %[r0], %[r0], %[shift] \n\t" - "addiu %[out], %[out], 2 \n\t" - "bgtz %[len], 3b \n\t" - " sh %[r0], -2(%[out]) \n\t" - "b 8f \n\t" - "4: \n\t" - "negu %[shift], %[shift] \n\t" - "beqz %[t0], 6f \n\t" - " andi %[len], %[len], 3 \n\t" - "5: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "lh %[r1], 2(%[in]) \n\t" - "lh %[r2], 4(%[in]) \n\t" - "lh %[r3], 6(%[in]) \n\t" - "srav %[r0], %[r0], %[shift] \n\t" - "srav %[r1], %[r1], %[shift] \n\t" - "srav %[r2], %[r2], %[shift] \n\t" - "srav %[r3], %[r3], %[shift] \n\t" - "addiu %[in], %[in], 8 \n\t" - "addiu %[t0], %[t0], -1 \n\t" - "sh %[r0], 0(%[out]) \n\t" - "sh %[r1], 2(%[out]) \n\t" - "sh %[r2], 4(%[out]) \n\t" - "sh %[r3], 6(%[out]) \n\t" - "bgtz %[t0], 5b \n\t" - " addiu %[out], %[out], 8 \n\t" - "6: \n\t" - "beqz %[len], 8f \n\t" - " nop \n\t" - "7: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "addiu %[in], %[in], 2 \n\t" - "addiu %[len], %[len], -1 \n\t" - "srav %[r0], %[r0], %[shift] \n\t" - "addiu %[out], %[out], 2 \n\t" - "bgtz %[len], 7b \n\t" - " sh %[r0], -2(%[out]) \n\t" - "8: \n\t" - ".set pop \n\t" - : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1), - [r2] "=&r" (r2), [r3] "=&r" (r3) - : [len] "r" (len), [shift] "r" (shift), [in] "r" (in), - [out] "r" (out) - : "memory" - ); -} -#endif - -// Normalize the real-valued signal |in|, the input to forward FFT. -void WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst, - const int16_t* in, - int16_t* out) { - int32_t r0, r1, r2, r3, t0; - int len = (int)inst->anaLen; - int shift = inst->normData; - - __asm __volatile ( - ".set push \n\t" - ".set noreorder \n\t" - "beqz %[len], 4f \n\t" - " sra %[t0], %[len], 2 \n\t" - "beqz %[t0], 2f \n\t" - " andi %[len], %[len], 3 \n\t" - "1: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "lh %[r1], 2(%[in]) \n\t" - "lh %[r2], 4(%[in]) \n\t" - "lh %[r3], 6(%[in]) \n\t" - "sllv %[r0], %[r0], %[shift] \n\t" - "sllv %[r1], %[r1], %[shift] \n\t" - "sllv %[r2], %[r2], %[shift] \n\t" - "sllv %[r3], %[r3], %[shift] \n\t" - "addiu %[in], %[in], 8 \n\t" - "addiu %[t0], %[t0], -1 \n\t" - "sh %[r0], 0(%[out]) \n\t" - "sh %[r1], 2(%[out]) \n\t" - "sh %[r2], 4(%[out]) \n\t" - "sh %[r3], 6(%[out]) \n\t" - "bgtz %[t0], 1b \n\t" - " addiu %[out], %[out], 8 \n\t" - "2: \n\t" - "beqz %[len], 4f \n\t" - " nop \n\t" - "3: \n\t" - "lh %[r0], 0(%[in]) \n\t" - "addiu %[in], %[in], 2 \n\t" - "addiu %[len], %[len], -1 \n\t" - "sllv %[r0], %[r0], %[shift] \n\t" - "addiu %[out], %[out], 2 \n\t" - "bgtz %[len], 3b \n\t" - " sh %[r0], -2(%[out]) \n\t" - "4: \n\t" - ".set pop \n\t" - : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1), - [r2] "=&r" (r2), [r3] "=&r" (r3) - : [len] "r" (len), [shift] "r" (shift), [in] "r" (in), - [out] "r" (out) - : "memory" - ); -}