xref: /aosp_15_r20/external/liblc3/tables/mktables.py (revision 49fe348c0058011ee60b6957cdd9d52742df84bc)
1*49fe348cSAndroid Build Coastguard Worker#!/usr/bin/env python3
2*49fe348cSAndroid Build Coastguard Worker#
3*49fe348cSAndroid Build Coastguard Worker# Copyright 2022 Google LLC
4*49fe348cSAndroid Build Coastguard Worker#
5*49fe348cSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*49fe348cSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*49fe348cSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*49fe348cSAndroid Build Coastguard Worker#
9*49fe348cSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*49fe348cSAndroid Build Coastguard Worker#
11*49fe348cSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*49fe348cSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*49fe348cSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*49fe348cSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*49fe348cSAndroid Build Coastguard Worker# limitations under the License.
16*49fe348cSAndroid Build Coastguard Worker#
17*49fe348cSAndroid Build Coastguard Worker
18*49fe348cSAndroid Build Coastguard Workerimport numpy as np
19*49fe348cSAndroid Build Coastguard Worker
20*49fe348cSAndroid Build Coastguard WorkerLTPF_H12K8 = np.array([
21*49fe348cSAndroid Build Coastguard Worker    -2.04305583e-05, -4.46345894e-05, -7.16366399e-05, -1.00101113e-04,
22*49fe348cSAndroid Build Coastguard Worker    -1.28372848e-04, -1.54543830e-04, -1.76544567e-04, -1.92256960e-04,
23*49fe348cSAndroid Build Coastguard Worker    -1.99643819e-04, -1.96888686e-04, -1.82538332e-04, -1.55639427e-04,
24*49fe348cSAndroid Build Coastguard Worker    -1.15860365e-04, -6.35893034e-05,  2.81006480e-19,  7.29218021e-05,
25*49fe348cSAndroid Build Coastguard Worker     1.52397076e-04,  2.34920777e-04,  3.16378650e-04,  3.92211738e-04,
26*49fe348cSAndroid Build Coastguard Worker     4.57623849e-04,  5.07824294e-04,  5.38295523e-04,  5.45072918e-04,
27*49fe348cSAndroid Build Coastguard Worker     5.25022155e-04,  4.76098424e-04,  3.97571380e-04,  2.90200217e-04,
28*49fe348cSAndroid Build Coastguard Worker     1.56344667e-04, -5.81880142e-19, -1.73252713e-04, -3.56385965e-04,
29*49fe348cSAndroid Build Coastguard Worker    -5.41155231e-04, -7.18414023e-04, -8.78505232e-04, -1.01171451e-03,
30*49fe348cSAndroid Build Coastguard Worker    -1.10876706e-03, -1.16134522e-03, -1.16260169e-03, -1.10764097e-03,
31*49fe348cSAndroid Build Coastguard Worker    -9.93941563e-04, -8.21692190e-04, -5.94017766e-04, -3.17074654e-04,
32*49fe348cSAndroid Build Coastguard Worker     9.74695082e-19,  3.45293760e-04,  7.04480871e-04,  1.06133447e-03,
33*49fe348cSAndroid Build Coastguard Worker     1.39837473e-03,  1.69763080e-03,  1.94148675e-03,  2.11357591e-03,
34*49fe348cSAndroid Build Coastguard Worker     2.19968245e-03,  2.18860625e-03,  2.07294546e-03,  1.84975249e-03,
35*49fe348cSAndroid Build Coastguard Worker     1.52102188e-03,  1.09397426e-03,  5.81108062e-04, -1.42248266e-18,
36*49fe348cSAndroid Build Coastguard Worker    -6.27153730e-04, -1.27425140e-03, -1.91223839e-03, -2.51026925e-03,
37*49fe348cSAndroid Build Coastguard Worker    -3.03703830e-03, -3.46222687e-03, -3.75800672e-03, -3.90053247e-03,
38*49fe348cSAndroid Build Coastguard Worker    -3.87135231e-03, -3.65866558e-03, -3.25835851e-03, -2.67475555e-03,
39*49fe348cSAndroid Build Coastguard Worker    -1.92103305e-03, -1.01925433e-03,  1.86962369e-18,  1.09841545e-03,
40*49fe348cSAndroid Build Coastguard Worker     2.23113197e-03,  3.34830927e-03,  4.39702277e-03,  5.32342672e-03,
41*49fe348cSAndroid Build Coastguard Worker     6.07510531e-03,  6.60352025e-03,  6.86645399e-03,  6.83034270e-03,
42*49fe348cSAndroid Build Coastguard Worker     6.47239234e-03,  5.78237521e-03,  4.76401273e-03,  3.43586351e-03,
43*49fe348cSAndroid Build Coastguard Worker     1.83165284e-03, -2.25189837e-18, -1.99647619e-03, -4.08266886e-03,
44*49fe348cSAndroid Build Coastguard Worker    -6.17308037e-03, -8.17444895e-03, -9.98882386e-03, -1.15169871e-02,
45*49fe348cSAndroid Build Coastguard Worker    -1.26621006e-02, -1.33334458e-02, -1.34501120e-02, -1.29444881e-02,
46*49fe348cSAndroid Build Coastguard Worker    -1.17654154e-02, -9.88086732e-03, -7.28003640e-03, -3.97473021e-03,
47*49fe348cSAndroid Build Coastguard Worker     2.50961778e-18,  4.58604422e-03,  9.70324900e-03,  1.52512477e-02,
48*49fe348cSAndroid Build Coastguard Worker     2.11120585e-02,  2.71533724e-02,  3.32324245e-02,  3.92003203e-02,
49*49fe348cSAndroid Build Coastguard Worker     4.49066644e-02,  5.02043309e-02,  5.49542017e-02,  5.90297032e-02,
50*49fe348cSAndroid Build Coastguard Worker     6.23209727e-02,  6.47385023e-02,  6.62161245e-02,  6.67132287e-02,
51*49fe348cSAndroid Build Coastguard Worker     6.62161245e-02,  6.47385023e-02,  6.23209727e-02,  5.90297032e-02,
52*49fe348cSAndroid Build Coastguard Worker     5.49542017e-02,  5.02043309e-02,  4.49066644e-02,  3.92003203e-02,
53*49fe348cSAndroid Build Coastguard Worker     3.32324245e-02,  2.71533724e-02,  2.11120585e-02,  1.52512477e-02,
54*49fe348cSAndroid Build Coastguard Worker     9.70324900e-03,  4.58604422e-03,  2.50961778e-18, -3.97473021e-03,
55*49fe348cSAndroid Build Coastguard Worker    -7.28003640e-03, -9.88086732e-03, -1.17654154e-02, -1.29444881e-02,
56*49fe348cSAndroid Build Coastguard Worker    -1.34501120e-02, -1.33334458e-02, -1.26621006e-02, -1.15169871e-02,
57*49fe348cSAndroid Build Coastguard Worker    -9.98882386e-03, -8.17444895e-03, -6.17308037e-03, -4.08266886e-03,
58*49fe348cSAndroid Build Coastguard Worker    -1.99647619e-03, -2.25189837e-18,  1.83165284e-03,  3.43586351e-03,
59*49fe348cSAndroid Build Coastguard Worker     4.76401273e-03,  5.78237521e-03,  6.47239234e-03,  6.83034270e-03,
60*49fe348cSAndroid Build Coastguard Worker     6.86645399e-03,  6.60352025e-03,  6.07510531e-03,  5.32342672e-03,
61*49fe348cSAndroid Build Coastguard Worker     4.39702277e-03,  3.34830927e-03,  2.23113197e-03,  1.09841545e-03,
62*49fe348cSAndroid Build Coastguard Worker     1.86962369e-18, -1.01925433e-03, -1.92103305e-03, -2.67475555e-03,
63*49fe348cSAndroid Build Coastguard Worker    -3.25835851e-03, -3.65866558e-03, -3.87135231e-03, -3.90053247e-03,
64*49fe348cSAndroid Build Coastguard Worker    -3.75800672e-03, -3.46222687e-03, -3.03703830e-03, -2.51026925e-03,
65*49fe348cSAndroid Build Coastguard Worker    -1.91223839e-03, -1.27425140e-03, -6.27153730e-04, -1.42248266e-18,
66*49fe348cSAndroid Build Coastguard Worker     5.81108062e-04,  1.09397426e-03,  1.52102188e-03,  1.84975249e-03,
67*49fe348cSAndroid Build Coastguard Worker     2.07294546e-03,  2.18860625e-03,  2.19968245e-03,  2.11357591e-03,
68*49fe348cSAndroid Build Coastguard Worker     1.94148675e-03,  1.69763080e-03,  1.39837473e-03,  1.06133447e-03,
69*49fe348cSAndroid Build Coastguard Worker     7.04480871e-04,  3.45293760e-04,  9.74695082e-19, -3.17074654e-04,
70*49fe348cSAndroid Build Coastguard Worker    -5.94017766e-04, -8.21692190e-04, -9.93941563e-04, -1.10764097e-03,
71*49fe348cSAndroid Build Coastguard Worker    -1.16260169e-03, -1.16134522e-03, -1.10876706e-03, -1.01171451e-03,
72*49fe348cSAndroid Build Coastguard Worker    -8.78505232e-04, -7.18414023e-04, -5.41155231e-04, -3.56385965e-04,
73*49fe348cSAndroid Build Coastguard Worker    -1.73252713e-04, -5.81880142e-19,  1.56344667e-04,  2.90200217e-04,
74*49fe348cSAndroid Build Coastguard Worker     3.97571380e-04,  4.76098424e-04,  5.25022155e-04,  5.45072918e-04,
75*49fe348cSAndroid Build Coastguard Worker     5.38295523e-04,  5.07824294e-04,  4.57623849e-04,  3.92211738e-04,
76*49fe348cSAndroid Build Coastguard Worker     3.16378650e-04,  2.34920777e-04,  1.52397076e-04,  7.29218021e-05,
77*49fe348cSAndroid Build Coastguard Worker     2.81006480e-19, -6.35893034e-05, -1.15860365e-04, -1.55639427e-04,
78*49fe348cSAndroid Build Coastguard Worker    -1.82538332e-04, -1.96888686e-04, -1.99643819e-04, -1.92256960e-04,
79*49fe348cSAndroid Build Coastguard Worker    -1.76544567e-04, -1.54543830e-04, -1.28372848e-04, -1.00101113e-04,
80*49fe348cSAndroid Build Coastguard Worker    -7.16366399e-05, -4.46345894e-05, -2.04305583e-05
81*49fe348cSAndroid Build Coastguard Worker])
82*49fe348cSAndroid Build Coastguard Worker
83*49fe348cSAndroid Build Coastguard WorkerLTPF_HI = np.array([
84*49fe348cSAndroid Build Coastguard Worker     6.69885837e-03,  3.96711478e-02,  1.06999186e-01,  2.09880463e-01,
85*49fe348cSAndroid Build Coastguard Worker     3.35690625e-01,  4.59220930e-01,  5.50075002e-01,  5.83527575e-01,
86*49fe348cSAndroid Build Coastguard Worker     5.50075002e-01,  4.59220930e-01,  3.35690625e-01,  2.09880463e-01,
87*49fe348cSAndroid Build Coastguard Worker     1.06999186e-01,  3.96711478e-02,  6.69885837e-03
88*49fe348cSAndroid Build Coastguard Worker])
89*49fe348cSAndroid Build Coastguard Worker
90*49fe348cSAndroid Build Coastguard Workerdef print_table(t, m=4):
91*49fe348cSAndroid Build Coastguard Worker
92*49fe348cSAndroid Build Coastguard Worker    for (i, v) in enumerate(t):
93*49fe348cSAndroid Build Coastguard Worker        print('{:14.8e},'.format(v), end = '\n' if i%m == m-1 else ' ')
94*49fe348cSAndroid Build Coastguard Worker
95*49fe348cSAndroid Build Coastguard Worker    if len(t) % 4:
96*49fe348cSAndroid Build Coastguard Worker        print('')
97*49fe348cSAndroid Build Coastguard Worker
98*49fe348cSAndroid Build Coastguard Worker
99*49fe348cSAndroid Build Coastguard Workerdef mdct_fft_twiddles():
100*49fe348cSAndroid Build Coastguard Worker
101*49fe348cSAndroid Build Coastguard Worker    for n in (10, 20, 30, 40, 60, 80, 90, 120, 160, 180, 240, 480):
102*49fe348cSAndroid Build Coastguard Worker
103*49fe348cSAndroid Build Coastguard Worker        print('\n--- fft bf2 twiddles {:3d} ---'.format(n))
104*49fe348cSAndroid Build Coastguard Worker
105*49fe348cSAndroid Build Coastguard Worker        kv = -2 * np.pi * np.arange(n // 2) / n
106*49fe348cSAndroid Build Coastguard Worker        for (i, k) in enumerate(kv):
107*49fe348cSAndroid Build Coastguard Worker            print('{{ {:14.7e}, {:14.7e} }},'.format(np.cos(k), np.sin(k)),
108*49fe348cSAndroid Build Coastguard Worker                  end = '\n' if i%2 == 1 else ' ')
109*49fe348cSAndroid Build Coastguard Worker
110*49fe348cSAndroid Build Coastguard Worker    for n in (15, 45):
111*49fe348cSAndroid Build Coastguard Worker
112*49fe348cSAndroid Build Coastguard Worker        print('\n--- fft bf3 twiddles {:3d} ---'.format(n))
113*49fe348cSAndroid Build Coastguard Worker
114*49fe348cSAndroid Build Coastguard Worker        kv = -2 * np.pi * np.arange(n) / n
115*49fe348cSAndroid Build Coastguard Worker        for k in kv:
116*49fe348cSAndroid Build Coastguard Worker            print(('{{ {{ {:14.7e}, {:14.7e} }},' +
117*49fe348cSAndroid Build Coastguard Worker                     ' {{ {:14.7e}, {:14.7e} }} }},').format(
118*49fe348cSAndroid Build Coastguard Worker                np.cos(k), np.sin(k), np.cos(2*k), np.sin(2*k)))
119*49fe348cSAndroid Build Coastguard Worker
120*49fe348cSAndroid Build Coastguard Worker
121*49fe348cSAndroid Build Coastguard Workerdef mdct_rot_twiddles():
122*49fe348cSAndroid Build Coastguard Worker
123*49fe348cSAndroid Build Coastguard Worker    for n in (40, 80, 120, 160, 240, 320, 360, 480, 640, 720, 960, 1920):
124*49fe348cSAndroid Build Coastguard Worker
125*49fe348cSAndroid Build Coastguard Worker        print('\n--- mdct rot twiddles {:3d} ---'.format(n))
126*49fe348cSAndroid Build Coastguard Worker
127*49fe348cSAndroid Build Coastguard Worker        kv = 2 * np.pi * (np.arange(n // 4) + 1/8) / n
128*49fe348cSAndroid Build Coastguard Worker        scale = np.sqrt( np.sqrt( 4 / n ) )
129*49fe348cSAndroid Build Coastguard Worker        for (i, k) in enumerate(kv):
130*49fe348cSAndroid Build Coastguard Worker            print('{{ {:14.7e}, {:14.7e} }},'.format(
131*49fe348cSAndroid Build Coastguard Worker                np.cos(k) * scale, np.sin(k) * scale),
132*49fe348cSAndroid Build Coastguard Worker                  end = '\n' if i%2 == 1 else ' ')
133*49fe348cSAndroid Build Coastguard Worker
134*49fe348cSAndroid Build Coastguard Worker
135*49fe348cSAndroid Build Coastguard Workerdef tns_lag_window():
136*49fe348cSAndroid Build Coastguard Worker
137*49fe348cSAndroid Build Coastguard Worker    print('\n--- tns lag window ---')
138*49fe348cSAndroid Build Coastguard Worker    print_table(np.exp(-0.5 * (0.02 * np.pi * np.arange(9)) ** 2))
139*49fe348cSAndroid Build Coastguard Worker
140*49fe348cSAndroid Build Coastguard Worker
141*49fe348cSAndroid Build Coastguard Workerdef tns_quantization_table():
142*49fe348cSAndroid Build Coastguard Worker
143*49fe348cSAndroid Build Coastguard Worker    print('\n--- tns quantization table ---')
144*49fe348cSAndroid Build Coastguard Worker
145*49fe348cSAndroid Build Coastguard Worker    xe = np.sin((np.arange(8) + 0.5) * (np.pi / 17))
146*49fe348cSAndroid Build Coastguard Worker    xe = np.rint(xe * 2**15).astype(np.int16)
147*49fe348cSAndroid Build Coastguard Worker
148*49fe348cSAndroid Build Coastguard Worker    xd = np.sin(np.arange(9) * (np.pi / 17))
149*49fe348cSAndroid Build Coastguard Worker    xd = np.rint(xd * 2**15).astype(np.int16)
150*49fe348cSAndroid Build Coastguard Worker
151*49fe348cSAndroid Build Coastguard Worker    for x in (xe, xd):
152*49fe348cSAndroid Build Coastguard Worker        print()
153*49fe348cSAndroid Build Coastguard Worker        for (i, xi) in enumerate(x):
154*49fe348cSAndroid Build Coastguard Worker            print('0x{:04x}p-15,'.format(xi), end = '\n' if i%4 == 4-1 else ' ')
155*49fe348cSAndroid Build Coastguard Worker        if len(x) % 4:
156*49fe348cSAndroid Build Coastguard Worker            print()
157*49fe348cSAndroid Build Coastguard Worker
158*49fe348cSAndroid Build Coastguard Workerdef quant_iq_table():
159*49fe348cSAndroid Build Coastguard Worker
160*49fe348cSAndroid Build Coastguard Worker    print('\n--- quantization iq table ---')
161*49fe348cSAndroid Build Coastguard Worker    print_table(10 ** (np.arange(65) / 28))
162*49fe348cSAndroid Build Coastguard Worker
163*49fe348cSAndroid Build Coastguard Worker
164*49fe348cSAndroid Build Coastguard Workerdef sns_ge_table():
165*49fe348cSAndroid Build Coastguard Worker
166*49fe348cSAndroid Build Coastguard Worker    g_tilt_table = [ 14, 18, 22, 26, 30, 34 ]
167*49fe348cSAndroid Build Coastguard Worker
168*49fe348cSAndroid Build Coastguard Worker    for (sr, g_tilt) in enumerate(g_tilt_table):
169*49fe348cSAndroid Build Coastguard Worker        print('\n--- sns ge table, sr:{} ---'.format(sr))
170*49fe348cSAndroid Build Coastguard Worker        print_table(10 ** ((np.arange(64) * g_tilt) / 630))
171*49fe348cSAndroid Build Coastguard Worker
172*49fe348cSAndroid Build Coastguard Worker
173*49fe348cSAndroid Build Coastguard Workerdef inv_table():
174*49fe348cSAndroid Build Coastguard Worker
175*49fe348cSAndroid Build Coastguard Worker    print('\n--- inv table ---')
176*49fe348cSAndroid Build Coastguard Worker    print_table(np.append(np.zeros(1), 1 / np.arange(1, 28)))
177*49fe348cSAndroid Build Coastguard Worker
178*49fe348cSAndroid Build Coastguard Workerdef ltpf_resampler_table():
179*49fe348cSAndroid Build Coastguard Worker
180*49fe348cSAndroid Build Coastguard Worker    for sr in [ 8, 16, 32, 24, 48, 96 ]:
181*49fe348cSAndroid Build Coastguard Worker
182*49fe348cSAndroid Build Coastguard Worker        r = 192 // sr
183*49fe348cSAndroid Build Coastguard Worker        k = 64 if r & (r-1) else 192
184*49fe348cSAndroid Build Coastguard Worker
185*49fe348cSAndroid Build Coastguard Worker        p = (192 // k) * (k // sr)
186*49fe348cSAndroid Build Coastguard Worker        q = p * (0.5 if sr == 8 else 1)
187*49fe348cSAndroid Build Coastguard Worker
188*49fe348cSAndroid Build Coastguard Worker        print('\n--- LTPF resampler {:d} KHz to 12.8 KHz ---'.format(sr))
189*49fe348cSAndroid Build Coastguard Worker
190*49fe348cSAndroid Build Coastguard Worker        h = np.rint(np.append(LTPF_H12K8, 0.) * q * 2**15).astype(int)
191*49fe348cSAndroid Build Coastguard Worker        h = h.reshape((len(h) // p, p)).T
192*49fe348cSAndroid Build Coastguard Worker        h = np.flip(h, axis=0)
193*49fe348cSAndroid Build Coastguard Worker        print('... Gain:', np.max(np.sum(np.abs(h), axis=1)) / 32768.)
194*49fe348cSAndroid Build Coastguard Worker
195*49fe348cSAndroid Build Coastguard Worker        for i in range(0, len(h), 192 // k):
196*49fe348cSAndroid Build Coastguard Worker            for j in range(0, len(h[i]), 10):
197*49fe348cSAndroid Build Coastguard Worker                print('{:5d}, {:5d}, {:5d}, {:5d}, {:5d}, '
198*49fe348cSAndroid Build Coastguard Worker                      '{:5d}, {:5d}, {:5d}, {:5d}, {:5d},'.format(
199*49fe348cSAndroid Build Coastguard Worker                    h[i][j+0], h[i][j+1], h[i][j+2], h[i][j+3], h[i][j+4],
200*49fe348cSAndroid Build Coastguard Worker                    h[i][j+5], h[i][j+6], h[i][j+7], h[i][j+8], h[i][j+9]))
201*49fe348cSAndroid Build Coastguard Worker
202*49fe348cSAndroid Build Coastguard Worker
203*49fe348cSAndroid Build Coastguard Workerdef ltpf_interpolate_table():
204*49fe348cSAndroid Build Coastguard Worker
205*49fe348cSAndroid Build Coastguard Worker    print('\n--- LTPF interpolation ---')
206*49fe348cSAndroid Build Coastguard Worker
207*49fe348cSAndroid Build Coastguard Worker    h = np.rint(np.append(LTPF_HI, 0.) * 2**15).astype(int)
208*49fe348cSAndroid Build Coastguard Worker
209*49fe348cSAndroid Build Coastguard Worker    h = h.reshape(len(h) // 4, 4).T
210*49fe348cSAndroid Build Coastguard Worker    h = np.flip(h, axis=0)
211*49fe348cSAndroid Build Coastguard Worker    print('... Gain:', np.max(np.sum(np.abs(h), axis=1)) / 32768.)
212*49fe348cSAndroid Build Coastguard Worker
213*49fe348cSAndroid Build Coastguard Worker    for i in range(len(h)):
214*49fe348cSAndroid Build Coastguard Worker        print('{:5d}, {:5d}, {:5d}, {:5d}'.format(
215*49fe348cSAndroid Build Coastguard Worker            h[i][0], h[i][1], h[i][2], h[i][3]))
216*49fe348cSAndroid Build Coastguard Worker
217*49fe348cSAndroid Build Coastguard Worker
218*49fe348cSAndroid Build Coastguard Workerif __name__ == '__main__':
219*49fe348cSAndroid Build Coastguard Worker
220*49fe348cSAndroid Build Coastguard Worker    mdct_fft_twiddles()
221*49fe348cSAndroid Build Coastguard Worker    mdct_rot_twiddles()
222*49fe348cSAndroid Build Coastguard Worker
223*49fe348cSAndroid Build Coastguard Worker    inv_table()
224*49fe348cSAndroid Build Coastguard Worker    sns_ge_table()
225*49fe348cSAndroid Build Coastguard Worker    tns_lag_window()
226*49fe348cSAndroid Build Coastguard Worker    tns_quantization_table()
227*49fe348cSAndroid Build Coastguard Worker    quant_iq_table()
228*49fe348cSAndroid Build Coastguard Worker
229*49fe348cSAndroid Build Coastguard Worker    ltpf_resampler_table()
230*49fe348cSAndroid Build Coastguard Worker    ltpf_interpolate_table()
231*49fe348cSAndroid Build Coastguard Worker
232*49fe348cSAndroid Build Coastguard Worker    print('')
233