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