1*df25739fSMilanka Ringwald /****************************************************************************** 2*df25739fSMilanka Ringwald * 3*df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4*df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5*df25739fSMilanka Ringwald * 6*df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7*df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8*df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9*df25739fSMilanka Ringwald * 10*df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11*df25739fSMilanka Ringwald * 12*df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13*df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14*df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15*df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16*df25739fSMilanka Ringwald * limitations under the License. 17*df25739fSMilanka Ringwald * 18*df25739fSMilanka Ringwald ******************************************************************************/ 19*df25739fSMilanka Ringwald 20*df25739fSMilanka Ringwald /********************************************************************************** 21*df25739fSMilanka Ringwald $Revision: #1 $ 22*df25739fSMilanka Ringwald ***********************************************************************************/ 23*df25739fSMilanka Ringwald 24*df25739fSMilanka Ringwald /** 25*df25739fSMilanka Ringwald @file 26*df25739fSMilanka Ringwald 27*df25739fSMilanka Ringwald Dequantizer for SBC decoder; reconstructs quantized representation of subband samples. 28*df25739fSMilanka Ringwald 29*df25739fSMilanka Ringwald @ingroup codec_internal 30*df25739fSMilanka Ringwald */ 31*df25739fSMilanka Ringwald 32*df25739fSMilanka Ringwald /** 33*df25739fSMilanka Ringwald @addtogroup codec_internal 34*df25739fSMilanka Ringwald @{ 35*df25739fSMilanka Ringwald */ 36*df25739fSMilanka Ringwald 37*df25739fSMilanka Ringwald /** 38*df25739fSMilanka Ringwald This function is a fixed-point approximation of a modification of the following 39*df25739fSMilanka Ringwald dequantization operation defined in the spec, as inferred from section 12.6.4: 40*df25739fSMilanka Ringwald 41*df25739fSMilanka Ringwald @code 42*df25739fSMilanka Ringwald dequant = 2^(scale_factor+1) * ((raw * 2.0 + 1.0) / ((2^bits) - 1) - 1) 43*df25739fSMilanka Ringwald 44*df25739fSMilanka Ringwald 2 <= bits <= 16 45*df25739fSMilanka Ringwald 0 <= raw < (2^bits)-1 (the -1 is because quantized values with all 1's are forbidden) 46*df25739fSMilanka Ringwald 47*df25739fSMilanka Ringwald -65535 < dequant < 65535 48*df25739fSMilanka Ringwald @endcode 49*df25739fSMilanka Ringwald 50*df25739fSMilanka Ringwald The code below computes the dequantized value divided by a scaling constant 51*df25739fSMilanka Ringwald equal to about 1.38. This constant is chosen to ensure that the entry in the 52*df25739fSMilanka Ringwald dequant_long_scaled table for 16 bits is as accurate as possible, since it has 53*df25739fSMilanka Ringwald the least relative precision available to it due to its small magnitude. 54*df25739fSMilanka Ringwald 55*df25739fSMilanka Ringwald This routine outputs in Q16.15 format. 56*df25739fSMilanka Ringwald 57*df25739fSMilanka Ringwald The helper array dequant_long is defined as follows: 58*df25739fSMilanka Ringwald 59*df25739fSMilanka Ringwald @code 60*df25739fSMilanka Ringwald dequant_long_long[bits] = round(2^31 * 1/((2^bits - 1) / 1.38...) for 2 <= bits <= 16 61*df25739fSMilanka Ringwald @endcode 62*df25739fSMilanka Ringwald 63*df25739fSMilanka Ringwald 64*df25739fSMilanka Ringwald Additionally, the table entries have the following property: 65*df25739fSMilanka Ringwald 66*df25739fSMilanka Ringwald @code 67*df25739fSMilanka Ringwald dequant_long_scaled[bits] <= 2^31 / ((2^bits - 1)) for 2 <= bits <= 16 68*df25739fSMilanka Ringwald @endcode 69*df25739fSMilanka Ringwald 70*df25739fSMilanka Ringwald Therefore 71*df25739fSMilanka Ringwald 72*df25739fSMilanka Ringwald @code 73*df25739fSMilanka Ringwald d = 2 * raw + 1 1 <= d <= 2^bits - 2 74*df25739fSMilanka Ringwald 75*df25739fSMilanka Ringwald d' = d * dequant_long[bits] 76*df25739fSMilanka Ringwald 77*df25739fSMilanka Ringwald d * dequant_long_scaled[bits] <= (2^bits - 2) * (2^31 / (2^bits - 1)) 78*df25739fSMilanka Ringwald d * dequant_long_scaled[bits] <= 2^31 * (2^bits - 2)/(2^bits - 1) < 2^31 79*df25739fSMilanka Ringwald @endcode 80*df25739fSMilanka Ringwald 81*df25739fSMilanka Ringwald Therefore, d' doesn't overflow a signed 32-bit value. 82*df25739fSMilanka Ringwald 83*df25739fSMilanka Ringwald @code 84*df25739fSMilanka Ringwald 85*df25739fSMilanka Ringwald d' =~ 2^31 * (raw * 2.0 + 1.0) / (2^bits - 1) / 1.38... 86*df25739fSMilanka Ringwald 87*df25739fSMilanka Ringwald result = d' - 2^31/1.38... =~ 2^31 * ((raw * 2.0 + 1.0) / (2^bits - 1) - 1) / 1.38... 88*df25739fSMilanka Ringwald 89*df25739fSMilanka Ringwald result is therefore a scaled approximation to dequant. It remains only to 90*df25739fSMilanka Ringwald turn 2^31 into 2^(scale_factor+1). Since we're aiming for Q16.15 format, 91*df25739fSMilanka Ringwald this is achieved by shifting right by (15-scale_factor): 92*df25739fSMilanka Ringwald 93*df25739fSMilanka Ringwald (2^31 * x) >> (15-scale_factor) =~ 2^(31-15+scale_factor) * x = 2^15 * 2^(1+scale_factor) * x 94*df25739fSMilanka Ringwald @endcode 95*df25739fSMilanka Ringwald 96*df25739fSMilanka Ringwald */ 97*df25739fSMilanka Ringwald 98*df25739fSMilanka Ringwald #include <oi_codec_sbc_private.h> 99*df25739fSMilanka Ringwald 100*df25739fSMilanka Ringwald #ifndef SBC_DEQUANT_LONG_SCALED_OFFSET 101*df25739fSMilanka Ringwald #define SBC_DEQUANT_LONG_SCALED_OFFSET 1555931970 102*df25739fSMilanka Ringwald #endif 103*df25739fSMilanka Ringwald 104*df25739fSMilanka Ringwald #ifndef SBC_DEQUANT_LONG_UNSCALED_OFFSET 105*df25739fSMilanka Ringwald #define SBC_DEQUANT_LONG_UNSCALED_OFFSET 2147483648 106*df25739fSMilanka Ringwald #endif 107*df25739fSMilanka Ringwald 108*df25739fSMilanka Ringwald #ifndef SBC_DEQUANT_SCALING_FACTOR 109*df25739fSMilanka Ringwald #define SBC_DEQUANT_SCALING_FACTOR 1.38019122262781f 110*df25739fSMilanka Ringwald #endif 111*df25739fSMilanka Ringwald 112*df25739fSMilanka Ringwald extern const OI_UINT32 dequant_long_scaled[17]; 113*df25739fSMilanka Ringwald extern const OI_UINT32 dequant_long_unscaled[17]; 114*df25739fSMilanka Ringwald 115*df25739fSMilanka Ringwald /** Scales x by y bits to the right, adding a rounding factor. 116*df25739fSMilanka Ringwald */ 117*df25739fSMilanka Ringwald #ifndef SCALE 118*df25739fSMilanka Ringwald #define SCALE(x, y) (((x) + (1 <<((y)-1))) >> (y)) 119*df25739fSMilanka Ringwald #endif 120*df25739fSMilanka Ringwald 121*df25739fSMilanka Ringwald #ifdef DEBUG_DEQUANTIZATION 122*df25739fSMilanka Ringwald 123*df25739fSMilanka Ringwald #include <math.h> 124*df25739fSMilanka Ringwald 125*df25739fSMilanka Ringwald INLINE float dequant_float(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) 126*df25739fSMilanka Ringwald { 127*df25739fSMilanka Ringwald float result = (1 << (scale_factor+1)) * ((raw * 2.0f + 1.0f) / ((1 << bits) - 1.0f) - 1.0f); 128*df25739fSMilanka Ringwald 129*df25739fSMilanka Ringwald result /= SBC_DEQUANT_SCALING_FACTOR; 130*df25739fSMilanka Ringwald 131*df25739fSMilanka Ringwald /* Unless the encoder screwed up, all correct dequantized values should 132*df25739fSMilanka Ringwald * satisfy this inequality. Non-compliant encoders which generate quantized 133*df25739fSMilanka Ringwald * values with all 1-bits set can, theoretically, trigger this assert. This 134*df25739fSMilanka Ringwald * is unlikely, however, and only an issue in debug mode. 135*df25739fSMilanka Ringwald */ 136*df25739fSMilanka Ringwald OI_ASSERT(fabs(result) < 32768 * 1.6); 137*df25739fSMilanka Ringwald 138*df25739fSMilanka Ringwald return result; 139*df25739fSMilanka Ringwald } 140*df25739fSMilanka Ringwald 141*df25739fSMilanka Ringwald #endif 142*df25739fSMilanka Ringwald 143*df25739fSMilanka Ringwald 144*df25739fSMilanka Ringwald INLINE OI_INT32 OI_SBC_Dequant(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) 145*df25739fSMilanka Ringwald { 146*df25739fSMilanka Ringwald OI_UINT32 d; 147*df25739fSMilanka Ringwald OI_INT32 result; 148*df25739fSMilanka Ringwald 149*df25739fSMilanka Ringwald OI_ASSERT(scale_factor <= 15); 150*df25739fSMilanka Ringwald OI_ASSERT(bits <= 16); 151*df25739fSMilanka Ringwald 152*df25739fSMilanka Ringwald if (bits <= 1) { 153*df25739fSMilanka Ringwald return 0; 154*df25739fSMilanka Ringwald } 155*df25739fSMilanka Ringwald 156*df25739fSMilanka Ringwald d = (raw * 2) + 1; 157*df25739fSMilanka Ringwald d *= dequant_long_scaled[bits]; 158*df25739fSMilanka Ringwald result = d - SBC_DEQUANT_LONG_SCALED_OFFSET; 159*df25739fSMilanka Ringwald 160*df25739fSMilanka Ringwald #ifdef DEBUG_DEQUANTIZATION 161*df25739fSMilanka Ringwald { 162*df25739fSMilanka Ringwald OI_INT32 integerized_float_result; 163*df25739fSMilanka Ringwald float float_result; 164*df25739fSMilanka Ringwald 165*df25739fSMilanka Ringwald float_result = dequant_float(raw, scale_factor, bits); 166*df25739fSMilanka Ringwald integerized_float_result = (OI_INT32)floor(0.5f+float_result * (1 << 15)); 167*df25739fSMilanka Ringwald 168*df25739fSMilanka Ringwald /* This detects overflow */ 169*df25739fSMilanka Ringwald OI_ASSERT(((result >= 0) && (integerized_float_result >= 0)) || 170*df25739fSMilanka Ringwald ((result <= 0) && (integerized_float_result <= 0))); 171*df25739fSMilanka Ringwald } 172*df25739fSMilanka Ringwald #endif 173*df25739fSMilanka Ringwald return result >> (15 - scale_factor); 174*df25739fSMilanka Ringwald } 175*df25739fSMilanka Ringwald 176*df25739fSMilanka Ringwald /* This version of Dequant does not incorporate the scaling factor of 1.38. It 177*df25739fSMilanka Ringwald * is intended for use with implementations of the filterbank which are 178*df25739fSMilanka Ringwald * hard-coded into a DSP. Output is Q16.4 format, so that after joint stereo 179*df25739fSMilanka Ringwald * processing (which leaves the most significant bit equal to the sign bit if 180*df25739fSMilanka Ringwald * the encoder is conformant) the result will fit a 24 bit fixed point signed 181*df25739fSMilanka Ringwald * value.*/ 182*df25739fSMilanka Ringwald 183*df25739fSMilanka Ringwald INLINE OI_INT32 OI_SBC_Dequant_Unscaled(OI_UINT32 raw, OI_UINT scale_factor, OI_UINT bits) 184*df25739fSMilanka Ringwald { 185*df25739fSMilanka Ringwald OI_UINT32 d; 186*df25739fSMilanka Ringwald OI_INT32 result; 187*df25739fSMilanka Ringwald 188*df25739fSMilanka Ringwald OI_ASSERT(scale_factor <= 15); 189*df25739fSMilanka Ringwald OI_ASSERT(bits <= 16); 190*df25739fSMilanka Ringwald 191*df25739fSMilanka Ringwald 192*df25739fSMilanka Ringwald if (bits <= 1) { 193*df25739fSMilanka Ringwald return 0; 194*df25739fSMilanka Ringwald } 195*df25739fSMilanka Ringwald if (bits == 16) { 196*df25739fSMilanka Ringwald result = (raw << 16) + raw - 0x7fff7fff; 197*df25739fSMilanka Ringwald return SCALE(result, 24 - scale_factor); 198*df25739fSMilanka Ringwald } 199*df25739fSMilanka Ringwald 200*df25739fSMilanka Ringwald 201*df25739fSMilanka Ringwald d = (raw * 2) + 1; 202*df25739fSMilanka Ringwald d *= dequant_long_unscaled[bits]; 203*df25739fSMilanka Ringwald result = d - 0x80000000; 204*df25739fSMilanka Ringwald 205*df25739fSMilanka Ringwald return SCALE(result, 24 - scale_factor); 206*df25739fSMilanka Ringwald } 207*df25739fSMilanka Ringwald 208*df25739fSMilanka Ringwald /** 209*df25739fSMilanka Ringwald @} 210*df25739fSMilanka Ringwald */ 211