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