xref: /btstack/3rd-party/lc3-google/src/common.h (revision 4930cef6e21e6da2d7571b9259c7f0fb8bed3d01)
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