xref: /btstack/3rd-party/bluedroid/decoder/srce/dequant.c (revision df25739fc3ea5a0a90f0f5925e6461d653697d2e)
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