Minus a bunch of warnings when enabling alloca()
[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 /** Applies a series of rotations so that pulses are spread like a two-sided
43 exponential. The effect of this is to reduce the tonal noise created by the
44 sparse spectrum resulting from the pulse codebook */
45 static void exp_rotation(celt_norm_t *X, int len, float theta, int dir, int stride, int iter)
46 {
47    int i, k;
48    float c, s;
49    c = cos(theta);
50    s = dir*sin(theta);
51    for (k=0;k<iter;k++)
52    {
53       for (i=0;i<len-stride;i++)
54       {
55          float x1, x2;
56          x1 = X[i];
57          x2 = X[i+stride];
58          X[i] = c*x1 - s*x2;
59          X[i+stride] = c*x2 + s*x1;
60       }
61       for (i=len-2*stride-1;i>=0;i--)
62       {
63          float x1, x2;
64          x1 = X[i];
65          x2 = X[i+stride];
66          X[i] = c*x1 - s*x2;
67          X[i+stride] = c*x2 + 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, float *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] = 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, float *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+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 void renormalise_bands(const CELTMode *m, celt_norm_t *X)
116 {
117    VARDECL(float *tmpE);
118    ALLOC(tmpE, m->nbEBands*m->nbChannels, float);
119    compute_band_energies(m, X, tmpE);
120    /* FIXME: This isn't right */
121    normalise_bands(m, X, X, tmpE);
122 }
123
124 /* De-normalise the energy to produce the synthesis from the unit-energy bands */
125 void denormalise_bands(const CELTMode *m, celt_norm_t *X, celt_sig_t *freq, float *bank)
126 {
127    int i, c, B, C;
128    const int *eBands = m->eBands;
129    B = m->nbMdctBlocks;
130    C = m->nbChannels;
131    for (c=0;c<C;c++)
132    {
133       for (i=0;i<m->nbEBands;i++)
134       {
135          int j;
136          float g = sqrt(C)*bank[i*C+c];
137          for (j=B*eBands[i];j<B*eBands[i+1];j++)
138             freq[j*C+c] = NORM_SCALING_1*SIG_SCALING*X[j*C+c] * g;
139       }
140    }
141    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
142       freq[i] = 0;
143 }
144
145
146 /* Compute the best gain for each "pitch band" */
147 void compute_pitch_gain(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, float *gains, float *bank)
148 {
149    int i, B;
150    const int *eBands = m->eBands;
151    const int *pBands = m->pBands;
152    VARDECL(float *w);
153    B = m->nbMdctBlocks*m->nbChannels;
154    ALLOC(w, B*eBands[m->nbEBands], float);
155    for (i=0;i<m->nbEBands;i++)
156    {
157       int j;
158       for (j=B*eBands[i];j<B*eBands[i+1];j++)
159          w[j] = bank[i];
160    }
161
162    
163    for (i=0;i<m->nbPBands;i++)
164    {
165       float Sxy=0;
166       float Sxx = 0;
167       int j;
168       float gain;
169       for (j=B*pBands[i];j<B*pBands[i+1];j++)
170       {
171          Sxy += 1.f*X[j]*P[j]*w[j];
172          Sxx += 1.f*X[j]*X[j]*w[j];
173       }
174       gain = Sxy/(1e-10*NORM_SCALING*NORM_SCALING+Sxx);
175       if (gain > 1.f)
176          gain = 1.f;
177       if (gain < 0.0f)
178          gain = 0.0f;
179       /* We need to be a bit conservative, otherwise residual doesn't quantise well */
180       gain *= .9f;
181       gains[i] = gain;
182       /*printf ("%f ", 1-sqrt(1-gain*gain));*/
183    }
184    /*if(rand()%10==0)
185    {
186       for (i=0;i<m->nbPBands;i++)
187          printf ("%f ", 1-sqrt(1-gains[i]*gains[i]));
188       printf ("\n");
189    }*/
190    for (i=B*pBands[m->nbPBands];i<B*pBands[m->nbPBands+1];i++)
191       P[i] = 0;
192 }
193
194 /* Apply the (quantised) gain to each "pitch band" */
195 void pitch_quant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, float *gains)
196 {
197    int i, B;
198    const int *pBands = m->pBands;
199    B = m->nbMdctBlocks*m->nbChannels;
200    for (i=0;i<m->nbPBands;i++)
201    {
202       int j;
203       for (j=B*pBands[i];j<B*pBands[i+1];j++)
204          P[j] *= gains[i];
205       /*printf ("%f ", gain);*/
206    }
207    for (i=B*pBands[m->nbPBands];i<B*pBands[m->nbPBands+1];i++)
208       P[i] = 0;
209 }
210
211
212 /* Quantisation of the residual */
213 void quant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, float *W, int total_bits, ec_enc *enc)
214 {
215    int i, j, B, bits;
216    const int *eBands = m->eBands;
217    float alpha = .7;
218    VARDECL(celt_norm_t *norm);
219    VARDECL(int *pulses);
220    VARDECL(int *offsets);
221    
222    B = m->nbMdctBlocks*m->nbChannels;
223    
224    ALLOC(norm, B*eBands[m->nbEBands+1], celt_norm_t);
225    ALLOC(pulses, m->nbEBands, int);
226    ALLOC(offsets, m->nbEBands, int);
227
228    for (i=0;i<m->nbEBands;i++)
229       offsets[i] = 0;
230    /* Use a single-bit margin to guard against overrunning (make sure it's enough) */
231    bits = total_bits - ec_enc_tell(enc, 0) - 1;
232    compute_allocation(m, offsets, bits, pulses);
233    
234    /*printf("bits left: %d\n", bits);
235    for (i=0;i<m->nbEBands;i++)
236       printf ("%d ", pulses[i]);
237    printf ("\n");*/
238    /*printf ("%d %d\n", ec_enc_tell(enc, 0), compute_allocation(m, m->nbPulses));*/
239    for (i=0;i<m->nbEBands;i++)
240    {
241       int q;
242       float theta, n;
243       q = pulses[i];
244       /*Scale factor of .0625f is just there to prevent overflows in fixed-point
245        (has no effect on float)*/
246       n = .0625f*sqrt(B*(eBands[i+1]-eBands[i]));
247       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
248
249       /* If pitch isn't available, use intra-frame prediction */
250       if (eBands[i] >= m->pitchEnd || q<=0)
251       {
252          q -= 1;
253          alpha = 0;
254          if (q<0)
255             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
256          else
257             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);
258       } else {
259          alpha = .7;
260       }
261       
262       if (q > 0)
263       {
264          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
265          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
266          alg_quant(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, enc);
267          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
268       }
269       for (j=B*eBands[i];j<B*eBands[i+1];j++)
270          norm[j] = X[j] * n;
271    }
272    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
273       X[i] = 0;
274 }
275
276 /* Decoding of the residual */
277 void unquant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, int total_bits, ec_dec *dec)
278 {
279    int i, j, B, bits;
280    const int *eBands = m->eBands;
281    float alpha = .7;
282    VARDECL(celt_norm_t *norm);
283    VARDECL(int *pulses);
284    VARDECL(int *offsets);
285    
286    B = m->nbMdctBlocks*m->nbChannels;
287    
288    ALLOC(norm, B*eBands[m->nbEBands+1], celt_norm_t);
289    ALLOC(pulses, m->nbEBands, int);
290    ALLOC(offsets, m->nbEBands, int);
291
292    for (i=0;i<m->nbEBands;i++)
293       offsets[i] = 0;
294    /* Use a single-bit margin to guard against overrunning (make sure it's enough) */
295    bits = total_bits - ec_dec_tell(dec, 0) - 1;
296    compute_allocation(m, offsets, bits, pulses);
297
298    for (i=0;i<m->nbEBands;i++)
299    {
300       int q;
301       float theta, n;
302       q = pulses[i];
303       /*Scale factor of .0625f is just there to prevent overflows in fixed-point
304       (has no effect on float)*/
305       n = .0625f*sqrt(B*(eBands[i+1]-eBands[i]));
306       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
307
308       /* If pitch isn't available, use intra-frame prediction */
309       if (eBands[i] >= m->pitchEnd || q<=0)
310       {
311          q -= 1;
312          alpha = 0;
313          if (q<0)
314             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
315          else
316             intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec);
317       } else {
318          alpha = .7;
319       }
320       
321       if (q > 0)
322       {
323          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
324          alg_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, dec);
325          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
326       }
327       for (j=B*eBands[i];j<B*eBands[i+1];j++)
328          norm[j] = X[j] * n;
329    }
330    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
331       X[i] = 0;
332 }
333
334 void stereo_mix(const CELTMode *m, celt_norm_t *X, float *bank, int dir)
335 {
336    int i, B, C;
337    const int *eBands = m->eBands;
338    B = m->nbMdctBlocks;
339    C = m->nbChannels;
340    for (i=0;i<m->nbEBands;i++)
341    {
342       int j;
343       float left, right;
344       float a1, a2;
345       left = bank[i*C];
346       right = bank[i*C+1];
347       a1 = left/sqrt(.01+left*left+right*right);
348       a2 = dir*right/sqrt(.01+left*left+right*right);
349       for (j=B*eBands[i];j<B*eBands[i+1];j++)
350       {
351          float r, l;
352          l = X[j*C];
353          r = X[j*C+1];         
354          X[j*C] = a1*l + a2*r;
355          X[j*C+1] = a1*r - a2*l;
356       }
357    }
358    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
359       X[i] = 0;
360
361 }