More 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    -1,
206    &nb_encoder_init,
207    &nb_encoder_destroy,
208    &nb_encode,
209    &nb_decoder_init,
210    &nb_decoder_destroy,
211    &nb_decode,
212    &nb_encoder_ctl,
213    &nb_decoder_ctl,
214    160,
215    17950,
216    0
217 };
218
219 SpeexMode speex_nb_mode = {
220    &nb_mode,
221    0,
222    &nb_encoder_init,
223    &nb_encoder_destroy,
224    &nb_encode,
225    &nb_decoder_init,
226    &nb_decoder_destroy,
227    &nb_decode,
228    &nb_encoder_ctl,
229    &nb_decoder_ctl,
230    160,
231    14750,
232    0
233 };
234
235 SpeexMode speex_nb_lbr_mode = {
236    &nb_lbr_mode,
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    7900,
248    0
249 };
250
251 /* Split-band wideband CELP mode*/
252 static SpeexSBMode sb_wb_mode = {
253    &low_wb_mode,
254    160,    /*frameSize*/
255    40,     /*subframeSize*/
256    320,    /*windowSize*/
257    8,     /*lpcSize*/
258    640,    /*bufSize*/
259    .9,    /*gamma1*/
260    0.6,    /*gamma2*/
261    .002,   /*lag_factor*/
262    1.0001, /*lpc_floor*/
263    0.0,    /*preemph*/
264    /*LSP quantization*/
265    lsp_quant_high,
266    lsp_unquant_high,
267    /*Innovation quantization*/
268    split_cb_search_shape_sign,
269    split_cb_shape_sign_unquant,
270    &split_cb_high
271 };
272
273
274 SpeexMode speex_wb_mode = {
275    &sb_wb_mode,
276    2,
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
293
294
295
296
297 void *speex_encoder_init(SpeexMode *mode)
298 {
299    return mode->enc_init(mode);
300 }
301
302 void *speex_decoder_init(SpeexMode *mode)
303 {
304    return mode->dec_init(mode);
305 }
306
307 void speex_encoder_destroy(void *state)
308 {
309    (*((SpeexMode**)state))->enc_destroy(state);
310 }
311
312 void speex_encode(void *state, float *in, SpeexBits *bits)
313 {
314    (*((SpeexMode**)state))->enc(state, in, bits);
315 }
316
317 void speex_decoder_destroy(void *state)
318 {
319    (*((SpeexMode**)state))->dec_destroy(state);
320 }
321
322 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
323 {
324    (*((SpeexMode**)state))->dec(state, bits, out, lost);
325 }
326
327
328 void speex_encoder_ctl(void *state, int request, void *ptr)
329 {
330    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
331 }
332
333 void speex_decoder_ctl(void *state, int request, void *ptr)
334 {
335    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
336 }