Preparing for beta 3, cleaned up the mode/bit-rate code in speexdec,
[speexdsp.git] / libspeex / sb_celp.h
1 /* Copyright (C) 2002 Jean-Marc Valin */
2 /**
3    @file sb_celp.h
4    @brief Sub-band CELP mode used for wideband encoding
5 */
6 /*
7    Redistribution and use in source and binary forms, with or without
8    modification, are permitted provided that the following conditions
9    are met:
10    
11    - Redistributions of source code must retain the above copyright
12    notice, this list of conditions and the following disclaimer.
13    
14    - Redistributions in binary form must reproduce the above copyright
15    notice, this list of conditions and the following disclaimer in the
16    documentation and/or other materials provided with the distribution.
17    
18    - Neither the name of the Xiph.org Foundation nor the names of its
19    contributors may be used to endorse or promote products derived from
20    this software without specific prior written permission.
21    
22    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25    A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
26    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
28    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
29    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
31    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
34 */
35
36 #ifndef SB_CELP_H
37 #define SB_CELP_H
38
39 #include "modes.h"
40 #include "speex_bits.h"
41 #include "nb_celp.h"
42
43 /**Structure representing the full state of the sub-band encoder*/
44 typedef struct SBEncState {
45    SpeexMode *mode;            /**< Pointer to the mode (containing for vtable info) */
46    void *st_low;               /**< State of the low-band (narrowband) encoder */
47    int    full_frame_size;     /**< Length of full-band frames*/
48    int    frame_size;          /**< Length of high-band frames*/
49    int    subframeSize;        /**< Length of high-band sub-frames*/
50    int    nbSubframes;         /**< Number of high-band sub-frames*/
51    int    windowSize;          /**< Length of high-band LPC window*/
52    int    lpcSize;             /**< Order of high-band LPC analysis */
53    int    bufSize;             /**< Buffer size */
54    int    first;               /**< First frame? */
55    float  lag_factor;          /**< Lag-windowing control parameter */
56    float  lpc_floor;           /**< Controls LPC analysis noise floor */
57    float  gamma1;              /**< Perceptual weighting coef 1 */
58    float  gamma2;              /**< Perceptual weighting coef 2 */
59
60    void  *stack;               /**< Temporary allocation stack */
61    float *x0d, *x1d; /**< QMF filter signals*/
62    float *high;                /**< High-band signal (buffer) */
63    float *y0, *y1;             /**< QMF synthesis signals */
64    float *h0_mem, *h1_mem, *g0_mem, *g1_mem; /**< QMF memories */
65
66    float *excBuf;              /**< High-band excitation */
67    float *exc;                 /**< High-band excitation (for QMF only)*/
68    float *buf;                 /**< Temporary buffer */
69    float *res;                 /**< Zero-input response (ringing) */
70    float *sw;                  /**< Perceptually weighted signal */
71    float *target;              /**< Weighted target signal (analysis by synthesis) */
72    float *window;              /**< LPC analysis window */
73    float *lagWindow;           /**< Auto-correlation window */
74    float *autocorr;            /**< Auto-correlation (for LPC analysis) */
75    float *rc;                  /**< Reflection coefficients (unused) */
76    float *lpc;                 /**< LPC coefficients */
77    float *lsp;                 /**< LSP coefficients */
78    float *qlsp;                /**< Quantized LSPs */
79    float *old_lsp;             /**< LSPs of previous frame */
80    float *old_qlsp;            /**< Quantized LSPs of previous frame */
81    float *interp_lsp;          /**< Interpolated LSPs for current sub-frame */
82    float *interp_qlsp;         /**< Interpolated quantized LSPs for current sub-frame */
83    float *interp_lpc;          /**< Interpolated LPCs for current sub-frame */
84    float *interp_qlpc;         /**< Interpolated quantized LPCs for current sub-frame */
85    float *bw_lpc1;             /**< Bandwidth-expanded version of LPCs (#1) */
86    float *bw_lpc2;             /**< Bandwidth-expanded version of LPCs (#2) */
87
88    float *mem_sp;              /**< Synthesis signal memory */
89    float *mem_sp2;
90    float *mem_sw;              /**< Perceptual signal memory */
91    float *pi_gain;
92
93    SpeexSubmode **submodes;
94    int    submodeID;
95    int    complexity;
96
97 } SBEncState;
98
99
100 /**Structure representing the full state of the sub-band decoder*/
101 typedef struct SBDecState {
102    SpeexMode *mode;            /**< Pointer to the mode (containing for vtable info) */
103    void *st_low;               /**< State of the low-band (narrowband) encoder */
104    int    full_frame_size;
105    int    frame_size;
106    int    subframeSize;
107    int    nbSubframes;
108    int    lpcSize;
109    int    first;
110
111    void  *stack;
112    float *x0d, *x1d;
113    float *high;
114    float *y0, *y1;
115    float *h0_mem, *h1_mem, *g0_mem, *g1_mem;
116
117    float *exc;
118    float *qlsp;
119    float *old_qlsp;
120    float *interp_qlsp;
121    float *interp_qlpc;
122
123    float *mem_sp;
124    float *pi_gain;
125
126    SpeexSubmode **submodes;
127    int    submodeID;
128 } SBDecState;
129
130
131 /**Initializes encoder state*/
132 void *sb_encoder_init(SpeexMode *m);
133
134 /**De-allocates encoder state resources*/
135 void sb_encoder_destroy(void *state);
136
137 /**Encodes one frame*/
138 void sb_encode(void *state, float *in, SpeexBits *bits);
139
140
141 /**Initializes decoder state*/
142 void *sb_decoder_init(SpeexMode *m);
143
144 /**De-allocates decoder state resources*/
145 void sb_decoder_destroy(void *state);
146
147 /**Decodes one frame*/
148 int sb_decode(void *state, SpeexBits *bits, float *out);
149
150 void sb_encoder_ctl(void *state, int request, void *ptr);
151
152 void sb_decoder_ctl(void *state, int request, void *ptr);
153
154 #endif