xref: /aosp_15_r20/external/liblc3/test/energy.py (revision 49fe348c0058011ee60b6957cdd9d52742df84bc)
1*49fe348cSAndroid Build Coastguard Worker#
2*49fe348cSAndroid Build Coastguard Worker# Copyright 2022 Google LLC
3*49fe348cSAndroid Build Coastguard Worker#
4*49fe348cSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
5*49fe348cSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
6*49fe348cSAndroid Build Coastguard Worker# You may obtain a copy of the License at
7*49fe348cSAndroid Build Coastguard Worker#
8*49fe348cSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
9*49fe348cSAndroid Build Coastguard Worker#
10*49fe348cSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
11*49fe348cSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
12*49fe348cSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*49fe348cSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
14*49fe348cSAndroid Build Coastguard Worker# limitations under the License.
15*49fe348cSAndroid Build Coastguard Worker#
16*49fe348cSAndroid Build Coastguard Worker
17*49fe348cSAndroid Build Coastguard Workerimport numpy as np
18*49fe348cSAndroid Build Coastguard Worker
19*49fe348cSAndroid Build Coastguard Workerimport lc3
20*49fe348cSAndroid Build Coastguard Workerimport tables as T, appendix_c as C
21*49fe348cSAndroid Build Coastguard Worker
22*49fe348cSAndroid Build Coastguard Worker### ------------------------------------------------------------------------ ###
23*49fe348cSAndroid Build Coastguard Worker
24*49fe348cSAndroid Build Coastguard Workerclass EnergyBand:
25*49fe348cSAndroid Build Coastguard Worker
26*49fe348cSAndroid Build Coastguard Worker    def __init__(self, dt, sr):
27*49fe348cSAndroid Build Coastguard Worker
28*49fe348cSAndroid Build Coastguard Worker        self.dt = dt
29*49fe348cSAndroid Build Coastguard Worker        self.I = T.I[dt][sr]
30*49fe348cSAndroid Build Coastguard Worker
31*49fe348cSAndroid Build Coastguard Worker    def compute(self, x):
32*49fe348cSAndroid Build Coastguard Worker
33*49fe348cSAndroid Build Coastguard Worker        e = [ np.mean(np.square(x[self.I[i]:self.I[i+1]]))
34*49fe348cSAndroid Build Coastguard Worker               for i in range(len(self.I)-1) ]
35*49fe348cSAndroid Build Coastguard Worker
36*49fe348cSAndroid Build Coastguard Worker        e_lo = np.sum(e[:len(e) - [2, 3, 4, 2][self.dt]])
37*49fe348cSAndroid Build Coastguard Worker        e_hi = np.sum(e[len(e) - [2, 3, 4, 2][self.dt]:])
38*49fe348cSAndroid Build Coastguard Worker
39*49fe348cSAndroid Build Coastguard Worker        return e, (e_hi > 30*e_lo)
40*49fe348cSAndroid Build Coastguard Worker
41*49fe348cSAndroid Build Coastguard Worker### ------------------------------------------------------------------------ ###
42*49fe348cSAndroid Build Coastguard Worker
43*49fe348cSAndroid Build Coastguard Workerdef check_unit(rng, dt, sr):
44*49fe348cSAndroid Build Coastguard Worker
45*49fe348cSAndroid Build Coastguard Worker    ns = T.NS[dt][sr]
46*49fe348cSAndroid Build Coastguard Worker    ok = True
47*49fe348cSAndroid Build Coastguard Worker
48*49fe348cSAndroid Build Coastguard Worker    nrg = EnergyBand(dt, sr)
49*49fe348cSAndroid Build Coastguard Worker
50*49fe348cSAndroid Build Coastguard Worker    x = (2 * rng.random(T.NS[dt][sr])) - 1
51*49fe348cSAndroid Build Coastguard Worker
52*49fe348cSAndroid Build Coastguard Worker    (e  , nn  ) = nrg.compute(x)
53*49fe348cSAndroid Build Coastguard Worker    (e_c, nn_c) = lc3.energy_compute(dt, sr, x)
54*49fe348cSAndroid Build Coastguard Worker    ok = ok and np.amax(np.abs(e_c - e)) < 1e-5 and nn_c == nn
55*49fe348cSAndroid Build Coastguard Worker
56*49fe348cSAndroid Build Coastguard Worker    x[15*ns//16:] *= 1e2;
57*49fe348cSAndroid Build Coastguard Worker
58*49fe348cSAndroid Build Coastguard Worker    (e  , nn  ) = nrg.compute(x)
59*49fe348cSAndroid Build Coastguard Worker    (e_c, nn_c) = lc3.energy_compute(dt, sr, x)
60*49fe348cSAndroid Build Coastguard Worker    ok = ok and np.amax(np.abs(e_c - e)) < 1e-3 and nn_c == nn
61*49fe348cSAndroid Build Coastguard Worker
62*49fe348cSAndroid Build Coastguard Worker    return ok
63*49fe348cSAndroid Build Coastguard Worker
64*49fe348cSAndroid Build Coastguard Workerdef check_appendix_c(dt):
65*49fe348cSAndroid Build Coastguard Worker
66*49fe348cSAndroid Build Coastguard Worker    i0 = dt - T.DT_7M5
67*49fe348cSAndroid Build Coastguard Worker    sr = T.SRATE_16K
68*49fe348cSAndroid Build Coastguard Worker
69*49fe348cSAndroid Build Coastguard Worker    ok = True
70*49fe348cSAndroid Build Coastguard Worker
71*49fe348cSAndroid Build Coastguard Worker    e  = lc3.energy_compute(dt, sr, C.X[i0][0])[0]
72*49fe348cSAndroid Build Coastguard Worker    ok = ok and np.amax(np.abs(1 - e/C.E_B[i0][0])) < 1e-6
73*49fe348cSAndroid Build Coastguard Worker
74*49fe348cSAndroid Build Coastguard Worker    e  = lc3.energy_compute(dt, sr, C.X[i0][1])[0]
75*49fe348cSAndroid Build Coastguard Worker    ok = ok and np.amax(np.abs(1 - e/C.E_B[i0][1])) < 1e-6
76*49fe348cSAndroid Build Coastguard Worker
77*49fe348cSAndroid Build Coastguard Worker    return ok
78*49fe348cSAndroid Build Coastguard Worker
79*49fe348cSAndroid Build Coastguard Workerdef check():
80*49fe348cSAndroid Build Coastguard Worker
81*49fe348cSAndroid Build Coastguard Worker    rng = np.random.default_rng(1234)
82*49fe348cSAndroid Build Coastguard Worker
83*49fe348cSAndroid Build Coastguard Worker    ok = True
84*49fe348cSAndroid Build Coastguard Worker
85*49fe348cSAndroid Build Coastguard Worker    for dt in range(T.NUM_DT):
86*49fe348cSAndroid Build Coastguard Worker        for sr in range(T.SRATE_8K, T.SRATE_48K + 1):
87*49fe348cSAndroid Build Coastguard Worker            ok = ok and check_unit(rng, dt, sr)
88*49fe348cSAndroid Build Coastguard Worker
89*49fe348cSAndroid Build Coastguard Worker    for dt in ( T.DT_2M5, T.DT_5M, T.DT_10M ):
90*49fe348cSAndroid Build Coastguard Worker        for sr in ( T.SRATE_48K_HR, T.SRATE_96K_HR ):
91*49fe348cSAndroid Build Coastguard Worker            ok = ok and check_unit(rng, dt, sr)
92*49fe348cSAndroid Build Coastguard Worker
93*49fe348cSAndroid Build Coastguard Worker    for dt in ( T.DT_7M5, T.DT_10M ):
94*49fe348cSAndroid Build Coastguard Worker        ok = ok and check_appendix_c(dt)
95*49fe348cSAndroid Build Coastguard Worker
96*49fe348cSAndroid Build Coastguard Worker    return ok
97*49fe348cSAndroid Build Coastguard Worker
98*49fe348cSAndroid Build Coastguard Worker### ------------------------------------------------------------------------ ###
99