19a19cd78SMatthias Ringwald /****************************************************************************** 29a19cd78SMatthias Ringwald * 3*4930cef6SMatthias Ringwald * Copyright 2022 Google LLC 49a19cd78SMatthias Ringwald * 59a19cd78SMatthias Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 69a19cd78SMatthias Ringwald * you may not use this file except in compliance with the License. 79a19cd78SMatthias Ringwald * You may obtain a copy of the License at: 89a19cd78SMatthias Ringwald * 99a19cd78SMatthias Ringwald * http://www.apache.org/licenses/LICENSE-2.0 109a19cd78SMatthias Ringwald * 119a19cd78SMatthias Ringwald * Unless required by applicable law or agreed to in writing, software 129a19cd78SMatthias Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 139a19cd78SMatthias Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149a19cd78SMatthias Ringwald * See the License for the specific language governing permissions and 159a19cd78SMatthias Ringwald * limitations under the License. 169a19cd78SMatthias Ringwald * 179a19cd78SMatthias Ringwald ******************************************************************************/ 189a19cd78SMatthias Ringwald 199a19cd78SMatthias Ringwald /** 209a19cd78SMatthias Ringwald * LC3 - Common constants and types 219a19cd78SMatthias Ringwald */ 229a19cd78SMatthias Ringwald 239a19cd78SMatthias Ringwald #ifndef __LC3_COMMON_H 249a19cd78SMatthias Ringwald #define __LC3_COMMON_H 259a19cd78SMatthias Ringwald 269a19cd78SMatthias Ringwald #include <lc3.h> 27*4930cef6SMatthias Ringwald #include "fastmath.h" 289a19cd78SMatthias Ringwald 29*4930cef6SMatthias Ringwald #include <stdalign.h> 309a19cd78SMatthias Ringwald #include <limits.h> 319a19cd78SMatthias Ringwald #include <string.h> 32*4930cef6SMatthias Ringwald 33*4930cef6SMatthias Ringwald #ifdef __ARM_ARCH 34*4930cef6SMatthias Ringwald #include <arm_acle.h> 35*4930cef6SMatthias Ringwald #endif 36*4930cef6SMatthias Ringwald 37*4930cef6SMatthias Ringwald 38*4930cef6SMatthias Ringwald /** 39*4930cef6SMatthias Ringwald * Hot Function attribute 40*4930cef6SMatthias Ringwald * Selectively disable sanitizer 41*4930cef6SMatthias Ringwald */ 42*4930cef6SMatthias Ringwald 43*4930cef6SMatthias Ringwald #ifdef __clang__ 44*4930cef6SMatthias Ringwald 45*4930cef6SMatthias Ringwald #define LC3_HOT \ 46*4930cef6SMatthias Ringwald __attribute__((no_sanitize("bounds"))) \ 47*4930cef6SMatthias Ringwald __attribute__((no_sanitize("integer"))) 48*4930cef6SMatthias Ringwald 49*4930cef6SMatthias Ringwald #else /* __clang__ */ 50*4930cef6SMatthias Ringwald 51*4930cef6SMatthias Ringwald #define LC3_HOT 52*4930cef6SMatthias Ringwald 53*4930cef6SMatthias Ringwald #endif /* __clang__ */ 549a19cd78SMatthias Ringwald 559a19cd78SMatthias Ringwald 569a19cd78SMatthias Ringwald /** 579a19cd78SMatthias Ringwald * Macros 589a19cd78SMatthias Ringwald * MIN/MAX Minimum and maximum between 2 values 599a19cd78SMatthias Ringwald * CLIP Clip a value between low and high limits 60*4930cef6SMatthias Ringwald * SATXX Signed saturation on 'xx' bits 61*4930cef6SMatthias Ringwald * ABS Return absolute value 629a19cd78SMatthias Ringwald */ 639a19cd78SMatthias Ringwald 649a19cd78SMatthias Ringwald #define LC3_MIN(a, b) ( (a) < (b) ? (a) : (b) ) 659a19cd78SMatthias Ringwald #define LC3_MAX(a, b) ( (a) > (b) ? (a) : (b) ) 669a19cd78SMatthias Ringwald 67*4930cef6SMatthias Ringwald #define LC3_CLIP(v, min, max) LC3_MIN(LC3_MAX(v, min), max) 68*4930cef6SMatthias Ringwald #define LC3_SAT16(v) LC3_CLIP(v, -(1 << 15), (1 << 15) - 1) 69*4930cef6SMatthias Ringwald #define LC3_SAT24(v) LC3_CLIP(v, -(1 << 23), (1 << 23) - 1) 70*4930cef6SMatthias Ringwald 71*4930cef6SMatthias Ringwald #define LC3_ABS(v) ( (v) < 0 ? -(v) : (v) ) 72*4930cef6SMatthias Ringwald 73*4930cef6SMatthias Ringwald 74*4930cef6SMatthias Ringwald #ifdef __ARM_FEATURE_SAT 75*4930cef6SMatthias Ringwald 76*4930cef6SMatthias Ringwald #undef LC3_SAT16 77*4930cef6SMatthias Ringwald #define LC3_SAT16(v) __ssat(v, 16) 78*4930cef6SMatthias Ringwald 79*4930cef6SMatthias Ringwald #undef LC3_SAT24 80*4930cef6SMatthias Ringwald #define LC3_SAT24(v) __ssat(v, 24) 81*4930cef6SMatthias Ringwald 82*4930cef6SMatthias Ringwald #endif /* __ARM_FEATURE_SAT */ 839a19cd78SMatthias Ringwald 849a19cd78SMatthias Ringwald 859a19cd78SMatthias Ringwald /** 869a19cd78SMatthias Ringwald * Convert `dt` in us and `sr` in KHz 879a19cd78SMatthias Ringwald */ 889a19cd78SMatthias Ringwald 899a19cd78SMatthias Ringwald #define LC3_DT_US(dt) \ 909a19cd78SMatthias Ringwald ( (3 + (dt)) * 2500 ) 919a19cd78SMatthias Ringwald 929a19cd78SMatthias Ringwald #define LC3_SRATE_KHZ(sr) \ 939a19cd78SMatthias Ringwald ( (1 + (sr) + ((sr) == LC3_SRATE_48K)) * 8 ) 949a19cd78SMatthias Ringwald 959a19cd78SMatthias Ringwald 969a19cd78SMatthias Ringwald /** 979a19cd78SMatthias Ringwald * Return number of samples, delayed samples and 989a19cd78SMatthias Ringwald * encoded spectrum coefficients within a frame 99*4930cef6SMatthias Ringwald * - For encoding, keep 1.25 ms for temporal window 100*4930cef6SMatthias Ringwald * - For decoding, keep 18 ms of history, aligned on frames, and a frame 1019a19cd78SMatthias Ringwald */ 1029a19cd78SMatthias Ringwald 1039a19cd78SMatthias Ringwald #define LC3_NS(dt, sr) \ 1049a19cd78SMatthias Ringwald ( 20 * (3 + (dt)) * (1 + (sr) + ((sr) == LC3_SRATE_48K)) ) 1059a19cd78SMatthias Ringwald 1069a19cd78SMatthias Ringwald #define LC3_ND(dt, sr) \ 1079a19cd78SMatthias Ringwald ( (dt) == LC3_DT_7M5 ? 23 * LC3_NS(dt, sr) / 30 \ 1089a19cd78SMatthias Ringwald : 5 * LC3_NS(dt, sr) / 8 ) 109*4930cef6SMatthias Ringwald 1109a19cd78SMatthias Ringwald #define LC3_NE(dt, sr) \ 1119a19cd78SMatthias Ringwald ( 20 * (3 + (dt)) * (1 + (sr)) ) 1129a19cd78SMatthias Ringwald 1139a19cd78SMatthias Ringwald #define LC3_MAX_NE \ 1149a19cd78SMatthias Ringwald LC3_NE(LC3_DT_10M, LC3_SRATE_48K) 1159a19cd78SMatthias Ringwald 116*4930cef6SMatthias Ringwald #define LC3_NT(sr_hz) \ 117*4930cef6SMatthias Ringwald ( (5 * LC3_SRATE_KHZ(sr)) / 4 ) 118*4930cef6SMatthias Ringwald 119*4930cef6SMatthias Ringwald #define LC3_NH(dt, sr) \ 120*4930cef6SMatthias Ringwald ( ((3 - dt) + 1) * LC3_NS(dt, sr) ) 1219a19cd78SMatthias Ringwald 1229a19cd78SMatthias Ringwald 1239a19cd78SMatthias Ringwald /** 1249a19cd78SMatthias Ringwald * Bandwidth, mapped to Nyquist frequency of samplerates 1259a19cd78SMatthias Ringwald */ 1269a19cd78SMatthias Ringwald 1279a19cd78SMatthias Ringwald enum lc3_bandwidth { 1289a19cd78SMatthias Ringwald LC3_BANDWIDTH_NB = LC3_SRATE_8K, 1299a19cd78SMatthias Ringwald LC3_BANDWIDTH_WB = LC3_SRATE_16K, 1309a19cd78SMatthias Ringwald LC3_BANDWIDTH_SSWB = LC3_SRATE_24K, 1319a19cd78SMatthias Ringwald LC3_BANDWIDTH_SWB = LC3_SRATE_32K, 1329a19cd78SMatthias Ringwald LC3_BANDWIDTH_FB = LC3_SRATE_48K, 1339a19cd78SMatthias Ringwald 1349a19cd78SMatthias Ringwald LC3_NUM_BANDWIDTH, 1359a19cd78SMatthias Ringwald }; 1369a19cd78SMatthias Ringwald 1379a19cd78SMatthias Ringwald 1389a19cd78SMatthias Ringwald /** 1399a19cd78SMatthias Ringwald * Complex floating point number 1409a19cd78SMatthias Ringwald */ 1419a19cd78SMatthias Ringwald 1429a19cd78SMatthias Ringwald struct lc3_complex 1439a19cd78SMatthias Ringwald { 1449a19cd78SMatthias Ringwald float re, im; 1459a19cd78SMatthias Ringwald }; 1469a19cd78SMatthias Ringwald 1479a19cd78SMatthias Ringwald 1489a19cd78SMatthias Ringwald #endif /* __LC3_COMMON_H */ 149