xref: /btstack/3rd-party/lc3-google/include/lc3_private.h (revision 9a19cd786042b1fc78813d984efdd045e84593df)
1*9a19cd78SMatthias Ringwald /******************************************************************************
2*9a19cd78SMatthias Ringwald  *
3*9a19cd78SMatthias Ringwald  *  Copyright 2015 Google, Inc.
4*9a19cd78SMatthias Ringwald  *
5*9a19cd78SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6*9a19cd78SMatthias Ringwald  *  you may not use this file except in compliance with the License.
7*9a19cd78SMatthias Ringwald  *  You may obtain a copy of the License at:
8*9a19cd78SMatthias Ringwald  *
9*9a19cd78SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10*9a19cd78SMatthias Ringwald  *
11*9a19cd78SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
12*9a19cd78SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13*9a19cd78SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*9a19cd78SMatthias Ringwald  *  See the License for the specific language governing permissions and
15*9a19cd78SMatthias Ringwald  *  limitations under the License.
16*9a19cd78SMatthias Ringwald  *
17*9a19cd78SMatthias Ringwald  ******************************************************************************/
18*9a19cd78SMatthias Ringwald 
19*9a19cd78SMatthias Ringwald #ifndef __LC3_PRIVATE_H
20*9a19cd78SMatthias Ringwald #define __LC3_PRIVATE_H
21*9a19cd78SMatthias Ringwald 
22*9a19cd78SMatthias Ringwald #include <stdint.h>
23*9a19cd78SMatthias Ringwald #include <stdbool.h>
24*9a19cd78SMatthias Ringwald 
25*9a19cd78SMatthias Ringwald 
26*9a19cd78SMatthias Ringwald /**
27*9a19cd78SMatthias Ringwald  * Return number of samples, delayed samples and
28*9a19cd78SMatthias Ringwald  * encoded spectrum coefficients within a frame
29*9a19cd78SMatthias Ringwald  * For decoding, add number of samples of 18 ms history
30*9a19cd78SMatthias Ringwald  */
31*9a19cd78SMatthias Ringwald 
32*9a19cd78SMatthias Ringwald #define __LC3_NS(dt_us, sr_hz) \
33*9a19cd78SMatthias Ringwald     ((dt_us * sr_hz) / 1000 / 1000)
34*9a19cd78SMatthias Ringwald 
35*9a19cd78SMatthias Ringwald #define __LC3_ND(dt_us, sr_hz) \
36*9a19cd78SMatthias Ringwald     ( (dt_us) == 7500 ? 23 * __LC3_NS(dt_us, sr_hz) / 30 \
37*9a19cd78SMatthias Ringwald                       :  5 * __LC3_NS(dt_us, sr_hz) /  8 )
38*9a19cd78SMatthias Ringwald 
39*9a19cd78SMatthias Ringwald #define __LC3_NH(sr_hz) \
40*9a19cd78SMatthias Ringwald     ( (18 * sr_hz) / 1000 )
41*9a19cd78SMatthias Ringwald 
42*9a19cd78SMatthias Ringwald 
43*9a19cd78SMatthias Ringwald /**
44*9a19cd78SMatthias Ringwald  * Frame duration 7.5ms or 10ms
45*9a19cd78SMatthias Ringwald  */
46*9a19cd78SMatthias Ringwald 
47*9a19cd78SMatthias Ringwald enum lc3_dt {
48*9a19cd78SMatthias Ringwald     LC3_DT_7M5,
49*9a19cd78SMatthias Ringwald     LC3_DT_10M,
50*9a19cd78SMatthias Ringwald 
51*9a19cd78SMatthias Ringwald     LC3_NUM_DT
52*9a19cd78SMatthias Ringwald };
53*9a19cd78SMatthias Ringwald 
54*9a19cd78SMatthias Ringwald /**
55*9a19cd78SMatthias Ringwald  * Sampling frequency
56*9a19cd78SMatthias Ringwald  */
57*9a19cd78SMatthias Ringwald 
58*9a19cd78SMatthias Ringwald enum lc3_srate {
59*9a19cd78SMatthias Ringwald     LC3_SRATE_8K,
60*9a19cd78SMatthias Ringwald     LC3_SRATE_16K,
61*9a19cd78SMatthias Ringwald     LC3_SRATE_24K,
62*9a19cd78SMatthias Ringwald     LC3_SRATE_32K,
63*9a19cd78SMatthias Ringwald     LC3_SRATE_48K,
64*9a19cd78SMatthias Ringwald 
65*9a19cd78SMatthias Ringwald     LC3_NUM_SRATE,
66*9a19cd78SMatthias Ringwald };
67*9a19cd78SMatthias Ringwald 
68*9a19cd78SMatthias Ringwald 
69*9a19cd78SMatthias Ringwald /**
70*9a19cd78SMatthias Ringwald  * Encoder state and memory
71*9a19cd78SMatthias Ringwald  */
72*9a19cd78SMatthias Ringwald 
73*9a19cd78SMatthias Ringwald typedef struct lc3_attdet_analysis {
74*9a19cd78SMatthias Ringwald     float en1, an1;
75*9a19cd78SMatthias Ringwald     int p_att;
76*9a19cd78SMatthias Ringwald } lc3_attdet_analysis_t;
77*9a19cd78SMatthias Ringwald 
78*9a19cd78SMatthias Ringwald struct lc3_ltpf_hp50_state {
79*9a19cd78SMatthias Ringwald     float s1, s2;
80*9a19cd78SMatthias Ringwald };
81*9a19cd78SMatthias Ringwald 
82*9a19cd78SMatthias Ringwald typedef struct lc3_ltpf_analysis {
83*9a19cd78SMatthias Ringwald     bool active;
84*9a19cd78SMatthias Ringwald     int pitch;
85*9a19cd78SMatthias Ringwald     float nc[2];
86*9a19cd78SMatthias Ringwald 
87*9a19cd78SMatthias Ringwald     struct lc3_ltpf_hp50_state hp50;
88*9a19cd78SMatthias Ringwald     float x_12k8[384];
89*9a19cd78SMatthias Ringwald     float x_6k4[178];
90*9a19cd78SMatthias Ringwald     int tc;
91*9a19cd78SMatthias Ringwald } lc3_ltpf_analysis_t;
92*9a19cd78SMatthias Ringwald 
93*9a19cd78SMatthias Ringwald typedef struct lc3_spec_analysis {
94*9a19cd78SMatthias Ringwald     float nbits_off;
95*9a19cd78SMatthias Ringwald     int nbits_spare;
96*9a19cd78SMatthias Ringwald } lc3_spec_analysis_t;
97*9a19cd78SMatthias Ringwald 
98*9a19cd78SMatthias Ringwald struct lc3_encoder {
99*9a19cd78SMatthias Ringwald     enum lc3_dt dt;
100*9a19cd78SMatthias Ringwald     enum lc3_srate sr, sr_pcm;
101*9a19cd78SMatthias Ringwald 
102*9a19cd78SMatthias Ringwald     lc3_attdet_analysis_t attdet;
103*9a19cd78SMatthias Ringwald     lc3_ltpf_analysis_t ltpf;
104*9a19cd78SMatthias Ringwald     lc3_spec_analysis_t spec;
105*9a19cd78SMatthias Ringwald 
106*9a19cd78SMatthias Ringwald     float *xs, *xf, s[0];
107*9a19cd78SMatthias Ringwald };
108*9a19cd78SMatthias Ringwald 
109*9a19cd78SMatthias Ringwald #define LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) \
110*9a19cd78SMatthias Ringwald     ( 2*__LC3_NS(dt_us, sr_hz) + __LC3_ND(dt_us, sr_hz) )
111*9a19cd78SMatthias Ringwald 
112*9a19cd78SMatthias Ringwald #define LC3_ENCODER_MEM_T(dt_us, sr_hz) \
113*9a19cd78SMatthias Ringwald     struct { \
114*9a19cd78SMatthias Ringwald         struct lc3_encoder __e; \
115*9a19cd78SMatthias Ringwald         float __s[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)]; \
116*9a19cd78SMatthias Ringwald     }
117*9a19cd78SMatthias Ringwald 
118*9a19cd78SMatthias Ringwald 
119*9a19cd78SMatthias Ringwald /**
120*9a19cd78SMatthias Ringwald  * Decoder state and memory
121*9a19cd78SMatthias Ringwald  */
122*9a19cd78SMatthias Ringwald 
123*9a19cd78SMatthias Ringwald typedef struct lc3_ltpf_synthesis {
124*9a19cd78SMatthias Ringwald     bool active;
125*9a19cd78SMatthias Ringwald     int pitch;
126*9a19cd78SMatthias Ringwald     float c[12][2], x[12];
127*9a19cd78SMatthias Ringwald } lc3_ltpf_synthesis_t;
128*9a19cd78SMatthias Ringwald 
129*9a19cd78SMatthias Ringwald typedef struct lc3_plc_state {
130*9a19cd78SMatthias Ringwald     uint16_t seed;
131*9a19cd78SMatthias Ringwald     int count;
132*9a19cd78SMatthias Ringwald     float alpha;
133*9a19cd78SMatthias Ringwald } lc3_plc_state_t;
134*9a19cd78SMatthias Ringwald 
135*9a19cd78SMatthias Ringwald struct lc3_decoder {
136*9a19cd78SMatthias Ringwald     enum lc3_dt dt;
137*9a19cd78SMatthias Ringwald     enum lc3_srate sr, sr_pcm;
138*9a19cd78SMatthias Ringwald 
139*9a19cd78SMatthias Ringwald     lc3_ltpf_synthesis_t ltpf;
140*9a19cd78SMatthias Ringwald     lc3_plc_state_t plc;
141*9a19cd78SMatthias Ringwald 
142*9a19cd78SMatthias Ringwald     float *xs, *xd, *xg, s[0];
143*9a19cd78SMatthias Ringwald };
144*9a19cd78SMatthias Ringwald 
145*9a19cd78SMatthias Ringwald #define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \
146*9a19cd78SMatthias Ringwald     ( __LC3_NH(sr_hz) +  __LC3_NS(dt_us, sr_hz) + \
147*9a19cd78SMatthias Ringwald       __LC3_ND(dt_us, sr_hz) + __LC3_NS(dt_us, sr_hz) )
148*9a19cd78SMatthias Ringwald 
149*9a19cd78SMatthias Ringwald #define LC3_DECODER_MEM_T(dt_us, sr_hz) \
150*9a19cd78SMatthias Ringwald     struct { \
151*9a19cd78SMatthias Ringwald         struct lc3_decoder __d; \
152*9a19cd78SMatthias Ringwald         float __s[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)]; \
153*9a19cd78SMatthias Ringwald     }
154*9a19cd78SMatthias Ringwald 
155*9a19cd78SMatthias Ringwald 
156*9a19cd78SMatthias Ringwald #endif /* __LC3_PRIVATE_H */
157