xref: /aosp_15_r20/external/libopus/silk/resampler_rom.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /***********************************************************************
2*a58d3d2aSXin Li Copyright (c) 2006-2011, Skype Limited. All rights reserved.
3*a58d3d2aSXin Li Redistribution and use in source and binary forms, with or without
4*a58d3d2aSXin Li modification, are permitted provided that the following conditions
5*a58d3d2aSXin Li are met:
6*a58d3d2aSXin Li - Redistributions of source code must retain the above copyright notice,
7*a58d3d2aSXin Li this list of conditions and the following disclaimer.
8*a58d3d2aSXin Li - Redistributions in binary form must reproduce the above copyright
9*a58d3d2aSXin Li notice, this list of conditions and the following disclaimer in the
10*a58d3d2aSXin Li documentation and/or other materials provided with the distribution.
11*a58d3d2aSXin Li - Neither the name of Internet Society, IETF or IETF Trust, nor the
12*a58d3d2aSXin Li names of specific contributors, may be used to endorse or promote
13*a58d3d2aSXin Li products derived from this software without specific prior written
14*a58d3d2aSXin Li permission.
15*a58d3d2aSXin Li THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16*a58d3d2aSXin Li AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*a58d3d2aSXin Li IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*a58d3d2aSXin Li ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19*a58d3d2aSXin Li LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20*a58d3d2aSXin Li CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21*a58d3d2aSXin Li SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22*a58d3d2aSXin Li INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23*a58d3d2aSXin Li CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24*a58d3d2aSXin Li ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25*a58d3d2aSXin Li POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li ***********************************************************************/
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li /* Filter coefficients for IIR/FIR polyphase resampling     *
33*a58d3d2aSXin Li  * Total size: 179 Words (358 Bytes)                        */
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li #include "resampler_private.h"
36*a58d3d2aSXin Li 
37*a58d3d2aSXin Li /* Matlab code for the notch filter coefficients: */
38*a58d3d2aSXin Li /* B = [1, 0.147, 1];  A = [1, 0.107, 0.89]; G = 0.93; freqz(G * B, A, 2^14, 16e3); axis([0, 8000, -10, 1]) */
39*a58d3d2aSXin Li /* fprintf('\t%6d, %6d, %6d, %6d\n', round(B(2)*2^16), round(-A(2)*2^16), round((1-A(3))*2^16), round(G*2^15)) */
40*a58d3d2aSXin Li /* const opus_int16 silk_resampler_up2_hq_notch[ 4 ] = { 9634,  -7012,   7209,  30474 }; */
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li /* Tables with IIR and FIR coefficients for fractional downsamplers (123 Words) */
43*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_3_4_COEFS[ 2 + 3 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = {
44*a58d3d2aSXin Li     -20694, -13867,
45*a58d3d2aSXin Li        -49,     64,     17,   -157,    353,   -496,    163,  11047,  22205,
46*a58d3d2aSXin Li        -39,      6,     91,   -170,    186,     23,   -896,   6336,  19928,
47*a58d3d2aSXin Li        -19,    -36,    102,    -89,    -24,    328,   -951,   2568,  15909,
48*a58d3d2aSXin Li };
49*a58d3d2aSXin Li 
50*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS[ 2 + 2 * RESAMPLER_DOWN_ORDER_FIR0 / 2 ] = {
51*a58d3d2aSXin Li     -14457, -14019,
52*a58d3d2aSXin Li         64,    128,   -122,     36,    310,   -768,    584,   9267,  17733,
53*a58d3d2aSXin Li         12,    128,     18,   -142,    288,   -117,   -865,   4123,  14459,
54*a58d3d2aSXin Li };
55*a58d3d2aSXin Li 
56*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_2_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR1 / 2 ] = {
57*a58d3d2aSXin Li        616, -14323,
58*a58d3d2aSXin Li        -10,     39,     58,    -46,    -84,    120,    184,   -315,   -541,   1284,   5380,   9024,
59*a58d3d2aSXin Li };
60*a58d3d2aSXin Li 
61*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_3_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = {
62*a58d3d2aSXin Li      16102, -15162,
63*a58d3d2aSXin Li        -13,      0,     20,     26,      5,    -31,    -43,     -4,     65,     90,      7,   -157,   -248,    -44,    593,   1583,   2612,   3271,
64*a58d3d2aSXin Li };
65*a58d3d2aSXin Li 
66*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_4_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = {
67*a58d3d2aSXin Li      22500, -15099,
68*a58d3d2aSXin Li          3,    -14,    -20,    -15,      2,     25,     37,     25,    -16,    -71,   -107,    -79,     50,    292,    623,    982,   1288,   1464,
69*a58d3d2aSXin Li };
70*a58d3d2aSXin Li 
71*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_1_6_COEFS[ 2 + RESAMPLER_DOWN_ORDER_FIR2 / 2 ] = {
72*a58d3d2aSXin Li      27540, -15257,
73*a58d3d2aSXin Li         17,     12,      8,      1,    -10,    -22,    -30,    -32,    -22,      3,     44,    100,    168,    243,    317,    381,    429,    455,
74*a58d3d2aSXin Li };
75*a58d3d2aSXin Li 
76*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_Resampler_2_3_COEFS_LQ[ 2 + 2 * 2 ] = {
77*a58d3d2aSXin Li      -2797,  -6507,
78*a58d3d2aSXin Li       4697,  10739,
79*a58d3d2aSXin Li       1567,   8276,
80*a58d3d2aSXin Li };
81*a58d3d2aSXin Li 
82*a58d3d2aSXin Li /* Table with interplation fractions of 1/24, 3/24, 5/24, ... , 23/24 : 23/24 (46 Words) */
83*a58d3d2aSXin Li silk_DWORD_ALIGN const opus_int16 silk_resampler_frac_FIR_12[ 12 ][ RESAMPLER_ORDER_FIR_12 / 2 ] = {
84*a58d3d2aSXin Li     {  189,  -600,   617, 30567 },
85*a58d3d2aSXin Li     {  117,  -159, -1070, 29704 },
86*a58d3d2aSXin Li     {   52,   221, -2392, 28276 },
87*a58d3d2aSXin Li     {   -4,   529, -3350, 26341 },
88*a58d3d2aSXin Li     {  -48,   758, -3956, 23973 },
89*a58d3d2aSXin Li     {  -80,   905, -4235, 21254 },
90*a58d3d2aSXin Li     {  -99,   972, -4222, 18278 },
91*a58d3d2aSXin Li     { -107,   967, -3957, 15143 },
92*a58d3d2aSXin Li     { -103,   896, -3487, 11950 },
93*a58d3d2aSXin Li     {  -91,   773, -2865,  8798 },
94*a58d3d2aSXin Li     {  -71,   611, -2143,  5784 },
95*a58d3d2aSXin Li     {  -46,   425, -1375,  2996 },
96*a58d3d2aSXin Li };
97