Added bit-rate information via speex_*_ctl calls, fixed stupid bug in
[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    2500
179 };
180
181 static SpeexSubmode nb_submode2 = {
182    0,
183    0,
184    /*LSP quantization*/
185    lsp_quant_lbr,
186    lsp_unquant_lbr,
187    /*No pitch quantization*/
188    pitch_search_3tap,
189    pitch_unquant_3tap,
190    &ltp_params_vlbr,
191    /*Innovation quantization*/
192    split_cb_search_nogain,
193    split_cb_nogain_unquant,
194    &split_cb_nb_vlbr,
195    nb_post_filter,
196    &pf_params_lbr,
197    5900
198 };
199
200
201 static SpeexSubmode nb_submode3 = {
202    -1,
203    1,
204    /*LSP quantization*/
205    lsp_quant_lbr,
206    lsp_unquant_lbr,
207    /*Pitch quantization*/
208    pitch_search_3tap,
209    pitch_unquant_3tap,
210    &ltp_params_lbr,
211    /*Innovation quantization*/
212    split_cb_search_nogain,
213    split_cb_nogain_unquant,
214    &split_cb_nb_lbr,
215    nb_post_filter,
216    &pf_params_lbr,
217    8350
218 };
219
220 static SpeexSubmode nb_submode4 = {
221    -1,
222    1,
223    /*LSP quantization*/
224    lsp_quant_lbr,
225    lsp_unquant_lbr,
226    /*Pitch quantization*/
227    pitch_search_3tap,
228    pitch_unquant_3tap,
229    &ltp_params_med,
230    /*Innovation quantization*/
231    split_cb_search_nogain,
232    split_cb_nogain_unquant,
233    &split_cb_nb_med,
234    nb_post_filter,
235    &pf_params_med,
236    11350
237 };
238
239 static SpeexSubmode nb_submode5 = {
240    -1,
241    1,
242    /*LSP quantization*/
243    lsp_quant_nb,
244    lsp_unquant_nb,
245    /*Pitch quantization*/
246    pitch_search_3tap,
247    pitch_unquant_3tap,
248    &ltp_params_nb,
249    /*Innovation quantization*/
250    split_cb_search_nogain,
251    split_cb_nogain_unquant,
252    &split_cb_nb,
253    nb_post_filter,
254    &pf_params_nb,
255    14950
256 };
257
258 static SpeexSubmode nb_submode6 = {
259    -1,
260    1,
261    /*LSP quantization*/
262    lsp_quant_nb,
263    lsp_unquant_nb,
264    /*Pitch quantization*/
265    pitch_search_3tap,
266    pitch_unquant_3tap,
267    &ltp_params_nb,
268    /*Innovation quantization*/
269    split_cb_search_nogain,
270    split_cb_nogain_unquant,
271    &split_cb_sb,
272    nb_post_filter,
273    &pf_params_sb,
274    18150
275 };
276
277
278 /* Default mode for narrowband */
279 static SpeexNBMode nb_mode = {
280    160,    /*frameSize*/
281    40,     /*subframeSize*/
282    10,     /*lpcSize*/
283    640,    /*bufSize*/
284    17,     /*pitchStart*/
285    144,    /*pitchEnd*/
286    0.9,    /*gamma1*/
287    0.6,    /*gamma2*/
288    .005,   /*lag_factor*/
289    1.0001, /*lpc_floor*/
290    0.0,    /*preemph*/
291    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, &nb_submode6, NULL,
292    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
293    5
294 };
295
296
297 SpeexMode speex_nb_mode = {
298    &nb_mode,
299    "narrowband",
300    0,
301    3,
302    &nb_encoder_init,
303    &nb_encoder_destroy,
304    &nb_encode,
305    &nb_decoder_init,
306    &nb_decoder_destroy,
307    &nb_decode,
308    &nb_encoder_ctl,
309    &nb_decoder_ctl,
310    160,
311    -1,
312    0
313 };
314
315 static SpeexSubmode wb_submode1 = {
316    0,
317    1,
318    /*LSP quantization*/
319    lsp_quant_high,
320    lsp_unquant_high,
321    /*Pitch quantization*/
322    NULL,
323    NULL,
324    NULL,
325    /*No innovation quantization*/
326    NULL,
327    NULL,
328    NULL,
329    /*No post-filter*/
330    NULL,
331    NULL,
332    1750
333 };
334
335
336 static SpeexSubmode wb_submode2 = {
337    0,
338    1,
339    /*LSP quantization*/
340    lsp_quant_high,
341    lsp_unquant_high,
342    /*Pitch quantization*/
343    NULL,
344    NULL,
345    NULL,
346    /*Innovation quantization*/
347    split_cb_search_nogain,
348    split_cb_nogain_unquant,
349    &split_cb_high_lbr,
350    NULL,
351    NULL,
352    5550
353 };
354
355
356 static SpeexSubmode wb_submode3 = {
357    0,
358    1,
359    /*LSP quantization*/
360    lsp_quant_high,
361    lsp_unquant_high,
362    /*Pitch quantization*/
363    NULL,
364    NULL,
365    NULL,
366    /*Innovation quantization*/
367    split_cb_search_shape_sign,
368    split_cb_shape_sign_unquant,
369    &split_cb_high,
370    NULL,
371    NULL,
372    9550
373 };
374
375
376 /* Split-band wideband CELP mode*/
377 static SpeexSBMode sb_wb_mode = {
378    &speex_nb_mode,
379    160,    /*frameSize*/
380    40,     /*subframeSize*/
381    8,     /*lpcSize*/
382    640,    /*bufSize*/
383    .9,    /*gamma1*/
384    0.6,    /*gamma2*/
385    .002,   /*lag_factor*/
386    1.0001, /*lpc_floor*/
387    0.0,    /*preemph*/
388    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, NULL, NULL, NULL, NULL},
389    3
390 };
391
392
393 SpeexMode speex_wb_mode = {
394    &sb_wb_mode,
395    "full-rate wideband (sub-band CELP)",
396    1,
397    3,
398    &sb_encoder_init,
399    &sb_encoder_destroy,
400    &sb_encode,
401    &sb_decoder_init,
402    &sb_decoder_destroy,
403    &sb_decode,
404    &sb_encoder_ctl,
405    &sb_decoder_ctl,
406    320,
407    -1,
408    0
409 };
410
411
412
413 void *speex_encoder_init(SpeexMode *mode)
414 {
415    return mode->enc_init(mode);
416 }
417
418 void *speex_decoder_init(SpeexMode *mode)
419 {
420    return mode->dec_init(mode);
421 }
422
423 void speex_encoder_destroy(void *state)
424 {
425    (*((SpeexMode**)state))->enc_destroy(state);
426 }
427
428 void speex_encode(void *state, float *in, SpeexBits *bits)
429 {
430    (*((SpeexMode**)state))->enc(state, in, bits);
431 }
432
433 void speex_decoder_destroy(void *state)
434 {
435    (*((SpeexMode**)state))->dec_destroy(state);
436 }
437
438 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
439 {
440    (*((SpeexMode**)state))->dec(state, bits, out, lost);
441 }
442
443
444 void speex_encoder_ctl(void *state, int request, void *ptr)
445 {
446    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
447 }
448
449 void speex_decoder_ctl(void *state, int request, void *ptr)
450 {
451    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
452 }