Added a comfort noise 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 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.3       /* 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    4
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
94 /* Split-VQ innovation parameters for low bit-rate narrowband */
95 split_cb_params split_cb_nb_lbr = {
96    10,               /*subvect_size*/
97    4,               /*nb_subvect*/
98    exc_10_32_table, /*shape_cb*/
99    5,               /*shape_bits*/
100 };
101
102
103 /* Split-VQ innovation parameters narrowband */
104 split_cb_params split_cb_nb = {
105    5,               /*subvect_size*/
106    8,               /*nb_subvect*/
107    exc_5_64_table, /*shape_cb*/
108    6,               /*shape_bits*/
109 };
110
111 /* Split-VQ innovation parameters narrowband */
112 split_cb_params split_cb_nb_med = {
113    8,               /*subvect_size*/
114    5,               /*nb_subvect*/
115    exc_8_128_table, /*shape_cb*/
116    7,               /*shape_bits*/
117 };
118
119 /* Split-VQ innovation for low-band wideband */
120 split_cb_params split_cb_sb = {
121    5,               /*subvect_size*/
122    8,              /*nb_subvect*/
123    exc_5_256_table,    /*shape_cb*/
124    8,               /*shape_bits*/
125 };
126
127 /* Split-VQ innovation for high-band wideband */
128 static split_cb_params split_cb_high = {
129    8,               /*subvect_size*/
130    5,               /*nb_subvect*/
131    hexc_table,       /*shape_cb*/
132    7,               /*shape_bits*/
133 };
134
135
136 /* Split-VQ innovation for high-band wideband */
137 static split_cb_params split_cb_high_lbr = {
138    10,               /*subvect_size*/
139    4,               /*nb_subvect*/
140    hexc_10_32_table,       /*shape_cb*/
141    5,               /*shape_bits*/
142 };
143
144
145 SpeexSubmode nb_submode1 = {
146    0,
147    1,
148    /* LSP quantization */
149    lsp_quant_lbr,
150    lsp_unquant_lbr,
151    /* No pitch quantization */
152    NULL,
153    NULL,
154    NULL,
155    /* No innovation quantization (noise only) */
156    NULL,
157    NULL,
158    NULL,
159    /* No Post-filter */
160    NULL,
161    NULL
162 };
163
164 SpeexSubmode nb_submode2 = {
165    8,
166    1,
167    /*LSP quantization*/
168    lsp_quant_lbr,
169    lsp_unquant_lbr,
170    /*Pitch quantization*/
171    pitch_search_3tap,
172    pitch_unquant_3tap,
173    &ltp_params_lbr,
174    /*Innovation quantization*/
175    split_cb_search_nogain2,
176    split_cb_nogain_unquant,
177    &split_cb_nb_lbr,
178    nb_post_filter,
179    &pf_params_lbr
180 };
181
182 SpeexSubmode nb_submode3 = {
183    -1,
184    1,
185    /*LSP quantization*/
186    lsp_quant_nb,
187    lsp_unquant_nb,
188    /*Pitch quantization*/
189    pitch_search_3tap,
190    pitch_unquant_3tap,
191    &ltp_params_med,
192    /*Innovation quantization*/
193    split_cb_search_nogain2,
194    split_cb_nogain_unquant,
195    &split_cb_nb_med,
196    nb_post_filter,
197    &pf_params_nb
198 };
199
200 SpeexSubmode nb_submode4 = {
201    -1,
202    1,
203    /*LSP quantization*/
204    lsp_quant_nb,
205    lsp_unquant_nb,
206    /*Pitch quantization*/
207    pitch_search_3tap,
208    pitch_unquant_3tap,
209    &ltp_params_nb,
210    /*Innovation quantization*/
211    split_cb_search_nogain2,
212    split_cb_nogain_unquant,
213    &split_cb_nb,
214    nb_post_filter,
215    &pf_params_nb
216 };
217
218 SpeexSubmode nb_submode5 = {
219    -1,
220    1,
221    /*LSP quantization*/
222    lsp_quant_nb,
223    lsp_unquant_nb,
224    /*Pitch quantization*/
225    pitch_search_3tap,
226    pitch_unquant_3tap,
227    &ltp_params_nb,
228    /*Innovation quantization*/
229    split_cb_search_nogain2,
230    split_cb_nogain_unquant,
231    &split_cb_sb,
232    nb_post_filter,
233    &pf_params_sb
234 };
235
236
237 /* Default mode for narrowband */
238 SpeexNBMode nb_mode = {
239    160,    /*frameSize*/
240    40,     /*subframeSize*/
241    10,     /*lpcSize*/
242    640,    /*bufSize*/
243    17,     /*pitchStart*/
244    144,    /*pitchEnd*/
245    0.9,    /*gamma1*/
246    0.6,    /*gamma2*/
247    .005,   /*lag_factor*/
248    1.0001, /*lpc_floor*/
249    0.0,    /*preemph*/
250    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4, &nb_submode5, NULL, NULL,
251    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
252    4
253 };
254
255
256 SpeexMode speex_nb_mode = {
257    &nb_mode,
258    "narrowband",
259    0,
260    1,
261    &nb_encoder_init,
262    &nb_encoder_destroy,
263    &nb_encode,
264    &nb_decoder_init,
265    &nb_decoder_destroy,
266    &nb_decode,
267    &nb_encoder_ctl,
268    &nb_decoder_ctl,
269    160,
270    14750,
271    0
272 };
273
274
275 SpeexSubmode wb_submode1 = {
276    0,
277    1,
278    /*LSP quantization*/
279    lsp_quant_high,
280    lsp_unquant_high,
281    /*Pitch quantization*/
282    NULL,
283    NULL,
284    NULL,
285    /*Innovation quantization*/
286    split_cb_search_nogain2,
287    split_cb_nogain_unquant,
288    &split_cb_high_lbr,
289    NULL,
290    NULL
291 };
292
293
294 SpeexSubmode wb_submode2 = {
295    0,
296    1,
297    /*LSP quantization*/
298    lsp_quant_high,
299    lsp_unquant_high,
300    /*Pitch quantization*/
301    NULL,
302    NULL,
303    NULL,
304    /*Innovation quantization*/
305    split_cb_search_shape_sign,
306    split_cb_shape_sign_unquant,
307    &split_cb_high,
308    NULL,
309    NULL
310 };
311
312
313 /* Split-band wideband CELP mode*/
314 static SpeexSBMode sb_wb_mode = {
315    &speex_nb_mode,
316    160,    /*frameSize*/
317    40,     /*subframeSize*/
318    8,     /*lpcSize*/
319    640,    /*bufSize*/
320    .9,    /*gamma1*/
321    0.6,    /*gamma2*/
322    .002,   /*lag_factor*/
323    1.0001, /*lpc_floor*/
324    0.0,    /*preemph*/
325    {NULL, &wb_submode1, &wb_submode2, NULL, NULL, NULL, NULL, NULL},
326    2
327 };
328
329
330 SpeexMode speex_wb_mode = {
331    &sb_wb_mode,
332    "full-rate wideband (sub-band CELP)",
333    1,
334    1,
335    &sb_encoder_init,
336    &sb_encoder_destroy,
337    &sb_encode,
338    &sb_decoder_init,
339    &sb_decoder_destroy,
340    &sb_decode,
341    &sb_encoder_ctl,
342    &sb_decoder_ctl,
343    320,
344    27350,
345    0
346 };
347
348
349
350 void *speex_encoder_init(SpeexMode *mode)
351 {
352    return mode->enc_init(mode);
353 }
354
355 void *speex_decoder_init(SpeexMode *mode)
356 {
357    return mode->dec_init(mode);
358 }
359
360 void speex_encoder_destroy(void *state)
361 {
362    (*((SpeexMode**)state))->enc_destroy(state);
363 }
364
365 void speex_encode(void *state, float *in, SpeexBits *bits)
366 {
367    (*((SpeexMode**)state))->enc(state, in, bits);
368 }
369
370 void speex_decoder_destroy(void *state)
371 {
372    (*((SpeexMode**)state))->dec_destroy(state);
373 }
374
375 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
376 {
377    (*((SpeexMode**)state))->dec(state, bits, out, lost);
378 }
379
380
381 void speex_encoder_ctl(void *state, int request, void *ptr)
382 {
383    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
384 }
385
386 void speex_decoder_ctl(void *state, int request, void *ptr)
387 {
388    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
389 }