More comments
[speexdsp.git] / libspeex / sb_celp.h
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: sb_celp.h
3
4    This library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8    
9    This library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13    
14    You should have received a copy of the GNU Lesser General Public
15    License along with this library; if not, write to the Free Software
16    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18 */
19
20 #ifndef SB_CELP_H
21 #define SB_CELP_H
22
23 #include "modes.h"
24 #include "speex_bits.h"
25 #include "nb_celp.h"
26
27 /**Structure representing the full state of the sub-band encoder*/
28 typedef struct SBEncState {
29    SpeexMode *mode;            /* Pointer to the mode (containing for vtable info) */
30    void *st_low;               /* State of the low-band (narrowband) encoder */
31    int    full_frame_size;     /* Length of full-band frames*/
32    int    frame_size;          /* Length of high-band frames*/
33    int    subframeSize;        /* Length of high-band sub-frames*/
34    int    nbSubframes;         /* Number of high-band sub-frames*/
35    int    windowSize;          /* Length of high-band LPC window*/
36    int    lpcSize;             /* Order of high-band LPC analysis */
37    int    bufSize;             /* Buffer size */
38    int    first;               /* First frame? */
39    float  lag_factor;          /* Lag-windowing control parameter */
40    float  lpc_floor;           /* Controls LPC analysis noise floor */
41    float  gamma1;              /* Perceptual weighting coef 1 */
42    float  gamma2;              /* Perceptual weighting coef 2 */
43
44    float *stack;               /* Temporary allocation stack */
45    float *x0, *x0d, *x1, *x1d; /* QMF filter signals*/
46    float *high;                /* High-band signal (buffer) */
47    float *y0, *y1;             /* QMF synthesis signals */
48    float *h0_mem, *h1_mem, *g0_mem, *g1_mem; /* QMF memories */
49
50    float *excBuf;              /* High-band excitation */
51    float *exc;                 /* High-band excitation (for QMF only)*/
52    float *buf;                 /* Temporary buffer */
53    float *res;                 /* Zero-input response (ringing) */
54    float *sw;                  /* Perceptually weighted signal */
55    float *target;              /* Weighted target signal (analysis by synthesis) */
56    float *window;              /* LPC analysis window */
57    float *lagWindow;           /* Auto-correlation window */
58    float *autocorr;            /* Auto-correlation (for LPC analysis) */
59    float *rc;                  /* Reflection coefficients (unused) */
60    float *lpc;                 /* LPC coefficients */
61    float *lsp;                 /* LSP coefficients */
62    float *qlsp;                /* Quantized LSPs */
63    float *old_lsp;             /* LSPs of previous frame */
64    float *old_qlsp;            /* Quantized LSPs of previous frame */
65    float *interp_lsp;          /* Interpolated LSPs for current sub-frame */
66    float *interp_qlsp;         /* Interpolated quantized LSPs for current sub-frame */
67    float *interp_lpc;          /* Interpolated LPCs for current sub-frame */
68    float *interp_qlpc;         /* Interpolated quantized LPCs for current sub-frame */
69    float *bw_lpc1;             /* Bandwidth-expanded version of LPCs (#1) */
70    float *bw_lpc2;             /* Bandwidth-expanded version of LPCs (#2) */
71
72    float *mem_sp;              /* Synthesis signal memory */
73    float *mem_sp2;
74    float *mem_sw;              /* Perceptual signal memory */
75
76    lsp_quant_func    lsp_quant;
77    innovation_quant_func innovation_quant;
78    void             *innovation_params;
79 } SBEncState;
80
81
82 /**Structure representing the full state of the sub-band decoder*/
83 typedef struct SBDecState {
84    SpeexMode *mode;            /* Pointer to the mode (containing for vtable info) */
85    void *st_low;               /* State of the low-band (narrowband) encoder */
86    int    full_frame_size;
87    int    frame_size;
88    int    subframeSize;
89    int    nbSubframes;
90    int    lpcSize;
91    int    first;
92    float  pf_gamma;
93    int    pf_order;
94
95    float *stack;
96    float *x0, *x0d, *x1, *x1d;
97    float *high;
98    float *y0, *y1;
99    float *h0_mem, *h1_mem, *g0_mem, *g1_mem;
100
101    float *exc;
102    float *pf_exc;
103    float *pf_window;
104    float *pf_autocorr;
105    float *pf_lpc;
106    float *pf_bwlpc;
107    float *qlsp;
108    float *old_qlsp;
109    float *interp_qlsp;
110    float *interp_qlpc;
111
112    float *mem_sp;
113    float *mem_pf_exc1;
114    float *mem_pf_exc2;
115    float *mem_pf_sp;
116
117    lsp_unquant_func  lsp_unquant;
118    innovation_unquant_func innovation_unquant;
119    void             *innovation_params;
120 } SBDecState;
121
122
123 /**Initializes encoder state*/
124 void *sb_encoder_init(SpeexMode *m);
125
126 /**De-allocates encoder state resources*/
127 void sb_encoder_destroy(void *state);
128
129 /**Encodes one frame*/
130 void sb_encode(void *state, float *in, FrameBits *bits);
131
132
133 /**Initializes decoder state*/
134 void *sb_decoder_init(SpeexMode *m);
135
136 /**De-allocates decoder state resources*/
137 void sb_decoder_destroy(void *state);
138
139 /**Decodes one frame*/
140 void sb_decode(void *state, FrameBits *bits, float *out);
141
142
143 #endif