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