~ubuntu-branches/ubuntu/wily/sflphone/wily

« back to all changes in this revision

Viewing changes to daemon/libs/pjproject-2.0.1/third_party/speex/libspeex/quant_lsp.c

  • Committer: Package Import Robot
  • Author(s): Mark Purcell
  • Date: 2014-01-28 18:23:36 UTC
  • mfrom: (1.1.11)
  • mto: This revision was merged to the branch mainline in revision 24.
  • Revision ID: package-import@ubuntu.com-20140128182336-3xenud1kbnwmf3mz
* New upstream release 
  - Fixes "New Upstream Release" (Closes: #735846)
  - Fixes "Ringtone does not stop" (Closes: #727164)
  - Fixes "[sflphone-kde] crash on startup" (Closes: #718178)
  - Fixes "sflphone GUI crashes when call is hung up" (Closes: #736583)
* Build-Depends: ensure GnuTLS 2.6
  - libucommon-dev (>= 6.0.7-1.1), libccrtp-dev (>= 2.0.6-3)
  - Fixes "FTBFS Build-Depends libgnutls{26,28}-dev" (Closes: #722040)
* Fix "boost 1.49 is going away" unversioned Build-Depends: (Closes: #736746)
* Add Build-Depends: libsndfile-dev, nepomuk-core-dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2002 Jean-Marc Valin
2
 
   File: quant_lsp.c
3
 
   LSP vector quantization
4
 
 
5
 
   Redistribution and use in source and binary forms, with or without
6
 
   modification, are permitted provided that the following conditions
7
 
   are met:
8
 
 
9
 
   - Redistributions of source code must retain the above copyright
10
 
   notice, this list of conditions and the following disclaimer.
11
 
 
12
 
   - Redistributions in binary form must reproduce the above copyright
13
 
   notice, this list of conditions and the following disclaimer in the
14
 
   documentation and/or other materials provided with the distribution.
15
 
 
16
 
   - Neither the name of the Xiph.org Foundation nor the names of its
17
 
   contributors may be used to endorse or promote products derived from
18
 
   this software without specific prior written permission.
19
 
 
20
 
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
 
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
 
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
 
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24
 
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
 
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26
 
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27
 
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28
 
   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
 
   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
 
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
 
*/
32
 
 
33
 
#ifdef HAVE_CONFIG_H
34
 
#include "config.h"
35
 
#endif
36
 
 
37
 
#include "quant_lsp.h"
38
 
#include "os_support.h"
39
 
#include <math.h>
40
 
#ifndef M_PI
41
 
#define M_PI 3.14159265358979323846
42
 
#endif
43
 
 
44
 
#include "arch.h"
45
 
 
46
 
#ifdef BFIN_ASM
47
 
#include "quant_lsp_bfin.h"
48
 
#endif
49
 
 
50
 
#ifdef FIXED_POINT
51
 
 
52
 
#define LSP_LINEAR(i) (SHL16(i+1,11))
53
 
#define LSP_LINEAR_HIGH(i) (ADD16(MULT16_16_16(i,2560),6144))
54
 
#define LSP_DIV_256(x) (SHL16((spx_word16_t)x, 5))
55
 
#define LSP_DIV_512(x) (SHL16((spx_word16_t)x, 4))
56
 
#define LSP_DIV_1024(x) (SHL16((spx_word16_t)x, 3))
57
 
#define LSP_PI 25736
58
 
 
59
 
#else
60
 
 
61
 
#define LSP_LINEAR(i) (.25*(i)+.25)
62
 
#define LSP_LINEAR_HIGH(i) (.3125*(i)+.75)
63
 
#define LSP_SCALE 256.
64
 
#define LSP_DIV_256(x) (0.0039062*(x))
65
 
#define LSP_DIV_512(x) (0.0019531*(x))
66
 
#define LSP_DIV_1024(x) (0.00097656*(x))
67
 
#define LSP_PI M_PI
68
 
 
69
 
#endif
70
 
 
71
 
static void compute_quant_weights(spx_lsp_t *qlsp, spx_word16_t *quant_weight, int order)
72
 
{
73
 
   int i;
74
 
   spx_word16_t tmp1, tmp2;
75
 
   for (i=0;i<order;i++)
76
 
   {
77
 
      if (i==0)
78
 
         tmp1 = qlsp[i];
79
 
      else
80
 
         tmp1 = qlsp[i]-qlsp[i-1];
81
 
      if (i==order-1)
82
 
         tmp2 = LSP_PI-qlsp[i];
83
 
      else
84
 
         tmp2 = qlsp[i+1]-qlsp[i];
85
 
      if (tmp2<tmp1)
86
 
         tmp1 = tmp2;
87
 
#ifdef FIXED_POINT
88
 
      quant_weight[i] = DIV32_16(81920,ADD16(300,tmp1));
89
 
#else
90
 
      quant_weight[i] = 10/(.04+tmp1);
91
 
#endif
92
 
   }
93
 
 
94
 
}
95
 
 
96
 
/* Note: x is modified*/
97
 
#ifndef OVERRIDE_LSP_QUANT
98
 
static int lsp_quant(spx_word16_t *x, const signed char *cdbk, int nbVec, int nbDim)
99
 
{
100
 
   int i,j;
101
 
   spx_word32_t dist;
102
 
   spx_word16_t tmp;
103
 
   spx_word32_t best_dist=VERY_LARGE32;
104
 
   int best_id=0;
105
 
   const signed char *ptr=cdbk;
106
 
   for (i=0;i<nbVec;i++)
107
 
   {
108
 
      dist=0;
109
 
      for (j=0;j<nbDim;j++)
110
 
      {
111
 
         tmp=SUB16(x[j],SHL16((spx_word16_t)*ptr++,5));
112
 
         dist=MAC16_16(dist,tmp,tmp);
113
 
      }
114
 
      if (dist<best_dist)
115
 
      {
116
 
         best_dist=dist;
117
 
         best_id=i;
118
 
      }
119
 
   }
120
 
 
121
 
   for (j=0;j<nbDim;j++)
122
 
      x[j] = SUB16(x[j],SHL16((spx_word16_t)cdbk[best_id*nbDim+j],5));
123
 
 
124
 
   return best_id;
125
 
}
126
 
#endif
127
 
 
128
 
/* Note: x is modified*/
129
 
#ifndef OVERRIDE_LSP_WEIGHT_QUANT
130
 
static int lsp_weight_quant(spx_word16_t *x, spx_word16_t *weight, const signed char *cdbk, int nbVec, int nbDim)
131
 
{
132
 
   int i,j;
133
 
   spx_word32_t dist;
134
 
   spx_word16_t tmp;
135
 
   spx_word32_t best_dist=VERY_LARGE32;
136
 
   int best_id=0;
137
 
   const signed char *ptr=cdbk;
138
 
   for (i=0;i<nbVec;i++)
139
 
   {
140
 
      dist=0;
141
 
      for (j=0;j<nbDim;j++)
142
 
      {
143
 
         tmp=SUB16(x[j],SHL16((spx_word16_t)*ptr++,5));
144
 
         dist=MAC16_32_Q15(dist,weight[j],MULT16_16(tmp,tmp));
145
 
      }
146
 
      if (dist<best_dist)
147
 
      {
148
 
         best_dist=dist;
149
 
         best_id=i;
150
 
      }
151
 
   }
152
 
 
153
 
   for (j=0;j<nbDim;j++)
154
 
      x[j] = SUB16(x[j],SHL16((spx_word16_t)cdbk[best_id*nbDim+j],5));
155
 
   return best_id;
156
 
}
157
 
#endif
158
 
 
159
 
void lsp_quant_nb(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
160
 
{
161
 
   int i;
162
 
   int id;
163
 
   spx_word16_t quant_weight[10];
164
 
 
165
 
   for (i=0;i<order;i++)
166
 
      qlsp[i]=lsp[i];
167
 
 
168
 
   compute_quant_weights(qlsp, quant_weight, order);
169
 
 
170
 
   for (i=0;i<order;i++)
171
 
      qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i));
172
 
 
173
 
#ifndef FIXED_POINT
174
 
   for (i=0;i<order;i++)
175
 
      qlsp[i] = LSP_SCALE*qlsp[i];
176
 
#endif
177
 
   id = lsp_quant(qlsp, cdbk_nb, NB_CDBK_SIZE, order);
178
 
   speex_bits_pack(bits, id, 6);
179
 
 
180
 
   for (i=0;i<order;i++)
181
 
      qlsp[i]*=2;
182
 
 
183
 
   id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low1, NB_CDBK_SIZE_LOW1, 5);
184
 
   speex_bits_pack(bits, id, 6);
185
 
 
186
 
   for (i=0;i<5;i++)
187
 
      qlsp[i]*=2;
188
 
 
189
 
   id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low2, NB_CDBK_SIZE_LOW2, 5);
190
 
   speex_bits_pack(bits, id, 6);
191
 
 
192
 
   id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high1, NB_CDBK_SIZE_HIGH1, 5);
193
 
   speex_bits_pack(bits, id, 6);
194
 
 
195
 
   for (i=5;i<10;i++)
196
 
      qlsp[i]*=2;
197
 
 
198
 
   id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high2, NB_CDBK_SIZE_HIGH2, 5);
199
 
   speex_bits_pack(bits, id, 6);
200
 
 
201
 
#ifdef FIXED_POINT
202
 
   for (i=0;i<order;i++)
203
 
      qlsp[i]=PSHR16(qlsp[i],2);
204
 
#else
205
 
   for (i=0;i<order;i++)
206
 
      qlsp[i]=qlsp[i] * .00097656;
207
 
#endif
208
 
 
209
 
   for (i=0;i<order;i++)
210
 
      qlsp[i]=lsp[i]-qlsp[i];
211
 
}
212
 
 
213
 
void lsp_unquant_nb(spx_lsp_t *lsp, int order, SpeexBits *bits)
214
 
{
215
 
   int i, id;
216
 
   for (i=0;i<order;i++)
217
 
      lsp[i]=LSP_LINEAR(i);
218
 
 
219
 
 
220
 
   id=speex_bits_unpack_unsigned(bits, 6);
221
 
   for (i=0;i<10;i++)
222
 
      lsp[i] = ADD32(lsp[i], LSP_DIV_256(cdbk_nb[id*10+i]));
223
 
 
224
 
   id=speex_bits_unpack_unsigned(bits, 6);
225
 
   for (i=0;i<5;i++)
226
 
      lsp[i] = ADD16(lsp[i], LSP_DIV_512(cdbk_nb_low1[id*5+i]));
227
 
 
228
 
   id=speex_bits_unpack_unsigned(bits, 6);
229
 
   for (i=0;i<5;i++)
230
 
      lsp[i] = ADD32(lsp[i], LSP_DIV_1024(cdbk_nb_low2[id*5+i]));
231
 
 
232
 
   id=speex_bits_unpack_unsigned(bits, 6);
233
 
   for (i=0;i<5;i++)
234
 
      lsp[i+5] = ADD32(lsp[i+5], LSP_DIV_512(cdbk_nb_high1[id*5+i]));
235
 
 
236
 
   id=speex_bits_unpack_unsigned(bits, 6);
237
 
   for (i=0;i<5;i++)
238
 
      lsp[i+5] = ADD32(lsp[i+5], LSP_DIV_1024(cdbk_nb_high2[id*5+i]));
239
 
}
240
 
 
241
 
 
242
 
void lsp_quant_lbr(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
243
 
{
244
 
   int i;
245
 
   int id;
246
 
   spx_word16_t quant_weight[10];
247
 
 
248
 
   for (i=0;i<order;i++)
249
 
      qlsp[i]=lsp[i];
250
 
 
251
 
   compute_quant_weights(qlsp, quant_weight, order);
252
 
 
253
 
   for (i=0;i<order;i++)
254
 
      qlsp[i]=SUB16(qlsp[i],LSP_LINEAR(i));
255
 
#ifndef FIXED_POINT
256
 
   for (i=0;i<order;i++)
257
 
      qlsp[i]=qlsp[i]*LSP_SCALE;
258
 
#endif
259
 
   id = lsp_quant(qlsp, cdbk_nb, NB_CDBK_SIZE, order);
260
 
   speex_bits_pack(bits, id, 6);
261
 
 
262
 
   for (i=0;i<order;i++)
263
 
      qlsp[i]*=2;
264
 
 
265
 
   id = lsp_weight_quant(qlsp, quant_weight, cdbk_nb_low1, NB_CDBK_SIZE_LOW1, 5);
266
 
   speex_bits_pack(bits, id, 6);
267
 
 
268
 
   id = lsp_weight_quant(qlsp+5, quant_weight+5, cdbk_nb_high1, NB_CDBK_SIZE_HIGH1, 5);
269
 
   speex_bits_pack(bits, id, 6);
270
 
 
271
 
#ifdef FIXED_POINT
272
 
   for (i=0;i<order;i++)
273
 
      qlsp[i] = PSHR16(qlsp[i],1);
274
 
#else
275
 
   for (i=0;i<order;i++)
276
 
      qlsp[i] = qlsp[i]*0.0019531;
277
 
#endif
278
 
 
279
 
   for (i=0;i<order;i++)
280
 
      qlsp[i]=lsp[i]-qlsp[i];
281
 
}
282
 
 
283
 
void lsp_unquant_lbr(spx_lsp_t *lsp, int order, SpeexBits *bits)
284
 
{
285
 
   int i, id;
286
 
   for (i=0;i<order;i++)
287
 
      lsp[i]=LSP_LINEAR(i);
288
 
 
289
 
 
290
 
   id=speex_bits_unpack_unsigned(bits, 6);
291
 
   for (i=0;i<10;i++)
292
 
      lsp[i] += LSP_DIV_256(cdbk_nb[id*10+i]);
293
 
 
294
 
   id=speex_bits_unpack_unsigned(bits, 6);
295
 
   for (i=0;i<5;i++)
296
 
      lsp[i] += LSP_DIV_512(cdbk_nb_low1[id*5+i]);
297
 
 
298
 
   id=speex_bits_unpack_unsigned(bits, 6);
299
 
   for (i=0;i<5;i++)
300
 
      lsp[i+5] += LSP_DIV_512(cdbk_nb_high1[id*5+i]);
301
 
 
302
 
}
303
 
 
304
 
 
305
 
#ifdef DISABLE_WIDEBAND
306
 
void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
307
 
{
308
 
   speex_fatal("Wideband and Ultra-wideband are disabled");
309
 
}
310
 
void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits)
311
 
{
312
 
   speex_fatal("Wideband and Ultra-wideband are disabled");
313
 
}
314
 
#else
315
 
extern const signed char high_lsp_cdbk[];
316
 
extern const signed char high_lsp_cdbk2[];
317
 
 
318
 
 
319
 
void lsp_quant_high(spx_lsp_t *lsp, spx_lsp_t *qlsp, int order, SpeexBits *bits)
320
 
{
321
 
   int i;
322
 
   int id;
323
 
   spx_word16_t quant_weight[10];
324
 
 
325
 
   for (i=0;i<order;i++)
326
 
      qlsp[i]=lsp[i];
327
 
 
328
 
   compute_quant_weights(qlsp, quant_weight, order);
329
 
 
330
 
   /*   quant_weight[0] = 10/(qlsp[1]-qlsp[0]);
331
 
   quant_weight[order-1] = 10/(qlsp[order-1]-qlsp[order-2]);
332
 
   for (i=1;i<order-1;i++)
333
 
   {
334
 
      tmp1 = 10/(qlsp[i]-qlsp[i-1]);
335
 
      tmp2 = 10/(qlsp[i+1]-qlsp[i]);
336
 
      quant_weight[i] = tmp1 > tmp2 ? tmp1 : tmp2;
337
 
      }*/
338
 
 
339
 
   for (i=0;i<order;i++)
340
 
      qlsp[i]=SUB16(qlsp[i],LSP_LINEAR_HIGH(i));
341
 
#ifndef FIXED_POINT
342
 
   for (i=0;i<order;i++)
343
 
      qlsp[i] = qlsp[i]*LSP_SCALE;
344
 
#endif
345
 
   id = lsp_quant(qlsp, high_lsp_cdbk, 64, order);
346
 
   speex_bits_pack(bits, id, 6);
347
 
 
348
 
   for (i=0;i<order;i++)
349
 
      qlsp[i]*=2;
350
 
 
351
 
   id = lsp_weight_quant(qlsp, quant_weight, high_lsp_cdbk2, 64, order);
352
 
   speex_bits_pack(bits, id, 6);
353
 
 
354
 
#ifdef FIXED_POINT
355
 
   for (i=0;i<order;i++)
356
 
      qlsp[i] = PSHR16(qlsp[i],1);
357
 
#else
358
 
   for (i=0;i<order;i++)
359
 
      qlsp[i] = qlsp[i]*0.0019531;
360
 
#endif
361
 
 
362
 
   for (i=0;i<order;i++)
363
 
      qlsp[i]=lsp[i]-qlsp[i];
364
 
}
365
 
 
366
 
void lsp_unquant_high(spx_lsp_t *lsp, int order, SpeexBits *bits)
367
 
{
368
 
 
369
 
   int i, id;
370
 
   for (i=0;i<order;i++)
371
 
      lsp[i]=LSP_LINEAR_HIGH(i);
372
 
 
373
 
 
374
 
   id=speex_bits_unpack_unsigned(bits, 6);
375
 
   for (i=0;i<order;i++)
376
 
      lsp[i] += LSP_DIV_256(high_lsp_cdbk[id*order+i]);
377
 
 
378
 
 
379
 
   id=speex_bits_unpack_unsigned(bits, 6);
380
 
   for (i=0;i<order;i++)
381
 
      lsp[i] += LSP_DIV_512(high_lsp_cdbk2[id*order+i]);
382
 
}
383
 
 
384
 
#endif