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