/* * 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. */ /* * This file contains the resampling by two functions. * The description header can be found in signal_processing_library.h * */ #include "common_audio/signal_processing/include/signal_processing_library.h" #ifdef WEBRTC_ARCH_ARM_V7 // allpass filter coefficients. static const uint32_t kResampleAllpass1[3] = {3284, 24441, 49528 << 15}; static const uint32_t kResampleAllpass2[3] = {12199, 37471 << 15, 60255 << 15}; // Multiply two 32-bit values and accumulate to another input value. // Return: state + ((diff * tbl_value) >> 16) static __inline int32_t MUL_ACCUM_1(int32_t tbl_value, int32_t diff, int32_t state) { int32_t result; __asm __volatile ("smlawb %0, %1, %2, %3": "=r"(result): "r"(diff), "r"(tbl_value), "r"(state)); return result; } // Multiply two 32-bit values and accumulate to another input value. // Return: Return: state + (((diff << 1) * tbl_value) >> 32) // // The reason to introduce this function is that, in case we can't use smlawb // instruction (in MUL_ACCUM_1) due to input value range, we can still use // smmla to save some cycles. static __inline int32_t MUL_ACCUM_2(int32_t tbl_value, int32_t diff, int32_t state) { int32_t result; __asm __volatile ("smmla %0, %1, %2, %3": "=r"(result): "r"(diff << 1), "r"(tbl_value), "r"(state)); return result; } #else // allpass filter coefficients. static const uint16_t kResampleAllpass1[3] = …; static const uint16_t kResampleAllpass2[3] = …; // Multiply a 32-bit value with a 16-bit value and accumulate to another input: #define MUL_ACCUM_1(a, b, c) … #define MUL_ACCUM_2(a, b, c) … #endif // WEBRTC_ARCH_ARM_V7 // decimator #if !defined(MIPS32_LE) void WebRtcSpl_DownsampleBy2(const int16_t* in, size_t len, int16_t* out, int32_t* filtState) { … } #endif // #if defined(MIPS32_LE) void WebRtcSpl_UpsampleBy2(const int16_t* in, size_t len, int16_t* out, int32_t* filtState) { … }