fixed-point: unquant_energy_mono() has received the fixed-point code from
[opus.git] / libcelt / bands.c
1 /* (C) 2007 Jean-Marc Valin, CSIRO
2 */
3 /*
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met:
7    
8    - Redistributions of source code must retain the above copyright
9    notice, this list of conditions and the following disclaimer.
10    
11    - Redistributions in binary form must reproduce the above copyright
12    notice, this list of conditions and the following disclaimer in the
13    documentation and/or other materials provided with the distribution.
14    
15    - Neither the name of the Xiph.org Foundation nor the names of its
16    contributors may be used to endorse or promote products derived from
17    this software without specific prior written permission.
18    
19    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
23    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
27    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifdef HAVE_CONFIG_H
33 #include "config.h"
34 #endif
35
36 #include <math.h>
37 #include "bands.h"
38 #include "modes.h"
39 #include "vq.h"
40 #include "cwrs.h"
41
42
43 void exp_rotation(celt_norm_t *X, int len, float theta, int dir, int stride, int iter)
44 {
45    int i, k;
46    celt_word16_t c, s;
47    c = Q15ONE*cos(theta);
48    s = dir*Q15ONE*sin(theta);
49    for (k=0;k<iter;k++)
50    {
51       /* We could use MULT16_16_P15 instead of MULT16_16_Q15 for more accuracy, 
52          but at this point, I really don't think it's necessary */
53       for (i=0;i<len-stride;i++)
54       {
55          celt_norm_t x1, x2;
56          x1 = X[i];
57          x2 = X[i+stride];
58          X[i] = MULT16_16_Q15(c,x1) - MULT16_16_Q15(s,x2);
59          X[i+stride] = MULT16_16_Q15(c,x2) + MULT16_16_Q15(s,x1);
60       }
61       for (i=len-2*stride-1;i>=0;i--)
62       {
63          celt_norm_t x1, x2;
64          x1 = X[i];
65          x2 = X[i+stride];
66          X[i] = MULT16_16_Q15(c,x1) - MULT16_16_Q15(s,x2);
67          X[i+stride] = MULT16_16_Q15(c,x2) + MULT16_16_Q15(s,x1);
68       }
69    }
70 }
71
72 /* Compute the amplitude (sqrt energy) in each of the bands */
73 void compute_band_energies(const CELTMode *m, celt_sig_t *X, celt_ener_t *bank)
74 {
75    int i, c, B, C;
76    const int *eBands = m->eBands;
77    B = m->nbMdctBlocks;
78    C = m->nbChannels;
79    for (c=0;c<C;c++)
80    {
81       for (i=0;i<m->nbEBands;i++)
82       {
83          int j;
84          float sum = 1e-10;
85          for (j=B*eBands[i];j<B*eBands[i+1];j++)
86             sum += SIG_SCALING_1*SIG_SCALING_1*X[j*C+c]*X[j*C+c];
87          bank[i*C+c] = ENER_SCALING*sqrt(sum);
88          /*printf ("%f ", bank[i*C+c]);*/
89       }
90    }
91    /*printf ("\n");*/
92 }
93
94 /* Normalise each band such that the energy is one. */
95 void normalise_bands(const CELTMode *m, celt_sig_t *freq, celt_norm_t *X, celt_ener_t *bank)
96 {
97    int i, c, B, C;
98    const int *eBands = m->eBands;
99    B = m->nbMdctBlocks;
100    C = m->nbChannels;
101    for (c=0;c<C;c++)
102    {
103       for (i=0;i<m->nbEBands;i++)
104       {
105          int j;
106          float g = 1.f/(1e-10+ENER_SCALING_1*bank[i*C+c]*sqrt(C));
107          for (j=B*eBands[i];j<B*eBands[i+1];j++)
108             X[j*C+c] = NORM_SCALING*SIG_SCALING_1*freq[j*C+c]*g;
109       }
110    }
111    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
112       X[i] = 0;
113 }
114
115 #ifdef FIXED_POINT
116 void renormalise_bands(const CELTMode *m, celt_norm_t *X)
117 {
118    int i;
119    VARDECL(celt_ener_t *tmpE);
120    VARDECL(celt_sig_t *freq);
121    ALLOC(tmpE, m->nbEBands*m->nbChannels, celt_ener_t);
122    ALLOC(freq, m->nbMdctBlocks*m->nbChannels*m->eBands[m->nbEBands+1], celt_sig_t);
123    for (i=0;i<m->nbMdctBlocks*m->nbChannels*m->eBands[m->nbEBands+1];i++)
124       freq[i] = SHL32(EXTEND32(X[i]), 10);
125    compute_band_energies(m, freq, tmpE);
126    normalise_bands(m, freq, X, tmpE);
127 }
128 #else
129 void renormalise_bands(const CELTMode *m, celt_norm_t *X)
130 {
131    VARDECL(celt_ener_t *tmpE);
132    ALLOC(tmpE, m->nbEBands*m->nbChannels, celt_ener_t);
133    compute_band_energies(m, X, tmpE);
134    normalise_bands(m, X, X, tmpE);
135 }
136 #endif
137
138 /* De-normalise the energy to produce the synthesis from the unit-energy bands */
139 void denormalise_bands(const CELTMode *m, celt_norm_t *X, celt_sig_t *freq, celt_ener_t *bank)
140 {
141    int i, c, B, C;
142    const int *eBands = m->eBands;
143    B = m->nbMdctBlocks;
144    C = m->nbChannels;
145    for (c=0;c<C;c++)
146    {
147       for (i=0;i<m->nbEBands;i++)
148       {
149          int j;
150          float g = ENER_SCALING_1*sqrt(C)*bank[i*C+c];
151          for (j=B*eBands[i];j<B*eBands[i+1];j++)
152             freq[j*C+c] = NORM_SCALING_1*SIG_SCALING*X[j*C+c] * g;
153       }
154    }
155    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
156       freq[i] = 0;
157 }
158
159
160 /* Compute the best gain for each "pitch band" */
161 void compute_pitch_gain(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, celt_pgain_t *gains)
162 {
163    int i, B;
164    const int *pBands = m->pBands;
165    B = m->nbMdctBlocks*m->nbChannels;
166    
167    for (i=0;i<m->nbPBands;i++)
168    {
169       celt_word32_t Sxy=0, Sxx=0;
170       int j;
171       /* We know we're not going to overflow because Sxx can't be more than 1 (Q28) */
172       for (j=B*pBands[i];j<B*pBands[i+1];j++)
173       {
174          Sxy = MAC16_16(Sxy, X[j], P[j]);
175          Sxx = MAC16_16(Sxx, X[j], X[j]);
176       }
177       /* No negative gain allowed */
178       if (Sxy < 0)
179          Sxy = 0;
180       /* Not sure how that would happen, just making sure */
181       if (Sxy > Sxx)
182          Sxy = Sxx;
183       /* We need to be a bit conservative (multiply gain by 0.9), otherwise the
184          residual doesn't quantise well */
185       Sxy = MULT16_32_Q15(QCONST16(.9f, 15), Sxy);
186       /* gain = Sxy/Sxx */
187       gains[i] = DIV32_16(Sxy,ADD32(SHR32(Sxx, PGAIN_SHIFT),EPSILON));
188       /*printf ("%f ", 1-sqrt(1-gain*gain));*/
189    }
190    /*if(rand()%10==0)
191    {
192       for (i=0;i<m->nbPBands;i++)
193          printf ("%f ", 1-sqrt(1-gains[i]*gains[i]));
194       printf ("\n");
195    }*/
196    for (i=B*pBands[m->nbPBands];i<B*pBands[m->nbPBands+1];i++)
197       P[i] = 0;
198 }
199
200 /* Apply the (quantised) gain to each "pitch band" */
201 void pitch_quant_bands(const CELTMode *m, celt_norm_t *P, celt_pgain_t *gains)
202 {
203    int i, B;
204    const int *pBands = m->pBands;
205    B = m->nbMdctBlocks*m->nbChannels;
206    for (i=0;i<m->nbPBands;i++)
207    {
208       int j;
209       for (j=B*pBands[i];j<B*pBands[i+1];j++)
210          P[j] = MULT16_16_Q15(gains[i], P[j]);
211       /*printf ("%f ", gain);*/
212    }
213    for (i=B*pBands[m->nbPBands];i<B*pBands[m->nbPBands+1];i++)
214       P[i] = 0;
215 }
216
217
218 /* Quantisation of the residual */
219 void quant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, celt_mask_t *W, int total_bits, ec_enc *enc)
220 {
221    int i, j, B, bits;
222    const int *eBands = m->eBands;
223    celt_word16_t alpha;
224    VARDECL(celt_norm_t *norm);
225    VARDECL(int *pulses);
226    VARDECL(int *offsets);
227    
228    B = m->nbMdctBlocks*m->nbChannels;
229    
230    ALLOC(norm, B*eBands[m->nbEBands+1], celt_norm_t);
231    ALLOC(pulses, m->nbEBands, int);
232    ALLOC(offsets, m->nbEBands, int);
233
234    for (i=0;i<m->nbEBands;i++)
235       offsets[i] = 0;
236    /* Use a single-bit margin to guard against overrunning (make sure it's enough) */
237    bits = total_bits - ec_enc_tell(enc, 0) - 1;
238    compute_allocation(m, offsets, bits, pulses);
239    
240    /*printf("bits left: %d\n", bits);
241    for (i=0;i<m->nbEBands;i++)
242       printf ("%d ", pulses[i]);
243    printf ("\n");*/
244    /*printf ("%d %d\n", ec_enc_tell(enc, 0), compute_allocation(m, m->nbPulses));*/
245    for (i=0;i<m->nbEBands;i++)
246    {
247       int q;
248       float theta, n;
249       q = pulses[i];
250       /*Scale factor of .0625f is just there to prevent overflows in fixed-point
251        (has no effect on float)*/
252       n = .0625f*sqrt(B*(eBands[i+1]-eBands[i]));
253       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
254
255       /* If pitch isn't available, use intra-frame prediction */
256       if (eBands[i] >= m->pitchEnd || q<=0)
257       {
258          q -= 1;
259          alpha = 0;
260          if (q<0)
261             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
262          else
263             intra_prediction(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], enc);
264       } else {
265          alpha = QCONST16(.7f,15);
266       }
267       
268       if (q > 0)
269       {
270          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
271          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
272          alg_quant(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, enc);
273          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
274       }
275       for (j=B*eBands[i];j<B*eBands[i+1];j++)
276          norm[j] = X[j] * n;
277    }
278    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
279       X[i] = 0;
280 }
281
282 /* Decoding of the residual */
283 void unquant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, int total_bits, ec_dec *dec)
284 {
285    int i, j, B, bits;
286    const int *eBands = m->eBands;
287    celt_word16_t alpha;
288    VARDECL(celt_norm_t *norm);
289    VARDECL(int *pulses);
290    VARDECL(int *offsets);
291    
292    B = m->nbMdctBlocks*m->nbChannels;
293    
294    ALLOC(norm, B*eBands[m->nbEBands+1], celt_norm_t);
295    ALLOC(pulses, m->nbEBands, int);
296    ALLOC(offsets, m->nbEBands, int);
297
298    for (i=0;i<m->nbEBands;i++)
299       offsets[i] = 0;
300    /* Use a single-bit margin to guard against overrunning (make sure it's enough) */
301    bits = total_bits - ec_dec_tell(dec, 0) - 1;
302    compute_allocation(m, offsets, bits, pulses);
303
304    for (i=0;i<m->nbEBands;i++)
305    {
306       int q;
307       float theta, n;
308       q = pulses[i];
309       /*Scale factor of .0625f is just there to prevent overflows in fixed-point
310       (has no effect on float)*/
311       n = .0625f*sqrt(B*(eBands[i+1]-eBands[i]));
312       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
313
314       /* If pitch isn't available, use intra-frame prediction */
315       if (eBands[i] >= m->pitchEnd || q<=0)
316       {
317          q -= 1;
318          alpha = 0;
319          if (q<0)
320             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
321          else
322             intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec);
323       } else {
324          alpha = QCONST16(.7f,15);
325       }
326       
327       if (q > 0)
328       {
329          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
330          alg_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, dec);
331          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
332       }
333       for (j=B*eBands[i];j<B*eBands[i+1];j++)
334          norm[j] = X[j] * n;
335    }
336    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
337       X[i] = 0;
338 }
339
340 void stereo_mix(const CELTMode *m, celt_norm_t *X, celt_ener_t *bank, int dir)
341 {
342    int i, B, C;
343    const int *eBands = m->eBands;
344    B = m->nbMdctBlocks;
345    C = m->nbChannels;
346    for (i=0;i<m->nbEBands;i++)
347    {
348       int j;
349       float left, right;
350       float a1, a2;
351       left = bank[i*C];
352       right = bank[i*C+1];
353       a1 = left/sqrt(.01+left*left+right*right);
354       a2 = dir*right/sqrt(.01+left*left+right*right);
355       for (j=B*eBands[i];j<B*eBands[i+1];j++)
356       {
357          float r, l;
358          l = X[j*C];
359          r = X[j*C+1];         
360          X[j*C] = a1*l + a2*r;
361          X[j*C+1] = a1*r - a2*l;
362       }
363    }
364    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
365       X[i] = 0;
366
367 }