904c22b6232fdba7218ef71a23f04c077a6af70c
[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 SpeexMode low_wb_mode = {
153    &low_sb_mode,
154    &nb_encoder_init,
155    &nb_encoder_destroy,
156    &nb_encode,
157    &nb_decoder_init,
158    &nb_decoder_destroy,
159    &nb_decode,
160    160
161 };
162
163 SpeexSBMode sb_wb_mode = {
164    &low_wb_mode,
165    160,    /*frameSize*/
166    40,     /*subframeSize*/
167    320,    /*windowSize*/
168    8,     /*lpcSize*/
169    640,    /*bufSize*/
170    .9,    /*gamma1*/
171    0.6,    /*gamma2*/
172    .002,   /*lag_factor*/
173    1.00005, /*lpc_floor*/
174    0.0,    /*preemph*/
175    /*LSP quantization*/
176    lsp_quant_nb,
177    lsp_unquant_nb,
178    /*Innovation quantization*/
179    split_cb_search2,
180    split_cb_unquant,
181    &split_cb_sb
182 };
183
184
185
186 SpeexMode nb_mode = {
187    &mp_nb_mode,
188    &nb_encoder_init,
189    &nb_encoder_destroy,
190    &nb_encode,
191    &nb_decoder_init,
192    &nb_decoder_destroy,
193    &nb_decode,
194    160
195 };
196
197 SpeexMode wb_mode = {
198    &sb_wb_mode,
199    &sb_encoder_init,
200    &sb_encoder_destroy,
201    &sb_encode,
202    &sb_decoder_init,
203    &sb_decoder_destroy,
204    &sb_decode,
205    320
206 };
207
208
209
210
211 void *encoder_init(SpeexMode *mode)
212 {
213    return mode->enc_init(mode);
214 }
215
216 void *decoder_init(SpeexMode *mode)
217 {
218    return mode->dec_init(mode);
219 }
220
221 void encoder_destroy(void *state)
222 {
223    (*((SpeexMode**)state))->enc_destroy(state);
224 }
225
226 void encode(void *state, float *in, FrameBits *bits)
227 {
228    (*((SpeexMode**)state))->enc(state, in, bits);
229 }
230
231 void decoder_destroy(void *state)
232 {
233    (*((SpeexMode**)state))->dec_destroy(state);
234 }
235
236 void decode(void *state, FrameBits *bits, float *out)
237 {
238    (*((SpeexMode**)state))->dec(state, bits, out);
239 }