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