some tuning, replaced conditional constants with QCONST16.
[speexdsp.git] / libspeex / modes.c
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: modes.c
3
4    Describes the different modes of the codec
5
6    Redistribution and use in source and binary forms, with or without
7    modification, are permitted provided that the following conditions
8    are met:
9    
10    - Redistributions of source code must retain the above copyright
11    notice, this list of conditions and the following disclaimer.
12    
13    - Redistributions in binary form must reproduce the above copyright
14    notice, this list of conditions and the following disclaimer in the
15    documentation and/or other materials provided with the distribution.
16    
17    - Neither the name of the Xiph.org Foundation nor the names of its
18    contributors may be used to endorse or promote products derived from
19    this software without specific prior written permission.
20    
21    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
25    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 */
34
35 #ifdef HAVE_CONFIG_H
36 #include "config.h"
37 #endif
38
39 #include "modes.h"
40 #include "ltp.h"
41 #include "quant_lsp.h"
42 #include "cb_search.h"
43 #include "sb_celp.h"
44 #include "nb_celp.h"
45 #include "vbr.h"
46 #include "misc.h"
47 #include <math.h>
48
49 #ifndef NULL
50 #define NULL 0
51 #endif
52
53 #define MAX_IN_SAMPLES 640
54
55 const SpeexMode * const speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode, &speex_uwb_mode};
56
57 /* Extern declarations for all codebooks we use here */
58 extern const signed char gain_cdbk_nb[];
59 extern const signed char gain_cdbk_lbr[];
60 extern const signed char hexc_table[];
61 extern const signed char exc_5_256_table[];
62 extern const signed char exc_5_64_table[];
63 extern const signed char exc_8_128_table[];
64 extern const signed char exc_10_32_table[];
65 extern const signed char exc_10_16_table[];
66 extern const signed char exc_20_32_table[];
67 extern const signed char hexc_10_32_table[];
68
69
70 /* Parameters for Long-Term Prediction (LTP)*/
71 static const ltp_params ltp_params_nb = {
72    gain_cdbk_nb,
73    7,
74    7
75 };
76
77 /* Parameters for Long-Term Prediction (LTP)*/
78 static const ltp_params ltp_params_vlbr = {
79    gain_cdbk_lbr,
80    5,
81    0
82 };
83
84 /* Parameters for Long-Term Prediction (LTP)*/
85 static const ltp_params ltp_params_lbr = {
86    gain_cdbk_lbr,
87    5,
88    7
89 };
90
91 /* Parameters for Long-Term Prediction (LTP)*/
92 static const ltp_params ltp_params_med = {
93    gain_cdbk_lbr,
94    5,
95    7
96 };
97
98 /* Split-VQ innovation parameters for very low bit-rate narrowband */
99 static const split_cb_params split_cb_nb_vlbr = {
100    10,               /*subvect_size*/
101    4,               /*nb_subvect*/
102    exc_10_16_table, /*shape_cb*/
103    4,               /*shape_bits*/
104    0,
105 };
106
107 /* Split-VQ innovation parameters for very low bit-rate narrowband */
108 static const split_cb_params split_cb_nb_ulbr = {
109    20,               /*subvect_size*/
110    2,               /*nb_subvect*/
111    exc_20_32_table, /*shape_cb*/
112    5,               /*shape_bits*/
113    0,
114 };
115
116 /* Split-VQ innovation parameters for low bit-rate narrowband */
117 static const split_cb_params split_cb_nb_lbr = {
118    10,              /*subvect_size*/
119    4,               /*nb_subvect*/
120    exc_10_32_table, /*shape_cb*/
121    5,               /*shape_bits*/
122    0,
123 };
124
125
126 /* Split-VQ innovation parameters narrowband */
127 static const split_cb_params split_cb_nb = {
128    5,               /*subvect_size*/
129    8,               /*nb_subvect*/
130    exc_5_64_table, /*shape_cb*/
131    6,               /*shape_bits*/
132    0,
133 };
134
135 /* Split-VQ innovation parameters narrowband */
136 static const split_cb_params split_cb_nb_med = {
137    8,               /*subvect_size*/
138    5,               /*nb_subvect*/
139    exc_8_128_table, /*shape_cb*/
140    7,               /*shape_bits*/
141    0,
142 };
143
144 /* Split-VQ innovation for low-band wideband */
145 static const split_cb_params split_cb_sb = {
146    5,               /*subvect_size*/
147    8,              /*nb_subvect*/
148    exc_5_256_table,    /*shape_cb*/
149    8,               /*shape_bits*/
150    0,
151 };
152
153 #ifndef DISABLE_WIDEBAND
154
155 /* Split-VQ innovation for high-band wideband */
156 static const split_cb_params split_cb_high = {
157    8,               /*subvect_size*/
158    5,               /*nb_subvect*/
159    hexc_table,       /*shape_cb*/
160    7,               /*shape_bits*/
161    1,
162 };
163
164
165 /* Split-VQ innovation for high-band wideband */
166 static const split_cb_params split_cb_high_lbr = {
167    10,               /*subvect_size*/
168    4,               /*nb_subvect*/
169    hexc_10_32_table,       /*shape_cb*/
170    5,               /*shape_bits*/
171    0,
172 };
173
174 #endif
175
176 /* 2150 bps "vocoder-like" mode for comfort noise */
177 static const SpeexSubmode nb_submode1 = {
178    0,
179    1,
180    0,
181    0,
182    /* LSP quantization */
183    lsp_quant_lbr,
184    lsp_unquant_lbr,
185    /* No pitch quantization */
186    forced_pitch_quant,
187    forced_pitch_unquant,
188    NULL,
189    /* No innovation quantization (noise only) */
190    noise_codebook_quant,
191    noise_codebook_unquant,
192    NULL,
193    QCONST16(0.7,15), QCONST16(0.7,15), 0, -1,
194    43
195 };
196
197 /* 3.95 kbps very low bit-rate mode */
198 static const SpeexSubmode nb_submode8 = {
199    0,
200    1,
201    0,
202    0,
203    /*LSP quantization*/
204    lsp_quant_lbr,
205    lsp_unquant_lbr,
206    /*No pitch quantization*/
207    forced_pitch_quant,
208    forced_pitch_unquant,
209    NULL,
210    /*Innovation quantization*/
211    split_cb_search_shape_sign,
212    split_cb_shape_sign_unquant,
213    &split_cb_nb_ulbr,
214    QCONST16(0.7,15), QCONST16(0.5,15), QCONST16(.36,15), QCONST16(.65,15),
215    79
216 };
217
218 /* 5.95 kbps very low bit-rate mode */
219 static const SpeexSubmode nb_submode2 = {
220    0,
221    0,
222    0,
223    0,
224    /*LSP quantization*/
225    lsp_quant_lbr,
226    lsp_unquant_lbr,
227    /*No pitch quantization*/
228    pitch_search_3tap,
229    pitch_unquant_3tap,
230    &ltp_params_vlbr,
231    /*Innovation quantization*/
232    split_cb_search_shape_sign,
233    split_cb_shape_sign_unquant,
234    &split_cb_nb_vlbr,
235    QCONST16(0.7,15), QCONST16(0.55,15), QCONST16(.22,15), QCONST16(.55,15),
236    119
237 };
238
239 /* 8 kbps low bit-rate mode */
240 static const SpeexSubmode nb_submode3 = {
241    -1,
242    0,
243    1,
244    0,
245    /*LSP quantization*/
246    lsp_quant_lbr,
247    lsp_unquant_lbr,
248    /*Pitch quantization*/
249    pitch_search_3tap,
250    pitch_unquant_3tap,
251    &ltp_params_lbr,
252    /*Innovation quantization*/
253    split_cb_search_shape_sign,
254    split_cb_shape_sign_unquant,
255    &split_cb_nb_lbr,
256    QCONST16(0.7,15), QCONST16(0.6,15), QCONST16(.15,15), QCONST16(.45,15),
257    160
258 };
259
260 /* 11 kbps medium bit-rate mode */
261 static const SpeexSubmode nb_submode4 = {
262    -1,
263    0,
264    1,
265    0,
266    /*LSP quantization*/
267    lsp_quant_lbr,
268    lsp_unquant_lbr,
269    /*Pitch quantization*/
270    pitch_search_3tap,
271    pitch_unquant_3tap,
272    &ltp_params_med,
273    /*Innovation quantization*/
274    split_cb_search_shape_sign,
275    split_cb_shape_sign_unquant,
276    &split_cb_nb_med,
277    QCONST16(0.7,15), QCONST16(0.63,15), QCONST16(.1,15), QCONST16(.35,15),
278    220
279 };
280
281 /* 15 kbps high bit-rate mode */
282 static const SpeexSubmode nb_submode5 = {
283    -1,
284    0,
285    3,
286    0,
287    /*LSP quantization*/
288    lsp_quant_nb,
289    lsp_unquant_nb,
290    /*Pitch quantization*/
291    pitch_search_3tap,
292    pitch_unquant_3tap,
293    &ltp_params_nb,
294    /*Innovation quantization*/
295    split_cb_search_shape_sign,
296    split_cb_shape_sign_unquant,
297    &split_cb_nb,
298    QCONST16(0.7,15), QCONST16(0.65,15), QCONST16(.08,15), QCONST16(.2,15),
299    300
300 };
301
302 /* 18.2 high bit-rate mode */
303 static const SpeexSubmode nb_submode6 = {
304    -1,
305    0,
306    3,
307    0,
308    /*LSP quantization*/
309    lsp_quant_nb,
310    lsp_unquant_nb,
311    /*Pitch quantization*/
312    pitch_search_3tap,
313    pitch_unquant_3tap,
314    &ltp_params_nb,
315    /*Innovation quantization*/
316    split_cb_search_shape_sign,
317    split_cb_shape_sign_unquant,
318    &split_cb_sb,
319    QCONST16(0.68,15), QCONST16(0.65,15), QCONST16(.03,15), QCONST16(.1,15),
320    364
321 };
322
323 /* 24.6 kbps high bit-rate mode */
324 static const SpeexSubmode nb_submode7 = {
325    -1,
326    0,
327    3,
328    1,
329    /*LSP quantization*/
330    lsp_quant_nb,
331    lsp_unquant_nb,
332    /*Pitch quantization*/
333    pitch_search_3tap,
334    pitch_unquant_3tap,
335    &ltp_params_nb,
336    /*Innovation quantization*/
337    split_cb_search_shape_sign,
338    split_cb_shape_sign_unquant,
339    &split_cb_nb,
340    QCONST16(0.65,15), QCONST16(0.65,15), 0, -1,
341    492
342 };
343
344
345 /* Default mode for narrowband */
346 static const SpeexNBMode nb_mode = {
347    160,    /*frameSize*/
348    40,     /*subframeSize*/
349    10,     /*lpcSize*/
350    17,     /*pitchStart*/
351    144,    /*pitchEnd*/
352 #ifdef FIXED_POINT
353    29491, 19661, /* gamma1, gamma2 */
354 #else
355    0.9, 0.6, /* gamma1, gamma2 */
356 #endif
357    .012,   /*lag_factor*/
358    QCONST16(.0002,15), /*lpc_floor*/
359 #ifdef EPIC_48K
360    0,
361 #endif
362    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
363    &nb_submode8, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
364    5,
365    {1, 8, 2, 3, 3, 4, 4, 5, 5, 6, 7}
366 };
367
368
369 /* Default mode for narrowband */
370 const SpeexMode speex_nb_mode = {
371    &nb_mode,
372    nb_mode_query,
373    "narrowband",
374    0,
375    4,
376    &nb_encoder_init,
377    &nb_encoder_destroy,
378    &nb_encode,
379    &nb_decoder_init,
380    &nb_decoder_destroy,
381    &nb_decode,
382    &nb_encoder_ctl,
383    &nb_decoder_ctl,
384 };
385
386
387 /* Wideband part */
388
389 static const SpeexSubmode wb_submode1 = {
390    0,
391    0,
392    1,
393    0,
394    /*LSP quantization*/
395    lsp_quant_high,
396    lsp_unquant_high,
397    /*Pitch quantization*/
398    NULL,
399    NULL,
400    NULL,
401    /*No innovation quantization*/
402    NULL,
403    NULL,
404    NULL,
405 #ifdef FIXED_POINT
406    24576, 24576, 0, -1,
407 #else
408    .75, .75, .0, -1,
409 #endif
410    36
411 };
412
413
414 static const SpeexSubmode wb_submode2 = {
415    0,
416    0,
417    1,
418    0,
419    /*LSP quantization*/
420    lsp_quant_high,
421    lsp_unquant_high,
422    /*Pitch quantization*/
423    NULL,
424    NULL,
425    NULL,
426    /*Innovation quantization*/
427    split_cb_search_shape_sign,
428    split_cb_shape_sign_unquant,
429 #ifdef DISABLE_WIDEBAND
430    NULL,
431 #else
432    &split_cb_high_lbr,
433 #endif
434 #ifdef FIXED_POINT
435    27853, 19661, 8192, -1,
436 #else
437    .85, .6, .25, -1,
438 #endif
439    112
440 };
441
442
443 static const SpeexSubmode wb_submode3 = {
444    0,
445    0,
446    1,
447    0,
448    /*LSP quantization*/
449    lsp_quant_high,
450    lsp_unquant_high,
451    /*Pitch quantization*/
452    NULL,
453    NULL,
454    NULL,
455    /*Innovation quantization*/
456    split_cb_search_shape_sign,
457    split_cb_shape_sign_unquant,
458 #ifdef DISABLE_WIDEBAND
459    NULL,
460 #else
461    &split_cb_high,
462 #endif
463
464 #ifdef FIXED_POINT
465    24576, 22938, 1638, -1,
466 #else
467    .75, .7, .05, -1,
468 #endif
469    192
470 };
471
472 static const SpeexSubmode wb_submode4 = {
473    0,
474    0,
475    1,
476    1,
477    /*LSP quantization*/
478    lsp_quant_high,
479    lsp_unquant_high,
480    /*Pitch quantization*/
481    NULL,
482    NULL,
483    NULL,
484    /*Innovation quantization*/
485    split_cb_search_shape_sign,
486    split_cb_shape_sign_unquant,
487 #ifdef DISABLE_WIDEBAND
488    NULL,
489 #else
490    &split_cb_high,
491 #endif
492 #ifdef FIXED_POINT
493    24576, 24576, 0, -1,
494 #else
495    .75, .75, .0, -1,
496 #endif
497    352
498 };
499
500
501 /* Split-band wideband CELP mode*/
502 static const SpeexSBMode sb_wb_mode = {
503    &speex_nb_mode,
504    160,    /*frameSize*/
505    40,     /*subframeSize*/
506    8,     /*lpcSize*/
507    640,    /*bufSize*/
508 #ifdef FIXED_POINT
509    29491, 19661, /* gamma1, gamma2 */
510 #else
511    0.9, 0.6, /* gamma1, gamma2 */
512 #endif
513    .001,   /*lag_factor*/
514    QCONST16(.0001,15), /*lpc_floor*/
515    0.9,
516    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
517    3,
518    {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7},
519    {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
520    vbr_hb_thresh,
521    5
522 };
523
524
525 const SpeexMode speex_wb_mode = {
526    &sb_wb_mode,
527    wb_mode_query,
528    "wideband (sub-band CELP)",
529    1,
530    4,
531    &sb_encoder_init,
532    &sb_encoder_destroy,
533    &sb_encode,
534    &sb_decoder_init,
535    &sb_decoder_destroy,
536    &sb_decode,
537    &sb_encoder_ctl,
538    &sb_decoder_ctl,
539 };
540
541
542
543 /* "Ultra-wideband" mode stuff */
544
545
546
547 /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
548 static const SpeexSBMode sb_uwb_mode = {
549    &speex_wb_mode,
550    320,    /*frameSize*/
551    80,     /*subframeSize*/
552    8,     /*lpcSize*/
553    1280,    /*bufSize*/
554 #ifdef FIXED_POINT
555    29491, 19661, /* gamma1, gamma2 */
556 #else
557    0.9, 0.6, /* gamma1, gamma2 */
558 #endif
559    .002,   /*lag_factor*/
560    QCONST16(.0001,15), /*lpc_floor*/
561    0.7,
562    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
563    1,
564    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
565    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
566    vbr_uhb_thresh,
567    2
568 };
569
570
571 const SpeexMode speex_uwb_mode = {
572    &sb_uwb_mode,
573    wb_mode_query,
574    "ultra-wideband (sub-band CELP)",
575    2,
576    4,
577    &sb_encoder_init,
578    &sb_encoder_destroy,
579    &sb_encode,
580    &sb_decoder_init,
581    &sb_decoder_destroy,
582    &sb_decode,
583    &sb_encoder_ctl,
584    &sb_decoder_ctl,
585 };
586
587
588
589
590 #ifdef EPIC_48K
591
592 extern const signed char gain_cdbk_ulbr[];
593 extern const signed char exc_12_32_table[];
594
595 /* Parameters for Long-Term Prediction (LTP)*/
596 static const ltp_params ltp_params_48k = {
597    gain_cdbk_ulbr,
598    3,
599    0
600 };
601
602 static const split_cb_params split_cb_nb_48k = {
603    12,               /*subvect_size*/
604    4,               /*nb_subvect*/
605    exc_12_32_table, /*shape_cb*/
606    5,               /*shape_bits*/
607    0,
608 };
609
610
611 /* 4.8 kbps very low bit-rate mode */
612 static const SpeexSubmode nb_48k_submode = {
613    0,
614    0,
615    0,
616    0,
617    /*LSP quantization*/
618    lsp_quant_48k,
619    lsp_unquant_48k,
620    /*No pitch quantization*/
621    pitch_search_3tap,
622    pitch_unquant_3tap,
623    &ltp_params_48k,
624    /*Innovation quantization*/
625    split_cb_search_shape_sign,
626    split_cb_shape_sign_unquant,
627    &split_cb_nb_48k,
628 #ifdef FIXED_POINT
629    22938, 16384, 11796, 18022,
630 #else
631    0.7, 0.5, .36, .55,
632 #endif
633    144
634 };
635
636
637 /* Special, non-standard 4.8 kbps mode */
638 static const SpeexNBMode nb_48k_mode = {
639    240,    /*frameSize*/
640    48,     /*subframeSize*/
641    10,     /*lpcSize*/
642    640,    /*bufSize*/
643    17,     /*pitchStart*/
644    144,    /*pitchEnd*/
645    0.9,    /*gamma1*/
646    0.6,    /*gamma2*/
647    .01,   /*lag_factor*/
648    QCONST16(.0003,15), /*lpc_floor*/
649    1,
650    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
651    2,
652    {2,2,2,2,2,2,2,2,2,2,2}
653 };
654
655
656 /* Default mode for narrowband */
657 const SpeexMode speex_nb_48k_mode = {
658    &nb_48k_mode,
659    nb_mode_query,
660    "narrowband 4.8 kbps",
661    1000,
662    4,
663    &nb_encoder_init,
664    &nb_encoder_destroy,
665    &nb_encode,
666    &nb_decoder_init,
667    &nb_decoder_destroy,
668    &nb_decode,
669    &nb_encoder_ctl,
670    &nb_decoder_ctl,
671 };
672
673
674 #endif
675
676 int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
677 {
678    return mode->query(mode->mode, request, ptr);
679 }
680
681 const SpeexMode * speex_lib_get_mode (int mode)
682 {
683 #ifdef EPIC_48K
684   if (mode == SPEEX_MODEID_NB_48K) return &speex_nb_48k_mode;
685 #endif
686
687   if (mode < 0 || mode > SPEEX_NB_MODES) return NULL;
688
689   return speex_mode_list[mode];
690 }