16-bit clean shift in lsp_to_lpc()
[speexdsp.git] / libspeex / nb_celp.h
1 /* Copyright (C) 2002 Jean-Marc Valin */
2 /**
3     @file nb_celp.h
4     @brief Narrowband CELP encoder/decoder
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 NB_CELP_H
37 #define NB_CELP_H
38
39 #include "modes.h"
40 #include <speex/speex_bits.h>
41 #include <speex/speex_callbacks.h>
42 #include "vbr.h"
43 #include "filters.h"
44
45 #ifdef VORBIS_PSYCHO
46 #include "vorbis_psy.h"
47 #endif
48
49 /**Structure representing the full state of the narrowband encoder*/
50 typedef struct EncState {
51    const SpeexMode *mode;        /**< Mode corresponding to the state */
52    int    first;                 /**< Is this the first frame? */
53    int    frameSize;             /**< Size of frames */
54    int    subframeSize;          /**< Size of sub-frames */
55    int    nbSubframes;           /**< Number of sub-frames */
56    int    windowSize;            /**< Analysis (LPC) window length */
57    int    lpcSize;               /**< LPC order */
58    int    min_pitch;             /**< Minimum pitch value allowed */
59    int    max_pitch;             /**< Maximum pitch value allowed */
60
61    spx_word32_t cumul_gain;      /**< Product of previously used pitch gains (Q10) */
62    int    bounded_pitch;         /**< Next frame should not rely on previous frames for pitch */
63    int    ol_pitch;              /**< Open-loop pitch */
64    int    ol_voiced;             /**< Open-loop voiced/non-voiced decision */
65    int   *pitch;
66
67 #ifdef EPIC_48K
68    int    lbr_48k;
69 #endif
70
71 #ifdef VORBIS_PSYCHO
72    VorbisPsy *psy;
73    float *psy_window;
74    float *curve;
75    float *old_curve;
76 #endif
77
78    spx_word16_t  gamma1;         /**< Perceptual filter: A(z/gamma1) */
79    spx_word16_t  gamma2;         /**< Perceptual filter: A(z/gamma2) */
80    float  lag_factor;            /**< Lag windowing Gaussian width */
81    spx_word16_t  lpc_floor;      /**< Noise floor multiplier for A[0] in LPC analysis*/
82    char  *stack;                 /**< Pseudo-stack allocation for temporary memory */
83    spx_word16_t *winBuf;         /**< Input buffer (original signal) */
84    spx_word16_t *excBuf;         /**< Excitation buffer */
85    spx_word16_t *exc;            /**< Start of excitation frame */
86    spx_word16_t *swBuf;          /**< Weighted signal buffer */
87    spx_word16_t *sw;             /**< Start of weighted signal frame */
88    const spx_word16_t *window;   /**< Temporary (Hanning) window */
89    spx_word16_t *lagWindow;      /**< Window applied to auto-correlation */
90    spx_lsp_t *old_lsp;           /**< LSPs for previous frame */
91    spx_lsp_t *old_qlsp;          /**< Quantized LSPs for previous frame */
92    spx_mem_t *mem_sp;            /**< Filter memory for signal synthesis */
93    spx_mem_t *mem_sw;            /**< Filter memory for perceptually-weighted signal */
94    spx_mem_t *mem_sw_whole;      /**< Filter memory for perceptually-weighted signal (whole frame)*/
95    spx_mem_t *mem_exc;           /**< Filter memory for excitation (whole frame) */
96    spx_mem_t *mem_exc2;          /**< Filter memory for excitation (whole frame) */
97    spx_word32_t *pi_gain;        /**< Gain of LPC filter at theta=pi (fe/2) */
98    spx_sig_t *innov_save;        /**< If non-NULL, innovation is copied here */
99          
100    VBRState *vbr;                /**< State of the VBR data */
101    float  vbr_quality;           /**< Quality setting for VBR encoding */
102    float  relative_quality;      /**< Relative quality that will be needed by VBR */
103    int    vbr_enabled;           /**< 1 for enabling VBR, 0 otherwise */
104    spx_int32_t vbr_max;          /**< Max bit-rate allowed in VBR mode */
105    int    vad_enabled;           /**< 1 for enabling VAD, 0 otherwise */
106    int    dtx_enabled;           /**< 1 for enabling DTX, 0 otherwise */
107    int    dtx_count;             /**< Number of consecutive DTX frames */
108    spx_int32_t abr_enabled;      /**< ABR setting (in bps), 0 if off */
109    float  abr_drift;
110    float  abr_drift2;
111    float  abr_count;
112    int    complexity;            /**< Complexity setting (0-10 from least complex to most complex) */
113    spx_int32_t sampling_rate;
114    int    plc_tuning;
115    int    encode_submode;
116    const SpeexSubmode * const *submodes; /**< Sub-mode data */
117    int    submodeID;             /**< Activated sub-mode */
118    int    submodeSelect;         /**< Mode chosen by the user (may differ from submodeID if VAD is on) */
119 } EncState;
120
121 /**Structure representing the full state of the narrowband decoder*/
122 typedef struct DecState {
123    const SpeexMode *mode;       /**< Mode corresponding to the state */
124    int    first;                /**< Is this the first frame? */
125    int    count_lost;           /**< Was the last frame lost? */
126    int    frameSize;            /**< Size of frames */
127    int    subframeSize;         /**< Size of sub-frames */
128    int    nbSubframes;          /**< Number of sub-frames */
129    int    lpcSize;              /**< LPC order */
130    int    min_pitch;            /**< Minimum pitch value allowed */
131    int    max_pitch;            /**< Maximum pitch value allowed */
132    spx_int32_t sampling_rate;
133
134 #ifdef EPIC_48K
135    int    lbr_48k;
136 #endif
137
138    spx_word16_t  last_ol_gain;  /**< Open-loop gain for previous frame */
139
140    char  *stack;                /**< Pseudo-stack allocation for temporary memory */
141    spx_word16_t *excBuf;        /**< Excitation buffer */
142    spx_word16_t *exc;           /**< Start of excitation frame */
143    spx_lsp_t *old_qlsp;         /**< Quantized LSPs for previous frame */
144    spx_coef_t *interp_qlpc;     /**< Interpolated quantized LPCs */
145    spx_mem_t *mem_sp;           /**< Filter memory for synthesis signal */
146    spx_word32_t *pi_gain;       /**< Gain of LPC filter at theta=pi (fe/2) */
147    spx_sig_t *innov_save;       /** If non-NULL, innovation is copied here */
148    
149    /* This is used in packet loss concealment */
150    int    last_pitch;           /**< Pitch of last correctly decoded frame */
151    spx_word16_t  last_pitch_gain; /**< Pitch gain of last correctly decoded frame */
152    spx_word16_t  pitch_gain_buf[3]; /**< Pitch gain of last decoded frames */
153    int    pitch_gain_buf_idx;   /**< Tail of the buffer */
154    spx_int32_t seed;            /** Seed used for random number generation */
155    
156    int    encode_submode;
157    const SpeexSubmode * const *submodes; /**< Sub-mode data */
158    int    submodeID;            /**< Activated sub-mode */
159    int    lpc_enh_enabled;      /**< 1 when LPC enhancer is on, 0 otherwise */
160    SpeexCallback speex_callbacks[SPEEX_MAX_CALLBACKS];
161
162    SpeexCallback user_callback;
163
164    /*Vocoder data*/
165    spx_word16_t  voc_m1;
166    spx_word32_t  voc_m2;
167    float  voc_mean;
168    int    voc_offset;
169
170    int    dtx_enabled;
171 } DecState;
172
173 /** Initializes encoder state*/
174 void *nb_encoder_init(const SpeexMode *m);
175
176 /** De-allocates encoder state resources*/
177 void nb_encoder_destroy(void *state);
178
179 /** Encodes one frame*/
180 int nb_encode(void *state, void *in, SpeexBits *bits);
181
182
183 /** Initializes decoder state*/
184 void *nb_decoder_init(const SpeexMode *m);
185
186 /** De-allocates decoder state resources*/
187 void nb_decoder_destroy(void *state);
188
189 /** Decodes one frame*/
190 int nb_decode(void *state, SpeexBits *bits, void *out);
191
192 /** ioctl-like function for controlling a narrowband encoder */
193 int nb_encoder_ctl(void *state, int request, void *ptr);
194
195 /** ioctl-like function for controlling a narrowband decoder */
196 int nb_decoder_ctl(void *state, int request, void *ptr);
197
198
199 #endif