xref: /btstack/3rd-party/lc3-google/src/ltpf_arm.h (revision 4930cef6e21e6da2d7571b9259c7f0fb8bed3d01)
1*4930cef6SMatthias Ringwald /******************************************************************************
2*4930cef6SMatthias Ringwald  *
3*4930cef6SMatthias Ringwald  *  Copyright 2022 Google LLC
4*4930cef6SMatthias Ringwald  *
5*4930cef6SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6*4930cef6SMatthias Ringwald  *  you may not use this file except in compliance with the License.
7*4930cef6SMatthias Ringwald  *  You may obtain a copy of the License at:
8*4930cef6SMatthias Ringwald  *
9*4930cef6SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10*4930cef6SMatthias Ringwald  *
11*4930cef6SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
12*4930cef6SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13*4930cef6SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*4930cef6SMatthias Ringwald  *  See the License for the specific language governing permissions and
15*4930cef6SMatthias Ringwald  *  limitations under the License.
16*4930cef6SMatthias Ringwald  *
17*4930cef6SMatthias Ringwald  ******************************************************************************/
18*4930cef6SMatthias Ringwald 
19*4930cef6SMatthias Ringwald #if __ARM_FEATURE_SIMD32
20*4930cef6SMatthias Ringwald 
21*4930cef6SMatthias Ringwald #ifndef TEST_ARM
22*4930cef6SMatthias Ringwald 
23*4930cef6SMatthias Ringwald #include <arm_acle.h>
24*4930cef6SMatthias Ringwald 
25*4930cef6SMatthias Ringwald static inline int16x2_t __pkhbt(int16x2_t a, int16x2_t b)
26*4930cef6SMatthias Ringwald {
27*4930cef6SMatthias Ringwald     int16x2_t r;
28*4930cef6SMatthias Ringwald     __asm("pkhbt %0, %1, %2" : "=r" (r) : "r" (a), "r" (b));
29*4930cef6SMatthias Ringwald     return r;
30*4930cef6SMatthias Ringwald }
31*4930cef6SMatthias Ringwald 
32*4930cef6SMatthias Ringwald #endif /* TEST_ARM */
33*4930cef6SMatthias Ringwald 
34*4930cef6SMatthias Ringwald 
35*4930cef6SMatthias Ringwald /**
36*4930cef6SMatthias Ringwald  * Import
37*4930cef6SMatthias Ringwald  */
38*4930cef6SMatthias Ringwald 
39*4930cef6SMatthias Ringwald static inline int32_t filter_hp50(struct lc3_ltpf_hp50_state *, int32_t);
40*4930cef6SMatthias Ringwald static inline float dot(const int16_t *, const int16_t *, int);
41*4930cef6SMatthias Ringwald 
42*4930cef6SMatthias Ringwald 
43*4930cef6SMatthias Ringwald /**
44*4930cef6SMatthias Ringwald  * Resample from 8 / 16 / 32 KHz to 12.8 KHz Template
45*4930cef6SMatthias Ringwald  */
46*4930cef6SMatthias Ringwald #if !defined(resample_8k_12k8) || !defined(resample_16k_12k8) \
47*4930cef6SMatthias Ringwald     || !defined(resample_32k_12k8)
48*4930cef6SMatthias Ringwald static inline void arm_resample_x64k_12k8(const int p, const int16x2_t *h,
49*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
50*4930cef6SMatthias Ringwald {
51*4930cef6SMatthias Ringwald     const int w = 40 / p;
52*4930cef6SMatthias Ringwald 
53*4930cef6SMatthias Ringwald     x -= w;
54*4930cef6SMatthias Ringwald 
55*4930cef6SMatthias Ringwald     for (int i = 0; i < 5*n; i += 5) {
56*4930cef6SMatthias Ringwald         const int16x2_t *hn = h + (i % (2*p)) * (48 / p);
57*4930cef6SMatthias Ringwald         const int16x2_t *xn = x + (i / (2*p));
58*4930cef6SMatthias Ringwald 
59*4930cef6SMatthias Ringwald         int32_t un = __smlad(*(xn++), *(hn++), 0);
60*4930cef6SMatthias Ringwald 
61*4930cef6SMatthias Ringwald         for (int k = 0; k < w; k += 5) {
62*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
63*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
64*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
65*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
66*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
67*4930cef6SMatthias Ringwald         }
68*4930cef6SMatthias Ringwald 
69*4930cef6SMatthias Ringwald         int32_t yn = filter_hp50(hp50, un);
70*4930cef6SMatthias Ringwald         *(y++) = (yn + (1 << 15)) >> 16;
71*4930cef6SMatthias Ringwald     }
72*4930cef6SMatthias Ringwald }
73*4930cef6SMatthias Ringwald #endif
74*4930cef6SMatthias Ringwald 
75*4930cef6SMatthias Ringwald /**
76*4930cef6SMatthias Ringwald  * Resample from 24 / 48 KHz to 12.8 KHz Template
77*4930cef6SMatthias Ringwald  */
78*4930cef6SMatthias Ringwald #if !defined(resample_24k_12k8) || !defined(resample_48k_12k8)
79*4930cef6SMatthias Ringwald static inline void arm_resample_x192k_12k8(const int p, const int16x2_t *h,
80*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
81*4930cef6SMatthias Ringwald {
82*4930cef6SMatthias Ringwald     const int w = 120 / p;
83*4930cef6SMatthias Ringwald 
84*4930cef6SMatthias Ringwald     x -= w;
85*4930cef6SMatthias Ringwald 
86*4930cef6SMatthias Ringwald     for (int i = 0; i < 15*n; i += 15) {
87*4930cef6SMatthias Ringwald         const int16x2_t *hn = h + (i % (2*p)) * (128 / p);
88*4930cef6SMatthias Ringwald         const int16x2_t *xn = x + (i / (2*p));
89*4930cef6SMatthias Ringwald 
90*4930cef6SMatthias Ringwald         int32_t un = __smlad(*(xn++), *(hn++), 0);
91*4930cef6SMatthias Ringwald 
92*4930cef6SMatthias Ringwald         for (int k = 0; k < w; k += 15) {
93*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
94*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
95*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
96*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
97*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
98*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
99*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
100*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
101*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
102*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
103*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
104*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
105*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
106*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
107*4930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
108*4930cef6SMatthias Ringwald         }
109*4930cef6SMatthias Ringwald 
110*4930cef6SMatthias Ringwald         int32_t yn = filter_hp50(hp50, un);
111*4930cef6SMatthias Ringwald         *(y++) = (yn + (1 << 15)) >> 16;
112*4930cef6SMatthias Ringwald     }
113*4930cef6SMatthias Ringwald }
114*4930cef6SMatthias Ringwald #endif
115*4930cef6SMatthias Ringwald 
116*4930cef6SMatthias Ringwald /**
117*4930cef6SMatthias Ringwald  * Resample from 8 Khz to 12.8 KHz
118*4930cef6SMatthias Ringwald  */
119*4930cef6SMatthias Ringwald #ifndef resample_8k_12k8
120*4930cef6SMatthias Ringwald #define resample_8k_12k8 arm_resample_8k_12k8
121*4930cef6SMatthias Ringwald static void arm_resample_8k_12k8(
122*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
123*4930cef6SMatthias Ringwald {
124*4930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*8*12] = {
125*4930cef6SMatthias Ringwald         0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0, 0,
126*4930cef6SMatthias Ringwald         0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28, 0,
127*4930cef6SMatthias Ringwald         0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61, 0,
128*4930cef6SMatthias Ringwald         0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79, 0,
129*4930cef6SMatthias Ringwald         0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61, 0,
130*4930cef6SMatthias Ringwald         0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0, 0,
131*4930cef6SMatthias Ringwald         0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92, 0,
132*4930cef6SMatthias Ringwald         0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180, 0,
133*4930cef6SMatthias Ringwald         0, 0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0,
134*4930cef6SMatthias Ringwald         0, 0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28,
135*4930cef6SMatthias Ringwald         0, 0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61,
136*4930cef6SMatthias Ringwald         0, 0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79,
137*4930cef6SMatthias Ringwald         0, 0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61,
138*4930cef6SMatthias Ringwald         0, 0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0,
139*4930cef6SMatthias Ringwald         0, 0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92,
140*4930cef6SMatthias Ringwald         0, 0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180,
141*4930cef6SMatthias Ringwald     };
142*4930cef6SMatthias Ringwald 
143*4930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
144*4930cef6SMatthias Ringwald         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
145*4930cef6SMatthias Ringwald }
146*4930cef6SMatthias Ringwald #endif /* resample_8k_12k8 */
147*4930cef6SMatthias Ringwald 
148*4930cef6SMatthias Ringwald /**
149*4930cef6SMatthias Ringwald  * Resample from 16 Khz to 12.8 KHz
150*4930cef6SMatthias Ringwald  */
151*4930cef6SMatthias Ringwald #ifndef resample_16k_12k8
152*4930cef6SMatthias Ringwald #define resample_16k_12k8 arm_resample_16k_12k8
153*4930cef6SMatthias Ringwald static void arm_resample_16k_12k8(
154*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
155*4930cef6SMatthias Ringwald {
156*4930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*4*24] = {
157*4930cef6SMatthias Ringwald 
158*4930cef6SMatthias Ringwald             0,   -61,   214,  -398,   417,     0, -1052,  2686,
159*4930cef6SMatthias Ringwald         -4529,  5997, 26233,  5997, -4529,  2686, -1052,     0,
160*4930cef6SMatthias Ringwald           417,  -398,   214,   -61,     0,     0,     0,     0,
161*4930cef6SMatthias Ringwald 
162*4930cef6SMatthias Ringwald 
163*4930cef6SMatthias Ringwald             0,   -79,   180,  -213,     0,   598, -1522,  2389,
164*4930cef6SMatthias Ringwald         -2427,     0, 24506, 13068, -5289,  1873,     0,  -752,
165*4930cef6SMatthias Ringwald           763,  -457,   156,     0,   -28,     0,     0,     0,
166*4930cef6SMatthias Ringwald 
167*4930cef6SMatthias Ringwald 
168*4930cef6SMatthias Ringwald             0,   -61,    92,     0,  -323,   861, -1361,  1317,
169*4930cef6SMatthias Ringwald             0, -3885, 19741, 19741, -3885,     0,  1317, -1361,
170*4930cef6SMatthias Ringwald           861,  -323,     0,    92,   -61,     0,     0,     0,
171*4930cef6SMatthias Ringwald 
172*4930cef6SMatthias Ringwald             0,   -28,     0,   156,  -457,   763,  -752,     0,
173*4930cef6SMatthias Ringwald          1873, -5289, 13068, 24506,     0, -2427,  2389, -1522,
174*4930cef6SMatthias Ringwald           598,     0,  -213,   180,   -79,     0,     0,     0,
175*4930cef6SMatthias Ringwald 
176*4930cef6SMatthias Ringwald 
177*4930cef6SMatthias Ringwald             0,     0,   -61,   214,  -398,   417,     0, -1052,
178*4930cef6SMatthias Ringwald          2686, -4529,  5997, 26233,  5997, -4529,  2686, -1052,
179*4930cef6SMatthias Ringwald             0,   417,  -398,   214,   -61,     0,     0,     0,
180*4930cef6SMatthias Ringwald 
181*4930cef6SMatthias Ringwald 
182*4930cef6SMatthias Ringwald             0,     0,   -79,   180,  -213,     0,   598, -1522,
183*4930cef6SMatthias Ringwald          2389, -2427,     0, 24506, 13068, -5289,  1873,     0,
184*4930cef6SMatthias Ringwald          -752,   763,  -457,   156,     0,   -28,     0,     0,
185*4930cef6SMatthias Ringwald 
186*4930cef6SMatthias Ringwald 
187*4930cef6SMatthias Ringwald             0,     0,   -61,    92,     0,  -323,   861, -1361,
188*4930cef6SMatthias Ringwald          1317,     0, -3885, 19741, 19741, -3885,     0,  1317,
189*4930cef6SMatthias Ringwald         -1361,   861,  -323,     0,    92,   -61,     0,     0,
190*4930cef6SMatthias Ringwald 
191*4930cef6SMatthias Ringwald             0,     0,   -28,     0,   156,  -457,   763,  -752,
192*4930cef6SMatthias Ringwald             0,  1873, -5289, 13068, 24506,     0, -2427,  2389,
193*4930cef6SMatthias Ringwald         -1522,   598,     0,  -213,   180,   -79,     0,     0,
194*4930cef6SMatthias Ringwald     };
195*4930cef6SMatthias Ringwald 
196*4930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
197*4930cef6SMatthias Ringwald         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
198*4930cef6SMatthias Ringwald }
199*4930cef6SMatthias Ringwald #endif /* resample_16k_12k8 */
200*4930cef6SMatthias Ringwald 
201*4930cef6SMatthias Ringwald /**
202*4930cef6SMatthias Ringwald  * Resample from 32 Khz to 12.8 KHz
203*4930cef6SMatthias Ringwald  */
204*4930cef6SMatthias Ringwald #ifndef resample_32k_12k8
205*4930cef6SMatthias Ringwald #define resample_32k_12k8 arm_resample_32k_12k8
206*4930cef6SMatthias Ringwald static void arm_resample_32k_12k8(
207*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
208*4930cef6SMatthias Ringwald {
209*4930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*2*48] = {
210*4930cef6SMatthias Ringwald 
211*4930cef6SMatthias Ringwald             0,   -30,   -31,    46,   107,     0,  -199,  -162,
212*4930cef6SMatthias Ringwald           209,   430,     0,  -681,  -526,   658,  1343,     0,
213*4930cef6SMatthias Ringwald         -2264, -1943,  2999,  9871, 13116,  9871,  2999, -1943,
214*4930cef6SMatthias Ringwald         -2264,     0,  1343,   658,  -526,  -681,     0,   430,
215*4930cef6SMatthias Ringwald           209,  -162,  -199,     0,   107,    46,   -31,   -30,
216*4930cef6SMatthias Ringwald             0,     0,     0,     0,     0,     0,     0,     0,
217*4930cef6SMatthias Ringwald 
218*4930cef6SMatthias Ringwald             0,   -14,   -39,     0,    90,    78,  -106,  -229,
219*4930cef6SMatthias Ringwald             0,   382,   299,  -376,  -761,     0,  1194,   937,
220*4930cef6SMatthias Ringwald         -1214, -2644,     0,  6534, 12253, 12253,  6534,     0,
221*4930cef6SMatthias Ringwald         -2644, -1214,   937,  1194,     0,  -761,  -376,   299,
222*4930cef6SMatthias Ringwald           382,     0,  -229,  -106,    78,    90,     0,   -39,
223*4930cef6SMatthias Ringwald           -14,     0,     0,     0,     0,     0,     0,     0,
224*4930cef6SMatthias Ringwald 
225*4930cef6SMatthias Ringwald             0,     0,   -30,   -31,    46,   107,     0,  -199,
226*4930cef6SMatthias Ringwald          -162,   209,   430,     0,  -681,  -526,   658,  1343,
227*4930cef6SMatthias Ringwald             0, -2264, -1943,  2999,  9871, 13116,  9871,  2999,
228*4930cef6SMatthias Ringwald         -1943, -2264,     0,  1343,   658,  -526,  -681,     0,
229*4930cef6SMatthias Ringwald           430,   209,  -162,  -199,     0,   107,    46,   -31,
230*4930cef6SMatthias Ringwald           -30,     0,     0,     0,     0,     0,     0,     0,
231*4930cef6SMatthias Ringwald 
232*4930cef6SMatthias Ringwald             0,     0,   -14,   -39,     0,    90,    78,  -106,
233*4930cef6SMatthias Ringwald          -229,     0,   382,   299,  -376,  -761,     0,  1194,
234*4930cef6SMatthias Ringwald           937, -1214, -2644,     0,  6534, 12253, 12253,  6534,
235*4930cef6SMatthias Ringwald             0, -2644, -1214,   937,  1194,     0,  -761,  -376,
236*4930cef6SMatthias Ringwald           299,   382,     0,  -229,  -106,    78,    90,     0,
237*4930cef6SMatthias Ringwald           -39,   -14,     0,     0,     0,     0,     0,     0,
238*4930cef6SMatthias Ringwald     };
239*4930cef6SMatthias Ringwald 
240*4930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
241*4930cef6SMatthias Ringwald         2, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
242*4930cef6SMatthias Ringwald }
243*4930cef6SMatthias Ringwald #endif /* resample_32k_12k8 */
244*4930cef6SMatthias Ringwald 
245*4930cef6SMatthias Ringwald /**
246*4930cef6SMatthias Ringwald  * Resample from 24 Khz to 12.8 KHz
247*4930cef6SMatthias Ringwald  */
248*4930cef6SMatthias Ringwald #ifndef resample_24k_12k8
249*4930cef6SMatthias Ringwald #define resample_24k_12k8 arm_resample_24k_12k8
250*4930cef6SMatthias Ringwald static void arm_resample_24k_12k8(
251*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
252*4930cef6SMatthias Ringwald {
253*4930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*8*32] = {
254*4930cef6SMatthias Ringwald 
255*4930cef6SMatthias Ringwald             0,   -50,    19,   143,   -93,  -290,   278,   485,
256*4930cef6SMatthias Ringwald          -658,  -701,  1396,   901, -3019, -1042, 10276, 17488,
257*4930cef6SMatthias Ringwald         10276, -1042, -3019,   901,  1396,  -701,  -658,   485,
258*4930cef6SMatthias Ringwald           278,  -290,   -93,   143,    19,   -50,     0,     0,
259*4930cef6SMatthias Ringwald 
260*4930cef6SMatthias Ringwald             0,   -46,     0,   141,   -45,  -305,   185,   543,
261*4930cef6SMatthias Ringwald          -501,  -854,  1153,  1249, -2619, -1908,  8712, 17358,
262*4930cef6SMatthias Ringwald         11772,     0, -3319,   480,  1593,  -504,  -796,   399,
263*4930cef6SMatthias Ringwald           367,  -261,  -142,   138,    40,   -52,    -5,     0,
264*4930cef6SMatthias Ringwald 
265*4930cef6SMatthias Ringwald             0,   -41,   -17,   133,     0,  -304,    91,   574,
266*4930cef6SMatthias Ringwald          -334,  -959,   878,  1516, -2143, -2590,  7118, 16971,
267*4930cef6SMatthias Ringwald         13161,  1202, -3495,     0,  1731,  -267,  -908,   287,
268*4930cef6SMatthias Ringwald           445,  -215,  -188,   125,    62,   -52,   -12,     0,
269*4930cef6SMatthias Ringwald 
270*4930cef6SMatthias Ringwald             0,   -34,   -30,   120,    41,  -291,     0,   577,
271*4930cef6SMatthias Ringwald          -164, -1015,   585,  1697, -1618, -3084,  5534, 16337,
272*4930cef6SMatthias Ringwald         14406,  2544, -3526,  -523,  1800,     0,  -985,   152,
273*4930cef6SMatthias Ringwald           509,  -156,  -230,   104,    83,   -48,   -19,     0,
274*4930cef6SMatthias Ringwald 
275*4930cef6SMatthias Ringwald             0,   -26,   -41,   103,    76,  -265,   -83,   554,
276*4930cef6SMatthias Ringwald             0, -1023,   288,  1791, -1070, -3393,  3998, 15474,
277*4930cef6SMatthias Ringwald         15474,  3998, -3393, -1070,  1791,   288, -1023,     0,
278*4930cef6SMatthias Ringwald           554,   -83,  -265,    76,   103,   -41,   -26,     0,
279*4930cef6SMatthias Ringwald 
280*4930cef6SMatthias Ringwald             0,   -19,   -48,    83,   104,  -230,  -156,   509,
281*4930cef6SMatthias Ringwald           152,  -985,     0,  1800,  -523, -3526,  2544, 14406,
282*4930cef6SMatthias Ringwald         16337,  5534, -3084, -1618,  1697,   585, -1015,  -164,
283*4930cef6SMatthias Ringwald           577,     0,  -291,    41,   120,   -30,   -34,     0,
284*4930cef6SMatthias Ringwald 
285*4930cef6SMatthias Ringwald             0,   -12,   -52,    62,   125,  -188,  -215,   445,
286*4930cef6SMatthias Ringwald           287,  -908,  -267,  1731,     0, -3495,  1202, 13161,
287*4930cef6SMatthias Ringwald         16971,  7118, -2590, -2143,  1516,   878,  -959,  -334,
288*4930cef6SMatthias Ringwald           574,    91,  -304,     0,   133,   -17,   -41,     0,
289*4930cef6SMatthias Ringwald 
290*4930cef6SMatthias Ringwald             0,    -5,   -52,    40,   138,  -142,  -261,   367,
291*4930cef6SMatthias Ringwald           399,  -796,  -504,  1593,   480, -3319,     0, 11772,
292*4930cef6SMatthias Ringwald         17358,  8712, -1908, -2619,  1249,  1153,  -854,  -501,
293*4930cef6SMatthias Ringwald           543,   185,  -305,   -45,   141,     0,   -46,     0,
294*4930cef6SMatthias Ringwald 
295*4930cef6SMatthias Ringwald             0,     0,   -50,    19,   143,   -93,  -290,   278,
296*4930cef6SMatthias Ringwald           485,  -658,  -701,  1396,   901, -3019, -1042, 10276,
297*4930cef6SMatthias Ringwald         17488, 10276, -1042, -3019,   901,  1396,  -701,  -658,
298*4930cef6SMatthias Ringwald           485,   278,  -290,   -93,   143,    19,   -50,     0,
299*4930cef6SMatthias Ringwald 
300*4930cef6SMatthias Ringwald             0,     0,   -46,     0,   141,   -45,  -305,   185,
301*4930cef6SMatthias Ringwald           543,  -501,  -854,  1153,  1249, -2619, -1908,  8712,
302*4930cef6SMatthias Ringwald         17358, 11772,     0, -3319,   480,  1593,  -504,  -796,
303*4930cef6SMatthias Ringwald           399,   367,  -261,  -142,   138,    40,   -52,    -5,
304*4930cef6SMatthias Ringwald 
305*4930cef6SMatthias Ringwald             0,     0,   -41,   -17,   133,     0,  -304,    91,
306*4930cef6SMatthias Ringwald           574,  -334,  -959,   878,  1516, -2143, -2590,  7118,
307*4930cef6SMatthias Ringwald         16971, 13161,  1202, -3495,     0,  1731,  -267,  -908,
308*4930cef6SMatthias Ringwald           287,   445,  -215,  -188,   125,    62,   -52,   -12,
309*4930cef6SMatthias Ringwald 
310*4930cef6SMatthias Ringwald             0,     0,   -34,   -30,   120,    41,  -291,     0,
311*4930cef6SMatthias Ringwald           577,  -164, -1015,   585,  1697, -1618, -3084,  5534,
312*4930cef6SMatthias Ringwald         16337, 14406,  2544, -3526,  -523,  1800,     0,  -985,
313*4930cef6SMatthias Ringwald           152,   509,  -156,  -230,   104,    83,   -48,   -19,
314*4930cef6SMatthias Ringwald 
315*4930cef6SMatthias Ringwald             0,     0,   -26,   -41,   103,    76,  -265,   -83,
316*4930cef6SMatthias Ringwald           554,     0, -1023,   288,  1791, -1070, -3393,  3998,
317*4930cef6SMatthias Ringwald         15474, 15474,  3998, -3393, -1070,  1791,   288, -1023,
318*4930cef6SMatthias Ringwald             0,   554,   -83,  -265,    76,   103,   -41,   -26,
319*4930cef6SMatthias Ringwald 
320*4930cef6SMatthias Ringwald             0,     0,   -19,   -48,    83,   104,  -230,  -156,
321*4930cef6SMatthias Ringwald           509,   152,  -985,     0,  1800,  -523, -3526,  2544,
322*4930cef6SMatthias Ringwald         14406, 16337,  5534, -3084, -1618,  1697,   585, -1015,
323*4930cef6SMatthias Ringwald          -164,   577,     0,  -291,    41,   120,   -30,   -34,
324*4930cef6SMatthias Ringwald 
325*4930cef6SMatthias Ringwald             0,     0,   -12,   -52,    62,   125,  -188,  -215,
326*4930cef6SMatthias Ringwald           445,   287,  -908,  -267,  1731,     0, -3495,  1202,
327*4930cef6SMatthias Ringwald         13161, 16971,  7118, -2590, -2143,  1516,   878,  -959,
328*4930cef6SMatthias Ringwald          -334,   574,    91,  -304,     0,   133,   -17,   -41,
329*4930cef6SMatthias Ringwald 
330*4930cef6SMatthias Ringwald             0,     0,    -5,   -52,    40,   138,  -142,  -261,
331*4930cef6SMatthias Ringwald           367,   399,  -796,  -504,  1593,   480, -3319,     0,
332*4930cef6SMatthias Ringwald         11772, 17358,  8712, -1908, -2619,  1249,  1153,  -854,
333*4930cef6SMatthias Ringwald          -501,   543,   185,  -305,   -45,   141,     0,   -46,
334*4930cef6SMatthias Ringwald     };
335*4930cef6SMatthias Ringwald 
336*4930cef6SMatthias Ringwald     arm_resample_x192k_12k8(
337*4930cef6SMatthias Ringwald         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
338*4930cef6SMatthias Ringwald }
339*4930cef6SMatthias Ringwald #endif /* resample_24k_12k8 */
340*4930cef6SMatthias Ringwald 
341*4930cef6SMatthias Ringwald /**
342*4930cef6SMatthias Ringwald  * Resample from 48 Khz to 12.8 KHz
343*4930cef6SMatthias Ringwald  */
344*4930cef6SMatthias Ringwald #ifndef resample_48k_12k8
345*4930cef6SMatthias Ringwald #define resample_48k_12k8 arm_resample_48k_12k8
346*4930cef6SMatthias Ringwald static void arm_resample_48k_12k8(
347*4930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
348*4930cef6SMatthias Ringwald {
349*4930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*4*64] = {
350*4930cef6SMatthias Ringwald 
351*4930cef6SMatthias Ringwald             0,   -13,   -25,   -20,    10,    51,    71,    38,
352*4930cef6SMatthias Ringwald           -47,  -133,  -145,   -42,   139,   277,   242,     0,
353*4930cef6SMatthias Ringwald          -329,  -511,  -351,   144,   698,   895,   450,  -535,
354*4930cef6SMatthias Ringwald         -1510, -1697,  -521,  1999,  5138,  7737,  8744,  7737,
355*4930cef6SMatthias Ringwald          5138,  1999,  -521, -1697, -1510,  -535,   450,   895,
356*4930cef6SMatthias Ringwald           698,   144,  -351,  -511,  -329,     0,   242,   277,
357*4930cef6SMatthias Ringwald           139,   -42,  -145,  -133,   -47,    38,    71,    51,
358*4930cef6SMatthias Ringwald            10,   -20,   -25,   -13,     0,     0,     0,     0,
359*4930cef6SMatthias Ringwald 
360*4930cef6SMatthias Ringwald             0,    -9,   -23,   -24,     0,    41,    71,    52,
361*4930cef6SMatthias Ringwald           -23,  -115,  -152,   -78,    92,   254,   272,    76,
362*4930cef6SMatthias Ringwald          -251,  -493,  -427,     0,   576,   900,   624,  -262,
363*4930cef6SMatthias Ringwald         -1309, -1763,  -954,  1272,  4356,  7203,  8679,  8169,
364*4930cef6SMatthias Ringwald          5886,  2767,     0, -1542, -1660,  -809,   240,   848,
365*4930cef6SMatthias Ringwald           796,   292,  -252,  -507,  -398,   -82,   199,   288,
366*4930cef6SMatthias Ringwald           183,     0,  -130,  -145,   -71,    20,    69,    60,
367*4930cef6SMatthias Ringwald            20,   -15,   -26,   -17,    -3,     0,     0,     0,
368*4930cef6SMatthias Ringwald 
369*4930cef6SMatthias Ringwald             0,    -6,   -20,   -26,    -8,    31,    67,    62,
370*4930cef6SMatthias Ringwald             0,   -94,  -152,  -108,    45,   223,   287,   143,
371*4930cef6SMatthias Ringwald          -167,  -454,  -480,  -134,   439,   866,   758,     0,
372*4930cef6SMatthias Ringwald         -1071, -1748, -1295,   601,  3559,  6580,  8485,  8485,
373*4930cef6SMatthias Ringwald          6580,  3559,   601, -1295, -1748, -1071,     0,   758,
374*4930cef6SMatthias Ringwald           866,   439,  -134,  -480,  -454,  -167,   143,   287,
375*4930cef6SMatthias Ringwald           223,    45,  -108,  -152,   -94,     0,    62,    67,
376*4930cef6SMatthias Ringwald            31,    -8,   -26,   -20,    -6,     0,     0,     0,
377*4930cef6SMatthias Ringwald 
378*4930cef6SMatthias Ringwald             0,    -3,   -17,   -26,   -15,    20,    60,    69,
379*4930cef6SMatthias Ringwald            20,   -71,  -145,  -130,     0,   183,   288,   199,
380*4930cef6SMatthias Ringwald           -82,  -398,  -507,  -252,   292,   796,   848,   240,
381*4930cef6SMatthias Ringwald          -809, -1660, -1542,     0,  2767,  5886,  8169,  8679,
382*4930cef6SMatthias Ringwald          7203,  4356,  1272,  -954, -1763, -1309,  -262,   624,
383*4930cef6SMatthias Ringwald           900,   576,     0,  -427,  -493,  -251,    76,   272,
384*4930cef6SMatthias Ringwald           254,    92,   -78,  -152,  -115,   -23,    52,    71,
385*4930cef6SMatthias Ringwald            41,     0,   -24,   -23,    -9,     0,     0,     0,
386*4930cef6SMatthias Ringwald 
387*4930cef6SMatthias Ringwald             0,     0,   -13,   -25,   -20,    10,    51,    71,
388*4930cef6SMatthias Ringwald            38,   -47,  -133,  -145,   -42,   139,   277,   242,
389*4930cef6SMatthias Ringwald             0,  -329,  -511,  -351,   144,   698,   895,   450,
390*4930cef6SMatthias Ringwald          -535, -1510, -1697,  -521,  1999,  5138,  7737,  8744,
391*4930cef6SMatthias Ringwald          7737,  5138,  1999,  -521, -1697, -1510,  -535,   450,
392*4930cef6SMatthias Ringwald           895,   698,   144,  -351,  -511,  -329,     0,   242,
393*4930cef6SMatthias Ringwald           277,   139,   -42,  -145,  -133,   -47,    38,    71,
394*4930cef6SMatthias Ringwald            51,    10,   -20,   -25,   -13,     0,     0,     0,
395*4930cef6SMatthias Ringwald 
396*4930cef6SMatthias Ringwald             0,     0,    -9,   -23,   -24,     0,    41,    71,
397*4930cef6SMatthias Ringwald            52,   -23,  -115,  -152,   -78,    92,   254,   272,
398*4930cef6SMatthias Ringwald            76,  -251,  -493,  -427,     0,   576,   900,   624,
399*4930cef6SMatthias Ringwald          -262, -1309, -1763,  -954,  1272,  4356,  7203,  8679,
400*4930cef6SMatthias Ringwald          8169,  5886,  2767,     0, -1542, -1660,  -809,   240,
401*4930cef6SMatthias Ringwald           848,   796,   292,  -252,  -507,  -398,   -82,   199,
402*4930cef6SMatthias Ringwald           288,   183,     0,  -130,  -145,   -71,    20,    69,
403*4930cef6SMatthias Ringwald            60,    20,   -15,   -26,   -17,    -3,     0,     0,
404*4930cef6SMatthias Ringwald 
405*4930cef6SMatthias Ringwald             0,     0,    -6,   -20,   -26,    -8,    31,    67,
406*4930cef6SMatthias Ringwald            62,     0,   -94,  -152,  -108,    45,   223,   287,
407*4930cef6SMatthias Ringwald           143,  -167,  -454,  -480,  -134,   439,   866,   758,
408*4930cef6SMatthias Ringwald             0, -1071, -1748, -1295,   601,  3559,  6580,  8485,
409*4930cef6SMatthias Ringwald          8485,  6580,  3559,   601, -1295, -1748, -1071,     0,
410*4930cef6SMatthias Ringwald           758,   866,   439,  -134,  -480,  -454,  -167,   143,
411*4930cef6SMatthias Ringwald           287,   223,    45,  -108,  -152,   -94,     0,    62,
412*4930cef6SMatthias Ringwald            67,    31,    -8,   -26,   -20,    -6,     0,     0,
413*4930cef6SMatthias Ringwald 
414*4930cef6SMatthias Ringwald             0,     0,    -3,   -17,   -26,   -15,    20,    60,
415*4930cef6SMatthias Ringwald            69,    20,   -71,  -145,  -130,     0,   183,   288,
416*4930cef6SMatthias Ringwald           199,   -82,  -398,  -507,  -252,   292,   796,   848,
417*4930cef6SMatthias Ringwald           240,  -809, -1660, -1542,     0,  2767,  5886,  8169,
418*4930cef6SMatthias Ringwald          8679,  7203,  4356,  1272,  -954, -1763, -1309,  -262,
419*4930cef6SMatthias Ringwald           624,   900,   576,     0,  -427,  -493,  -251,    76,
420*4930cef6SMatthias Ringwald           272,   254,    92,   -78,  -152,  -115,   -23,    52,
421*4930cef6SMatthias Ringwald            71,    41,     0,   -24,   -23,    -9,     0,     0,
422*4930cef6SMatthias Ringwald     };
423*4930cef6SMatthias Ringwald 
424*4930cef6SMatthias Ringwald     arm_resample_x192k_12k8(
425*4930cef6SMatthias Ringwald         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
426*4930cef6SMatthias Ringwald }
427*4930cef6SMatthias Ringwald #endif /* resample_48k_12k8 */
428*4930cef6SMatthias Ringwald 
429*4930cef6SMatthias Ringwald /**
430*4930cef6SMatthias Ringwald  * Return vector of correlations
431*4930cef6SMatthias Ringwald  */
432*4930cef6SMatthias Ringwald #ifndef correlate
433*4930cef6SMatthias Ringwald #define correlate arm_correlate
434*4930cef6SMatthias Ringwald static void arm_correlate(
435*4930cef6SMatthias Ringwald     const int16_t *a, const int16_t *b, int n, float *y, int nc)
436*4930cef6SMatthias Ringwald {
437*4930cef6SMatthias Ringwald     /* --- Check alignment of `b` --- */
438*4930cef6SMatthias Ringwald 
439*4930cef6SMatthias Ringwald     if ((uintptr_t)b & 3)
440*4930cef6SMatthias Ringwald         *(y++) = dot(a, b--, n), nc--;
441*4930cef6SMatthias Ringwald 
442*4930cef6SMatthias Ringwald     /* --- Processing by pair --- */
443*4930cef6SMatthias Ringwald 
444*4930cef6SMatthias Ringwald     for ( ; nc >= 2; nc -= 2) {
445*4930cef6SMatthias Ringwald         const int16x2_t *an = (const int16x2_t *)(a  );
446*4930cef6SMatthias Ringwald         const int16x2_t *bn = (const int16x2_t *)(b--);
447*4930cef6SMatthias Ringwald 
448*4930cef6SMatthias Ringwald         int16x2_t ax, b0, b1;
449*4930cef6SMatthias Ringwald         int64_t v0 = 0, v1 = 0;
450*4930cef6SMatthias Ringwald 
451*4930cef6SMatthias Ringwald         b1 = (int16x2_t)*(b--) << 16;
452*4930cef6SMatthias Ringwald 
453*4930cef6SMatthias Ringwald         for (int i = 0; i < (n >> 4); i++ )
454*4930cef6SMatthias Ringwald             for (int j = 0; j < 4; j++) {
455*4930cef6SMatthias Ringwald 
456*4930cef6SMatthias Ringwald                 ax = *(an++), b0 = *(bn++);
457*4930cef6SMatthias Ringwald                 v0 = __smlald (ax, b0, v0);
458*4930cef6SMatthias Ringwald                 v1 = __smlaldx(ax, __pkhbt(b0, b1), v1);
459*4930cef6SMatthias Ringwald 
460*4930cef6SMatthias Ringwald                 ax = *(an++), b1 = *(bn++);
461*4930cef6SMatthias Ringwald                 v0 = __smlald (ax, b1, v0);
462*4930cef6SMatthias Ringwald                 v1 = __smlaldx(ax, __pkhbt(b1, b0), v1);
463*4930cef6SMatthias Ringwald             }
464*4930cef6SMatthias Ringwald 
465*4930cef6SMatthias Ringwald         *(y++) = (float)((int32_t)((v0 + (1 << 5)) >> 6));
466*4930cef6SMatthias Ringwald         *(y++) = (float)((int32_t)((v1 + (1 << 5)) >> 6));
467*4930cef6SMatthias Ringwald     }
468*4930cef6SMatthias Ringwald 
469*4930cef6SMatthias Ringwald     /* --- Odd element count --- */
470*4930cef6SMatthias Ringwald 
471*4930cef6SMatthias Ringwald     if (nc > 0)
472*4930cef6SMatthias Ringwald         *(y++) = dot(a, b, n);
473*4930cef6SMatthias Ringwald }
474*4930cef6SMatthias Ringwald #endif /* correlate */
475*4930cef6SMatthias Ringwald 
476*4930cef6SMatthias Ringwald #endif /* __ARM_FEATURE_SIMD32 */
477