xref: /btstack/3rd-party/lc3-google/src/ltpf_arm.h (revision 4c4eb519208b4224604d94b3ed1931841ddd93bb)
14930cef6SMatthias Ringwald /******************************************************************************
24930cef6SMatthias Ringwald  *
34930cef6SMatthias Ringwald  *  Copyright 2022 Google LLC
44930cef6SMatthias Ringwald  *
54930cef6SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
64930cef6SMatthias Ringwald  *  you may not use this file except in compliance with the License.
74930cef6SMatthias Ringwald  *  You may obtain a copy of the License at:
84930cef6SMatthias Ringwald  *
94930cef6SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
104930cef6SMatthias Ringwald  *
114930cef6SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
124930cef6SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
134930cef6SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
144930cef6SMatthias Ringwald  *  See the License for the specific language governing permissions and
154930cef6SMatthias Ringwald  *  limitations under the License.
164930cef6SMatthias Ringwald  *
174930cef6SMatthias Ringwald  ******************************************************************************/
184930cef6SMatthias Ringwald 
19*4c4eb519SMatthias Ringwald #if (__ARM_FEATURE_SIMD32 && !(__GNUC__ < 10) || defined(TEST_ARM))
204930cef6SMatthias Ringwald 
214930cef6SMatthias Ringwald #ifndef TEST_ARM
224930cef6SMatthias Ringwald 
234930cef6SMatthias Ringwald #include <arm_acle.h>
244930cef6SMatthias Ringwald 
__pkhbt(int16x2_t a,int16x2_t b)254930cef6SMatthias Ringwald static inline int16x2_t __pkhbt(int16x2_t a, int16x2_t b)
264930cef6SMatthias Ringwald {
274930cef6SMatthias Ringwald     int16x2_t r;
284930cef6SMatthias Ringwald     __asm("pkhbt %0, %1, %2" : "=r" (r) : "r" (a), "r" (b));
294930cef6SMatthias Ringwald     return r;
304930cef6SMatthias Ringwald }
314930cef6SMatthias Ringwald 
324930cef6SMatthias Ringwald #endif /* TEST_ARM */
334930cef6SMatthias Ringwald 
344930cef6SMatthias Ringwald 
354930cef6SMatthias Ringwald /**
364930cef6SMatthias Ringwald  * Import
374930cef6SMatthias Ringwald  */
384930cef6SMatthias Ringwald 
394930cef6SMatthias Ringwald static inline int32_t filter_hp50(struct lc3_ltpf_hp50_state *, int32_t);
404930cef6SMatthias Ringwald static inline float dot(const int16_t *, const int16_t *, int);
414930cef6SMatthias Ringwald 
424930cef6SMatthias Ringwald 
434930cef6SMatthias Ringwald /**
444930cef6SMatthias Ringwald  * Resample from 8 / 16 / 32 KHz to 12.8 KHz Template
454930cef6SMatthias Ringwald  */
464930cef6SMatthias Ringwald #if !defined(resample_8k_12k8) || !defined(resample_16k_12k8) \
474930cef6SMatthias Ringwald     || !defined(resample_32k_12k8)
arm_resample_x64k_12k8(const int p,const int16x2_t * h,struct lc3_ltpf_hp50_state * hp50,const int16x2_t * x,int16_t * y,int n)484930cef6SMatthias Ringwald static inline void arm_resample_x64k_12k8(const int p, const int16x2_t *h,
494930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
504930cef6SMatthias Ringwald {
514930cef6SMatthias Ringwald     const int w = 40 / p;
524930cef6SMatthias Ringwald 
534930cef6SMatthias Ringwald     x -= w;
544930cef6SMatthias Ringwald 
554930cef6SMatthias Ringwald     for (int i = 0; i < 5*n; i += 5) {
564930cef6SMatthias Ringwald         const int16x2_t *hn = h + (i % (2*p)) * (48 / p);
574930cef6SMatthias Ringwald         const int16x2_t *xn = x + (i / (2*p));
584930cef6SMatthias Ringwald 
594930cef6SMatthias Ringwald         int32_t un = __smlad(*(xn++), *(hn++), 0);
604930cef6SMatthias Ringwald 
614930cef6SMatthias Ringwald         for (int k = 0; k < w; k += 5) {
624930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
634930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
644930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
654930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
664930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
674930cef6SMatthias Ringwald         }
684930cef6SMatthias Ringwald 
694930cef6SMatthias Ringwald         int32_t yn = filter_hp50(hp50, un);
704930cef6SMatthias Ringwald         *(y++) = (yn + (1 << 15)) >> 16;
714930cef6SMatthias Ringwald     }
724930cef6SMatthias Ringwald }
734930cef6SMatthias Ringwald #endif
744930cef6SMatthias Ringwald 
754930cef6SMatthias Ringwald /**
764930cef6SMatthias Ringwald  * Resample from 24 / 48 KHz to 12.8 KHz Template
774930cef6SMatthias Ringwald  */
784930cef6SMatthias Ringwald #if !defined(resample_24k_12k8) || !defined(resample_48k_12k8)
arm_resample_x192k_12k8(const int p,const int16x2_t * h,struct lc3_ltpf_hp50_state * hp50,const int16x2_t * x,int16_t * y,int n)794930cef6SMatthias Ringwald static inline void arm_resample_x192k_12k8(const int p, const int16x2_t *h,
804930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16x2_t *x, int16_t *y, int n)
814930cef6SMatthias Ringwald {
824930cef6SMatthias Ringwald     const int w = 120 / p;
834930cef6SMatthias Ringwald 
844930cef6SMatthias Ringwald     x -= w;
854930cef6SMatthias Ringwald 
864930cef6SMatthias Ringwald     for (int i = 0; i < 15*n; i += 15) {
874930cef6SMatthias Ringwald         const int16x2_t *hn = h + (i % (2*p)) * (128 / p);
884930cef6SMatthias Ringwald         const int16x2_t *xn = x + (i / (2*p));
894930cef6SMatthias Ringwald 
904930cef6SMatthias Ringwald         int32_t un = __smlad(*(xn++), *(hn++), 0);
914930cef6SMatthias Ringwald 
924930cef6SMatthias Ringwald         for (int k = 0; k < w; k += 15) {
934930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
944930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
954930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
964930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
974930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
984930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
994930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1004930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1014930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1024930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1034930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1044930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1054930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1064930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1074930cef6SMatthias Ringwald             un = __smlad(*(xn++), *(hn++), un);
1084930cef6SMatthias Ringwald         }
1094930cef6SMatthias Ringwald 
1104930cef6SMatthias Ringwald         int32_t yn = filter_hp50(hp50, un);
1114930cef6SMatthias Ringwald         *(y++) = (yn + (1 << 15)) >> 16;
1124930cef6SMatthias Ringwald     }
1134930cef6SMatthias Ringwald }
1144930cef6SMatthias Ringwald #endif
1154930cef6SMatthias Ringwald 
1164930cef6SMatthias Ringwald /**
1174930cef6SMatthias Ringwald  * Resample from 8 Khz to 12.8 KHz
1184930cef6SMatthias Ringwald  */
1194930cef6SMatthias Ringwald #ifndef resample_8k_12k8
120*4c4eb519SMatthias Ringwald 
arm_resample_8k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)1214930cef6SMatthias Ringwald static void arm_resample_8k_12k8(
1224930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
1234930cef6SMatthias Ringwald {
1244930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*8*12] = {
1254930cef6SMatthias Ringwald         0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0, 0,
1264930cef6SMatthias Ringwald         0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28, 0,
1274930cef6SMatthias Ringwald         0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61, 0,
1284930cef6SMatthias Ringwald         0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79, 0,
1294930cef6SMatthias Ringwald         0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61, 0,
1304930cef6SMatthias Ringwald         0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0, 0,
1314930cef6SMatthias Ringwald         0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92, 0,
1324930cef6SMatthias Ringwald         0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180, 0,
1334930cef6SMatthias Ringwald         0, 0, 214,  417, -1052, -4529, 26233, -4529, -1052,   417,  214,   0,
1344930cef6SMatthias Ringwald         0, 0, 180,    0, -1522, -2427, 24506, -5289,     0,   763,  156, -28,
1354930cef6SMatthias Ringwald         0, 0,  92, -323, -1361,     0, 19741, -3885,  1317,   861,    0, -61,
1364930cef6SMatthias Ringwald         0, 0,   0, -457,  -752,  1873, 13068,     0,  2389,   598, -213, -79,
1374930cef6SMatthias Ringwald         0, 0, -61, -398,     0,  2686,  5997,  5997,  2686,     0, -398, -61,
1384930cef6SMatthias Ringwald         0, 0, -79, -213,   598,  2389,     0, 13068,  1873,  -752, -457,   0,
1394930cef6SMatthias Ringwald         0, 0, -61,    0,   861,  1317, -3885, 19741,     0, -1361, -323,  92,
1404930cef6SMatthias Ringwald         0, 0, -28,  156,   763,     0, -5289, 24506, -2427, -1522,    0, 180,
1414930cef6SMatthias Ringwald     };
1424930cef6SMatthias Ringwald 
1434930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
1444930cef6SMatthias Ringwald         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
1454930cef6SMatthias Ringwald }
146*4c4eb519SMatthias Ringwald 
147*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
148*4c4eb519SMatthias Ringwald #define resample_8k_12k8 arm_resample_8k_12k8
149*4c4eb519SMatthias Ringwald #endif
150*4c4eb519SMatthias Ringwald 
1514930cef6SMatthias Ringwald #endif /* resample_8k_12k8 */
1524930cef6SMatthias Ringwald 
1534930cef6SMatthias Ringwald /**
1544930cef6SMatthias Ringwald  * Resample from 16 Khz to 12.8 KHz
1554930cef6SMatthias Ringwald  */
1564930cef6SMatthias Ringwald #ifndef resample_16k_12k8
157*4c4eb519SMatthias Ringwald 
arm_resample_16k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)1584930cef6SMatthias Ringwald static void arm_resample_16k_12k8(
1594930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
1604930cef6SMatthias Ringwald {
1614930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*4*24] = {
1624930cef6SMatthias Ringwald 
1634930cef6SMatthias Ringwald             0,   -61,   214,  -398,   417,     0, -1052,  2686,
1644930cef6SMatthias Ringwald         -4529,  5997, 26233,  5997, -4529,  2686, -1052,     0,
1654930cef6SMatthias Ringwald           417,  -398,   214,   -61,     0,     0,     0,     0,
1664930cef6SMatthias Ringwald 
1674930cef6SMatthias Ringwald 
1684930cef6SMatthias Ringwald             0,   -79,   180,  -213,     0,   598, -1522,  2389,
1694930cef6SMatthias Ringwald         -2427,     0, 24506, 13068, -5289,  1873,     0,  -752,
1704930cef6SMatthias Ringwald           763,  -457,   156,     0,   -28,     0,     0,     0,
1714930cef6SMatthias Ringwald 
1724930cef6SMatthias Ringwald 
1734930cef6SMatthias Ringwald             0,   -61,    92,     0,  -323,   861, -1361,  1317,
1744930cef6SMatthias Ringwald             0, -3885, 19741, 19741, -3885,     0,  1317, -1361,
1754930cef6SMatthias Ringwald           861,  -323,     0,    92,   -61,     0,     0,     0,
1764930cef6SMatthias Ringwald 
1774930cef6SMatthias Ringwald             0,   -28,     0,   156,  -457,   763,  -752,     0,
1784930cef6SMatthias Ringwald          1873, -5289, 13068, 24506,     0, -2427,  2389, -1522,
1794930cef6SMatthias Ringwald           598,     0,  -213,   180,   -79,     0,     0,     0,
1804930cef6SMatthias Ringwald 
1814930cef6SMatthias Ringwald 
1824930cef6SMatthias Ringwald             0,     0,   -61,   214,  -398,   417,     0, -1052,
1834930cef6SMatthias Ringwald          2686, -4529,  5997, 26233,  5997, -4529,  2686, -1052,
1844930cef6SMatthias Ringwald             0,   417,  -398,   214,   -61,     0,     0,     0,
1854930cef6SMatthias Ringwald 
1864930cef6SMatthias Ringwald 
1874930cef6SMatthias Ringwald             0,     0,   -79,   180,  -213,     0,   598, -1522,
1884930cef6SMatthias Ringwald          2389, -2427,     0, 24506, 13068, -5289,  1873,     0,
1894930cef6SMatthias Ringwald          -752,   763,  -457,   156,     0,   -28,     0,     0,
1904930cef6SMatthias Ringwald 
1914930cef6SMatthias Ringwald 
1924930cef6SMatthias Ringwald             0,     0,   -61,    92,     0,  -323,   861, -1361,
1934930cef6SMatthias Ringwald          1317,     0, -3885, 19741, 19741, -3885,     0,  1317,
1944930cef6SMatthias Ringwald         -1361,   861,  -323,     0,    92,   -61,     0,     0,
1954930cef6SMatthias Ringwald 
1964930cef6SMatthias Ringwald             0,     0,   -28,     0,   156,  -457,   763,  -752,
1974930cef6SMatthias Ringwald             0,  1873, -5289, 13068, 24506,     0, -2427,  2389,
1984930cef6SMatthias Ringwald         -1522,   598,     0,  -213,   180,   -79,     0,     0,
1994930cef6SMatthias Ringwald     };
2004930cef6SMatthias Ringwald 
2014930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
2024930cef6SMatthias Ringwald         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
2034930cef6SMatthias Ringwald }
204*4c4eb519SMatthias Ringwald 
205*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
206*4c4eb519SMatthias Ringwald #define resample_16k_12k8 arm_resample_16k_12k8
207*4c4eb519SMatthias Ringwald #endif
208*4c4eb519SMatthias Ringwald 
2094930cef6SMatthias Ringwald #endif /* resample_16k_12k8 */
2104930cef6SMatthias Ringwald 
2114930cef6SMatthias Ringwald /**
2124930cef6SMatthias Ringwald  * Resample from 32 Khz to 12.8 KHz
2134930cef6SMatthias Ringwald  */
2144930cef6SMatthias Ringwald #ifndef resample_32k_12k8
215*4c4eb519SMatthias Ringwald 
arm_resample_32k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)2164930cef6SMatthias Ringwald static void arm_resample_32k_12k8(
2174930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
2184930cef6SMatthias Ringwald {
2194930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*2*48] = {
2204930cef6SMatthias Ringwald 
2214930cef6SMatthias Ringwald             0,   -30,   -31,    46,   107,     0,  -199,  -162,
2224930cef6SMatthias Ringwald           209,   430,     0,  -681,  -526,   658,  1343,     0,
2234930cef6SMatthias Ringwald         -2264, -1943,  2999,  9871, 13116,  9871,  2999, -1943,
2244930cef6SMatthias Ringwald         -2264,     0,  1343,   658,  -526,  -681,     0,   430,
2254930cef6SMatthias Ringwald           209,  -162,  -199,     0,   107,    46,   -31,   -30,
2264930cef6SMatthias Ringwald             0,     0,     0,     0,     0,     0,     0,     0,
2274930cef6SMatthias Ringwald 
2284930cef6SMatthias Ringwald             0,   -14,   -39,     0,    90,    78,  -106,  -229,
2294930cef6SMatthias Ringwald             0,   382,   299,  -376,  -761,     0,  1194,   937,
2304930cef6SMatthias Ringwald         -1214, -2644,     0,  6534, 12253, 12253,  6534,     0,
2314930cef6SMatthias Ringwald         -2644, -1214,   937,  1194,     0,  -761,  -376,   299,
2324930cef6SMatthias Ringwald           382,     0,  -229,  -106,    78,    90,     0,   -39,
2334930cef6SMatthias Ringwald           -14,     0,     0,     0,     0,     0,     0,     0,
2344930cef6SMatthias Ringwald 
2354930cef6SMatthias Ringwald             0,     0,   -30,   -31,    46,   107,     0,  -199,
2364930cef6SMatthias Ringwald          -162,   209,   430,     0,  -681,  -526,   658,  1343,
2374930cef6SMatthias Ringwald             0, -2264, -1943,  2999,  9871, 13116,  9871,  2999,
2384930cef6SMatthias Ringwald         -1943, -2264,     0,  1343,   658,  -526,  -681,     0,
2394930cef6SMatthias Ringwald           430,   209,  -162,  -199,     0,   107,    46,   -31,
2404930cef6SMatthias Ringwald           -30,     0,     0,     0,     0,     0,     0,     0,
2414930cef6SMatthias Ringwald 
2424930cef6SMatthias Ringwald             0,     0,   -14,   -39,     0,    90,    78,  -106,
2434930cef6SMatthias Ringwald          -229,     0,   382,   299,  -376,  -761,     0,  1194,
2444930cef6SMatthias Ringwald           937, -1214, -2644,     0,  6534, 12253, 12253,  6534,
2454930cef6SMatthias Ringwald             0, -2644, -1214,   937,  1194,     0,  -761,  -376,
2464930cef6SMatthias Ringwald           299,   382,     0,  -229,  -106,    78,    90,     0,
2474930cef6SMatthias Ringwald           -39,   -14,     0,     0,     0,     0,     0,     0,
2484930cef6SMatthias Ringwald     };
2494930cef6SMatthias Ringwald 
2504930cef6SMatthias Ringwald     arm_resample_x64k_12k8(
2514930cef6SMatthias Ringwald         2, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
2524930cef6SMatthias Ringwald }
253*4c4eb519SMatthias Ringwald 
254*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
255*4c4eb519SMatthias Ringwald #define resample_32k_12k8 arm_resample_32k_12k8
256*4c4eb519SMatthias Ringwald #endif
257*4c4eb519SMatthias Ringwald 
2584930cef6SMatthias Ringwald #endif /* resample_32k_12k8 */
2594930cef6SMatthias Ringwald 
2604930cef6SMatthias Ringwald /**
2614930cef6SMatthias Ringwald  * Resample from 24 Khz to 12.8 KHz
2624930cef6SMatthias Ringwald  */
2634930cef6SMatthias Ringwald #ifndef resample_24k_12k8
264*4c4eb519SMatthias Ringwald 
arm_resample_24k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)2654930cef6SMatthias Ringwald static void arm_resample_24k_12k8(
2664930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
2674930cef6SMatthias Ringwald {
2684930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*8*32] = {
2694930cef6SMatthias Ringwald 
2704930cef6SMatthias Ringwald             0,   -50,    19,   143,   -93,  -290,   278,   485,
2714930cef6SMatthias Ringwald          -658,  -701,  1396,   901, -3019, -1042, 10276, 17488,
2724930cef6SMatthias Ringwald         10276, -1042, -3019,   901,  1396,  -701,  -658,   485,
2734930cef6SMatthias Ringwald           278,  -290,   -93,   143,    19,   -50,     0,     0,
2744930cef6SMatthias Ringwald 
2754930cef6SMatthias Ringwald             0,   -46,     0,   141,   -45,  -305,   185,   543,
2764930cef6SMatthias Ringwald          -501,  -854,  1153,  1249, -2619, -1908,  8712, 17358,
2774930cef6SMatthias Ringwald         11772,     0, -3319,   480,  1593,  -504,  -796,   399,
2784930cef6SMatthias Ringwald           367,  -261,  -142,   138,    40,   -52,    -5,     0,
2794930cef6SMatthias Ringwald 
2804930cef6SMatthias Ringwald             0,   -41,   -17,   133,     0,  -304,    91,   574,
2814930cef6SMatthias Ringwald          -334,  -959,   878,  1516, -2143, -2590,  7118, 16971,
2824930cef6SMatthias Ringwald         13161,  1202, -3495,     0,  1731,  -267,  -908,   287,
2834930cef6SMatthias Ringwald           445,  -215,  -188,   125,    62,   -52,   -12,     0,
2844930cef6SMatthias Ringwald 
2854930cef6SMatthias Ringwald             0,   -34,   -30,   120,    41,  -291,     0,   577,
2864930cef6SMatthias Ringwald          -164, -1015,   585,  1697, -1618, -3084,  5534, 16337,
2874930cef6SMatthias Ringwald         14406,  2544, -3526,  -523,  1800,     0,  -985,   152,
2884930cef6SMatthias Ringwald           509,  -156,  -230,   104,    83,   -48,   -19,     0,
2894930cef6SMatthias Ringwald 
2904930cef6SMatthias Ringwald             0,   -26,   -41,   103,    76,  -265,   -83,   554,
2914930cef6SMatthias Ringwald             0, -1023,   288,  1791, -1070, -3393,  3998, 15474,
2924930cef6SMatthias Ringwald         15474,  3998, -3393, -1070,  1791,   288, -1023,     0,
2934930cef6SMatthias Ringwald           554,   -83,  -265,    76,   103,   -41,   -26,     0,
2944930cef6SMatthias Ringwald 
2954930cef6SMatthias Ringwald             0,   -19,   -48,    83,   104,  -230,  -156,   509,
2964930cef6SMatthias Ringwald           152,  -985,     0,  1800,  -523, -3526,  2544, 14406,
2974930cef6SMatthias Ringwald         16337,  5534, -3084, -1618,  1697,   585, -1015,  -164,
2984930cef6SMatthias Ringwald           577,     0,  -291,    41,   120,   -30,   -34,     0,
2994930cef6SMatthias Ringwald 
3004930cef6SMatthias Ringwald             0,   -12,   -52,    62,   125,  -188,  -215,   445,
3014930cef6SMatthias Ringwald           287,  -908,  -267,  1731,     0, -3495,  1202, 13161,
3024930cef6SMatthias Ringwald         16971,  7118, -2590, -2143,  1516,   878,  -959,  -334,
3034930cef6SMatthias Ringwald           574,    91,  -304,     0,   133,   -17,   -41,     0,
3044930cef6SMatthias Ringwald 
3054930cef6SMatthias Ringwald             0,    -5,   -52,    40,   138,  -142,  -261,   367,
3064930cef6SMatthias Ringwald           399,  -796,  -504,  1593,   480, -3319,     0, 11772,
3074930cef6SMatthias Ringwald         17358,  8712, -1908, -2619,  1249,  1153,  -854,  -501,
3084930cef6SMatthias Ringwald           543,   185,  -305,   -45,   141,     0,   -46,     0,
3094930cef6SMatthias Ringwald 
3104930cef6SMatthias Ringwald             0,     0,   -50,    19,   143,   -93,  -290,   278,
3114930cef6SMatthias Ringwald           485,  -658,  -701,  1396,   901, -3019, -1042, 10276,
3124930cef6SMatthias Ringwald         17488, 10276, -1042, -3019,   901,  1396,  -701,  -658,
3134930cef6SMatthias Ringwald           485,   278,  -290,   -93,   143,    19,   -50,     0,
3144930cef6SMatthias Ringwald 
3154930cef6SMatthias Ringwald             0,     0,   -46,     0,   141,   -45,  -305,   185,
3164930cef6SMatthias Ringwald           543,  -501,  -854,  1153,  1249, -2619, -1908,  8712,
3174930cef6SMatthias Ringwald         17358, 11772,     0, -3319,   480,  1593,  -504,  -796,
3184930cef6SMatthias Ringwald           399,   367,  -261,  -142,   138,    40,   -52,    -5,
3194930cef6SMatthias Ringwald 
3204930cef6SMatthias Ringwald             0,     0,   -41,   -17,   133,     0,  -304,    91,
3214930cef6SMatthias Ringwald           574,  -334,  -959,   878,  1516, -2143, -2590,  7118,
3224930cef6SMatthias Ringwald         16971, 13161,  1202, -3495,     0,  1731,  -267,  -908,
3234930cef6SMatthias Ringwald           287,   445,  -215,  -188,   125,    62,   -52,   -12,
3244930cef6SMatthias Ringwald 
3254930cef6SMatthias Ringwald             0,     0,   -34,   -30,   120,    41,  -291,     0,
3264930cef6SMatthias Ringwald           577,  -164, -1015,   585,  1697, -1618, -3084,  5534,
3274930cef6SMatthias Ringwald         16337, 14406,  2544, -3526,  -523,  1800,     0,  -985,
3284930cef6SMatthias Ringwald           152,   509,  -156,  -230,   104,    83,   -48,   -19,
3294930cef6SMatthias Ringwald 
3304930cef6SMatthias Ringwald             0,     0,   -26,   -41,   103,    76,  -265,   -83,
3314930cef6SMatthias Ringwald           554,     0, -1023,   288,  1791, -1070, -3393,  3998,
3324930cef6SMatthias Ringwald         15474, 15474,  3998, -3393, -1070,  1791,   288, -1023,
3334930cef6SMatthias Ringwald             0,   554,   -83,  -265,    76,   103,   -41,   -26,
3344930cef6SMatthias Ringwald 
3354930cef6SMatthias Ringwald             0,     0,   -19,   -48,    83,   104,  -230,  -156,
3364930cef6SMatthias Ringwald           509,   152,  -985,     0,  1800,  -523, -3526,  2544,
3374930cef6SMatthias Ringwald         14406, 16337,  5534, -3084, -1618,  1697,   585, -1015,
3384930cef6SMatthias Ringwald          -164,   577,     0,  -291,    41,   120,   -30,   -34,
3394930cef6SMatthias Ringwald 
3404930cef6SMatthias Ringwald             0,     0,   -12,   -52,    62,   125,  -188,  -215,
3414930cef6SMatthias Ringwald           445,   287,  -908,  -267,  1731,     0, -3495,  1202,
3424930cef6SMatthias Ringwald         13161, 16971,  7118, -2590, -2143,  1516,   878,  -959,
3434930cef6SMatthias Ringwald          -334,   574,    91,  -304,     0,   133,   -17,   -41,
3444930cef6SMatthias Ringwald 
3454930cef6SMatthias Ringwald             0,     0,    -5,   -52,    40,   138,  -142,  -261,
3464930cef6SMatthias Ringwald           367,   399,  -796,  -504,  1593,   480, -3319,     0,
3474930cef6SMatthias Ringwald         11772, 17358,  8712, -1908, -2619,  1249,  1153,  -854,
3484930cef6SMatthias Ringwald          -501,   543,   185,  -305,   -45,   141,     0,   -46,
3494930cef6SMatthias Ringwald     };
3504930cef6SMatthias Ringwald 
3514930cef6SMatthias Ringwald     arm_resample_x192k_12k8(
3524930cef6SMatthias Ringwald         8, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
3534930cef6SMatthias Ringwald }
354*4c4eb519SMatthias Ringwald 
355*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
356*4c4eb519SMatthias Ringwald #define resample_24k_12k8 arm_resample_24k_12k8
357*4c4eb519SMatthias Ringwald #endif
358*4c4eb519SMatthias Ringwald 
3594930cef6SMatthias Ringwald #endif /* resample_24k_12k8 */
3604930cef6SMatthias Ringwald 
3614930cef6SMatthias Ringwald /**
3624930cef6SMatthias Ringwald  * Resample from 48 Khz to 12.8 KHz
3634930cef6SMatthias Ringwald  */
3644930cef6SMatthias Ringwald #ifndef resample_48k_12k8
365*4c4eb519SMatthias Ringwald 
arm_resample_48k_12k8(struct lc3_ltpf_hp50_state * hp50,const int16_t * x,int16_t * y,int n)3664930cef6SMatthias Ringwald static void arm_resample_48k_12k8(
3674930cef6SMatthias Ringwald     struct lc3_ltpf_hp50_state *hp50, const int16_t *x, int16_t *y, int n)
3684930cef6SMatthias Ringwald {
3694930cef6SMatthias Ringwald     static const int16_t alignas(int32_t) h[2*4*64] = {
3704930cef6SMatthias Ringwald 
3714930cef6SMatthias Ringwald             0,   -13,   -25,   -20,    10,    51,    71,    38,
3724930cef6SMatthias Ringwald           -47,  -133,  -145,   -42,   139,   277,   242,     0,
3734930cef6SMatthias Ringwald          -329,  -511,  -351,   144,   698,   895,   450,  -535,
3744930cef6SMatthias Ringwald         -1510, -1697,  -521,  1999,  5138,  7737,  8744,  7737,
3754930cef6SMatthias Ringwald          5138,  1999,  -521, -1697, -1510,  -535,   450,   895,
3764930cef6SMatthias Ringwald           698,   144,  -351,  -511,  -329,     0,   242,   277,
3774930cef6SMatthias Ringwald           139,   -42,  -145,  -133,   -47,    38,    71,    51,
3784930cef6SMatthias Ringwald            10,   -20,   -25,   -13,     0,     0,     0,     0,
3794930cef6SMatthias Ringwald 
3804930cef6SMatthias Ringwald             0,    -9,   -23,   -24,     0,    41,    71,    52,
3814930cef6SMatthias Ringwald           -23,  -115,  -152,   -78,    92,   254,   272,    76,
3824930cef6SMatthias Ringwald          -251,  -493,  -427,     0,   576,   900,   624,  -262,
3834930cef6SMatthias Ringwald         -1309, -1763,  -954,  1272,  4356,  7203,  8679,  8169,
3844930cef6SMatthias Ringwald          5886,  2767,     0, -1542, -1660,  -809,   240,   848,
3854930cef6SMatthias Ringwald           796,   292,  -252,  -507,  -398,   -82,   199,   288,
3864930cef6SMatthias Ringwald           183,     0,  -130,  -145,   -71,    20,    69,    60,
3874930cef6SMatthias Ringwald            20,   -15,   -26,   -17,    -3,     0,     0,     0,
3884930cef6SMatthias Ringwald 
3894930cef6SMatthias Ringwald             0,    -6,   -20,   -26,    -8,    31,    67,    62,
3904930cef6SMatthias Ringwald             0,   -94,  -152,  -108,    45,   223,   287,   143,
3914930cef6SMatthias Ringwald          -167,  -454,  -480,  -134,   439,   866,   758,     0,
3924930cef6SMatthias Ringwald         -1071, -1748, -1295,   601,  3559,  6580,  8485,  8485,
3934930cef6SMatthias Ringwald          6580,  3559,   601, -1295, -1748, -1071,     0,   758,
3944930cef6SMatthias Ringwald           866,   439,  -134,  -480,  -454,  -167,   143,   287,
3954930cef6SMatthias Ringwald           223,    45,  -108,  -152,   -94,     0,    62,    67,
3964930cef6SMatthias Ringwald            31,    -8,   -26,   -20,    -6,     0,     0,     0,
3974930cef6SMatthias Ringwald 
3984930cef6SMatthias Ringwald             0,    -3,   -17,   -26,   -15,    20,    60,    69,
3994930cef6SMatthias Ringwald            20,   -71,  -145,  -130,     0,   183,   288,   199,
4004930cef6SMatthias Ringwald           -82,  -398,  -507,  -252,   292,   796,   848,   240,
4014930cef6SMatthias Ringwald          -809, -1660, -1542,     0,  2767,  5886,  8169,  8679,
4024930cef6SMatthias Ringwald          7203,  4356,  1272,  -954, -1763, -1309,  -262,   624,
4034930cef6SMatthias Ringwald           900,   576,     0,  -427,  -493,  -251,    76,   272,
4044930cef6SMatthias Ringwald           254,    92,   -78,  -152,  -115,   -23,    52,    71,
4054930cef6SMatthias Ringwald            41,     0,   -24,   -23,    -9,     0,     0,     0,
4064930cef6SMatthias Ringwald 
4074930cef6SMatthias Ringwald             0,     0,   -13,   -25,   -20,    10,    51,    71,
4084930cef6SMatthias Ringwald            38,   -47,  -133,  -145,   -42,   139,   277,   242,
4094930cef6SMatthias Ringwald             0,  -329,  -511,  -351,   144,   698,   895,   450,
4104930cef6SMatthias Ringwald          -535, -1510, -1697,  -521,  1999,  5138,  7737,  8744,
4114930cef6SMatthias Ringwald          7737,  5138,  1999,  -521, -1697, -1510,  -535,   450,
4124930cef6SMatthias Ringwald           895,   698,   144,  -351,  -511,  -329,     0,   242,
4134930cef6SMatthias Ringwald           277,   139,   -42,  -145,  -133,   -47,    38,    71,
4144930cef6SMatthias Ringwald            51,    10,   -20,   -25,   -13,     0,     0,     0,
4154930cef6SMatthias Ringwald 
4164930cef6SMatthias Ringwald             0,     0,    -9,   -23,   -24,     0,    41,    71,
4174930cef6SMatthias Ringwald            52,   -23,  -115,  -152,   -78,    92,   254,   272,
4184930cef6SMatthias Ringwald            76,  -251,  -493,  -427,     0,   576,   900,   624,
4194930cef6SMatthias Ringwald          -262, -1309, -1763,  -954,  1272,  4356,  7203,  8679,
4204930cef6SMatthias Ringwald          8169,  5886,  2767,     0, -1542, -1660,  -809,   240,
4214930cef6SMatthias Ringwald           848,   796,   292,  -252,  -507,  -398,   -82,   199,
4224930cef6SMatthias Ringwald           288,   183,     0,  -130,  -145,   -71,    20,    69,
4234930cef6SMatthias Ringwald            60,    20,   -15,   -26,   -17,    -3,     0,     0,
4244930cef6SMatthias Ringwald 
4254930cef6SMatthias Ringwald             0,     0,    -6,   -20,   -26,    -8,    31,    67,
4264930cef6SMatthias Ringwald            62,     0,   -94,  -152,  -108,    45,   223,   287,
4274930cef6SMatthias Ringwald           143,  -167,  -454,  -480,  -134,   439,   866,   758,
4284930cef6SMatthias Ringwald             0, -1071, -1748, -1295,   601,  3559,  6580,  8485,
4294930cef6SMatthias Ringwald          8485,  6580,  3559,   601, -1295, -1748, -1071,     0,
4304930cef6SMatthias Ringwald           758,   866,   439,  -134,  -480,  -454,  -167,   143,
4314930cef6SMatthias Ringwald           287,   223,    45,  -108,  -152,   -94,     0,    62,
4324930cef6SMatthias Ringwald            67,    31,    -8,   -26,   -20,    -6,     0,     0,
4334930cef6SMatthias Ringwald 
4344930cef6SMatthias Ringwald             0,     0,    -3,   -17,   -26,   -15,    20,    60,
4354930cef6SMatthias Ringwald            69,    20,   -71,  -145,  -130,     0,   183,   288,
4364930cef6SMatthias Ringwald           199,   -82,  -398,  -507,  -252,   292,   796,   848,
4374930cef6SMatthias Ringwald           240,  -809, -1660, -1542,     0,  2767,  5886,  8169,
4384930cef6SMatthias Ringwald          8679,  7203,  4356,  1272,  -954, -1763, -1309,  -262,
4394930cef6SMatthias Ringwald           624,   900,   576,     0,  -427,  -493,  -251,    76,
4404930cef6SMatthias Ringwald           272,   254,    92,   -78,  -152,  -115,   -23,    52,
4414930cef6SMatthias Ringwald            71,    41,     0,   -24,   -23,    -9,     0,     0,
4424930cef6SMatthias Ringwald     };
4434930cef6SMatthias Ringwald 
4444930cef6SMatthias Ringwald     arm_resample_x192k_12k8(
4454930cef6SMatthias Ringwald         4, (const int16x2_t *)h, hp50, (int16x2_t *)x, y, n);
4464930cef6SMatthias Ringwald }
447*4c4eb519SMatthias Ringwald 
448*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
449*4c4eb519SMatthias Ringwald #define resample_48k_12k8 arm_resample_48k_12k8
450*4c4eb519SMatthias Ringwald #endif
451*4c4eb519SMatthias Ringwald 
4524930cef6SMatthias Ringwald #endif /* resample_48k_12k8 */
4534930cef6SMatthias Ringwald 
4544930cef6SMatthias Ringwald /**
4554930cef6SMatthias Ringwald  * Return vector of correlations
4564930cef6SMatthias Ringwald  */
4574930cef6SMatthias Ringwald #ifndef correlate
458*4c4eb519SMatthias Ringwald 
arm_correlate(const int16_t * a,const int16_t * b,int n,float * y,int nc)4594930cef6SMatthias Ringwald static void arm_correlate(
4604930cef6SMatthias Ringwald     const int16_t *a, const int16_t *b, int n, float *y, int nc)
4614930cef6SMatthias Ringwald {
4624930cef6SMatthias Ringwald     /* --- Check alignment of `b` --- */
4634930cef6SMatthias Ringwald 
4644930cef6SMatthias Ringwald     if ((uintptr_t)b & 3)
4654930cef6SMatthias Ringwald         *(y++) = dot(a, b--, n), nc--;
4664930cef6SMatthias Ringwald 
4674930cef6SMatthias Ringwald     /* --- Processing by pair --- */
4684930cef6SMatthias Ringwald 
4694930cef6SMatthias Ringwald     for ( ; nc >= 2; nc -= 2) {
4704930cef6SMatthias Ringwald         const int16x2_t *an = (const int16x2_t *)(a  );
4714930cef6SMatthias Ringwald         const int16x2_t *bn = (const int16x2_t *)(b--);
4724930cef6SMatthias Ringwald 
4734930cef6SMatthias Ringwald         int16x2_t ax, b0, b1;
4744930cef6SMatthias Ringwald         int64_t v0 = 0, v1 = 0;
4754930cef6SMatthias Ringwald 
4764930cef6SMatthias Ringwald         b1 = (int16x2_t)*(b--) << 16;
4774930cef6SMatthias Ringwald 
4784930cef6SMatthias Ringwald         for (int i = 0; i < (n >> 4); i++ )
4794930cef6SMatthias Ringwald             for (int j = 0; j < 4; j++) {
4804930cef6SMatthias Ringwald 
4814930cef6SMatthias Ringwald                 ax = *(an++), b0 = *(bn++);
4824930cef6SMatthias Ringwald                 v0 = __smlald (ax, b0, v0);
4834930cef6SMatthias Ringwald                 v1 = __smlaldx(ax, __pkhbt(b0, b1), v1);
4844930cef6SMatthias Ringwald 
4854930cef6SMatthias Ringwald                 ax = *(an++), b1 = *(bn++);
4864930cef6SMatthias Ringwald                 v0 = __smlald (ax, b1, v0);
4874930cef6SMatthias Ringwald                 v1 = __smlaldx(ax, __pkhbt(b1, b0), v1);
4884930cef6SMatthias Ringwald             }
4894930cef6SMatthias Ringwald 
4904930cef6SMatthias Ringwald         *(y++) = (float)((int32_t)((v0 + (1 << 5)) >> 6));
4914930cef6SMatthias Ringwald         *(y++) = (float)((int32_t)((v1 + (1 << 5)) >> 6));
4924930cef6SMatthias Ringwald     }
4934930cef6SMatthias Ringwald 
4944930cef6SMatthias Ringwald     /* --- Odd element count --- */
4954930cef6SMatthias Ringwald 
4964930cef6SMatthias Ringwald     if (nc > 0)
4974930cef6SMatthias Ringwald         *(y++) = dot(a, b, n);
4984930cef6SMatthias Ringwald }
499*4c4eb519SMatthias Ringwald 
500*4c4eb519SMatthias Ringwald #ifndef TEST_ARM
501*4c4eb519SMatthias Ringwald #define correlate arm_correlate
502*4c4eb519SMatthias Ringwald #endif
503*4c4eb519SMatthias Ringwald 
5044930cef6SMatthias Ringwald #endif /* correlate */
5054930cef6SMatthias Ringwald 
5064930cef6SMatthias Ringwald #endif /* __ARM_FEATURE_SIMD32 */
507