19a19cd78SMatthias Ringwald /****************************************************************************** 29a19cd78SMatthias Ringwald * 34930cef6SMatthias 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> 274930cef6SMatthias Ringwald #include "fastmath.h" 289a19cd78SMatthias Ringwald 294930cef6SMatthias Ringwald #include <stdalign.h> 309a19cd78SMatthias Ringwald #include <limits.h> 319a19cd78SMatthias Ringwald #include <string.h> 324930cef6SMatthias Ringwald 334930cef6SMatthias Ringwald #ifdef __ARM_ARCH 344930cef6SMatthias Ringwald #include <arm_acle.h> 354930cef6SMatthias Ringwald #endif 364930cef6SMatthias Ringwald 374930cef6SMatthias Ringwald 384930cef6SMatthias Ringwald /** 394930cef6SMatthias Ringwald * Hot Function attribute 404930cef6SMatthias Ringwald * Selectively disable sanitizer 414930cef6SMatthias Ringwald */ 424930cef6SMatthias Ringwald 434930cef6SMatthias Ringwald #ifdef __clang__ 444930cef6SMatthias Ringwald 454930cef6SMatthias Ringwald #define LC3_HOT \ 464930cef6SMatthias Ringwald __attribute__((no_sanitize("bounds"))) \ 474930cef6SMatthias Ringwald __attribute__((no_sanitize("integer"))) 484930cef6SMatthias Ringwald 494930cef6SMatthias Ringwald #else /* __clang__ */ 504930cef6SMatthias Ringwald 514930cef6SMatthias Ringwald #define LC3_HOT 524930cef6SMatthias Ringwald 534930cef6SMatthias 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 604930cef6SMatthias Ringwald * SATXX Signed saturation on 'xx' bits 614930cef6SMatthias 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 674930cef6SMatthias Ringwald #define LC3_CLIP(v, min, max) LC3_MIN(LC3_MAX(v, min), max) 684930cef6SMatthias Ringwald #define LC3_SAT16(v) LC3_CLIP(v, -(1 << 15), (1 << 15) - 1) 694930cef6SMatthias Ringwald #define LC3_SAT24(v) LC3_CLIP(v, -(1 << 23), (1 << 23) - 1) 704930cef6SMatthias Ringwald 714930cef6SMatthias Ringwald #define LC3_ABS(v) ( (v) < 0 ? -(v) : (v) ) 724930cef6SMatthias Ringwald 734930cef6SMatthias Ringwald 74*d39ea275SBjoern Hartmann #if defined(__ARM_FEATURE_SAT) && !(__GNUC__ < 10) 754930cef6SMatthias Ringwald 764930cef6SMatthias Ringwald #undef LC3_SAT16 774930cef6SMatthias Ringwald #define LC3_SAT16(v) __ssat(v, 16) 784930cef6SMatthias Ringwald 794930cef6SMatthias Ringwald #undef LC3_SAT24 804930cef6SMatthias Ringwald #define LC3_SAT24(v) __ssat(v, 24) 814930cef6SMatthias Ringwald 824930cef6SMatthias 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 994930cef6SMatthias Ringwald * - For encoding, keep 1.25 ms for temporal window 1004930cef6SMatthias 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 ) 1094930cef6SMatthias 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 1164930cef6SMatthias Ringwald #define LC3_NT(sr_hz) \ 1174930cef6SMatthias Ringwald ( (5 * LC3_SRATE_KHZ(sr)) / 4 ) 1184930cef6SMatthias Ringwald 1194930cef6SMatthias Ringwald #define LC3_NH(dt, sr) \ 1204930cef6SMatthias 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