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