New very high quality modes for narrowband and wideband by using a double
[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    This library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
10    
11    This library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this library; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
20 */
21
22 #include <stdlib.h>
23 #include "modes.h"
24 #include "ltp.h"
25 #include "quant_lsp.h"
26 #include "cb_search.h"
27 #include "sb_celp.h"
28 #include "nb_celp.h"
29
30 SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode};
31
32 /* Extern declarations for all codebooks we use here */
33 extern float gain_cdbk_nb[];
34 extern float gain_cdbk_lbr[];
35 extern float hexc_table[];
36 extern float exc_5_256_table[];
37 extern float exc_5_64_table[];
38 extern float exc_8_128_table[];
39 extern float exc_8_32_table[];
40 extern float exc_10_32_table[];
41 extern float exc_10_16_table[];
42 extern float hexc_10_32_table[];
43
44 /* Parameters for Long-Term Prediction (LTP)*/
45 static ltp_params ltp_params_nb = {
46    gain_cdbk_nb,
47    7,
48    7
49 };
50
51 /* Parameters for Long-Term Prediction (LTP)*/
52 static ltp_params ltp_params_vlbr = {
53    gain_cdbk_lbr,
54    5,
55    0
56 };
57
58 /* Parameters for Long-Term Prediction (LTP)*/
59 static ltp_params ltp_params_lbr = {
60    gain_cdbk_lbr,
61    5,
62    7
63 };
64
65 /* Parameters for Long-Term Prediction (LTP)*/
66 static ltp_params ltp_params_med = {
67    gain_cdbk_lbr,
68    5,
69    7
70 };
71
72 /* Split-VQ innovation parameters for very low bit-rate narrowband */
73 static split_cb_params split_cb_nb_vlbr = {
74    10,               /*subvect_size*/
75    4,               /*nb_subvect*/
76    exc_10_16_table, /*shape_cb*/
77    4,               /*shape_bits*/
78 };
79
80 /* Split-VQ innovation parameters for low bit-rate narrowband */
81 static split_cb_params split_cb_nb_lbr = {
82    10,              /*subvect_size*/
83    4,               /*nb_subvect*/
84    exc_10_32_table, /*shape_cb*/
85    5,               /*shape_bits*/
86 };
87
88
89 /* Split-VQ innovation parameters narrowband */
90 static split_cb_params split_cb_nb = {
91    5,               /*subvect_size*/
92    8,               /*nb_subvect*/
93    exc_5_64_table, /*shape_cb*/
94    6,               /*shape_bits*/
95 };
96
97 /* Split-VQ innovation parameters narrowband */
98 static split_cb_params split_cb_nb_med = {
99    8,               /*subvect_size*/
100    5,               /*nb_subvect*/
101    exc_8_128_table, /*shape_cb*/
102    7,               /*shape_bits*/
103 };
104
105 /* Split-VQ innovation for low-band wideband */
106 static split_cb_params split_cb_sb = {
107    5,               /*subvect_size*/
108    8,              /*nb_subvect*/
109    exc_5_256_table,    /*shape_cb*/
110    8,               /*shape_bits*/
111 };
112
113 /* Split-VQ innovation for high-band wideband */
114 static split_cb_params split_cb_high = {
115    8,               /*subvect_size*/
116    5,               /*nb_subvect*/
117    hexc_table,       /*shape_cb*/
118    7,               /*shape_bits*/
119 };
120
121
122 /* Split-VQ innovation for high-band wideband */
123 static split_cb_params split_cb_high_lbr = {
124    10,               /*subvect_size*/
125    4,               /*nb_subvect*/
126    hexc_10_32_table,       /*shape_cb*/
127    5,               /*shape_bits*/
128 };
129
130 /* 2150 bps "vocoder-like" mode for comfort noise */
131 static SpeexSubmode nb_submode1 = {
132    0,
133    1,
134    1,
135    0,
136    /* LSP quantization */
137    lsp_quant_lbr,
138    lsp_unquant_lbr,
139    /* No pitch quantization */
140    forced_pitch_quant,
141    forced_pitch_unquant,
142    NULL,
143    /* No innovation quantization (noise only) */
144    noise_codebook_quant,
145    noise_codebook_unquant,
146    NULL,
147    0, 0, -1,
148    43
149 };
150
151 /* 5.95 kbps very low bit-rate mode */
152 static SpeexSubmode nb_submode2 = {
153    0,
154    0,
155    0,
156    0,
157    /*LSP quantization*/
158    lsp_quant_lbr,
159    lsp_unquant_lbr,
160    /*No pitch quantization*/
161    pitch_search_3tap,
162    pitch_unquant_3tap,
163    &ltp_params_vlbr,
164    /*Innovation quantization*/
165    split_cb_search_nogain,
166    split_cb_nogain_unquant,
167    &split_cb_nb_vlbr,
168
169    0.75, 0.6, .6,
170    119
171 };
172
173 /* 8 kbps low bit-rate mode */
174 static SpeexSubmode nb_submode3 = {
175    -1,
176    0,
177    1,
178    0,
179    /*LSP quantization*/
180    lsp_quant_lbr,
181    lsp_unquant_lbr,
182    /*Pitch quantization*/
183    pitch_search_3tap,
184    pitch_unquant_3tap,
185    &ltp_params_lbr,
186    /*Innovation quantization*/
187    split_cb_search_nogain,
188    split_cb_nogain_unquant,
189    &split_cb_nb_lbr,
190
191    0.75, 0.6, .5,
192    160
193 };
194
195 /* 11 kbps medium bit-rate mode */
196 static SpeexSubmode nb_submode4 = {
197    -1,
198    0,
199    1,
200    0,
201    /*LSP quantization*/
202    lsp_quant_lbr,
203    lsp_unquant_lbr,
204    /*Pitch quantization*/
205    pitch_search_3tap,
206    pitch_unquant_3tap,
207    &ltp_params_med,
208    /*Innovation quantization*/
209    split_cb_search_nogain,
210    split_cb_nogain_unquant,
211    &split_cb_nb_med,
212
213    0.72, 0.65, .3,
214    220
215 };
216
217 /* 15 kbps high bit-rate mode */
218 static SpeexSubmode nb_submode5 = {
219    -1,
220    0,
221    3,
222    0,
223    /*LSP quantization*/
224    lsp_quant_nb,
225    lsp_unquant_nb,
226    /*Pitch quantization*/
227    pitch_search_3tap,
228    pitch_unquant_3tap,
229    &ltp_params_nb,
230    /*Innovation quantization*/
231    split_cb_search_nogain,
232    split_cb_nogain_unquant,
233    &split_cb_nb,
234
235    0.7, 0.65, .2,
236    300
237 };
238
239 /* 18.2 high bit-rate mode */
240 static SpeexSubmode nb_submode6 = {
241    -1,
242    0,
243    3,
244    0,
245    /*LSP quantization*/
246    lsp_quant_nb,
247    lsp_unquant_nb,
248    /*Pitch quantization*/
249    pitch_search_3tap,
250    pitch_unquant_3tap,
251    &ltp_params_nb,
252    /*Innovation quantization*/
253    split_cb_search_nogain,
254    split_cb_nogain_unquant,
255    &split_cb_sb,
256
257    0.68, 0.65, .1,
258    364
259 };
260
261 /* 24.6 kbps high bit-rate mode */
262 static SpeexSubmode nb_submode7 = {
263    -1,
264    0,
265    3,
266    1,
267    /*LSP quantization*/
268    lsp_quant_nb,
269    lsp_unquant_nb,
270    /*Pitch quantization*/
271    pitch_search_3tap,
272    pitch_unquant_3tap,
273    &ltp_params_nb,
274    /*Innovation quantization*/
275    split_cb_search_nogain,
276    split_cb_nogain_unquant,
277    &split_cb_nb,
278
279    0.65, 0.65, 0,
280    492
281 };
282
283
284 /* Default mode for narrowband */
285 static SpeexNBMode nb_mode = {
286    160,    /*frameSize*/
287    40,     /*subframeSize*/
288    10,     /*lpcSize*/
289    640,    /*bufSize*/
290    17,     /*pitchStart*/
291    144,    /*pitchEnd*/
292    0.9,    /*gamma1*/
293    0.6,    /*gamma2*/
294    .005,   /*lag_factor*/
295    1.0001, /*lpc_floor*/
296    0.0,    /*preemph*/
297    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, &nb_submode7,
298    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
299    5
300 };
301
302
303 SpeexMode speex_nb_mode = {
304    &nb_mode,
305    "narrowband",
306    0,
307    4,
308    &nb_encoder_init,
309    &nb_encoder_destroy,
310    &nb_encode,
311    &nb_decoder_init,
312    &nb_decoder_destroy,
313    &nb_decode,
314    &nb_encoder_ctl,
315    &nb_decoder_ctl,
316    160,
317    -1,
318    0
319 };
320
321 static SpeexSubmode wb_submode1 = {
322    0,
323    0,
324    1,
325    0,
326    /*LSP quantization*/
327    lsp_quant_high,
328    lsp_unquant_high,
329    /*Pitch quantization*/
330    NULL,
331    NULL,
332    NULL,
333    /*No innovation quantization*/
334    NULL,
335    NULL,
336    NULL,
337
338    0, 0, -1,
339    36
340 };
341
342
343 static SpeexSubmode wb_submode2 = {
344    0,
345    0,
346    1,
347    0,
348    /*LSP quantization*/
349    lsp_quant_high,
350    lsp_unquant_high,
351    /*Pitch quantization*/
352    NULL,
353    NULL,
354    NULL,
355    /*Innovation quantization*/
356    split_cb_search_nogain,
357    split_cb_nogain_unquant,
358    &split_cb_high_lbr,
359
360    0, 0, -1,
361    112
362 };
363
364
365 static SpeexSubmode wb_submode3 = {
366    0,
367    0,
368    1,
369    0,
370    /*LSP quantization*/
371    lsp_quant_high,
372    lsp_unquant_high,
373    /*Pitch quantization*/
374    NULL,
375    NULL,
376    NULL,
377    /*Innovation quantization*/
378    split_cb_search_shape_sign,
379    split_cb_shape_sign_unquant,
380    &split_cb_high,
381
382    0, 0, -1,
383    192
384 };
385
386 static SpeexSubmode wb_submode4 = {
387    0,
388    0,
389    1,
390    1,
391    /*LSP quantization*/
392    lsp_quant_high,
393    lsp_unquant_high,
394    /*Pitch quantization*/
395    NULL,
396    NULL,
397    NULL,
398    /*Innovation quantization*/
399    split_cb_search_shape_sign,
400    split_cb_shape_sign_unquant,
401    &split_cb_high,
402
403    0, 0, -1,
404    352
405 };
406
407
408 /* Split-band wideband CELP mode*/
409 SpeexSBMode sb_wb_mode = {
410    &speex_nb_mode,
411    160,    /*frameSize*/
412    40,     /*subframeSize*/
413    8,     /*lpcSize*/
414    640,    /*bufSize*/
415    .9,    /*gamma1*/
416    0.6,    /*gamma2*/
417    .002,   /*lag_factor*/
418    1.0001, /*lpc_floor*/
419    0.0,    /*preemph*/
420    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, &wb_submode4, NULL, NULL, NULL},
421    3
422 };
423
424
425 SpeexMode speex_wb_mode = {
426    &sb_wb_mode,
427    "full-rate wideband (sub-band CELP)",
428    1,
429    4,
430    &sb_encoder_init,
431    &sb_encoder_destroy,
432    &sb_encode,
433    &sb_decoder_init,
434    &sb_decoder_destroy,
435    &sb_decode,
436    &sb_encoder_ctl,
437    &sb_decoder_ctl,
438    320,
439    -1,
440    0
441 };
442
443
444
445 void *speex_encoder_init(SpeexMode *mode)
446 {
447    return mode->enc_init(mode);
448 }
449
450 void *speex_decoder_init(SpeexMode *mode)
451 {
452    return mode->dec_init(mode);
453 }
454
455 void speex_encoder_destroy(void *state)
456 {
457    (*((SpeexMode**)state))->enc_destroy(state);
458 }
459
460 void speex_encode(void *state, float *in, SpeexBits *bits)
461 {
462    (*((SpeexMode**)state))->enc(state, in, bits);
463 }
464
465 void speex_decoder_destroy(void *state)
466 {
467    (*((SpeexMode**)state))->dec_destroy(state);
468 }
469
470 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
471 {
472    (*((SpeexMode**)state))->dec(state, bits, out, lost);
473 }
474
475
476 void speex_encoder_ctl(void *state, int request, void *ptr)
477 {
478    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
479 }
480
481 void speex_decoder_ctl(void *state, int request, void *ptr)
482 {
483    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
484 }