1d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim/*********************************************************************** 2d03c373974c945b4b62b59b873522387418a2a3fFelicia LimCopyright (c) 2014 Vidyo. 3d03c373974c945b4b62b59b873522387418a2a3fFelicia LimCopyright (c) 2006-2011, Skype Limited. All rights reserved. 4d03c373974c945b4b62b59b873522387418a2a3fFelicia LimRedistribution and use in source and binary forms, with or without 5d03c373974c945b4b62b59b873522387418a2a3fFelicia Limmodification, are permitted provided that the following conditions 6d03c373974c945b4b62b59b873522387418a2a3fFelicia Limare met: 7d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim- Redistributions of source code must retain the above copyright notice, 8d03c373974c945b4b62b59b873522387418a2a3fFelicia Limthis list of conditions and the following disclaimer. 9d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim- Redistributions in binary form must reproduce the above copyright 10d03c373974c945b4b62b59b873522387418a2a3fFelicia Limnotice, this list of conditions and the following disclaimer in the 11d03c373974c945b4b62b59b873522387418a2a3fFelicia Limdocumentation and/or other materials provided with the distribution. 12d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim- Neither the name of Internet Society, IETF or IETF Trust, nor the 13d03c373974c945b4b62b59b873522387418a2a3fFelicia Limnames of specific contributors, may be used to endorse or promote 14d03c373974c945b4b62b59b873522387418a2a3fFelicia Limproducts derived from this software without specific prior written 15d03c373974c945b4b62b59b873522387418a2a3fFelicia Limpermission. 16d03c373974c945b4b62b59b873522387418a2a3fFelicia LimTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17d03c373974c945b4b62b59b873522387418a2a3fFelicia LimAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18d03c373974c945b4b62b59b873522387418a2a3fFelicia LimIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19d03c373974c945b4b62b59b873522387418a2a3fFelicia LimARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20d03c373974c945b4b62b59b873522387418a2a3fFelicia LimLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21d03c373974c945b4b62b59b873522387418a2a3fFelicia LimCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22d03c373974c945b4b62b59b873522387418a2a3fFelicia LimSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23d03c373974c945b4b62b59b873522387418a2a3fFelicia LimINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24d03c373974c945b4b62b59b873522387418a2a3fFelicia LimCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25d03c373974c945b4b62b59b873522387418a2a3fFelicia LimARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26d03c373974c945b4b62b59b873522387418a2a3fFelicia LimPOSSIBILITY OF SUCH DAMAGE. 27d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim***********************************************************************/ 28d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#ifndef SILK_NSQ_H 29d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#define SILK_NSQ_H 30d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 31d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#include "SigProc_FIX.h" 32d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 33d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#undef silk_short_prediction_create_arch_coef 34d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 35d03c373974c945b4b62b59b873522387418a2a3fFelicia Limstatic OPUS_INLINE opus_int32 silk_noise_shape_quantizer_short_prediction_c(const opus_int32 *buf32, const opus_int16 *coef16, opus_int order) 36d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim{ 37d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim opus_int32 out; 38d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim silk_assert( order == 10 || order == 16 ); 39d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 40d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim /* Avoids introducing a bias because silk_SMLAWB() always rounds to -inf */ 41d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_RSHIFT( order, 1 ); 42d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ 0 ], coef16[ 0 ] ); 43d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -1 ], coef16[ 1 ] ); 44d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -2 ], coef16[ 2 ] ); 45d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -3 ], coef16[ 3 ] ); 46d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -4 ], coef16[ 4 ] ); 47d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -5 ], coef16[ 5 ] ); 48d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -6 ], coef16[ 6 ] ); 49d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -7 ], coef16[ 7 ] ); 50d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -8 ], coef16[ 8 ] ); 51d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -9 ], coef16[ 9 ] ); 52d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 53d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim if( order == 16 ) 54d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim { 55d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -10 ], coef16[ 10 ] ); 56d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -11 ], coef16[ 11 ] ); 57d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -12 ], coef16[ 12 ] ); 58d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -13 ], coef16[ 13 ] ); 59d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -14 ], coef16[ 14 ] ); 60d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB( out, buf32[ -15 ], coef16[ 15 ] ); 61d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim } 62d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim return out; 63d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim} 64d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 65d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#define silk_noise_shape_quantizer_short_prediction(in, coef, coefRev, order, arch) ((void)arch,silk_noise_shape_quantizer_short_prediction_c(in, coef, order)) 66d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 67d03c373974c945b4b62b59b873522387418a2a3fFelicia Limstatic OPUS_INLINE opus_int32 silk_NSQ_noise_shape_feedback_loop_c(const opus_int32 *data0, opus_int32 *data1, const opus_int16 *coef, opus_int order) 68d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim{ 69d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim opus_int32 out; 70d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim opus_int32 tmp1, tmp2; 71d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim opus_int j; 72d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 73d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim tmp2 = data0[0]; 74d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim tmp1 = data1[0]; 75d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim data1[0] = tmp2; 76d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 77d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_RSHIFT(order, 1); 78d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB(out, tmp2, coef[0]); 79d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 80d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim for (j = 2; j < order; j += 2) { 81d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim tmp2 = data1[j - 1]; 82d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim data1[j - 1] = tmp1; 83d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB(out, tmp1, coef[j - 1]); 84d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim tmp1 = data1[j + 0]; 85d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim data1[j + 0] = tmp2; 86d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB(out, tmp2, coef[j]); 87d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim } 88d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim data1[order - 1] = tmp1; 89d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_SMLAWB(out, tmp1, coef[order - 1]); 90d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim /* Q11 -> Q12 */ 91d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim out = silk_LSHIFT32( out, 1 ); 92d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim return out; 93d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim} 94d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 95d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#define silk_NSQ_noise_shape_feedback_loop(data0, data1, coef, order, arch) ((void)arch,silk_NSQ_noise_shape_feedback_loop_c(data0, data1, coef, order)) 96d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 97d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) 98d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#include "arm/NSQ_neon.h" 99d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#endif 100d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim 101d03c373974c945b4b62b59b873522387418a2a3fFelicia Lim#endif /* SILK_NSQ_H */ 102