Completed VBR for 0.5.0 release
[speexdsp.git] / libspeex / nb_celp.h
1 /* Copyright (C) 2002 Jean-Marc Valin 
2    File: nb_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 NB_CELP_H
21 #define NB_CELP_H
22
23 #include "modes.h"
24 #include "speex_bits.h"
25 #include "vbr.h"
26
27 /**Structure representing the full state of the narrowband encoder*/
28 typedef struct EncState {
29    SpeexMode *mode;
30    int    first;          /* Is this the first frame? */
31    int    frameSize;      /* Size of frames */
32    int    subframeSize;   /* Size of sub-frames */
33    int    nbSubframes;    /* Number of sub-frames */
34    int    windowSize;     /* Analysis (LPC) window length */
35    int    lpcSize;        /* LPC order */
36    int    bufSize;        /* Buffer size */
37    int    min_pitch;      /* Minimum pitch value allowed */
38    int    max_pitch;      /* Maximum pitch value allowed */
39
40    int    ol_pitch;       /* Open-loop pitch */
41    int    ol_voiced;      /* Open-loop voiced/non-voiced decision */
42    int   *pitch;
43    float  gamma1;         /* Perceptual filter: A(z/gamma1) */
44    float  gamma2;         /* Perceptual filter: A(z/gamma2) */
45    float  lag_factor;     /* Lag windowing gaussian width */
46    float  lpc_floor;      /* Noise floor multiplier for A[0] in LPC analysis*/
47    float  preemph;        /* Pre-emphasis: P(z) = 1 - a*z^-1*/
48    float  pre_mem;        /* 1-element memory for pre-emphasis */
49    float  pre_mem2;       /* 1-element memory for pre-emphasis */
50    float *stack;          /* Pseudo-stack allocation for temporary memory */
51    float *inBuf;          /* Input buffer (original signal) */
52    float *frame;          /* Start of original frame */
53    float *excBuf;         /* Excitation buffer */
54    float *exc;            /* Start of excitation frame */
55    float *exc2Buf;           /* "Pitch enhanced" excitation */
56    float *exc2;           /* "Pitch enhanced" excitation */
57    float *swBuf;          /* Weighted signal buffer */
58    float *sw;             /* Start of weighted signal frame */
59    float *window;         /* Temporary (Hanning) window */
60    float *buf2;           /* 2nd temporary buffer */
61    float *autocorr;       /* auto-correlation */
62    float *lagWindow;      /* Window applied to auto-correlation */
63    float *lpc;            /* LPCs for current frame */
64    float *lsp;            /* LSPs for current frame */
65    float *qlsp;           /* Quantized LSPs for current frame */
66    float *old_lsp;        /* LSPs for previous frame */
67    float *old_qlsp;       /* Quantized LSPs for previous frame */
68    float *interp_lsp;     /* Interpolated LSPs */
69    float *interp_qlsp;    /* Interpolated quantized LSPs */
70    float *interp_lpc;     /* Interpolated LPCs */
71    float *interp_qlpc;    /* Interpolated quantized LPCs */
72    float *bw_lpc1;        /* LPCs after bandwidth expansion by gamma1 for perceptual weighting*/
73    float *bw_lpc2;        /* LPCs after bandwidth expansion by gamma2 for perceptual weighting*/
74    float *rc;             /* Reflection coefficients */
75    float *mem_sp, *mem_sw;
76    float *pi_gain;
77    VBRState *vbr;
78    int    vbr_quality;
79    int    vbr_enabled;
80
81    SpeexSubmode **submodes;
82    int    submodeID;
83 } EncState;
84
85 /**Structure representing the full state of the narrowband decoder*/
86 typedef struct DecState {
87    SpeexMode *mode;
88    int    first;          /* Is this the first frame? */
89    int    count_lost;     /* Was the last frame lost? */
90    int    frameSize;      /* Size of frames */
91    int    subframeSize;   /* Size of sub-frames */
92    int    nbSubframes;    /* Number of sub-frames */
93    int    windowSize;     /* Analysis (LPC) window length */
94    int    lpcSize;        /* LPC order */
95    int    bufSize;        /* Buffer size */
96    int    min_pitch;      /* Minimum pitch value allowed */
97    int    max_pitch;      /* Maximum pitch value allowed */
98
99    float  gamma1;         /* Perceptual filter: A(z/gamma1) */
100    float  gamma2;         /* Perceptual filter: A(z/gamma2) */
101    float  preemph;        /* Pre-emphasis: P(z) = 1 - a*z^-1*/
102    float  pre_mem;        /* 1-element memory for pre-emphasis */
103    float *stack;
104    float *inBuf;          /* Input buffer (original signal) */
105    float *frame;          /* Start of original frame */
106    float *excBuf;         /* Excitation buffer */
107    float *exc2Buf;        /* Excitation (after post-filter) buffer */
108    float *exc;            /* Start of excitation frame */
109    float *exc2;           /* Start of excitation frame after post-filter*/
110    float *qlsp;           /* Quantized LSPs for current frame */
111    float *old_qlsp;       /* Quantized LSPs for previous frame */
112    float *interp_qlsp;    /* Interpolated quantized LSPs */
113    float *interp_qlpc;    /* Interpolated quantized LPCs */
114    float *mem_sp;
115    float *mem_pf;
116    float *mem_pf2;
117    float *pi_gain;
118    int    last_pitch;
119    float  last_pitch_gain;
120
121    SpeexSubmode **submodes;
122    int    submodeID;
123    int    pf_enabled;
124 } DecState;
125
126 /**Initializes encoder state*/
127 void *nb_encoder_init(SpeexMode *m);
128
129 /**De-allocates encoder state resources*/
130 void nb_encoder_destroy(void *state);
131
132 /**Encodes one frame*/
133 void nb_encode(void *state, float *in, SpeexBits *bits);
134
135
136 /**Initializes decoder state*/
137 void *nb_decoder_init(SpeexMode *m);
138
139 /**De-allocates decoder state resources*/
140 void nb_decoder_destroy(void *state);
141
142 /**Decodes one frame*/
143 void nb_decode(void *state, SpeexBits *bits, float *out, int lost);
144
145 void nb_encoder_ctl(void *state, int request, void *ptr);
146
147 void nb_decoder_ctl(void *state, int request, void *ptr);
148
149
150 #endif