1 /****************************************************************************** 2 * 3 * Copyright 2022 Google LLC 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ******************************************************************************/ 18 19 /** 20 * LC3 - Common constants and types 21 */ 22 23 #ifndef __LC3_COMMON_H 24 #define __LC3_COMMON_H 25 26 #include <lc3.h> 27 #include "fastmath.h" 28 29 #include <stdalign.h> 30 #include <limits.h> 31 #include <string.h> 32 33 #ifdef __ARM_ARCH 34 #include <arm_acle.h> 35 #endif 36 37 38 /** 39 * Hot Function attribute 40 * Selectively disable sanitizer 41 */ 42 43 #ifdef __clang__ 44 45 #define LC3_HOT \ 46 __attribute__((no_sanitize("bounds"))) \ 47 __attribute__((no_sanitize("integer"))) 48 49 #else /* __clang__ */ 50 51 #define LC3_HOT 52 53 #endif /* __clang__ */ 54 55 56 /** 57 * Macros 58 * MIN/MAX Minimum and maximum between 2 values 59 * CLIP Clip a value between low and high limits 60 * SATXX Signed saturation on 'xx' bits 61 * ABS Return absolute value 62 */ 63 64 #define LC3_MIN(a, b) ( (a) < (b) ? (a) : (b) ) 65 #define LC3_MAX(a, b) ( (a) > (b) ? (a) : (b) ) 66 67 #define LC3_CLIP(v, min, max) LC3_MIN(LC3_MAX(v, min), max) 68 #define LC3_SAT16(v) LC3_CLIP(v, -(1 << 15), (1 << 15) - 1) 69 #define LC3_SAT24(v) LC3_CLIP(v, -(1 << 23), (1 << 23) - 1) 70 71 #define LC3_ABS(v) ( (v) < 0 ? -(v) : (v) ) 72 73 74 #if defined(__ARM_FEATURE_SAT) && !(__GNUC__ < 10) 75 76 #undef LC3_SAT16 77 #define LC3_SAT16(v) __ssat(v, 16) 78 79 #undef LC3_SAT24 80 #define LC3_SAT24(v) __ssat(v, 24) 81 82 #endif /* __ARM_FEATURE_SAT */ 83 84 85 /** 86 * Convert `dt` in us and `sr` in KHz 87 */ 88 89 #define LC3_DT_US(dt) \ 90 ( (3 + (dt)) * 2500 ) 91 92 #define LC3_SRATE_KHZ(sr) \ 93 ( (1 + (sr) + ((sr) == LC3_SRATE_48K)) * 8 ) 94 95 96 /** 97 * Return number of samples, delayed samples and 98 * encoded spectrum coefficients within a frame 99 * - For encoding, keep 1.25 ms for temporal window 100 * - For decoding, keep 18 ms of history, aligned on frames, and a frame 101 */ 102 103 #define LC3_NS(dt, sr) \ 104 ( 20 * (3 + (dt)) * (1 + (sr) + ((sr) == LC3_SRATE_48K)) ) 105 106 #define LC3_ND(dt, sr) \ 107 ( (dt) == LC3_DT_7M5 ? 23 * LC3_NS(dt, sr) / 30 \ 108 : 5 * LC3_NS(dt, sr) / 8 ) 109 110 #define LC3_NE(dt, sr) \ 111 ( 20 * (3 + (dt)) * (1 + (sr)) ) 112 113 #define LC3_MAX_NS \ 114 LC3_NS(LC3_DT_10M, LC3_SRATE_48K) 115 116 #define LC3_MAX_NE \ 117 LC3_NE(LC3_DT_10M, LC3_SRATE_48K) 118 119 #define LC3_NT(sr_hz) \ 120 ( (5 * LC3_SRATE_KHZ(sr)) / 4 ) 121 122 #define LC3_NH(dt, sr) \ 123 ( ((3 - dt) + 1) * LC3_NS(dt, sr) ) 124 125 126 /** 127 * Bandwidth, mapped to Nyquist frequency of samplerates 128 */ 129 130 enum lc3_bandwidth { 131 LC3_BANDWIDTH_NB = LC3_SRATE_8K, 132 LC3_BANDWIDTH_WB = LC3_SRATE_16K, 133 LC3_BANDWIDTH_SSWB = LC3_SRATE_24K, 134 LC3_BANDWIDTH_SWB = LC3_SRATE_32K, 135 LC3_BANDWIDTH_FB = LC3_SRATE_48K, 136 137 LC3_NUM_BANDWIDTH, 138 }; 139 140 141 /** 142 * Complex floating point number 143 */ 144 145 struct lc3_complex 146 { 147 float re, im; 148 }; 149 150 151 #endif /* __LC3_COMMON_H */ 152