fixed-point version of the high-pass seems to work now.
[speexdsp.git] / libspeex / modes.c
1 /* Copyright (C) 2002-2006 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    -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(.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(.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(.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(.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(.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(.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    -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    -1,
406    36
407 };
408
409
410 static const SpeexSubmode wb_submode2 = {
411    0,
412    0,
413    1,
414    0,
415    /*LSP quantization*/
416    lsp_quant_high,
417    lsp_unquant_high,
418    /*Pitch quantization*/
419    NULL,
420    NULL,
421    NULL,
422    /*Innovation quantization*/
423    split_cb_search_shape_sign,
424    split_cb_shape_sign_unquant,
425 #ifdef DISABLE_WIDEBAND
426    NULL,
427 #else
428    &split_cb_high_lbr,
429 #endif
430    -1,
431    112
432 };
433
434
435 static const SpeexSubmode wb_submode3 = {
436    0,
437    0,
438    1,
439    0,
440    /*LSP quantization*/
441    lsp_quant_high,
442    lsp_unquant_high,
443    /*Pitch quantization*/
444    NULL,
445    NULL,
446    NULL,
447    /*Innovation quantization*/
448    split_cb_search_shape_sign,
449    split_cb_shape_sign_unquant,
450 #ifdef DISABLE_WIDEBAND
451    NULL,
452 #else
453    &split_cb_high,
454 #endif
455    -1,
456    192
457 };
458
459 static const SpeexSubmode wb_submode4 = {
460    0,
461    0,
462    1,
463    1,
464    /*LSP quantization*/
465    lsp_quant_high,
466    lsp_unquant_high,
467    /*Pitch quantization*/
468    NULL,
469    NULL,
470    NULL,
471    /*Innovation quantization*/
472    split_cb_search_shape_sign,
473    split_cb_shape_sign_unquant,
474 #ifdef DISABLE_WIDEBAND
475    NULL,
476 #else
477    &split_cb_high,
478 #endif
479    -1,
480    352
481 };
482
483
484 /* Split-band wideband CELP mode*/
485 static const SpeexSBMode sb_wb_mode = {
486    &speex_nb_mode,
487    160,    /*frameSize*/
488    40,     /*subframeSize*/
489    8,     /*lpcSize*/
490    640,    /*bufSize*/
491 #ifdef FIXED_POINT
492    29491, 19661, /* gamma1, gamma2 */
493 #else
494    0.9, 0.6, /* gamma1, gamma2 */
495 #endif
496    .012,   /*lag_factor*/
497    QCONST16(.0002,15), /*lpc_floor*/
498    0.9,
499    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
500    3,
501    {1, 8, 2, 3, 4, 5, 5, 6, 6, 7, 7},
502    {1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4},
503    vbr_hb_thresh,
504    5
505 };
506
507
508 const SpeexMode speex_wb_mode = {
509    &sb_wb_mode,
510    wb_mode_query,
511    "wideband (sub-band CELP)",
512    1,
513    4,
514    &sb_encoder_init,
515    &sb_encoder_destroy,
516    &sb_encode,
517    &sb_decoder_init,
518    &sb_decoder_destroy,
519    &sb_decode,
520    &sb_encoder_ctl,
521    &sb_decoder_ctl,
522 };
523
524
525
526 /* "Ultra-wideband" mode stuff */
527
528
529
530 /* Split-band "ultra-wideband" (32 kbps) CELP mode*/
531 static const SpeexSBMode sb_uwb_mode = {
532    &speex_wb_mode,
533    320,    /*frameSize*/
534    80,     /*subframeSize*/
535    8,     /*lpcSize*/
536    1280,    /*bufSize*/
537 #ifdef FIXED_POINT
538    29491, 19661, /* gamma1, gamma2 */
539 #else
540    0.9, 0.6, /* gamma1, gamma2 */
541 #endif
542    .012,   /*lag_factor*/
543    QCONST16(.0002,15), /*lpc_floor*/
544    0.7,
545    {NULL, &wb_submode1, NULL, NULL, NULL, NULL, NULL, NULL},
546    1,
547    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
548    {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
549    vbr_uhb_thresh,
550    2
551 };
552
553
554 const SpeexMode speex_uwb_mode = {
555    &sb_uwb_mode,
556    wb_mode_query,
557    "ultra-wideband (sub-band CELP)",
558    2,
559    4,
560    &sb_encoder_init,
561    &sb_encoder_destroy,
562    &sb_encode,
563    &sb_decoder_init,
564    &sb_decoder_destroy,
565    &sb_decode,
566    &sb_encoder_ctl,
567    &sb_decoder_ctl,
568 };
569
570
571
572
573 #ifdef EPIC_48K
574
575 extern const signed char gain_cdbk_ulbr[];
576 extern const signed char exc_12_32_table[];
577
578 /* Parameters for Long-Term Prediction (LTP)*/
579 static const ltp_params ltp_params_48k = {
580    gain_cdbk_ulbr,
581    3,
582    0
583 };
584
585 static const split_cb_params split_cb_nb_48k = {
586    12,               /*subvect_size*/
587    4,               /*nb_subvect*/
588    exc_12_32_table, /*shape_cb*/
589    5,               /*shape_bits*/
590    0,
591 };
592
593
594 /* 4.8 kbps very low bit-rate mode */
595 static const SpeexSubmode nb_48k_submode = {
596    0,
597    0,
598    0,
599    0,
600    /*LSP quantization*/
601    lsp_quant_48k,
602    lsp_unquant_48k,
603    /*No pitch quantization*/
604    pitch_search_3tap,
605    pitch_unquant_3tap,
606    &ltp_params_48k,
607    /*Innovation quantization*/
608    split_cb_search_shape_sign,
609    split_cb_shape_sign_unquant,
610    &split_cb_nb_48k,
611 #ifdef FIXED_POINT
612    22938, 16384, 11796, 18022,
613 #else
614    0.7, 0.5, .36, .55,
615 #endif
616    144
617 };
618
619
620 /* Special, non-standard 4.8 kbps mode */
621 static const SpeexNBMode nb_48k_mode = {
622    240,    /*frameSize*/
623    48,     /*subframeSize*/
624    10,     /*lpcSize*/
625    640,    /*bufSize*/
626    17,     /*pitchStart*/
627    144,    /*pitchEnd*/
628    0.9,    /*gamma1*/
629    0.6,    /*gamma2*/
630    .01,   /*lag_factor*/
631    QCONST16(.0003,15), /*lpc_floor*/
632    1,
633    {NULL, NULL, &nb_48k_submode, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
634    2,
635    {2,2,2,2,2,2,2,2,2,2,2}
636 };
637
638
639 /* Default mode for narrowband */
640 const SpeexMode speex_nb_48k_mode = {
641    &nb_48k_mode,
642    nb_mode_query,
643    "narrowband 4.8 kbps",
644    1000,
645    4,
646    &nb_encoder_init,
647    &nb_encoder_destroy,
648    &nb_encode,
649    &nb_decoder_init,
650    &nb_decoder_destroy,
651    &nb_decode,
652    &nb_encoder_ctl,
653    &nb_decoder_ctl,
654 };
655
656
657 #endif
658
659 int speex_mode_query(const SpeexMode *mode, int request, void *ptr)
660 {
661    return mode->query(mode->mode, request, ptr);
662 }
663
664 const SpeexMode * speex_lib_get_mode (int mode)
665 {
666 #ifdef EPIC_48K
667   if (mode == SPEEX_MODEID_NB_48K) return &speex_nb_48k_mode;
668 #endif
669
670   if (mode < 0 || mode > SPEEX_NB_MODES) return NULL;
671
672   return speex_mode_list[mode];
673 }