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