Removed narrowband 256x8 codebook from build.
[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
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_8_256_table[];*/
36 extern float exc_5_64_table[];
37
38 /* Parameters for Long-Term Prediction (LTP)*/
39 static ltp_params ltp_params_nb = {
40    gain_cdbk_nb,
41    7,
42    7
43 };
44
45 /* Split-VQ innovation parameters */
46 split_cb_params split_cb_nb = {
47    5,               /*subvect_size*/
48    8,               /*nb_subvect*/
49    exc_5_64_table, /*shape_cb*/
50    6,               /*shape_bits*/
51 };
52
53 split_cb_params split_cb_sb = {
54    5,               /*subvect_size*/
55    8,              /*nb_subvect*/
56    exc_5_256_table,    /*shape_cb*/
57    8,               /*shape_bits*/
58 };
59
60 static split_cb_params split_cb_high = {
61    8,               /*subvect_size*/
62    5,               /*nb_subvect*/
63    hexc_table,       /*shape_cb*/
64    8,               /*shape_bits*/
65 };
66
67 /* Default mode for narrowband */
68 SpeexNBMode nb_mode = {
69    160,    /*frameSize*/
70    40,     /*subframeSize*/
71    320,    /*windowSize*/
72    10,     /*lpcSize*/
73    640,    /*bufSize*/
74    17,     /*pitchStart*/
75    144,    /*pitchEnd*/
76    0.9,    /*gamma1*/
77    0.6,    /*gamma2*/
78    .005,   /*lag_factor*/
79    1.0001, /*lpc_floor*/
80    0.0,    /*preemph*/
81    /*LSP quantization*/
82    lsp_quant_nb,
83    lsp_unquant_nb,
84    /*Pitch quantization*/
85    pitch_search_3tap,
86    pitch_unquant_3tap,
87    &ltp_params_nb,
88    /*Innovation quantization*/
89    split_cb_search_nogain2,
90    split_cb_nogain_unquant,
91    &split_cb_nb
92 };
93
94 /* Narrowband mode used for split-band wideband CELP*/
95 static SpeexNBMode low_sb_mode = {
96    160,    /*frameSize*/
97    40,     /*subframeSize*/
98    320,    /*windowSize*/
99    10,     /*lpcSize*/
100    640,    /*bufSize*/
101    17,     /*pitchStart*/
102    144,    /*pitchEnd*/
103    .9,    /*gamma1*/
104    0.6,    /*gamma2*/
105    .002,   /*lag_factor*/
106    1.00005, /*lpc_floor*/
107    0.0,    /*preemph*/
108    /*LSP quantization*/
109    lsp_quant_nb,
110    lsp_unquant_nb,
111    /*Pitch quantization*/
112    pitch_search_3tap,
113    pitch_unquant_3tap,
114    &ltp_params_nb,
115    /*Innovation quantization*/
116    split_cb_search_nogain2,
117    split_cb_nogain_unquant,
118    &split_cb_sb
119 };
120
121 SpeexMode low_wb_mode = {
122    &low_sb_mode,
123    &nb_encoder_init,
124    &nb_encoder_destroy,
125    &nb_encode,
126    &nb_decoder_init,
127    &nb_decoder_destroy,
128    &nb_decode,
129    160
130 };
131
132 SpeexMode speex_nb_mode = {
133    &nb_mode,
134    &nb_encoder_init,
135    &nb_encoder_destroy,
136    &nb_encode,
137    &nb_decoder_init,
138    &nb_decoder_destroy,
139    &nb_decode,
140    160
141 };
142
143 /* Split-band wideband CELP mode*/
144 static SpeexSBMode sb_wb_mode = {
145    &low_wb_mode,
146    160,    /*frameSize*/
147    40,     /*subframeSize*/
148    320,    /*windowSize*/
149    8,     /*lpcSize*/
150    640,    /*bufSize*/
151    .9,    /*gamma1*/
152    0.6,    /*gamma2*/
153    .002,   /*lag_factor*/
154    1.0001, /*lpc_floor*/
155    0.0,    /*preemph*/
156    /*LSP quantization*/
157    lsp_quant_high,
158    lsp_unquant_high,
159    /*Innovation quantization*/
160    split_cb_search_nogain2,
161    split_cb_nogain_unquant,
162    &split_cb_high
163 };
164
165
166 SpeexMode speex_wb_mode = {
167    &sb_wb_mode,
168    &sb_encoder_init,
169    &sb_encoder_destroy,
170    &sb_encode,
171    &sb_decoder_init,
172    &sb_decoder_destroy,
173    &sb_decode,
174    320
175 };
176
177
178
179
180 void *encoder_init(SpeexMode *mode)
181 {
182    return mode->enc_init(mode);
183 }
184
185 void *decoder_init(SpeexMode *mode)
186 {
187    return mode->dec_init(mode);
188 }
189
190 void encoder_destroy(void *state)
191 {
192    (*((SpeexMode**)state))->enc_destroy(state);
193 }
194
195 void encode(void *state, float *in, FrameBits *bits)
196 {
197    (*((SpeexMode**)state))->enc(state, in, bits);
198 }
199
200 void decoder_destroy(void *state)
201 {
202    (*((SpeexMode**)state))->dec_destroy(state);
203 }
204
205 void decode(void *state, FrameBits *bits, float *out)
206 {
207    (*((SpeexMode**)state))->dec(state, bits, out);
208 }