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