More comments
[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 "mpulse.h"
28 #include "sb_celp.h"
29 #include "nb_celp.h"
30
31
32 /* Extern declarations for all codebooks we use here */
33 extern float gain_cdbk_nb[];
34 extern float exc_gains_table[];
35 extern float exc_table[];
36 extern float exc_wb_table[];
37 extern float exc_gains_wb_table[];
38 extern float exc_sb_table[];
39 extern float hexc_table[];
40
41 /* Parameters for Long-Term Prediction (LTP)*/
42 static ltp_params ltp_params_nb = {
43    gain_cdbk_nb,
44    7,
45    7
46 };
47
48 static ltp_params ltp_params_wb = {
49    gain_cdbk_nb,
50    7,
51    8
52 };
53
54 /* Split-VQ innovation parameters */
55 static split_cb_params split_cb_nb = {
56    8,               /*subvect_size*/
57    5,               /*nb_subvect*/
58    exc_table,       /*shape_cb*/
59    7,               /*shape_bits*/
60 };
61
62 static split_cb_params split_cb_sb = {
63    5,               /*subvect_size*/
64    8,              /*nb_subvect*/
65    exc_sb_table,    /*shape_cb*/
66    7,               /*shape_bits*/
67 };
68
69 static split_cb_params split_cb_wb = {
70    8,               /*subvect_size*/
71    10,              /*nb_subvect*/
72    exc_wb_table,    /*shape_cb*/
73    7,               /*shape_bits*/
74 };
75
76 static split_cb_params split_cb_high = {
77    8,               /*subvect_size*/
78    5,               /*nb_subvect*/
79    hexc_table,       /*shape_cb*/
80    8,               /*shape_bits*/
81 };
82
83
84 /* Various multi-pulse parameter definitions */
85 static mpulse_params mpulse_nb = {
86    15,     /*nb_pulse*/
87    5,      /*nb_tracks*/
88    4,    /*gain_coef*/
89    10
90 };
91
92
93 static mpulse_params mpulse_sb = {
94    15,     /*nb_pulse*/
95    5,      /*nb_tracks*/
96    3.8,    /*gain_coef*/
97    10
98 };
99
100
101 static mpulse_params mpulse_wb = {
102    24,     /*nb_pulse*/
103    4,      /*nb_tracks*/
104    2.2,    /*gain_coef*/
105    26,
106 };
107
108 /* Default mode for narrowband */
109 static SpeexNBMode mp_nb_mode = {
110    160,    /*frameSize*/
111    40,     /*subframeSize*/
112    320,    /*windowSize*/
113    10,     /*lpcSize*/
114    640,    /*bufSize*/
115    17,     /*pitchStart*/
116    144,    /*pitchEnd*/
117    0.9,    /*gamma1*/
118    0.6,    /*gamma2*/
119    .005,   /*lag_factor*/
120    1.0001, /*lpc_floor*/
121    0.0,    /*preemph*/
122    /*LSP quantization*/
123    lsp_quant_nb,
124    lsp_unquant_nb,
125    /*Pitch quantization*/
126    pitch_search_3tap,
127    pitch_unquant_3tap,
128    &ltp_params_nb,
129    /*Innovation quantization*/
130    mpulse_search,
131    mpulse_unquant,
132    &mpulse_nb
133 };
134
135 /* Narrowband mode used for split-band wideband CELP*/
136 static SpeexNBMode low_sb_mode = {
137    160,    /*frameSize*/
138    40,     /*subframeSize*/
139    320,    /*windowSize*/
140    10,     /*lpcSize*/
141    640,    /*bufSize*/
142    17,     /*pitchStart*/
143    144,    /*pitchEnd*/
144    .9,    /*gamma1*/
145    0.6,    /*gamma2*/
146    .002,   /*lag_factor*/
147    1.00005, /*lpc_floor*/
148    0.0,    /*preemph*/
149    /*LSP quantization*/
150    lsp_quant_nb,
151    lsp_unquant_nb,
152    /*Pitch quantization*/
153    pitch_search_3tap,
154    pitch_unquant_3tap,
155    &ltp_params_nb,
156    /*Innovation quantization*/
157 #if 1
158    split_cb_search2,
159    split_cb_unquant,
160    &split_cb_sb
161 #else
162    mpulse_search,
163    mpulse_unquant,
164    &mpulse_sb
165 #endif
166 };
167
168 SpeexMode low_wb_mode = {
169    &low_sb_mode,
170    &nb_encoder_init,
171    &nb_encoder_destroy,
172    &nb_encode,
173    &nb_decoder_init,
174    &nb_decoder_destroy,
175    &nb_decode,
176    160
177 };
178
179 SpeexMode nb_mode = {
180    &mp_nb_mode,
181    &nb_encoder_init,
182    &nb_encoder_destroy,
183    &nb_encode,
184    &nb_decoder_init,
185    &nb_decoder_destroy,
186    &nb_decode,
187    160
188 };
189
190 /* Split-band wideband CELP mode*/
191 static SpeexSBMode sb_wb_mode = {
192    &low_wb_mode,
193    160,    /*frameSize*/
194    40,     /*subframeSize*/
195    320,    /*windowSize*/
196    8,     /*lpcSize*/
197    640,    /*bufSize*/
198    .9,    /*gamma1*/
199    0.6,    /*gamma2*/
200    .002,   /*lag_factor*/
201    1.0001, /*lpc_floor*/
202    0.0,    /*preemph*/
203    /*LSP quantization*/
204    lsp_quant_high,
205    lsp_unquant_high,
206    /*Innovation quantization*/
207    split_cb_search_nogain,
208    split_cb_nogain_unquant,
209    &split_cb_high
210 };
211
212
213 SpeexMode wb_mode = {
214    &sb_wb_mode,
215    &sb_encoder_init,
216    &sb_encoder_destroy,
217    &sb_encode,
218    &sb_decoder_init,
219    &sb_decoder_destroy,
220    &sb_decode,
221    320
222 };
223
224
225
226
227 void *encoder_init(SpeexMode *mode)
228 {
229    return mode->enc_init(mode);
230 }
231
232 void *decoder_init(SpeexMode *mode)
233 {
234    return mode->dec_init(mode);
235 }
236
237 void encoder_destroy(void *state)
238 {
239    (*((SpeexMode**)state))->enc_destroy(state);
240 }
241
242 void encode(void *state, float *in, FrameBits *bits)
243 {
244    (*((SpeexMode**)state))->enc(state, in, bits);
245 }
246
247 void decoder_destroy(void *state)
248 {
249    (*((SpeexMode**)state))->dec_destroy(state);
250 }
251
252 void decode(void *state, FrameBits *bits, float *out)
253 {
254    (*((SpeexMode**)state))->dec(state, bits, out);
255 }