Changed the LPC analysis window to an asymetric (pseudo-)Hanning window
[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, &speex_wb_mode_lbr};
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 /* Default mode for narrowband */
129 SpeexNBMode nb_mode = {
130    160,    /*frameSize*/
131    40,     /*subframeSize*/
132    10,     /*lpcSize*/
133    640,    /*bufSize*/
134    17,     /*pitchStart*/
135    144,    /*pitchEnd*/
136    0,      /*lbr_pitch*/
137    0.9,    /*gamma1*/
138    0.6,    /*gamma2*/
139    .005,   /*lag_factor*/
140    1.0001, /*lpc_floor*/
141    0.0,    /*preemph*/
142    /*LSP quantization*/
143    lsp_quant_nb,
144    lsp_unquant_nb,
145    /*Pitch quantization*/
146    pitch_search_3tap,
147    pitch_unquant_3tap,
148    &ltp_params_nb,
149    /*Innovation quantization*/
150    split_cb_search_nogain2,
151    split_cb_nogain_unquant,
152    &split_cb_nb,
153    nb_post_filter,
154    &pf_params_nb
155 };
156
157
158 /* Default mode for narrowband */
159 SpeexNBMode nb_lbr_mode = {
160    160,    /*frameSize*/
161    40,     /*subframeSize*/
162    10,     /*lpcSize*/
163    640,    /*bufSize*/
164    17,     /*pitchStart*/
165    144,    /*pitchEnd*/
166    1,      /*lbr_pitch*/
167    0.9,    /*gamma1*/
168    0.6,    /*gamma2*/
169    .005,   /*lag_factor*/
170    1.0001, /*lpc_floor*/
171    0.0,    /*preemph*/
172    /*LSP quantization*/
173    lsp_quant_lbr,
174    lsp_unquant_lbr,
175    /*Pitch quantization*/
176    pitch_search_3tap,
177    pitch_unquant_3tap,
178    &ltp_params_lbr,
179    /*Innovation quantization*/
180    split_cb_search_nogain2,
181    split_cb_nogain_unquant,
182    &split_cb_nb_lbr,
183    nb_post_filter,
184    &pf_params_lbr
185 };
186
187
188
189 /* Narrowband mode used for split-band wideband CELP*/
190 static SpeexNBMode low_sb_mode = {
191    160,    /*frameSize*/
192    40,     /*subframeSize*/
193    10,     /*lpcSize*/
194    640,    /*bufSize*/
195    17,     /*pitchStart*/
196    144,    /*pitchEnd*/
197    0,      /*lbr_pitch*/
198    .9,    /*gamma1*/
199    0.6,    /*gamma2*/
200    .002,   /*lag_factor*/
201    1.00005, /*lpc_floor*/
202    0.0,    /*preemph*/
203    /*LSP quantization*/
204    lsp_quant_nb,
205    lsp_unquant_nb,
206    /*Pitch quantization*/
207    pitch_search_3tap,
208    pitch_unquant_3tap,
209    &ltp_params_nb,
210    /*Innovation quantization*/
211    split_cb_search_nogain2,
212    split_cb_nogain_unquant,
213    &split_cb_sb,
214    nb_post_filter,
215    &pf_params_sb
216 };
217
218 SpeexMode low_wb_mode = {
219    &low_sb_mode,
220    "low sub-band (used internally)",
221    -1,
222    -1,
223    &nb_encoder_init,
224    &nb_encoder_destroy,
225    &nb_encode,
226    &nb_decoder_init,
227    &nb_decoder_destroy,
228    &nb_decode,
229    &nb_encoder_ctl,
230    &nb_decoder_ctl,
231    160,
232    17950,
233    0
234 };
235
236 SpeexMode speex_nb_mode = {
237    &nb_mode,
238    "full-rate narrowband",
239    0,
240    0,
241    &nb_encoder_init,
242    &nb_encoder_destroy,
243    &nb_encode,
244    &nb_decoder_init,
245    &nb_decoder_destroy,
246    &nb_decode,
247    &nb_encoder_ctl,
248    &nb_decoder_ctl,
249    160,
250    14750,
251    0
252 };
253
254 SpeexMode speex_nb_lbr_mode = {
255    &nb_lbr_mode,
256    "low bit-rate narrowband",
257    1,
258    0,
259    &nb_encoder_init,
260    &nb_encoder_destroy,
261    &nb_encode,
262    &nb_decoder_init,
263    &nb_decoder_destroy,
264    &nb_decode,
265    &nb_encoder_ctl,
266    &nb_decoder_ctl,
267    160,
268    7900,
269    0
270 };
271
272 /* Split-band wideband CELP mode*/
273 static SpeexSBMode sb_wb_mode = {
274    &low_wb_mode,
275    160,    /*frameSize*/
276    40,     /*subframeSize*/
277    8,     /*lpcSize*/
278    640,    /*bufSize*/
279    .9,    /*gamma1*/
280    0.6,    /*gamma2*/
281    .002,   /*lag_factor*/
282    1.0001, /*lpc_floor*/
283    0.0,    /*preemph*/
284    /*LSP quantization*/
285    lsp_quant_high,
286    lsp_unquant_high,
287    /*Innovation quantization*/
288    split_cb_search_shape_sign,
289    split_cb_shape_sign_unquant,
290    &split_cb_high
291 };
292
293
294 SpeexMode speex_wb_mode = {
295    &sb_wb_mode,
296    "full-rate wideband (sub-band CELP)",
297    2,
298    0,
299    &sb_encoder_init,
300    &sb_encoder_destroy,
301    &sb_encode,
302    &sb_decoder_init,
303    &sb_decoder_destroy,
304    &sb_decode,
305    &sb_encoder_ctl,
306    &sb_decoder_ctl,
307    320,
308    27350,
309    0
310 };
311
312
313
314
315
316 /* Split-band wideband CELP mode*/
317 static SpeexSBMode sb_wb_mode_lbr = {
318    &speex_nb_mode,
319    160,    /*frameSize*/
320    40,     /*subframeSize*/
321    8,     /*lpcSize*/
322    640,    /*bufSize*/
323    .9,    /*gamma1*/
324    0.6,    /*gamma2*/
325    .002,   /*lag_factor*/
326    1.0001, /*lpc_floor*/
327    0.0,    /*preemph*/
328    /*LSP quantization*/
329    lsp_quant_high,
330    lsp_unquant_high,
331    /*Innovation quantization*/
332    split_cb_search_nogain2,
333    split_cb_nogain_unquant,
334    &split_cb_high_lbr
335 };
336
337
338 SpeexMode speex_wb_mode_lbr = {
339    &sb_wb_mode_lbr,
340    "low bit-rate wideband (sub-band CELP)",
341    3,
342    0,
343    &sb_encoder_init,
344    &sb_encoder_destroy,
345    &sb_encode,
346    &sb_decoder_init,
347    &sb_decoder_destroy,
348    &sb_decode,
349    &sb_encoder_ctl,
350    &sb_decoder_ctl,
351    320,
352    20150,
353    0
354 };
355
356
357
358
359
360
361 void *speex_encoder_init(SpeexMode *mode)
362 {
363    return mode->enc_init(mode);
364 }
365
366 void *speex_decoder_init(SpeexMode *mode)
367 {
368    return mode->dec_init(mode);
369 }
370
371 void speex_encoder_destroy(void *state)
372 {
373    (*((SpeexMode**)state))->enc_destroy(state);
374 }
375
376 void speex_encode(void *state, float *in, SpeexBits *bits)
377 {
378    (*((SpeexMode**)state))->enc(state, in, bits);
379 }
380
381 void speex_decoder_destroy(void *state)
382 {
383    (*((SpeexMode**)state))->dec_destroy(state);
384 }
385
386 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
387 {
388    (*((SpeexMode**)state))->dec(state, bits, out, lost);
389 }
390
391
392 void speex_encoder_ctl(void *state, int request, void *ptr)
393 {
394    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
395 }
396
397 void speex_decoder_ctl(void *state, int request, void *ptr)
398 {
399    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
400 }