xref: /aosp_15_r20/external/libopus/celt/bands.h (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2007-2008 CSIRO
2*a58d3d2aSXin Li    Copyright (c) 2007-2009 Xiph.Org Foundation
3*a58d3d2aSXin Li    Copyright (c) 2008-2009 Gregory Maxwell
4*a58d3d2aSXin Li    Written by Jean-Marc Valin and Gregory Maxwell */
5*a58d3d2aSXin Li /*
6*a58d3d2aSXin Li    Redistribution and use in source and binary forms, with or without
7*a58d3d2aSXin Li    modification, are permitted provided that the following conditions
8*a58d3d2aSXin Li    are met:
9*a58d3d2aSXin Li 
10*a58d3d2aSXin Li    - Redistributions of source code must retain the above copyright
11*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer.
12*a58d3d2aSXin Li 
13*a58d3d2aSXin Li    - Redistributions in binary form must reproduce the above copyright
14*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer in the
15*a58d3d2aSXin Li    documentation and/or other materials provided with the distribution.
16*a58d3d2aSXin Li 
17*a58d3d2aSXin Li    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*a58d3d2aSXin Li    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*a58d3d2aSXin Li    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*a58d3d2aSXin Li    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21*a58d3d2aSXin Li    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22*a58d3d2aSXin Li    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23*a58d3d2aSXin Li    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24*a58d3d2aSXin Li    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25*a58d3d2aSXin Li    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26*a58d3d2aSXin Li    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27*a58d3d2aSXin Li    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*a58d3d2aSXin Li */
29*a58d3d2aSXin Li 
30*a58d3d2aSXin Li #ifndef BANDS_H
31*a58d3d2aSXin Li #define BANDS_H
32*a58d3d2aSXin Li 
33*a58d3d2aSXin Li #include "arch.h"
34*a58d3d2aSXin Li #include "modes.h"
35*a58d3d2aSXin Li #include "entenc.h"
36*a58d3d2aSXin Li #include "entdec.h"
37*a58d3d2aSXin Li #include "rate.h"
38*a58d3d2aSXin Li 
39*a58d3d2aSXin Li opus_int16 bitexact_cos(opus_int16 x);
40*a58d3d2aSXin Li int bitexact_log2tan(int isin,int icos);
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li /** Compute the amplitude (sqrt energy) in each of the bands
43*a58d3d2aSXin Li  * @param m Mode data
44*a58d3d2aSXin Li  * @param X Spectrum
45*a58d3d2aSXin Li  * @param bandE Square root of the energy for each band (returned)
46*a58d3d2aSXin Li  */
47*a58d3d2aSXin Li void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch);
48*a58d3d2aSXin Li 
49*a58d3d2aSXin Li /*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/
50*a58d3d2aSXin Li 
51*a58d3d2aSXin Li /** Normalise each band of X such that the energy in each band is
52*a58d3d2aSXin Li     equal to 1
53*a58d3d2aSXin Li  * @param m Mode data
54*a58d3d2aSXin Li  * @param X Spectrum (returned normalised)
55*a58d3d2aSXin Li  * @param bandE Square root of the energy for each band
56*a58d3d2aSXin Li  */
57*a58d3d2aSXin Li void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, celt_norm * OPUS_RESTRICT X, const celt_ener *bandE, int end, int C, int M);
58*a58d3d2aSXin Li 
59*a58d3d2aSXin Li /** Denormalise each band of X to restore full amplitude
60*a58d3d2aSXin Li  * @param m Mode data
61*a58d3d2aSXin Li  * @param X Spectrum (returned de-normalised)
62*a58d3d2aSXin Li  * @param bandE Square root of the energy for each band
63*a58d3d2aSXin Li  */
64*a58d3d2aSXin Li void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
65*a58d3d2aSXin Li       celt_sig * OPUS_RESTRICT freq, const opus_val16 *bandE, int start,
66*a58d3d2aSXin Li       int end, int M, int downsample, int silence);
67*a58d3d2aSXin Li 
68*a58d3d2aSXin Li #define SPREAD_NONE       (0)
69*a58d3d2aSXin Li #define SPREAD_LIGHT      (1)
70*a58d3d2aSXin Li #define SPREAD_NORMAL     (2)
71*a58d3d2aSXin Li #define SPREAD_AGGRESSIVE (3)
72*a58d3d2aSXin Li 
73*a58d3d2aSXin Li int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
74*a58d3d2aSXin Li       int last_decision, int *hf_average, int *tapset_decision, int update_hf,
75*a58d3d2aSXin Li       int end, int C, int M, const int *spread_weight);
76*a58d3d2aSXin Li 
77*a58d3d2aSXin Li #ifdef MEASURE_NORM_MSE
78*a58d3d2aSXin Li void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
79*a58d3d2aSXin Li #endif
80*a58d3d2aSXin Li 
81*a58d3d2aSXin Li void haar1(celt_norm *X, int N0, int stride);
82*a58d3d2aSXin Li 
83*a58d3d2aSXin Li /** Quantisation/encoding of the residual spectrum
84*a58d3d2aSXin Li  * @param encode flag that indicates whether we're encoding (1) or decoding (0)
85*a58d3d2aSXin Li  * @param m Mode data
86*a58d3d2aSXin Li  * @param start First band to process
87*a58d3d2aSXin Li  * @param end Last band to process + 1
88*a58d3d2aSXin Li  * @param X Residual (normalised)
89*a58d3d2aSXin Li  * @param Y Residual (normalised) for second channel (or NULL for mono)
90*a58d3d2aSXin Li  * @param collapse_masks Anti-collapse tracking mask
91*a58d3d2aSXin Li  * @param bandE Square root of the energy for each band
92*a58d3d2aSXin Li  * @param pulses Bit allocation (per band) for PVQ
93*a58d3d2aSXin Li  * @param shortBlocks Zero for long blocks, non-zero for short blocks
94*a58d3d2aSXin Li  * @param spread Amount of spreading to use
95*a58d3d2aSXin Li  * @param dual_stereo Zero for MS stereo, non-zero for dual stereo
96*a58d3d2aSXin Li  * @param intensity First band to use intensity stereo
97*a58d3d2aSXin Li  * @param tf_res Time-frequency resolution change
98*a58d3d2aSXin Li  * @param total_bits Total number of bits that can be used for the frame (including the ones already spent)
99*a58d3d2aSXin Li  * @param balance Number of unallocated bits
100*a58d3d2aSXin Li  * @param en Entropy coder state
101*a58d3d2aSXin Li  * @param LM log2() of the number of 2.5 subframes in the frame
102*a58d3d2aSXin Li  * @param codedBands Last band to receive bits + 1
103*a58d3d2aSXin Li  * @param seed Random generator seed
104*a58d3d2aSXin Li  * @param arch Run-time architecture (see opus_select_arch())
105*a58d3d2aSXin Li  */
106*a58d3d2aSXin Li void quant_all_bands(int encode, const CELTMode *m, int start, int end,
107*a58d3d2aSXin Li       celt_norm * X, celt_norm * Y, unsigned char *collapse_masks,
108*a58d3d2aSXin Li       const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
109*a58d3d2aSXin Li       int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
110*a58d3d2aSXin Li       opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed,
111*a58d3d2aSXin Li       int complexity, int arch, int disable_inv);
112*a58d3d2aSXin Li 
113*a58d3d2aSXin Li void anti_collapse(const CELTMode *m, celt_norm *X_,
114*a58d3d2aSXin Li       unsigned char *collapse_masks, int LM, int C, int size, int start,
115*a58d3d2aSXin Li       int end, const opus_val16 *logE, const opus_val16 *prev1logE,
116*a58d3d2aSXin Li       const opus_val16 *prev2logE, const int *pulses, opus_uint32 seed,
117*a58d3d2aSXin Li       int arch);
118*a58d3d2aSXin Li 
119*a58d3d2aSXin Li opus_uint32 celt_lcg_rand(opus_uint32 seed);
120*a58d3d2aSXin Li 
121*a58d3d2aSXin Li int hysteresis_decision(opus_val16 val, const opus_val16 *thresholds, const opus_val16 *hysteresis, int N, int prev);
122*a58d3d2aSXin Li 
123*a58d3d2aSXin Li #endif /* BANDS_H */
124