More VBR work.
[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 #include "post_filter.h"
30
31
32 SpeexMode *speex_mode_list[SPEEX_NB_MODES] = {&speex_nb_mode, &speex_wb_mode};
33
34 /* Extern declarations for all codebooks we use here */
35 extern float gain_cdbk_nb[];
36 extern float gain_cdbk_lbr[];
37 extern float hexc_table[];
38 extern float exc_5_256_table[];
39 extern float exc_5_64_table[];
40 extern float exc_8_128_table[];
41 extern float exc_10_32_table[];
42 extern float hexc_10_32_table[];
43
44 /* Post-filter parameters for narrowband */
45 pf_params pf_params_nb = {
46    0.65,      /* formant enhancement numerator */
47    0.7,      /* formant enhancement denominator */
48    0.4       /* pitch enhancement factor */
49 };
50
51 /* Post-filter parameters for low bit-rate narrowband */
52 pf_params pf_params_lbr = {
53    0.65,      /* formant enhancement numerator */
54    0.72,      /* formant enhancement denominator */
55    0.4       /* pitch enhancement factor */
56 };
57
58 /* Post-filter parameters for wideband */
59 pf_params pf_params_sb = {
60    0.65,      /* formant enhancement numerator */
61    0.68,      /* formant enhancement denominator */
62    0.2       /* pitch enhancement factor */
63 };
64
65 /* Post-filter parameters for wideband */
66 pf_params pf_params_sb_lbr = {
67    0.65,      /* formant enhancement numerator */
68    0.7,      /* formant enhancement denominator */
69    0.4       /* pitch enhancement factor */
70 };
71
72 /* Parameters for Long-Term Prediction (LTP)*/
73 ltp_params ltp_params_nb = {
74    gain_cdbk_nb,
75    7,
76    7
77 };
78
79 /* Parameters for Long-Term Prediction (LTP)*/
80 ltp_params ltp_params_lbr = {
81    gain_cdbk_lbr,
82    5,
83    7
84 };
85
86 /* Parameters for Long-Term Prediction (LTP)*/
87 ltp_params ltp_params_med = {
88    gain_cdbk_lbr,
89    5,
90    7
91 };
92
93 /* Split-VQ innovation parameters for very low bit-rate narrowband */
94 split_cb_params split_cb_nb_vlbr = {
95    10,               /*subvect_size*/
96    4,               /*nb_subvect*/
97    exc_10_32_table, /*shape_cb*/
98    4,               /*shape_bits*/
99 };
100
101 /* Split-VQ innovation parameters for low bit-rate narrowband */
102 split_cb_params split_cb_nb_lbr = {
103    10,               /*subvect_size*/
104    4,               /*nb_subvect*/
105    exc_10_32_table, /*shape_cb*/
106    5,               /*shape_bits*/
107 };
108
109
110 /* Split-VQ innovation parameters narrowband */
111 split_cb_params split_cb_nb = {
112    5,               /*subvect_size*/
113    8,               /*nb_subvect*/
114    exc_5_64_table, /*shape_cb*/
115    6,               /*shape_bits*/
116 };
117
118 /* Split-VQ innovation parameters narrowband */
119 split_cb_params split_cb_nb_med = {
120    8,               /*subvect_size*/
121    5,               /*nb_subvect*/
122    exc_8_128_table, /*shape_cb*/
123    7,               /*shape_bits*/
124 };
125
126 /* Split-VQ innovation for low-band wideband */
127 split_cb_params split_cb_sb = {
128    5,               /*subvect_size*/
129    8,              /*nb_subvect*/
130    exc_5_256_table,    /*shape_cb*/
131    8,               /*shape_bits*/
132 };
133
134 /* Split-VQ innovation for high-band wideband */
135 static split_cb_params split_cb_high = {
136    8,               /*subvect_size*/
137    5,               /*nb_subvect*/
138    hexc_table,       /*shape_cb*/
139    7,               /*shape_bits*/
140 };
141
142
143 /* Split-VQ innovation for high-band wideband */
144 static split_cb_params split_cb_high_lbr = {
145    10,               /*subvect_size*/
146    4,               /*nb_subvect*/
147    hexc_10_32_table,       /*shape_cb*/
148    5,               /*shape_bits*/
149 };
150
151
152 SpeexSubmode nb_submode1 = {
153    0,
154    1,
155    /* LSP quantization */
156    lsp_quant_lbr,
157    lsp_unquant_lbr,
158    /* No pitch quantization */
159    NULL,
160    NULL,
161    NULL,
162    /* No innovation quantization (noise only) */
163    NULL,
164    NULL,
165    NULL,
166    /* No Post-filter */
167    NULL,
168    NULL
169 };
170
171 SpeexSubmode nb_submode2 = {
172    0,
173    0,
174    /*LSP quantization*/
175    lsp_quant_lbr,
176    lsp_unquant_lbr,
177    /*No pitch quantization*/
178    NULL,
179    NULL,
180    NULL,
181    /*Innovation quantization*/
182    split_cb_search_nogain2,
183    split_cb_nogain_unquant,
184    &split_cb_nb_vlbr,
185    nb_post_filter,
186    &pf_params_lbr
187 };
188
189
190 SpeexSubmode nb_submode3 = {
191    -1,
192    1,
193    /*LSP quantization*/
194    lsp_quant_lbr,
195    lsp_unquant_lbr,
196    /*Pitch quantization*/
197    pitch_search_3tap,
198    pitch_unquant_3tap,
199    &ltp_params_lbr,
200    /*Innovation quantization*/
201    split_cb_search_nogain2,
202    split_cb_nogain_unquant,
203    &split_cb_nb_lbr,
204    nb_post_filter,
205    &pf_params_lbr
206 };
207
208 SpeexSubmode nb_submode4 = {
209    -1,
210    1,
211    /*LSP quantization*/
212    lsp_quant_lbr,
213    lsp_unquant_lbr,
214    /*Pitch quantization*/
215    pitch_search_3tap,
216    pitch_unquant_3tap,
217    &ltp_params_med,
218    /*Innovation quantization*/
219    split_cb_search_nogain2,
220    split_cb_nogain_unquant,
221    &split_cb_nb_med,
222    nb_post_filter,
223    &pf_params_nb
224 };
225
226 SpeexSubmode nb_submode5 = {
227    -1,
228    1,
229    /*LSP quantization*/
230    lsp_quant_nb,
231    lsp_unquant_nb,
232    /*Pitch quantization*/
233    pitch_search_3tap,
234    pitch_unquant_3tap,
235    &ltp_params_nb,
236    /*Innovation quantization*/
237    split_cb_search_nogain2,
238    split_cb_nogain_unquant,
239    &split_cb_nb,
240    nb_post_filter,
241    &pf_params_nb
242 };
243
244 SpeexSubmode nb_submode6 = {
245    -1,
246    1,
247    /*LSP quantization*/
248    lsp_quant_nb,
249    lsp_unquant_nb,
250    /*Pitch quantization*/
251    pitch_search_3tap,
252    pitch_unquant_3tap,
253    &ltp_params_nb,
254    /*Innovation quantization*/
255    split_cb_search_nogain2,
256    split_cb_nogain_unquant,
257    &split_cb_sb,
258    nb_post_filter,
259    &pf_params_sb
260 };
261
262
263 /* Default mode for narrowband */
264 SpeexNBMode nb_mode = {
265    160,    /*frameSize*/
266    40,     /*subframeSize*/
267    10,     /*lpcSize*/
268    640,    /*bufSize*/
269    17,     /*pitchStart*/
270    144,    /*pitchEnd*/
271    0.9,    /*gamma1*/
272    0.6,    /*gamma2*/
273    .005,   /*lag_factor*/
274    1.0001, /*lpc_floor*/
275    0.0,    /*preemph*/
276    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, NULL,
277    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
278    5
279 };
280
281
282 SpeexMode speex_nb_mode = {
283    &nb_mode,
284    "narrowband",
285    0,
286    2,
287    &nb_encoder_init,
288    &nb_encoder_destroy,
289    &nb_encode,
290    &nb_decoder_init,
291    &nb_decoder_destroy,
292    &nb_decode,
293    &nb_encoder_ctl,
294    &nb_decoder_ctl,
295    160,
296    14750,
297    0
298 };
299
300 SpeexSubmode wb_submode1 = {
301    0,
302    1,
303    /*LSP quantization*/
304    lsp_quant_high,
305    lsp_unquant_high,
306    /*Pitch quantization*/
307    NULL,
308    NULL,
309    NULL,
310    /*No innovation quantization*/
311    NULL,
312    NULL,
313    NULL,
314    /*No post-filter*/
315    NULL,
316    NULL
317 };
318
319
320 SpeexSubmode wb_submode2 = {
321    0,
322    1,
323    /*LSP quantization*/
324    lsp_quant_high,
325    lsp_unquant_high,
326    /*Pitch quantization*/
327    NULL,
328    NULL,
329    NULL,
330    /*Innovation quantization*/
331    split_cb_search_nogain2,
332    split_cb_nogain_unquant,
333    &split_cb_high_lbr,
334    NULL,
335    NULL
336 };
337
338
339 SpeexSubmode wb_submode3 = {
340    0,
341    1,
342    /*LSP quantization*/
343    lsp_quant_high,
344    lsp_unquant_high,
345    /*Pitch quantization*/
346    NULL,
347    NULL,
348    NULL,
349    /*Innovation quantization*/
350    split_cb_search_shape_sign,
351    split_cb_shape_sign_unquant,
352    &split_cb_high,
353    NULL,
354    NULL
355 };
356
357
358 /* Split-band wideband CELP mode*/
359 static SpeexSBMode sb_wb_mode = {
360    &speex_nb_mode,
361    160,    /*frameSize*/
362    40,     /*subframeSize*/
363    8,     /*lpcSize*/
364    640,    /*bufSize*/
365    .9,    /*gamma1*/
366    0.6,    /*gamma2*/
367    .002,   /*lag_factor*/
368    1.0001, /*lpc_floor*/
369    0.0,    /*preemph*/
370    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, NULL, NULL, NULL, NULL},
371    3
372 };
373
374
375 SpeexMode speex_wb_mode = {
376    &sb_wb_mode,
377    "full-rate wideband (sub-band CELP)",
378    1,
379    2,
380    &sb_encoder_init,
381    &sb_encoder_destroy,
382    &sb_encode,
383    &sb_decoder_init,
384    &sb_decoder_destroy,
385    &sb_decode,
386    &sb_encoder_ctl,
387    &sb_decoder_ctl,
388    320,
389    27350,
390    0
391 };
392
393
394
395 void *speex_encoder_init(SpeexMode *mode)
396 {
397    return mode->enc_init(mode);
398 }
399
400 void *speex_decoder_init(SpeexMode *mode)
401 {
402    return mode->dec_init(mode);
403 }
404
405 void speex_encoder_destroy(void *state)
406 {
407    (*((SpeexMode**)state))->enc_destroy(state);
408 }
409
410 void speex_encode(void *state, float *in, SpeexBits *bits)
411 {
412    (*((SpeexMode**)state))->enc(state, in, bits);
413 }
414
415 void speex_decoder_destroy(void *state)
416 {
417    (*((SpeexMode**)state))->dec_destroy(state);
418 }
419
420 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
421 {
422    (*((SpeexMode**)state))->dec(state, bits, out, lost);
423 }
424
425
426 void speex_encoder_ctl(void *state, int request, void *ptr)
427 {
428    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
429 }
430
431 void speex_decoder_ctl(void *state, int request, void *ptr)
432 {
433    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
434 }