High-band (for wideband) is now a shape-sign codebook, reducing search
[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 /* Extern declarations for all codebooks we use here */
32 extern float gain_cdbk_nb[];
33 extern float hexc_table[];
34 extern float exc_5_256_table[];
35 extern float exc_5_64_table[];
36
37 /* Post-filter parameters for narrowband */
38 pf_params pf_params_nb = {
39    0.65,      /* formant enhancement numerator */
40    0.7,      /* formant enhancement denominator */
41    0.4       /* pitch enhancement factor */
42 };
43
44 /* Post-filter parameters for wideband */
45 pf_params pf_params_sb = {
46    0.65,      /* formant enhancement numerator */
47    0.67,      /* formant enhancement denominator */
48    0.3       /* pitch enhancement factor */
49 };
50
51 /* Parameters for Long-Term Prediction (LTP)*/
52 ltp_params ltp_params_nb = {
53    gain_cdbk_nb,
54    7,
55    7
56 };
57
58 /* Split-VQ innovation parameters */
59 split_cb_params split_cb_nb = {
60    5,               /*subvect_size*/
61    8,               /*nb_subvect*/
62    exc_5_64_table, /*shape_cb*/
63    6,               /*shape_bits*/
64 };
65
66 split_cb_params split_cb_sb = {
67    5,               /*subvect_size*/
68    8,              /*nb_subvect*/
69    exc_5_256_table,    /*shape_cb*/
70    8,               /*shape_bits*/
71 };
72
73 static split_cb_params split_cb_high = {
74    8,               /*subvect_size*/
75    5,               /*nb_subvect*/
76    hexc_table,       /*shape_cb*/
77    7,               /*shape_bits*/
78 };
79
80 /* Default mode for narrowband */
81 SpeexNBMode nb_mode = {
82    160,    /*frameSize*/
83    40,     /*subframeSize*/
84    320,    /*windowSize*/
85    10,     /*lpcSize*/
86    640,    /*bufSize*/
87    17,     /*pitchStart*/
88    144,    /*pitchEnd*/
89    0.9,    /*gamma1*/
90    0.6,    /*gamma2*/
91    .005,   /*lag_factor*/
92    1.0001, /*lpc_floor*/
93    0.0,    /*preemph*/
94    /*LSP quantization*/
95    lsp_quant_nb,
96    lsp_unquant_nb,
97    /*Pitch quantization*/
98    pitch_search_3tap,
99    pitch_unquant_3tap,
100    &ltp_params_nb,
101    /*Innovation quantization*/
102    split_cb_search_nogain2,
103    split_cb_nogain_unquant,
104    &split_cb_nb,
105    nb_post_filter,
106    &pf_params_nb
107 };
108
109 /* Narrowband mode used for split-band wideband CELP*/
110 static SpeexNBMode low_sb_mode = {
111    160,    /*frameSize*/
112    40,     /*subframeSize*/
113    320,    /*windowSize*/
114    10,     /*lpcSize*/
115    640,    /*bufSize*/
116    17,     /*pitchStart*/
117    144,    /*pitchEnd*/
118    .9,    /*gamma1*/
119    0.6,    /*gamma2*/
120    .002,   /*lag_factor*/
121    1.00005, /*lpc_floor*/
122    0.0,    /*preemph*/
123    /*LSP quantization*/
124    lsp_quant_nb,
125    lsp_unquant_nb,
126    /*Pitch quantization*/
127    pitch_search_3tap,
128    pitch_unquant_3tap,
129    &ltp_params_nb,
130    /*Innovation quantization*/
131    split_cb_search_nogain2,
132    split_cb_nogain_unquant,
133    &split_cb_sb,
134    nb_post_filter,
135    &pf_params_nb
136 };
137
138 SpeexMode low_wb_mode = {
139    &low_sb_mode,
140    &nb_encoder_init,
141    &nb_encoder_destroy,
142    &nb_encode,
143    &nb_decoder_init,
144    &nb_decoder_destroy,
145    &nb_decode,
146    &nb_encoder_ctl,
147    &nb_decoder_ctl,
148 };
149
150 SpeexMode speex_nb_mode = {
151    &nb_mode,
152    &nb_encoder_init,
153    &nb_encoder_destroy,
154    &nb_encode,
155    &nb_decoder_init,
156    &nb_decoder_destroy,
157    &nb_decode,
158    &nb_encoder_ctl,
159    &nb_decoder_ctl,
160 };
161
162 /* Split-band wideband CELP mode*/
163 static 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.0001, /*lpc_floor*/
174    0.0,    /*preemph*/
175    /*LSP quantization*/
176    lsp_quant_high,
177    lsp_unquant_high,
178    /*Innovation quantization*/
179    split_cb_search_shape_sign,
180    split_cb_shape_sign_unquant,
181    &split_cb_high
182 };
183
184
185 SpeexMode speex_wb_mode = {
186    &sb_wb_mode,
187    &sb_encoder_init,
188    &sb_encoder_destroy,
189    &sb_encode,
190    &sb_decoder_init,
191    &sb_decoder_destroy,
192    &sb_decode,
193    &sb_encoder_ctl,
194    &sb_decoder_ctl,
195 };
196
197
198
199
200 void *speex_encoder_init(SpeexMode *mode)
201 {
202    return mode->enc_init(mode);
203 }
204
205 void *speex_decoder_init(SpeexMode *mode)
206 {
207    return mode->dec_init(mode);
208 }
209
210 void speex_encoder_destroy(void *state)
211 {
212    (*((SpeexMode**)state))->enc_destroy(state);
213 }
214
215 void speex_encode(void *state, float *in, SpeexBits *bits)
216 {
217    (*((SpeexMode**)state))->enc(state, in, bits);
218 }
219
220 void speex_decoder_destroy(void *state)
221 {
222    (*((SpeexMode**)state))->dec_destroy(state);
223 }
224
225 void speex_decode(void *state, SpeexBits *bits, float *out, int lost)
226 {
227    (*((SpeexMode**)state))->dec(state, bits, out, lost);
228 }
229
230
231 void speex_encoder_ctl(void *state, int request, void *ptr)
232 {
233    (*((SpeexMode**)state))->enc_ctl(state, request, ptr);
234 }
235
236 void speex_decoder_ctl(void *state, int request, void *ptr)
237 {
238    (*((SpeexMode**)state))->dec_ctl(state, request, ptr);
239 }