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