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