First step to variable bit-rate (VBR): it is now possible to change the
[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_10_32_table[];
41 extern float hexc_10_32_table[];
42
43 /* Post-filter parameters for narrowband */
44 pf_params pf_params_nb = {
45    0.65,      /* formant enhancement numerator */
46    0.7,      /* formant enhancement denominator */
47    0.4       /* pitch enhancement factor */
48 };
49
50 /* Post-filter parameters for low bit-rate narrowband */
51 pf_params pf_params_lbr = {
52    0.65,      /* formant enhancement numerator */
53    0.72,      /* formant enhancement denominator */
54    0.4       /* pitch enhancement factor */
55 };
56
57 /* Post-filter parameters for wideband */
58 pf_params pf_params_sb = {
59    0.65,      /* formant enhancement numerator */
60    0.68,      /* formant enhancement denominator */
61    0.3       /* pitch enhancement factor */
62 };
63
64 /* Post-filter parameters for wideband */
65 pf_params pf_params_sb_lbr = {
66    0.65,      /* formant enhancement numerator */
67    0.7,      /* formant enhancement denominator */
68    0.4       /* pitch enhancement factor */
69 };
70
71 /* Parameters for Long-Term Prediction (LTP)*/
72 ltp_params ltp_params_nb = {
73    gain_cdbk_nb,
74    7,
75    7
76 };
77
78 /* Parameters for Long-Term Prediction (LTP)*/
79 ltp_params ltp_params_lbr = {
80    gain_cdbk_lbr,
81    5,
82    4
83 };
84
85 /* Split-VQ innovation parameters for low bit-rate narrowband */
86 split_cb_params split_cb_nb_lbr = {
87    10,               /*subvect_size*/
88    4,               /*nb_subvect*/
89    exc_10_32_table, /*shape_cb*/
90    5,               /*shape_bits*/
91 };
92
93
94 /* Split-VQ innovation parameters narrowband */
95 split_cb_params split_cb_nb = {
96    5,               /*subvect_size*/
97    8,               /*nb_subvect*/
98    exc_5_64_table, /*shape_cb*/
99    6,               /*shape_bits*/
100 };
101
102 /* Split-VQ innovation for low-band wideband */
103 split_cb_params split_cb_sb = {
104    5,               /*subvect_size*/
105    8,              /*nb_subvect*/
106    exc_5_256_table,    /*shape_cb*/
107    8,               /*shape_bits*/
108 };
109
110 /* Split-VQ innovation for high-band wideband */
111 static split_cb_params split_cb_high = {
112    8,               /*subvect_size*/
113    5,               /*nb_subvect*/
114    hexc_table,       /*shape_cb*/
115    7,               /*shape_bits*/
116 };
117
118
119 /* Split-VQ innovation for high-band wideband */
120 static split_cb_params split_cb_high_lbr = {
121    10,               /*subvect_size*/
122    4,               /*nb_subvect*/
123    hexc_10_32_table,       /*shape_cb*/
124    5,               /*shape_bits*/
125 };
126
127
128
129 SpeexSubmode nb_submode1 = {
130    1,
131    /*LSP quantization*/
132    lsp_quant_lbr,
133    lsp_unquant_lbr,
134    /*Pitch quantization*/
135    pitch_search_3tap,
136    pitch_unquant_3tap,
137    &ltp_params_lbr,
138    /*Innovation quantization*/
139    split_cb_search_nogain2,
140    split_cb_nogain_unquant,
141    &split_cb_nb_lbr,
142    nb_post_filter,
143    &pf_params_lbr
144 };
145
146
147 SpeexSubmode nb_submode2 = {
148    0,
149    /*LSP quantization*/
150    lsp_quant_nb,
151    lsp_unquant_nb,
152    /*Pitch quantization*/
153    pitch_search_3tap,
154    pitch_unquant_3tap,
155    &ltp_params_nb,
156    /*Innovation quantization*/
157    split_cb_search_nogain2,
158    split_cb_nogain_unquant,
159    &split_cb_nb,
160    nb_post_filter,
161    &pf_params_nb
162 };
163
164 SpeexSubmode nb_submode3 = {
165    0,
166    /*LSP quantization*/
167    lsp_quant_nb,
168    lsp_unquant_nb,
169    /*Pitch quantization*/
170    pitch_search_3tap,
171    pitch_unquant_3tap,
172    &ltp_params_nb,
173    /*Innovation quantization*/
174    split_cb_search_nogain2,
175    split_cb_nogain_unquant,
176    &split_cb_sb,
177    nb_post_filter,
178    &pf_params_sb
179 };
180
181
182 /* Default mode for narrowband */
183 SpeexNBMode nb_mode = {
184    160,    /*frameSize*/
185    40,     /*subframeSize*/
186    10,     /*lpcSize*/
187    640,    /*bufSize*/
188    17,     /*pitchStart*/
189    144,    /*pitchEnd*/
190    0.9,    /*gamma1*/
191    0.6,    /*gamma2*/
192    .005,   /*lag_factor*/
193    1.0001, /*lpc_floor*/
194    0.0,    /*preemph*/
195    {NULL, &nb_submode1, &nb_submode2, &nb_submode3},
196    2
197 };
198
199
200 SpeexMode speex_nb_mode = {
201    &nb_mode,
202    "narrowband",
203    0,
204    1,
205    &nb_encoder_init,
206    &nb_encoder_destroy,
207    &nb_encode,
208    &nb_decoder_init,
209    &nb_decoder_destroy,
210    &nb_decode,
211    &nb_encoder_ctl,
212    &nb_decoder_ctl,
213    160,
214    14750,
215    0
216 };
217
218
219 SpeexSubmode wb_submode1 = {
220    0,
221    /*LSP quantization*/
222    lsp_quant_high,
223    lsp_unquant_high,
224    /*Pitch quantization*/
225    NULL,
226    NULL,
227    NULL,
228    /*Innovation quantization*/
229    split_cb_search_nogain2,
230    split_cb_nogain_unquant,
231    &split_cb_high_lbr,
232    NULL,
233    NULL
234 };
235
236
237 SpeexSubmode wb_submode2 = {
238    0,
239    /*LSP quantization*/
240    lsp_quant_high,
241    lsp_unquant_high,
242    /*Pitch quantization*/
243    NULL,
244    NULL,
245    NULL,
246    /*Innovation quantization*/
247    split_cb_search_shape_sign,
248    split_cb_shape_sign_unquant,
249    &split_cb_high,
250    NULL,
251    NULL
252 };
253
254
255 /* Split-band wideband CELP mode*/
256 static SpeexSBMode sb_wb_mode = {
257    &speex_nb_mode,
258    160,    /*frameSize*/
259    40,     /*subframeSize*/
260    8,     /*lpcSize*/
261    640,    /*bufSize*/
262    .9,    /*gamma1*/
263    0.6,    /*gamma2*/
264    .002,   /*lag_factor*/
265    1.0001, /*lpc_floor*/
266    0.0,    /*preemph*/
267    {NULL, &wb_submode1, &wb_submode2},
268    2
269 };
270
271
272 SpeexMode speex_wb_mode = {
273    &sb_wb_mode,
274    "full-rate wideband (sub-band CELP)",
275    1,
276    1,
277    &sb_encoder_init,
278    &sb_encoder_destroy,
279    &sb_encode,
280    &sb_decoder_init,
281    &sb_decoder_destroy,
282    &sb_decode,
283    &sb_encoder_ctl,
284    &sb_decoder_ctl,
285    320,
286    27350,
287    0
288 };
289
290
291
292 void *speex_encoder_init(SpeexMode *mode)
293 {
294    return mode->enc_init(mode);
295 }
296
297 void *speex_decoder_init(SpeexMode *mode)
298 {
299    return mode->dec_init(mode);
300 }
301
302 void speex_encoder_destroy(void *state)
303 {
304    (*((SpeexMode**)state))->enc_destroy(state);
305 }
306
307 void speex_encode(void *state, float *in, SpeexBits *bits)
308 {
309    (*((SpeexMode**)state))->enc(state, in, bits);
310 }
311
312 void speex_decoder_destroy(void *state)
313 {
314    (*((SpeexMode**)state))->dec_destroy(state);
315 }
316
317 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
318 {
319    (*((SpeexMode**)state))->dec(state, bits, out, lost);
320 }
321
322
323 void speex_encoder_ctl(void *state, int request, void *ptr)
324 {
325    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
326 }
327
328 void speex_decoder_ctl(void *state, int request, void *ptr)
329 {
330    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
331 }