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