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