Created quality modes for wideband, updated encoder. Getting close to 0.4.0
[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.2       /* 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 SpeexSubmode wb_submode1 = {
275    0,
276    1,
277    /*LSP quantization*/
278    lsp_quant_high,
279    lsp_unquant_high,
280    /*Pitch quantization*/
281    NULL,
282    NULL,
283    NULL,
284    /*No innovation quantization*/
285    NULL,
286    NULL,
287    NULL,
288    /*No post-filter*/
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_nogain2,
306    split_cb_nogain_unquant,
307    &split_cb_high_lbr,
308    NULL,
309    NULL
310 };
311
312
313 SpeexSubmode wb_submode3 = {
314    0,
315    1,
316    /*LSP quantization*/
317    lsp_quant_high,
318    lsp_unquant_high,
319    /*Pitch quantization*/
320    NULL,
321    NULL,
322    NULL,
323    /*Innovation quantization*/
324    split_cb_search_shape_sign,
325    split_cb_shape_sign_unquant,
326    &split_cb_high,
327    NULL,
328    NULL
329 };
330
331
332 /* Split-band wideband CELP mode*/
333 static SpeexSBMode sb_wb_mode = {
334    &speex_nb_mode,
335    160,    /*frameSize*/
336    40,     /*subframeSize*/
337    8,     /*lpcSize*/
338    640,    /*bufSize*/
339    .9,    /*gamma1*/
340    0.6,    /*gamma2*/
341    .002,   /*lag_factor*/
342    1.0001, /*lpc_floor*/
343    0.0,    /*preemph*/
344    {NULL, &wb_submode1, &wb_submode2, &wb_submode3, NULL, NULL, NULL, NULL},
345    3
346 };
347
348
349 SpeexMode speex_wb_mode = {
350    &sb_wb_mode,
351    "full-rate wideband (sub-band CELP)",
352    1,
353    1,
354    &sb_encoder_init,
355    &sb_encoder_destroy,
356    &sb_encode,
357    &sb_decoder_init,
358    &sb_decoder_destroy,
359    &sb_decode,
360    &sb_encoder_ctl,
361    &sb_decoder_ctl,
362    320,
363    27350,
364    0
365 };
366
367
368
369 void *speex_encoder_init(SpeexMode *mode)
370 {
371    return mode->enc_init(mode);
372 }
373
374 void *speex_decoder_init(SpeexMode *mode)
375 {
376    return mode->dec_init(mode);
377 }
378
379 void speex_encoder_destroy(void *state)
380 {
381    (*((SpeexMode**)state))->enc_destroy(state);
382 }
383
384 void speex_encode(void *state, float *in, SpeexBits *bits)
385 {
386    (*((SpeexMode**)state))->enc(state, in, bits);
387 }
388
389 void speex_decoder_destroy(void *state)
390 {
391    (*((SpeexMode**)state))->dec_destroy(state);
392 }
393
394 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
395 {
396    (*((SpeexMode**)state))->dec(state, bits, out, lost);
397 }
398
399
400 void speex_encoder_ctl(void *state, int request, void *ptr)
401 {
402    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
403 }
404
405 void speex_decoder_ctl(void *state, int request, void *ptr)
406 {
407    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
408 }