Separating types for normalised vs. denormalised data paths
[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 += X[j*C+c]*X[j*C+c];
87          bank[i*C+c] = sqrt(C*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]);
107          for (j=B*eBands[i];j<B*eBands[i+1];j++)
108             X[j*C+c] = 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 = bank[i*C+c];
137          for (j=B*eBands[i];j<B*eBands[i+1];j++)
138             freq[j*C+c] = 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 += X[j]*P[j]*w[j];
172          Sxx += X[j]*X[j]*w[j];
173       }
174       gain = Sxy/(1e-10+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       n = sqrt(B*(eBands[i+1]-eBands[i]));
245       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
246
247       /* If pitch isn't available, use intra-frame prediction */
248       if (eBands[i] >= m->pitchEnd || q<=0)
249       {
250          q -= 1;
251          alpha = 0;
252          if (q<0)
253             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
254          else
255             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);
256       } else {
257          alpha = .7;
258       }
259       
260       if (q > 0)
261       {
262          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
263          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
264          alg_quant(X+B*eBands[i], W+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, enc);
265          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
266       }
267       for (j=B*eBands[i];j<B*eBands[i+1];j++)
268          norm[j] = X[j] * n;
269    }
270    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
271       X[i] = 0;
272 }
273
274 /* Decoding of the residual */
275 void unquant_bands(const CELTMode *m, celt_norm_t *X, celt_norm_t *P, int total_bits, ec_dec *dec)
276 {
277    int i, j, B, bits;
278    const int *eBands = m->eBands;
279    float alpha = .7;
280    VARDECL(celt_norm_t *norm);
281    VARDECL(int *pulses);
282    VARDECL(int *offsets);
283    
284    B = m->nbMdctBlocks*m->nbChannels;
285    
286    ALLOC(norm, B*eBands[m->nbEBands+1], celt_norm_t);
287    ALLOC(pulses, m->nbEBands, int);
288    ALLOC(offsets, m->nbEBands, int);
289
290    for (i=0;i<m->nbEBands;i++)
291       offsets[i] = 0;
292    /* Use a single-bit margin to guard against overrunning (make sure it's enough) */
293    bits = total_bits - ec_dec_tell(dec, 0) - 1;
294    compute_allocation(m, offsets, bits, pulses);
295
296    for (i=0;i<m->nbEBands;i++)
297    {
298       int q;
299       float theta, n;
300       q = pulses[i];
301       n = sqrt(B*(eBands[i+1]-eBands[i]));
302       theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+q);
303
304       /* If pitch isn't available, use intra-frame prediction */
305       if (eBands[i] >= m->pitchEnd || q<=0)
306       {
307          q -= 1;
308          alpha = 0;
309          if (q<0)
310             intra_fold(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), norm, P+B*eBands[i], B, eBands[i], eBands[m->nbEBands+1]);
311          else
312             intra_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, norm, P+B*eBands[i], B, eBands[i], dec);
313       } else {
314          alpha = .7;
315       }
316       
317       if (q > 0)
318       {
319          exp_rotation(P+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, -1, B, 8);
320          alg_unquant(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), q, P+B*eBands[i], alpha, dec);
321          exp_rotation(X+B*eBands[i], B*(eBands[i+1]-eBands[i]), theta, 1, B, 8);
322       }
323       for (j=B*eBands[i];j<B*eBands[i+1];j++)
324          norm[j] = X[j] * n;
325    }
326    for (i=B*eBands[m->nbEBands];i<B*eBands[m->nbEBands+1];i++)
327       X[i] = 0;
328 }
329
330 void stereo_mix(const CELTMode *m, celt_norm_t *X, float *bank, int dir)
331 {
332    int i, B, C;
333    const int *eBands = m->eBands;
334    B = m->nbMdctBlocks;
335    C = m->nbChannels;
336    for (i=0;i<m->nbEBands;i++)
337    {
338       int j;
339       float left, right;
340       float a1, a2;
341       left = bank[i*C];
342       right = bank[i*C+1];
343       a1 = left/sqrt(.01+left*left+right*right);
344       a2 = dir*right/sqrt(.01+left*left+right*right);
345       for (j=B*eBands[i];j<B*eBands[i+1];j++)
346       {
347          float r, l;
348          l = X[j*C];
349          r = X[j*C+1];         
350          X[j*C] = a1*l + a2*r;
351          X[j*C+1] = a1*r - a2*l;
352       }
353    }
354    for (i=B*C*eBands[m->nbEBands];i<B*C*eBands[m->nbEBands+1];i++)
355       X[i] = 0;
356
357 }