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