Added narrowband mode at 11.75 kbps
[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
146 SpeexSubmode nb_submode1 = {
147    1,
148    /*LSP quantization*/
149    lsp_quant_lbr,
150    lsp_unquant_lbr,
151    /*Pitch quantization*/
152    pitch_search_3tap,
153    pitch_unquant_3tap,
154    &ltp_params_lbr,
155    /*Innovation quantization*/
156    split_cb_search_nogain2,
157    split_cb_nogain_unquant,
158    &split_cb_nb_lbr,
159    nb_post_filter,
160    &pf_params_lbr
161 };
162
163 SpeexSubmode nb_submode2 = {
164    0,
165    /*LSP quantization*/
166    lsp_quant_nb,
167    lsp_unquant_nb,
168    /*Pitch quantization*/
169    pitch_search_3tap,
170    pitch_unquant_3tap,
171    &ltp_params_med,
172    /*Innovation quantization*/
173    split_cb_search_nogain2,
174    split_cb_nogain_unquant,
175    &split_cb_nb_med,
176    nb_post_filter,
177    &pf_params_nb
178 };
179
180 SpeexSubmode nb_submode3 = {
181    0,
182    /*LSP quantization*/
183    lsp_quant_nb,
184    lsp_unquant_nb,
185    /*Pitch quantization*/
186    pitch_search_3tap,
187    pitch_unquant_3tap,
188    &ltp_params_nb,
189    /*Innovation quantization*/
190    split_cb_search_nogain2,
191    split_cb_nogain_unquant,
192    &split_cb_nb,
193    nb_post_filter,
194    &pf_params_nb
195 };
196
197 SpeexSubmode nb_submode4 = {
198    0,
199    /*LSP quantization*/
200    lsp_quant_nb,
201    lsp_unquant_nb,
202    /*Pitch quantization*/
203    pitch_search_3tap,
204    pitch_unquant_3tap,
205    &ltp_params_nb,
206    /*Innovation quantization*/
207    split_cb_search_nogain2,
208    split_cb_nogain_unquant,
209    &split_cb_sb,
210    nb_post_filter,
211    &pf_params_sb
212 };
213
214
215 /* Default mode for narrowband */
216 SpeexNBMode nb_mode = {
217    160,    /*frameSize*/
218    40,     /*subframeSize*/
219    10,     /*lpcSize*/
220    640,    /*bufSize*/
221    17,     /*pitchStart*/
222    144,    /*pitchEnd*/
223    0.9,    /*gamma1*/
224    0.6,    /*gamma2*/
225    .005,   /*lag_factor*/
226    1.0001, /*lpc_floor*/
227    0.0,    /*preemph*/
228    {NULL, &nb_submode1, &nb_submode2, &nb_submode3, &nb_submode4},
229    3
230 };
231
232
233 SpeexMode speex_nb_mode = {
234    &nb_mode,
235    "narrowband",
236    0,
237    1,
238    &nb_encoder_init,
239    &nb_encoder_destroy,
240    &nb_encode,
241    &nb_decoder_init,
242    &nb_decoder_destroy,
243    &nb_decode,
244    &nb_encoder_ctl,
245    &nb_decoder_ctl,
246    160,
247    14750,
248    0
249 };
250
251
252 SpeexSubmode wb_submode1 = {
253    0,
254    /*LSP quantization*/
255    lsp_quant_high,
256    lsp_unquant_high,
257    /*Pitch quantization*/
258    NULL,
259    NULL,
260    NULL,
261    /*Innovation quantization*/
262    split_cb_search_nogain2,
263    split_cb_nogain_unquant,
264    &split_cb_high_lbr,
265    NULL,
266    NULL
267 };
268
269
270 SpeexSubmode wb_submode2 = {
271    0,
272    /*LSP quantization*/
273    lsp_quant_high,
274    lsp_unquant_high,
275    /*Pitch quantization*/
276    NULL,
277    NULL,
278    NULL,
279    /*Innovation quantization*/
280    split_cb_search_shape_sign,
281    split_cb_shape_sign_unquant,
282    &split_cb_high,
283    NULL,
284    NULL
285 };
286
287
288 /* Split-band wideband CELP mode*/
289 static SpeexSBMode sb_wb_mode = {
290    &speex_nb_mode,
291    160,    /*frameSize*/
292    40,     /*subframeSize*/
293    8,     /*lpcSize*/
294    640,    /*bufSize*/
295    .9,    /*gamma1*/
296    0.6,    /*gamma2*/
297    .002,   /*lag_factor*/
298    1.0001, /*lpc_floor*/
299    0.0,    /*preemph*/
300    {NULL, &wb_submode1, &wb_submode2},
301    2
302 };
303
304
305 SpeexMode speex_wb_mode = {
306    &sb_wb_mode,
307    "full-rate wideband (sub-band CELP)",
308    1,
309    1,
310    &sb_encoder_init,
311    &sb_encoder_destroy,
312    &sb_encode,
313    &sb_decoder_init,
314    &sb_decoder_destroy,
315    &sb_decode,
316    &sb_encoder_ctl,
317    &sb_decoder_ctl,
318    320,
319    27350,
320    0
321 };
322
323
324
325 void *speex_encoder_init(SpeexMode *mode)
326 {
327    return mode->enc_init(mode);
328 }
329
330 void *speex_decoder_init(SpeexMode *mode)
331 {
332    return mode->dec_init(mode);
333 }
334
335 void speex_encoder_destroy(void *state)
336 {
337    (*((SpeexMode**)state))->enc_destroy(state);
338 }
339
340 void speex_encode(void *state, float *in, SpeexBits *bits)
341 {
342    (*((SpeexMode**)state))->enc(state, in, bits);
343 }
344
345 void speex_decoder_destroy(void *state)
346 {
347    (*((SpeexMode**)state))->dec_destroy(state);
348 }
349
350 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
351 {
352    (*((SpeexMode**)state))->dec(state, bits, out, lost);
353 }
354
355
356 void speex_encoder_ctl(void *state, int request, void *ptr)
357 {
358    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
359 }
360
361 void speex_decoder_ctl(void *state, int request, void *ptr)
362 {
363    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
364 }