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